aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/builtin/exit.c6
-rw-r--r--src/eval/cmd.c108
-rw-r--r--src/preprocess.c143
-rw-r--r--src/utils.c30
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));
-}