diff options
Diffstat (limited to 'src/lexer')
| -rw-r--r-- | src/lexer/lexer.c | 29 | ||||
| -rw-r--r-- | src/lexer/tok_lst.c | 24 | ||||
| -rw-r--r-- | src/lexer/tok_lst_wrapper.c | 34 | ||||
| -rw-r--r-- | src/lexer/trim.c | 62 | ||||
| -rw-r--r-- | src/lexer/utils.c | 21 |
5 files changed, 89 insertions, 81 deletions
diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index 5df63ba..749450b 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -6,14 +6,19 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/07/16 08:18:25 by nahaddac #+# #+# */ -/* Updated: 2020/10/09 15:12:51 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:35:03 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" #include <stdio.h> -int len_until_sep(char *input) +static int st_lexer_sep(char c) +{ + return (ft_strchr(";&|><()", c) != NULL); +} + +static int st_len_until_sep(char *input) { int i; @@ -26,10 +31,10 @@ int len_until_sep(char *input) if (ft_isblank(input[i])) return (i + 1 + lexer_space(&input[i + 1])); else if (input[i] != '\'' || input[i] != '"') - i += len_until_sep(&input[i]); + i += st_len_until_sep(&input[i]); return (i); } - if (lexer_sep(input[i])) + if (st_lexer_sep(input[i])) return (i); if (input[i] == '\'' || input[i] == '"') return (i); @@ -39,19 +44,19 @@ int len_until_sep(char *input) return (i); } -int tok_len(char *input) +static int st_tok_len(char *input) { int i; i = 0; - if (input[i] == '\\' && lexer_sep(input[i + 1])) + if (input[i] == '\\' && st_lexer_sep(input[i + 1])) { i += 2; return (i + lexer_space(&input[i])); } if (input[i] == '(' || input[i] == ')') return (i + 1); - if (lexer_sep(input[i])) + if (st_lexer_sep(input[i])) { if (input[i] != ';' && input[i] == input[i + 1]) i++; @@ -61,7 +66,7 @@ int tok_len(char *input) return (quote_len(input, i)); if (ft_isblank(input[i])) return (i + 1 + lexer_space(&input[i + 1])); - return (len_until_sep(&input[i])); + return (st_len_until_sep(&input[i])); } /* @@ -72,7 +77,7 @@ int tok_len(char *input) ** return all token */ -t_tok_lst *create_token_list(char *input, t_tok_lst **lst) +static t_tok_lst *st_create_token_list(char *input, t_tok_lst **lst) { t_tok_lst *tok; size_t i; @@ -83,7 +88,7 @@ t_tok_lst *create_token_list(char *input, t_tok_lst **lst) i = 0; while (i < len) { - j = tok_len(&input[i]); + j = st_tok_len(&input[i]); tok = tok_lst_new_until(0, input + i, j); tok->tag = tok_assign_tag(tok->content); if (tok->tag == 0) @@ -103,12 +108,12 @@ t_tok_lst *create_token_list(char *input, t_tok_lst **lst) ** \return The created tokens or NULL on error */ -int lexer(char *input, t_tok_lst **out) +int lexer(char *input, t_tok_lst **out) { int status; *out = NULL; - *out = create_token_list(input, out); + *out = st_create_token_list(input, out); status = lexer_trim(*out); return (status); } diff --git a/src/lexer/tok_lst.c b/src/lexer/tok_lst.c index 89ab120..ac8ca4a 100644 --- a/src/lexer/tok_lst.c +++ b/src/lexer/tok_lst.c @@ -6,7 +6,7 @@ /* By: charles <me@cacharle.xyz> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/08/27 09:32:58 by charles #+# #+# */ -/* Updated: 2020/10/09 15:14:38 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:15:34 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,11 +45,6 @@ t_tok_lst *tok_lst_new_until( return (ret); } -void tok_lst_push_back(t_tok_lst **tokens, t_tok_lst *pushed) -{ - ft_lstpush_back((t_ftlst**)tokens, (t_ftlst*)pushed); -} - t_tok_lst *tok_lst_push_front( t_tok_lst **tokens, t_tok_lst *pushed) { @@ -59,23 +54,6 @@ t_tok_lst *tok_lst_push_front( return (*tokens); } -void tok_lst_pop_front( - t_tok_lst **tokens, void (*del)(void*)) -{ - ft_lstpop_front((t_ftlst**)tokens, del); -} - -void *tok_lst_destroy(t_tok_lst **tokens, void (*del)(void*)) -{ - ft_lstdestroy((t_ftlst**)tokens, del); - return (NULL); -} - -t_tok_lst *tok_lst_last(t_tok_lst *tokens) -{ - return ((t_tok_lst*)ft_lstlast((t_ftlst*)tokens)); -} - t_tok_lst *tok_lst_uncons(t_tok_lst **tokens) { t_tok_lst *poped; diff --git a/src/lexer/tok_lst_wrapper.c b/src/lexer/tok_lst_wrapper.c new file mode 100644 index 0000000..2852451 --- /dev/null +++ b/src/lexer/tok_lst_wrapper.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tok_lst_wrapper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <me@cacharle.xyz> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/10/10 08:15:38 by cacharle #+# #+# */ +/* Updated: 2020/10/10 08:17:04 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lexer.h" + +void tok_lst_push_back(t_tok_lst **tokens, t_tok_lst *pushed) +{ + ft_lstpush_back((t_ftlst **)tokens, (t_ftlst *)pushed); +} + +void tok_lst_pop_front(t_tok_lst **tokens, void (*del)(void *)) +{ + ft_lstpop_front((t_ftlst **)tokens, del); +} + +void *tok_lst_destroy(t_tok_lst **tokens, void (*del)(void *)) +{ + ft_lstdestroy((t_ftlst **)tokens, del); + return (NULL); +} + +t_tok_lst *tok_lst_last(t_tok_lst *tokens) +{ + return ((t_tok_lst *)ft_lstlast((t_ftlst *)tokens)); +} diff --git a/src/lexer/trim.c b/src/lexer/trim.c index d0ba90a..efc5171 100644 --- a/src/lexer/trim.c +++ b/src/lexer/trim.c @@ -6,13 +6,13 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/07/16 08:18:36 by nahaddac #+# #+# */ -/* Updated: 2020/10/09 15:17:45 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:32:41 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -void del_space(char *str) +static void st_del_space(char *str) { int i; @@ -30,50 +30,46 @@ void del_space(char *str) } } -int del_quote(char *str) +static size_t st_count_quote(char *str) { - size_t i; - size_t quote_counter; + char quote_char; + size_t counter; - i = 0; - quote_counter = 1; - if (str[0] == '\'') - { - while (str[i++] != '\0') - { - if (str[i] == '\'') - { - quote_counter++; - break ; - } - } - } - else if (str[0] == '"') + if (*str != '\'' && *str != '"') + return (0); + quote_char = *str; + counter = 1; + str++; + while (*str != '\0') { - while (str[i++] != '\0') + if (quote_char == '"' && *str == '\\') + str += 2; + if (*str == quote_char) { - if (str[i] == '\\') - i += 2; - if (str[i] == '"') - { - quote_counter++; - break ; - } + counter++; + *str = '\0'; + break ; } + str++; } - else - return (0); + return (counter); +} + +static int st_del_quote(char *str) +{ + size_t quote_counter; + + quote_counter = st_count_quote(str); if (quote_counter % 2 == 1) { errorf("unexpected EOF while looking for matching `%c'\n", str[0]); return (2); } - str[i] = '\0'; ft_memmove(str, str + 1, ft_strlen(str + 1) + 1); return (0); } -int lexer_trim(t_tok_lst *tokens) +int lexer_trim(t_tok_lst *tokens) { int status; @@ -81,14 +77,14 @@ int lexer_trim(t_tok_lst *tokens) { if (tokens->tag & (TAG_STR_DOUBLE | TAG_STR_SINGLE)) { - if ((status = del_quote(tokens->content)) != 0) + if ((status = st_del_quote(tokens->content)) != 0) return (status); if (tokens->next == NULL) tokens->tag &= ~TAG_STICK; } else { - del_space(tokens->content); + st_del_space(tokens->content); if (tokens->next == NULL) tokens->tag &= ~TAG_STICK; } diff --git a/src/lexer/utils.c b/src/lexer/utils.c index 624b460..0d8080c 100644 --- a/src/lexer/utils.c +++ b/src/lexer/utils.c @@ -6,13 +6,13 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/07/16 08:18:15 by nahaddac #+# #+# */ -/* Updated: 2020/10/09 15:24:31 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 08:38:46 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -enum e_tok tok_assign_tag(char *content) +enum e_tok tok_assign_tag(char *content) { if (content[0] == ';') return (TAG_END); @@ -41,9 +41,9 @@ enum e_tok tok_assign_tag(char *content) ** a la fin (char *)tk->tok ne figure pas d'espace. */ -enum e_tok tok_assign_stick(t_tok_lst *tok) +static enum e_tok st_tok_assign_stick(t_tok_lst *tok) { - int i; + int i; i = ft_strlen(tok->content); if (i > 0 && ft_isblank(tok->content[i - 1])) @@ -57,7 +57,7 @@ enum e_tok tok_assign_stick(t_tok_lst *tok) ** \note the loop after ft_strpbrk is to search again if the quote was escaped */ -enum e_tok tok_assign_str(t_tok_lst *tok) +enum e_tok tok_assign_str(t_tok_lst *tok) { char *found; @@ -70,20 +70,15 @@ enum e_tok tok_assign_str(t_tok_lst *tok) tok->tag = TAG_STR_SINGLE; else if (*found == '"') tok->tag = TAG_STR_DOUBLE; - return (tok_assign_stick(tok)); + return (st_tok_assign_stick(tok)); } -int lexer_sep(char c) -{ - return (ft_strchr(";&|><()", c) != NULL); -} - -int lexer_space(char *input) +int lexer_space(char *input) { return (ft_strspn(input, " \t")); } -int quote_len(char *input, int i) +int quote_len(char *input, int i) { char quote_type; |
