diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/builtin/exit.c | 6 | ||||
| -rw-r--r-- | src/eval/cmd.c | 108 | ||||
| -rw-r--r-- | src/preprocess.c | 143 | ||||
| -rw-r--r-- | src/utils.c | 30 |
4 files changed, 117 insertions, 170 deletions
diff --git a/src/builtin/exit.c b/src/builtin/exit.c index 3f1d843..640fc01 100644 --- a/src/builtin/exit.c +++ b/src/builtin/exit.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:10:16 by charles #+# #+# */ -/* Updated: 2020/07/19 19:12:46 by charles ### ########.fr */ +/* Updated: 2020/08/20 17:31:18 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,12 +34,12 @@ int builtin_exit(char **argv, t_env env) if (*after != '\0' || errno == ERANGE) { errorf("exit: %s: numeric argument required\n", argv[1]); - return 2; + return (2); } if (argv[2] != NULL) { errorf("exit: too many arguments\n"); - return 1; + return (1); } } exit(status % 256); diff --git a/src/eval/cmd.c b/src/eval/cmd.c index 951b845..f8884d6 100644 --- a/src/eval/cmd.c +++ b/src/eval/cmd.c @@ -6,7 +6,7 @@ /* By: charles <charles@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/14 10:41:31 by charles #+# #+# */ -/* Updated: 2020/07/20 18:22:14 by charles ### ########.fr */ +/* Updated: 2020/08/20 17:32:32 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -104,59 +104,59 @@ int eval_cmd(int fds[2], t_env env, t_path path, t_ast *ast) if ((param.env_local = env_from_array((char*[]){NULL})) == NULL) return (-1); - while (ast->cmd_argv != NULL - && ((t_token*)ast->cmd_argv->data)->tag & TAG_IS_STR - && utils_start_with_valid_identifier(((t_token*)ast->cmd_argv->data)->content)) - { - t_ftlst *start; - - id = ((t_token*)ast->cmd_argv->data)->content; - *ft_strchr(id, '=') = '\0'; - ((t_token*)ast->cmd_argv->data)->content = ft_strchr(id, '\0') + 1; - if (*((t_token*)ast->cmd_argv->data)->content == '\0') - ft_lstpop_front(&ast->cmd_argv, NULL); - else - { - t_ftlst *curr = ast->cmd_argv; - t_ftlst *prev = curr; - - while (curr != NULL - && ((t_token*)curr->data)->tag & TAG_STICK && ((t_token*)curr->data)->tag & TAG_IS_STR) - { - prev = curr; - curr = curr->next; - } - if (curr != NULL && ((t_token*)curr->data)->tag & TAG_IS_STR) - { - prev = curr; - curr = curr->next; - } - - start = ast->cmd_argv; - ast->cmd_argv = prev->next; - prev->next = NULL; - } - - /* ft_lstiter(start, token_debug); */ - /* puts(""); */ - /* ft_lstiter(ast->cmd_argv, token_debug); */ - - char **strs = preprocess(&start, env); - - if (env_export(param.env_local, id, strs[0]) == NULL) - return (-1); - } - if (ast->cmd_argv == NULL) // FIXME special env not passed to child processes - { - ft_vecpop(param.env_local, NULL); - if (ft_vecswallow_at(env, env->size - 1, param.env_local) == NULL) - { - ft_vecdestroy(param.env_local, free); - return (-1); - } - g_last_status_code = 0; - return (0); - } + /* while (ast->cmd_argv != NULL */ + /* && ((t_token*)ast->cmd_argv->data)->tag & TAG_IS_STR */ + /* && utils_start_with_valid_identifier(((t_token*)ast->cmd_argv->data)->content)) */ + /* { */ + /* t_ftlst *start; */ + /* */ + /* id = ((t_token*)ast->cmd_argv->data)->content; */ + /* *ft_strchr(id, '=') = '\0'; */ + /* ((t_token*)ast->cmd_argv->data)->content = ft_strchr(id, '\0') + 1; */ + /* if (*((t_token*)ast->cmd_argv->data)->content == '\0') */ + /* ft_lstpop_front(&ast->cmd_argv, NULL); */ + /* else */ + /* { */ + /* t_ftlst *curr = ast->cmd_argv; */ + /* t_ftlst *prev = curr; */ + /* */ + /* while (curr != NULL */ + /* && ((t_token*)curr->data)->tag & TAG_STICK && ((t_token*)curr->data)->tag & TAG_IS_STR) */ + /* { */ + /* prev = curr; */ + /* curr = curr->next; */ + /* } */ + /* if (curr != NULL && ((t_token*)curr->data)->tag & TAG_IS_STR) */ + /* { */ + /* prev = curr; */ + /* curr = curr->next; */ + /* } */ + /* */ + /* start = ast->cmd_argv; */ + /* ast->cmd_argv = prev->next; */ + /* prev->next = NULL; */ + /* } */ + /* */ + /* #<{(| ft_lstiter(start, token_debug); |)}># */ + /* #<{(| puts(""); |)}># */ + /* #<{(| ft_lstiter(ast->cmd_argv, token_debug); |)}># */ + /* */ + /* char **strs = preprocess(&start, env); */ + /* */ + /* if (env_export(param.env_local, id, strs[0]) == NULL) */ + /* return (-1); */ + /* } */ + /* if (ast->cmd_argv == NULL) // FIXME special env not passed to child processes */ + /* { */ + /* ft_vecpop(param.env_local, NULL); */ + /* if (ft_vecswallow_at(env, env->size - 1, param.env_local) == NULL) */ + /* { */ + /* ft_vecdestroy(param.env_local, free); */ + /* return (-1); */ + /* } */ + /* g_last_status_code = 0; */ + /* return (0); */ + /* } */ if ((argv = preprocess(&ast->cmd_argv, env)) == NULL) { diff --git a/src/preprocess.c b/src/preprocess.c index eb5416e..5782a45 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,7 +6,7 @@ /* By: charles <charles@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/08/20 14:24:51 by charles ### ########.fr */ +/* Updated: 2020/08/20 17:28:28 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,32 +16,69 @@ static t_ftlst *st_field_split(char *str) { - char **strs; t_ftlst *ret; - t_ftlst *node; - int i; + char *match; - if ((strs = ms_split_notrim(str, ' ')) == NULL) - return (NULL); ret = NULL; - i = 0; - while (strs[i] != NULL) + while (*str != '\0') { - if ((node = ft_lstnew(token_new(TAG_STR, strs[i]))) == NULL) + if ((match = ft_strchr(str, ' ')) == NULL) { - free(strs); - return (NULL); + if (ft_lstpush_front_node(&ret, token_new(TAG_STR, str)) == NULL) + return (ft_lstdestroy(&ret, free)); + break; } - ft_lstpush_back(&ret, node); - i++; + if (ft_lstpush_front_node(&ret, token_new_until(TAG_STR, str, match - str)) == NULL) + return (ft_lstdestroy(&ret, free)); + while (*++match == ' ') + ; + str = match; + if (*str == '\0' && ft_lstpush_front_node(&ret, token_new(TAG_STR, str)) == NULL) + return (ft_lstdestroy(&ret, free)); } - free(strs); - return (ret); + return (ft_lstreverse_ret(ret)); +} + + +t_ftlst *st_stick_tokens(t_ftlst *tokens) +{ + t_ftlst *curr; + + curr = tokens; + while (curr != NULL) + { + // curr->next shouldn't be null + if (token_tag(curr) & TAG_STICK) + { + token_set_content(curr, ft_strjoinf_fst(token_content(curr), token_content(curr->next))); + t_ftlst *tmp = curr->next->next; + token_set_tag(curr, token_tag(curr->next)); + ft_lstdelone(curr->next, free); + curr->next = tmp; + continue; + } + curr = curr->next; + } + return (tokens); } -void token_debug(void *v); +char **st_tokens_to_argv(t_ftlst *tokens) +{ + char **ret; + size_t i; + + if ((ret = ft_calloc(ft_lstsize(tokens) + 1, sizeof(char*))) == NULL) + return (NULL); + i = 0; + while (tokens != NULL) + { + ret[i++] = token_content(tokens); + tokens = tokens->next; + } + ft_lstdestroy(&tokens, free); + return (ret); +} -// FIXME field split space before/after when arg not sticked char **preprocess(t_ftlst **tokens, t_env env) { t_ftlst *curr; @@ -91,45 +128,24 @@ char **preprocess(t_ftlst **tokens, t_env env) if (token_tag(curr) & TAG_STR) { t_ftlst *fields = st_field_split(match); - /* printf("fields \n"); */ - /* ft_lstiter(fields, token_debug); */ - /* printf("f %p\n", fields); */ - /* printf("f %s\n", token_content(fields)); */ len = ft_strlen(token_content(ft_lstlast(fields))); - /* printf("l %d\n", len); */ - /* printf("prev %d\n", prev_tag & TAG_STICK); */ if (!(prev_tag & TAG_STICK) && *before == '\0' && *token_content(fields) == '\0') - { - /* printf("yo\n"); */ - ft_lstpop_front(&fields, NULL); - } + ft_lstpop_front(&fields, (void (*)(void*))token_destroy); if (!(token_tag(curr) & TAG_STICK) && *after == '\0' && *token_content(ft_lstlast(fields)) == '\0') - ft_lstpop_back(&fields, NULL); - /* ft_lstiter(fields, token_debug); */ + ft_lstpop_back(&fields, (void (*)(void*))token_destroy); if (fields == NULL) - // delete curr + // delete curr? ; else if (fields->next == NULL) { - /* printf("yo\n"); */ token_set_content(curr, ft_strjoin3(before, token_content(fields), after)); i += len - 1; } else { - - /* - ** A=' bonjour je suis ' - ** echo $A - ** curr = $A - ** fs = '' 'bonjour' 'je' 'suis' '' - */ - - /* if (*before != '\0' && */ - token_set_content(curr, ft_strjoin(before, token_content(fields))); token_set_content(ft_lstlast(fields), ft_strjoin(token_content(ft_lstlast(fields)), after)); @@ -140,63 +156,22 @@ char **preprocess(t_ftlst **tokens, t_env env) curr->next = tmp; i = len - 1; str = token_content(curr); - /* printf("%d\n", i); */ - /* i += len - 1; */ - /* printf("%d\n", i); */ - /* printf("> |%s|\n", str); */ - /* printf(">> |%s|\n", str + i); */ } } else if (token_tag(curr) & TAG_STR_DOUBLE) { token_set_content(curr, ft_strjoin3(before, match, after)); - /* printf(">%s< %d\n", match, ft_strlen(match)); */ i += ft_strlen(match) - 1; - /* printf("> %zu %s\n", i, str); */ } } } } prev_tag = token_tag(curr); curr = curr->next; - /* if (curr != NULL) */ - /* { */ - /* prev_tag = token_tag(curr); */ - /* token_debug(curr->data); */ - /* } */ } - /* printf("=====================AFTER\n"); */ - /* ft_lstiter(*tokens, token_debug); */ - - curr = *tokens; - while (curr != NULL) - { - // curr->next shouldn't be null - if (token_tag(curr) & TAG_STICK) - { - token_set_content(curr, ft_strjoinf_fst(token_content(curr), token_content(curr->next))); - t_ftlst *tmp = curr->next->next; - token_set_tag(curr, token_tag(curr->next)); - ft_lstdelone(curr->next, free); - curr->next = tmp; - continue; - } - curr = curr->next; - } - - char **ret = malloc(sizeof(char*) * (ft_lstsize(*tokens) + 1)); - curr = *tokens; - size_t i = 0; - while (curr != NULL) - { - ret[i] = token_content(curr); - i++; - curr = curr->next; - } - ret[i] = NULL; - ft_lstdestroy(tokens, NULL); - return ret; + st_stick_tokens(*tokens); + return (st_tokens_to_argv(*tokens)); } // need to free tokens diff --git a/src/utils.c b/src/utils.c index a0771db..ce05d7c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -6,7 +6,7 @@ /* By: cacharle <cacharle@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:56:31 by cacharle #+# #+# */ -/* Updated: 2020/08/19 17:50:43 by charles ### ########.fr */ +/* Updated: 2020/08/20 14:45:14 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -97,31 +97,3 @@ void print_prompt(void) printf("\033[0;32m%s\033[0m$ ", getcwd(NULL, 0)); fflush(stdout); } - -char **ms_split_notrim(const char *s, char c) -{ - t_ftvec *ret; - char *match; - - if ((ret = ft_vecnew(16)) == NULL) - return (NULL); - while (*s != '\0') - { - if ((match = ft_strchr(s, c)) == NULL) - { - if (ft_vecpush_safe(ret, ft_strdup(s)) == NULL) - return (ft_vecdestroy(ret, free)); - break; - } - if (ft_vecpush_safe(ret, ft_strndup(s, match - s)) == NULL) - return (ft_vecdestroy(ret, free)); - while (*++match == c) - ; - s = match; - if (*s == '\0' && ft_vecpush_safe(ret, ft_strdup(s)) == NULL) - return (ft_vecdestroy(ret, free)); - } - if (ft_vecpush(ret, NULL) == NULL) - return (ft_vecdestroy(ret, free)); - return ((char**)ft_vecunwrap(ret)); -} |
