diff --git a/exec/Filelist.exec.mk b/exec/Filelist.exec.mk index a0924157..ab6061cf 100644 --- a/exec/Filelist.exec.mk +++ b/exec/Filelist.exec.mk @@ -1,3 +1,4 @@ SRC_FILES = \ +arith \ run_ast \ diff --git a/exec/src/arith.c b/exec/src/arith.c new file mode 100644 index 00000000..b96ad470 --- /dev/null +++ b/exec/src/arith.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* arith.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maiboyer +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/26 15:14:50 by maiboyer #+# #+# */ +/* Updated: 2024/07/26 15:20:41 by maiboyer ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "app/state.h" +#include "ast/ast.h" +#include "exec/run.h" +#include "me/convert/numbers_to_str.h" +#include "me/hashmap/hashmap_env.h" +#include "me/mem/mem.h" +#include "me/os/pipe.h" +#include "me/os/process.h" +#include "me/str/str.h" +#include "me/string/string.h" +#include "me/types.h" +#include "me/vec/vec_estr.h" +#include "me/vec/vec_str.h" + +#include + +#pragma clang diagnostic ignored "-Wunused-parameter" +#pragma clang diagnostic ignored "-Wunused-variable" + +t_error run_arithmetic_binary(t_ast_arithmetic_binary *arithmetic_binary, t_state *state, void *out); +t_error run_arithmetic_literal(t_ast_arithmetic_literal *arithmetic_literal, t_state *state, void *out); +t_error run_arithmetic_postfix(t_ast_arithmetic_postfix *arithmetic_postfix, t_state *state, void *out); +t_error run_arithmetic_ternary(t_ast_arithmetic_ternary *arithmetic_ternary, t_state *state, void *out); +t_error run_arithmetic_unary(t_ast_arithmetic_unary *arithmetic_unary, t_state *state, void *out); +t_error run_arithmetic_expansion(t_ast_arithmetic_expansion *arithmetic_expansion, t_state *state, void *out); diff --git a/exec/src/run_ast.c b/exec/src/run_ast.c index 194807b4..9c3d1a33 100644 --- a/exec/src/run_ast.c +++ b/exec/src/run_ast.c @@ -6,7 +6,7 @@ /* By: maiboyer +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/11 17:22:29 by maiboyer #+# #+# */ -/* Updated: 2024/07/24 18:53:43 by maiboyer ### ########.fr */ +/* Updated: 2024/07/26 14:43:54 by maiboyer ### ########.fr */ /* */ /* ************************************************************************** */ @@ -335,36 +335,6 @@ t_str _get_ifs_value(t_state *state) ifs = " \t\n"; return (ifs); } -/* -t_error _split_ifs_expansion(t_ast_word_kind wkind, t_state *state, t_ast_expansion *exp, t_vec_str *out) -{ - const t_str ifs_key = "IFS"; - t_str ifs; - t_expansion_result exp_out; - t_vec_str split_res; - t_str tmp; - - if (exp == NULL || out == NULL) - return (ERROR); - ifs = NULL; - if (hmap_env_get(state->env, (t_str *)&ifs_key)) - ifs = *hmap_env_get(state->env, (t_str *)&ifs_key); - if (ifs == NULL) - ifs = " \t\n"; - if (run_expansion(exp, state, &exp_out)) - return (ERROR); - if (!(exp_out.exists && exp_out.value != NULL)) - return (NO_ERROR); - if (wkind != AST_WORD_NO_QUOTE) - return (vec_str_push(out, str_clone(exp_out.value)), NO_ERROR); - if (str_split(exp_out.value, ifs, &split_res)) - return (ERROR); - while (vec_str_pop_front(&split_res, &tmp)) - vec_str_push(out, tmp); - vec_str_free(split_res); - return (NO_ERROR); -} -*/ t_error _ast_get_str__expansion(t_ast_node elem, t_word_iterator *state, t_vec_estr *out) { @@ -435,7 +405,7 @@ t_error _exp_into_str(t_ast_node self, t_state *state, t_vec_str *append) return (NO_ERROR); if (str_split(res.value, _get_ifs_value(state), &splitted)) return (ERROR); - while (vec_str_pop_front(&splitted, &tmp)) + while (!vec_str_pop_front(&splitted, &tmp)) vec_str_push(append, tmp); vec_str_free(splitted); return (NO_ERROR); @@ -455,7 +425,7 @@ t_error _cmd_into_str(t_ast_node self, t_state *state, t_vec_str *append) /* if (str_split(res.value, _get_ifs_value(state), &splitted)) return (ERROR); - while (vec_str_pop_front(&splitted, &tmp)) + while (!vec_str_pop_front(&splitted, &tmp)) vec_str_push(append, tmp); vec_str_free(splitted); */ @@ -468,7 +438,10 @@ t_error _word_into_str(t_ast_node self, t_state *state, t_vec_str *append) t_vec_str splitted; t_string tmp; t_usize i; + t_usize j; + t_usize len; t_str ifs; + t_str tmp_str; if (self == NULL || state == NULL || append == NULL || self->kind == AST_WORD) return (ERROR); @@ -476,7 +449,9 @@ t_error _word_into_str(t_ast_node self, t_state *state, t_vec_str *append) return (ERROR); if (res.kind == AST_WORD_NO_QUOTE) { - tmp = string_new(1024); + tmp = string_new(64); + if (!vec_str_pop_front(&splitted, &tmp_str)) + string_push(&tmp, tmp_str), str_free(tmp_str); i = 0; while (i < res.value.len) { @@ -491,8 +466,36 @@ t_error _word_into_str(t_ast_node self, t_state *state, t_vec_str *append) string_push(&tmp, res.value.buffer[i].value); else { + ifs = _get_ifs_value(state); if (str_split(res.value.buffer[i].value, ifs, &splitted)) return (ERROR); + if (!vec_str_pop_front(&splitted, &tmp_str)) + { + if (str_find_chr(ifs, res.value.buffer[i].value[0]) == NULL) + { + string_push(&tmp, tmp_str), str_free(tmp_str); + } + else + { + vec_str_push(append, tmp.buf); + tmp = string_new(64); + string_push(&tmp, tmp_str); + str_free(tmp_str); + } + j = 0; + while (j + 1 < splitted.len) + { + if (vec_str_pop_front(&splitted, &tmp_str)) + return (ERROR); + vec_str_push(append, tmp_str); + j++; + } + len = str_len(res.value.buffer[i].value); + if (len != 0 && str_find_chr(ifs, res.value.buffer[i].value[len - 1]) == NULL) + string_push(&tmp, tmp_str), str_free(tmp_str); + else + vec_str_push(append, tmp_str); + } } } } @@ -500,7 +503,7 @@ t_error _word_into_str(t_ast_node self, t_state *state, t_vec_str *append) } else { - tmp = string_new(1024); + tmp = string_new(64); i = 0; while (i < res.value.len) string_push(&tmp, res.value.buffer[i++].value);