aboutsummaryrefslogtreecommitdiff
path: root/src/lexer
diff options
context:
space:
mode:
authornass1pro <nass1pro@gmail.com>2020-04-12 17:53:30 +0200
committerCharles <sircharlesaze@gmail.com>2020-06-09 10:53:38 +0200
commit9dca7dc98e46d5b29e236f2970072ffaf582e13e (patch)
treeba7b93052ff9d01c549ad5d16e7ba66daeacd686 /src/lexer
parentf66cb8f28a2779159baeef6ea91a7684d59cc295 (diff)
downloadminishell-9dca7dc98e46d5b29e236f2970072ffaf582e13e.tar.gz
minishell-9dca7dc98e46d5b29e236f2970072ffaf582e13e.tar.bz2
minishell-9dca7dc98e46d5b29e236f2970072ffaf582e13e.zip
Added lexer draft
Diffstat (limited to 'src/lexer')
-rw-r--r--src/lexer/lexer.c19
-rw-r--r--src/lexer/lexer_count_nb_element.c31
-rw-r--r--src/lexer/lexer_len_element_and_mall.c57
-rw-r--r--src/lexer/lexer_utils.c28
-rw-r--r--src/lexer/main.c15
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);
+}