diff options
Diffstat (limited to 'src/lexer')
| -rw-r--r-- | src/lexer/lexer.c | 19 | ||||
| -rw-r--r-- | src/lexer/lexer_count_nb_element.c | 31 | ||||
| -rw-r--r-- | src/lexer/lexer_len_element_and_mall.c | 57 | ||||
| -rw-r--r-- | src/lexer/lexer_utils.c | 28 | ||||
| -rw-r--r-- | src/lexer/main.c | 15 |
5 files changed, 150 insertions, 0 deletions
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\"<<AUTHORS; echo && ; salut;\"echo\"\"* login_x\""); + //out = lexer("echo * login_x << AUTHORS&&cd Desktop"); + while(out[++i]) + printf("%s\n", out[i]);; + exit(0); + return (0); +} |
