From 9dca7dc98e46d5b29e236f2970072ffaf582e13e Mon Sep 17 00:00:00 2001 From: nass1pro Date: Sun, 12 Apr 2020 17:53:30 +0200 Subject: Added lexer draft --- include/lexer.h | 10 ++++++ src/.DS_Store | Bin 0 -> 6148 bytes src/lexer/lexer.c | 19 +++++++++++ src/lexer/lexer_count_nb_element.c | 31 ++++++++++++++++++ src/lexer/lexer_len_element_and_mall.c | 57 +++++++++++++++++++++++++++++++++ src/lexer/lexer_utils.c | 28 ++++++++++++++++ src/lexer/main.c | 15 +++++++++ src/parse/lexer.c | 15 +++++++-- src/parse/parse.c | 12 +++---- 9 files changed, 178 insertions(+), 9 deletions(-) create mode 100644 include/lexer.h create mode 100644 src/.DS_Store create mode 100644 src/lexer/lexer.c create mode 100644 src/lexer/lexer_count_nb_element.c create mode 100644 src/lexer/lexer_len_element_and_mall.c create mode 100644 src/lexer/lexer_utils.c create mode 100644 src/lexer/main.c diff --git a/include/lexer.h b/include/lexer.h new file mode 100644 index 0000000..e7a6cdf --- /dev/null +++ b/include/lexer.h @@ -0,0 +1,10 @@ + +#include "minishell.h" + +char **lexer(char *input); +int lexer_sep(char input); +int lexer_verif_entre_cote(char *input, int i); +int lexer_verif_entre_cote22(char *input, int i); +int lexer_count_nb_element(char *input); +int lexer_count_len_element(char *input, int i); +char **lexer_malloc_len_elem(char *input, int i, char **out); diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..cd95961 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c new file mode 100644 index 0000000..7332b86 --- /dev/null +++ b/src/lexer/lexer.c @@ -0,0 +1,19 @@ + +#include "lexer.h" + + +char **lexer(char *input) +{ + char **out; + int i; + + if (!input) + return (0); + i = lexer_count_nb_element(input); + if (!(out = malloc(sizeof(char *) * i + 1))) + return (0); + out[i + 1] = NULL; + out = lexer_malloc_len_elem(input,i, out); + return(out); + +} diff --git a/src/lexer/lexer_count_nb_element.c b/src/lexer/lexer_count_nb_element.c new file mode 100644 index 0000000..1455d5e --- /dev/null +++ b/src/lexer/lexer_count_nb_element.c @@ -0,0 +1,31 @@ + +#include "lexer.h" + +int lexer_count_nb_element(char *input) +{ + int i; + int j; + + i = 0; + j = 1; + while(input[i] != '\0') + { + if (lexer_sep(input[i]) || input[i] == '"' || input[i] == '\'') + { + if (input[i] == '"' || input[i] == '\'') + { + i = lexer_verif_entre_cote(input,i); + j++; + } + if (lexer_sep(input[i])) + { + while (lexer_sep(input[i]) || input[i] == ' ') + ++i; + j++; + } + j++; + } + i++; + } + return (j); +} diff --git a/src/lexer/lexer_len_element_and_mall.c b/src/lexer/lexer_len_element_and_mall.c new file mode 100644 index 0000000..30ebc7b --- /dev/null +++ b/src/lexer/lexer_len_element_and_mall.c @@ -0,0 +1,57 @@ + +#include "lexer.h" + +int lexer_count_len_element(char *input, int i) +{ + int j = -1; + if (input[i] == '"' || input[i] == '\'') + { + return(j = lexer_verif_entre_cote(input,i)); + } + else if (lexer_sep(input[i]) || input[i] == ' ') + { + while(lexer_sep(input[i]) || input[i] == ' ') + { + if(input[j] == '\0') + return(j); + ++i; + ++j; + } + } + else + { + while (!lexer_sep(input[i]) && input[i] != ' ') + { + if(input[j] == '\0') + return(j); + ++i; + ++j; + } + } + ++j; + return(j); +} + +char **lexer_malloc_len_elem(char *input, int i, char **out) +{ + int j = 0; + int k = 0; + int temp = 0; + + j += lexer_count_len_element(&input[j], 0); + k = j; + out[temp] = malloc(sizeof(char) * k); + ft_strlcpy(out[temp], input, k + 1); + while (input[j] != '\0') + { + temp++; + j += lexer_count_len_element(&input[j], 0); + k -= j; + if (k < 0) + k *= -1; + out[temp] = malloc(sizeof(char) * j - k + 1); + ft_strlcpy(out[temp], &input[j - k], k + 1); + k = j; + } + return(out); +} diff --git a/src/lexer/lexer_utils.c b/src/lexer/lexer_utils.c new file mode 100644 index 0000000..f028113 --- /dev/null +++ b/src/lexer/lexer_utils.c @@ -0,0 +1,28 @@ + +#include "lexer.h" + +int lexer_sep(char input) +{ + char *sep; + int i; + + i = 0; + sep = ";&<>|"; + while(sep[i] != '\0') + { + if(sep[i] == input) + return(1); + i++; + } + return (0); +} + +int lexer_verif_entre_cote(char *input, int i) +{ + while((input[++i] != '"' || input[i] == '\'') && (input[i] != '\0')) + ; + i++; + if(input[i] == '"' || input[i] == '\'') + return(lexer_verif_entre_cote(input, i)); + return(i); +} diff --git a/src/lexer/main.c b/src/lexer/main.c new file mode 100644 index 0000000..b660f55 --- /dev/null +++ b/src/lexer/main.c @@ -0,0 +1,15 @@ + +#include "lexer.h" + +int main(void) +{ + char **out; + int i = -1; + + out = lexer("\"echo\" \"* login_x\"<