From 83c82a8b7248752ce3956c28f8792628c203c5bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 19 May 2020 14:32:44 +0200 Subject: [PATCH 01/46] init of parser branch --- src/redirections/redirection_manager.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/redirections/redirection_manager.c b/src/redirections/redirection_manager.c index 4cfd1ab..ae2a937 100644 --- a/src/redirections/redirection_manager.c +++ b/src/redirections/redirection_manager.c @@ -93,6 +93,11 @@ int command_format_is_invalid(char **cmds, env_t *env, int *return_values) return (0); } +int parser() +{ + //did this for init commit +} + int eval_raw_cmd(char *cmd, env_t *env) { int *return_values = NULL; From 5c49a0947baa7a9c6a2cb91b4c7b72bdc3684362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 19 May 2020 19:21:42 +0200 Subject: [PATCH 02/46] implementing simple quotes --- Makefile | 2 ++ src/parser/parser.c | 22 +++++++++++++++ src/parser/quotes.c | 37 ++++++++++++++++++++++++++ src/redirections/redirection_manager.c | 5 ---- 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 src/parser/parser.c create mode 100644 src/parser/quotes.c diff --git a/Makefile b/Makefile index 21e5060..d57a83c 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,8 @@ SRC = src/shell.c \ src/utility/fusion.c \ src/utility/split_commands.c \ src/utility/get_return.c \ + src/parser/parser.c \ + src/parser/quotes.c OBJ = $(SRC:%.c=%.o) OBJ += src/main.o diff --git a/src/parser/parser.c b/src/parser/parser.c new file mode 100644 index 0000000..4408d0b --- /dev/null +++ b/src/parser/parser.c @@ -0,0 +1,22 @@ +/* +** EPITECH PROJECT, 2020 +** PSU_minishell2_2019 +** File description: +** redirections +*/ + + +#include "shell.h" +#include "redirections.h" +#include +#include +#include +#include +#include +#include "utility.h" +#include "builtin.h" + +int parse_input(char *cmd) +{ + char *ret; +} \ No newline at end of file diff --git a/src/parser/quotes.c b/src/parser/quotes.c new file mode 100644 index 0000000..b019734 --- /dev/null +++ b/src/parser/quotes.c @@ -0,0 +1,37 @@ +/* +** EPITECH PROJECT, 2020 +** PSU_minishell2_2019 +** File description: +** redirections +*/ + + +#include "shell.h" +#include "redirections.h" +#include +#include +#include +#include +#include +#include +#include "utility.h" +#include "builtin.h" + +// takes only the data beetween 2 quotes (for now) +int parse_quotes(char *ptr, char **data) +{ + int length = 0; + + for (; ptr[length]; length++) + if (ptr[length] == '\'') + break; + if (ptr[length] != '\'') { + dprintf(2, "Unmatched '''.\n"); + return (-1); + } + *data = strndup(&ptr[1], length); + if (!(*data)) + return (-1); + (*data)[length - 1] = '\0'; + return (length); +} \ No newline at end of file diff --git a/src/redirections/redirection_manager.c b/src/redirections/redirection_manager.c index ae2a937..4cfd1ab 100644 --- a/src/redirections/redirection_manager.c +++ b/src/redirections/redirection_manager.c @@ -93,11 +93,6 @@ int command_format_is_invalid(char **cmds, env_t *env, int *return_values) return (0); } -int parser() -{ - //did this for init commit -} - int eval_raw_cmd(char *cmd, env_t *env) { int *return_values = NULL; From 66309a9a26d8e3aa647e738102f41275b0ac8f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 20 May 2020 01:41:46 +0200 Subject: [PATCH 03/46] adding parser.h and starting parse_input --- include/parser.h | 17 +++++++++++++++++ include/redirections.h | 1 - src/parser/parser.c | 24 ++++++++++++++++++++++-- src/parser/quotes.c | 4 ++-- src/prompt.c | 2 ++ 5 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 include/parser.h diff --git a/include/parser.h b/include/parser.h new file mode 100644 index 0000000..bfcade9 --- /dev/null +++ b/include/parser.h @@ -0,0 +1,17 @@ +/* +** EPITECH PROJECT, 2020 +** PSU_minishell2_2019 +** File description: +** redirections +*/ + +#pragma once + +#include "shell.h" + +typedef struct parser_map { + char *key; + int (*parser)(char *, char **); +} parser_map; + +int parse_quotes(char *ptr, char **data); \ No newline at end of file diff --git a/include/redirections.h b/include/redirections.h index 6fd2731..5afd39b 100644 --- a/include/redirections.h +++ b/include/redirections.h @@ -18,7 +18,6 @@ typedef enum redirection_type { EX_PIPE = 1 << 3 } redirection_type; - typedef struct redirection_map { char *key; int (*get_fd)(redirection *); diff --git a/src/parser/parser.c b/src/parser/parser.c index 4408d0b..73765ad 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -14,9 +14,29 @@ #include #include #include "utility.h" +#include "parser.h" #include "builtin.h" -int parse_input(char *cmd) +const parser_map parsers[] = { + {"'", &parse_quotes}, + {NULL, NULL} +}; + +char **parse_input(char *cmd) { - char *ret; + char *data; + char **ret = malloc(sizeof(char *) * 2); + int return_val = 0; + int inc = 0; + + for (int i = 0; cmd[i]; i++) { + for (int j = 0; parsers[j].key; j++) { + if (cmd[i] == parsers[j].key) + return_val = parsers[j].parser(&cmd[i], &data); + if (return_val == -1) + return (NULL); + ret[inc++] = data; + i += return_val; + } + } } \ No newline at end of file diff --git a/src/parser/quotes.c b/src/parser/quotes.c index b019734..cf76dab 100644 --- a/src/parser/quotes.c +++ b/src/parser/quotes.c @@ -23,9 +23,9 @@ int parse_quotes(char *ptr, char **data) int length = 0; for (; ptr[length]; length++) - if (ptr[length] == '\'') + if (ptr[length] == ' ') break; - if (ptr[length] != '\'') { + if (ptr[length] != '\'' && ptr[length] != ' ') { dprintf(2, "Unmatched '''.\n"); return (-1); } diff --git a/src/prompt.c b/src/prompt.c index 54487ac..1c231e6 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -38,6 +38,8 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env) perror("mysh"); return (-1); } + for (int i = 0; argv[i]; i++) + printf("argv[%i] : %s\n", i , argv[i]); if (!argv[0]) return (0); argv = globbing(argv); From 04403899b834ec1e046b76185c40c1045e4a49ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 20 May 2020 11:24:46 +0200 Subject: [PATCH 04/46] starting the inhibitors --- src/parser/parser.c | 65 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index 73765ad..1943377 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -22,21 +22,66 @@ const parser_map parsers[] = { {NULL, NULL} }; -char **parse_input(char *cmd) +/*char **parse_input(char *cmd) { char *data; - char **ret = malloc(sizeof(char *) * 2); + char **ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); int return_val = 0; int inc = 0; + char *ptr = cmd; + int inc_for = 1; - for (int i = 0; cmd[i]; i++) { - for (int j = 0; parsers[j].key; j++) { - if (cmd[i] == parsers[j].key) - return_val = parsers[j].parser(&cmd[i], &data); - if (return_val == -1) - return (NULL); - ret[inc++] = data; - i += return_val; + for (int i = 0; cmd[i]; i++, inc_for++) { + if (cmd[i] >= 33 && cmd[i] <= 126) + continue; + if (inc_for == 1) { + inc_for = 0; + continue; } + } +}*/ + +bool is_character_valid(char c) +{ + static bool is_valid = false; + + if (is_valid) { + is_valid = false; + return (true); + } + if (c == '\\') { + is_valid = true; + } + if (c >= 33 && c <= 126) + return (true); + return (false); +} + +char **parse_input(char *cmd) +{ + int size = strlen(cmd); + char **ret = malloc(sizeof(char *) * (size + 1)); + char *ptr = cmd; + int ret_inc = 0; + char *new; + + for (int i = 0, inc = 1; i <= size; i++, inc++) { + if (is_character_valid(cmd[i])) + continue; + if (inc == 1) { + ptr = cmd + i + 1; + inc = 0; + continue; + } + new = strndup(ptr, inc); + if (!new) + return (NULL); + new[strlen(new) - 1] = '\0'; + ret[ret_inc++] = new; + ptr = cmd + i + 1; + inc = 0; + } + ret[ret_inc] = NULL; + return (ret); } \ No newline at end of file From 9de01be5d18eb08c3e18d3471929787471630aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 20 May 2020 12:12:07 +0200 Subject: [PATCH 05/46] inhibitors working but pre process made by aliases makes some limits --- include/parser.h | 1 + src/parser/parser.c | 3 ++- src/prompt.c | 8 +++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/parser.h b/include/parser.h index bfcade9..a7618e8 100644 --- a/include/parser.h +++ b/include/parser.h @@ -14,4 +14,5 @@ typedef struct parser_map { int (*parser)(char *, char **); } parser_map; +char **parse_input(char *cmd); int parse_quotes(char *ptr, char **data); \ No newline at end of file diff --git a/src/parser/parser.c b/src/parser/parser.c index 1943377..30a4ea8 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -10,6 +10,7 @@ #include "redirections.h" #include #include +#include #include #include #include @@ -77,7 +78,7 @@ char **parse_input(char *cmd) new = strndup(ptr, inc); if (!new) return (NULL); - new[strlen(new) - 1] = '\0'; + new[inc - 1] = '\0'; ret[ret_inc++] = new; ptr = cmd + i + 1; inc = 0; diff --git a/src/prompt.c b/src/prompt.c index 1c231e6..5317e2e 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -10,6 +10,7 @@ #include "shell.h" #include "builtin.h" #include "redirections.h" +#include "parser.h" #include "utility.h" #include #include @@ -32,8 +33,13 @@ const builtin builtins[] = { int prompt_run(char *cmd, redirection *inout[2], env_t *env) { - char **argv = get_argv(cmd); + //char **argv = get_argv(cmd); + char **argv = parse_input(cmd); + for (int i = 0; argv[i]; i++) { + printf("'%s'\n", argv[i]); + } + return (0); if (!argv) { perror("mysh"); return (-1); From d9af127e4b3851be2d66326c04f25fcb9b67e0fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 20 May 2020 12:29:15 +0200 Subject: [PATCH 06/46] starting to implement main architecture to parse --- src/parser/parser.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index 30a4ea8..2b48225 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -59,6 +59,22 @@ bool is_character_valid(char c) return (false); } +char *manage_specials_parsers(char *cmd, int index) +{ + char *data; + int new_index = 0; + + for (int i = 0; parsers[i].key; i++) { + if (cmd[index] != parsers[i].key) + continue; + new_index = parsers[i].parser(&cmd[index], &data); + if (new_index == -1) + return (NULL); + return (data); + } + return (NULL); +} + char **parse_input(char *cmd) { int size = strlen(cmd); @@ -66,10 +82,19 @@ char **parse_input(char *cmd) char *ptr = cmd; int ret_inc = 0; char *new; + char *data; + int size_data; for (int i = 0, inc = 1; i <= size; i++, inc++) { - if (is_character_valid(cmd[i])) + if (is_character_valid(cmd[i])) { + data = manage_specials_parsers(cmd, i); + if (!data) + continue; + size_data = strlen(data); + i += size_data + 1; + inc += size_data + 1; continue; + } if (inc == 1) { ptr = cmd + i + 1; inc = 0; From 5e9e0b09be4a48102b4a85e8bc08db067ff33cab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 00:42:03 +0200 Subject: [PATCH 07/46] parsing working fine with inhibitors --- include/parser.h | 2 +- src/parser/parser.c | 100 +++++++++++++++++++++++++------------------- 2 files changed, 59 insertions(+), 43 deletions(-) diff --git a/include/parser.h b/include/parser.h index a7618e8..405e584 100644 --- a/include/parser.h +++ b/include/parser.h @@ -10,7 +10,7 @@ #include "shell.h" typedef struct parser_map { - char *key; + char key; int (*parser)(char *, char **); } parser_map; diff --git a/src/parser/parser.c b/src/parser/parser.c index 2b48225..f73344e 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -19,29 +19,25 @@ #include "builtin.h" const parser_map parsers[] = { - {"'", &parse_quotes}, - {NULL, NULL} + {'\'', &parse_quotes}, + {'\0', NULL} }; -/*char **parse_input(char *cmd) +char *strcat_realloc(char *dest, char *src) { - char *data; - char **ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); - int return_val = 0; - int inc = 0; - char *ptr = cmd; - int inc_for = 1; - - for (int i = 0; cmd[i]; i++, inc_for++) { - if (cmd[i] >= 33 && cmd[i] <= 126) - continue; - if (inc_for == 1) { - inc_for = 0; - continue; - } - + if (dest) { + dest = realloc(dest, sizeof(char) * (strlen(dest) + strlen(src) + 1)); + if (!dest) + return (NULL); + } else { + dest = malloc(sizeof(char) * (strlen(src) + 1)); + if (!dest) + return (NULL); + dest[0] = '\0'; } -}*/ + strcat(dest, src); + return (dest); +} bool is_character_valid(char c) { @@ -59,40 +55,60 @@ bool is_character_valid(char c) return (false); } -char *manage_specials_parsers(char *cmd, int index) +int manage_specials_parsers(char *cmd, int index, char **data) { - char *data; int new_index = 0; for (int i = 0; parsers[i].key; i++) { if (cmd[index] != parsers[i].key) continue; - new_index = parsers[i].parser(&cmd[index], &data); - if (new_index == -1) - return (NULL); - return (data); + new_index = parsers[i].parser(&cmd[index], data); + return (new_index); } - return (NULL); + return (0); +} + +int is_a_special_parser(char *cmd, int index, char **data) +{ + +} + +char *add_to_buffer(char *buffer, char *ptr, int nb) +{ + char *new = strndup(ptr, nb + 1); + + if (!new) + return (NULL); + new[nb - 2] = '\0'; + buffer = strcat_realloc(buffer, new); + free(new); + return (buffer); } char **parse_input(char *cmd) { - int size = strlen(cmd); - char **ret = malloc(sizeof(char *) * (size + 1)); + char **ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); char *ptr = cmd; int ret_inc = 0; - char *new; - char *data; - int size_data; + char *buffer = NULL; + char *data = NULL; + int new_index = 0; - for (int i = 0, inc = 1; i <= size; i++, inc++) { + for (int i = 0, inc = 1; i <= (int)strlen(cmd); i++, inc++) { if (is_character_valid(cmd[i])) { - data = manage_specials_parsers(cmd, i); - if (!data) - continue; - size_data = strlen(data); - i += size_data + 1; - inc += size_data + 1; + new_index = manage_specials_parsers(cmd, i, &data); + if (new_index == -1) + return (NULL); + i += new_index; + if (new_index > 0) { + buffer = add_to_buffer(buffer, ptr, inc + 1); + buffer = add_to_buffer(buffer, data, strlen(data)); + free(data); + inc = 1; + ptr = cmd + i + 1; + if (!buffer) + return (NULL); + } continue; } if (inc == 1) { @@ -100,11 +116,11 @@ char **parse_input(char *cmd) inc = 0; continue; } - new = strndup(ptr, inc); - if (!new) + buffer = add_to_buffer(buffer, ptr, inc + 1); + if (!buffer) return (NULL); - new[inc - 1] = '\0'; - ret[ret_inc++] = new; + ret[ret_inc++] = buffer; + buffer = NULL; ptr = cmd + i + 1; inc = 0; } From 7fbe6a372b79218200f6cb2b35f15586036ae86c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 00:53:53 +0200 Subject: [PATCH 08/46] trying to make parse_input norm compliant --- src/parser/parser.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index f73344e..58e2643 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -55,22 +55,37 @@ bool is_character_valid(char c) return (false); } -int manage_specials_parsers(char *cmd, int index, char **data) +int call_parsers(char *cmd, int index, char **data) { int new_index = 0; for (int i = 0; parsers[i].key; i++) { if (cmd[index] != parsers[i].key) continue; - new_index = parsers[i].parser(&cmd[index], data); + new_index = parsers[i].parser(&cmd[index], &data); return (new_index); } return (0); } -int is_a_special_parser(char *cmd, int index, char **data) +int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char **ptr) { + int new_index = 0; + char *data = NULL; + new_index = call_parsers(cmd, index, &data); + if (new_index == -1) + return (-1); + if (new_index > 0) { + *buffer = add_to_buffer(*buffer, *ptr, (*inc) + 1); + *buffer = add_to_buffer(*buffer, *data, strlen(*data)); + free(data); + *inc = 1; + *ptr = cmd + index + 1; + if (!(*buffer)) + return (-1); + } + return (0); } char *add_to_buffer(char *buffer, char *ptr, int nb) @@ -91,24 +106,16 @@ char **parse_input(char *cmd) char *ptr = cmd; int ret_inc = 0; char *buffer = NULL; - char *data = NULL; int new_index = 0; + if (!ret) + return (NULL); for (int i = 0, inc = 1; i <= (int)strlen(cmd); i++, inc++) { if (is_character_valid(cmd[i])) { - new_index = manage_specials_parsers(cmd, i, &data); + new_index = manage_specials_parsers(cmd, i, &buffer, &inc, &ptr); if (new_index == -1) return (NULL); i += new_index; - if (new_index > 0) { - buffer = add_to_buffer(buffer, ptr, inc + 1); - buffer = add_to_buffer(buffer, data, strlen(data)); - free(data); - inc = 1; - ptr = cmd + i + 1; - if (!buffer) - return (NULL); - } continue; } if (inc == 1) { From 54cc35be79531b81b0249af4a53ad3e68053eef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 00:57:49 +0200 Subject: [PATCH 09/46] norm compliant parsing_with special rules --- src/parser/parser.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index 58e2643..0a728a1 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -55,6 +55,18 @@ bool is_character_valid(char c) return (false); } +char *add_to_buffer(char *buffer, char *ptr, int nb) +{ + char *new = strndup(ptr, nb + 1); + + if (!new) + return (NULL); + new[nb - 2] = '\0'; + buffer = strcat_realloc(buffer, new); + free(new); + return (buffer); +} + int call_parsers(char *cmd, int index, char **data) { int new_index = 0; @@ -62,7 +74,7 @@ int call_parsers(char *cmd, int index, char **data) for (int i = 0; parsers[i].key; i++) { if (cmd[index] != parsers[i].key) continue; - new_index = parsers[i].parser(&cmd[index], &data); + new_index = parsers[i].parser(&cmd[index], data); return (new_index); } return (0); @@ -78,7 +90,7 @@ int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char return (-1); if (new_index > 0) { *buffer = add_to_buffer(*buffer, *ptr, (*inc) + 1); - *buffer = add_to_buffer(*buffer, *data, strlen(*data)); + *buffer = add_to_buffer(*buffer, data, strlen(data)); free(data); *inc = 1; *ptr = cmd + index + 1; @@ -88,18 +100,6 @@ int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char return (0); } -char *add_to_buffer(char *buffer, char *ptr, int nb) -{ - char *new = strndup(ptr, nb + 1); - - if (!new) - return (NULL); - new[nb - 2] = '\0'; - buffer = strcat_realloc(buffer, new); - free(new); - return (buffer); -} - char **parse_input(char *cmd) { char **ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); From 8a4e278f3d9e0d2a662a3ad55781f67333836733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 01:15:40 +0200 Subject: [PATCH 10/46] modfying parse quotes and fixing the return of manage_specials_parsers --- src/parser/parser.c | 1 + src/parser/quotes.c | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index 0a728a1..8b85840 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -96,6 +96,7 @@ int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char *ptr = cmd + index + 1; if (!(*buffer)) return (-1); + return (new_index); } return (0); } diff --git a/src/parser/quotes.c b/src/parser/quotes.c index cf76dab..f9a51ce 100644 --- a/src/parser/quotes.c +++ b/src/parser/quotes.c @@ -17,18 +17,16 @@ #include "utility.h" #include "builtin.h" -// takes only the data beetween 2 quotes (for now) int parse_quotes(char *ptr, char **data) { int length = 0; + char *ptr_end = strchr(&ptr[1], '\''); - for (; ptr[length]; length++) - if (ptr[length] == ' ') - break; - if (ptr[length] != '\'' && ptr[length] != ' ') { + if (!ptr_end) { dprintf(2, "Unmatched '''.\n"); return (-1); } + length = (ptr_end - ptr) / sizeof(char); *data = strndup(&ptr[1], length); if (!(*data)) return (-1); From 09d53db330c35ec9d86b59ec6fe10f753b78e1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 01:36:45 +0200 Subject: [PATCH 11/46] parseis working a lttle bit got an extra character in it --- src/parser/parser.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index 8b85840..eef7f7a 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -61,7 +61,7 @@ char *add_to_buffer(char *buffer, char *ptr, int nb) if (!new) return (NULL); - new[nb - 2] = '\0'; + new[nb] = '\0'; buffer = strcat_realloc(buffer, new); free(new); return (buffer); @@ -89,7 +89,7 @@ int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char if (new_index == -1) return (-1); if (new_index > 0) { - *buffer = add_to_buffer(*buffer, *ptr, (*inc) + 1); + *buffer = add_to_buffer(*buffer, *ptr, (*inc) - 1); *buffer = add_to_buffer(*buffer, data, strlen(data)); free(data); *inc = 1; @@ -124,7 +124,7 @@ char **parse_input(char *cmd) inc = 0; continue; } - buffer = add_to_buffer(buffer, ptr, inc + 1); + buffer = add_to_buffer(buffer, ptr, inc - 1); if (!buffer) return (NULL); ret[ret_inc++] = buffer; From b02ee7c5483beaa69cbe8fc53efe66aa49991b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 01:47:02 +0200 Subject: [PATCH 12/46] simple quotes are almost working some issues with data written just after quotes --- src/parser/parser.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index eef7f7a..2fc0b0e 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -57,8 +57,11 @@ bool is_character_valid(char c) char *add_to_buffer(char *buffer, char *ptr, int nb) { - char *new = strndup(ptr, nb + 1); + char *new; + if (nb <= 0) + return (buffer); + new = strndup(ptr, nb + 1); if (!new) return (NULL); new[nb] = '\0'; @@ -92,7 +95,7 @@ int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char *buffer = add_to_buffer(*buffer, *ptr, (*inc) - 1); *buffer = add_to_buffer(*buffer, data, strlen(data)); free(data); - *inc = 1; + *inc = -1; *ptr = cmd + index + 1; if (!(*buffer)) return (-1); From 38d8fb5975bd55bc23585acaf4de1f56df0e74b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 01:52:02 +0200 Subject: [PATCH 13/46] norm compliance made --- Makefile | 1 + include/parser.h | 7 +++++- src/parser/parser.c | 35 +----------------------------- src/parser/parser_utilities.c | 40 +++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 35 deletions(-) create mode 100644 src/parser/parser_utilities.c diff --git a/Makefile b/Makefile index b134211..1fd2b91 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,7 @@ SRC = src/shell.c \ src/utility/get_return.c \ src/parser/parser.c \ src/parser/quotes.c \ + src/parser/parser_utilities.c \ src/key_bindings/basic_typing_functions.c \ src/key_bindings/default_bindings.c \ src/key_bindings/control_commands.c \ diff --git a/include/parser.h b/include/parser.h index 405e584..a3986fc 100644 --- a/include/parser.h +++ b/include/parser.h @@ -8,6 +8,8 @@ #pragma once #include "shell.h" +#include +#include typedef struct parser_map { char key; @@ -15,4 +17,7 @@ typedef struct parser_map { } parser_map; char **parse_input(char *cmd); -int parse_quotes(char *ptr, char **data); \ No newline at end of file +int parse_quotes(char *ptr, char **data); + +char *strcat_realloc(char *dest, char *src); +char *add_to_buffer(char *buffer, char *ptr, int nb); \ No newline at end of file diff --git a/src/parser/parser.c b/src/parser/parser.c index 2fc0b0e..d99283d 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -9,36 +9,18 @@ #include "shell.h" #include "redirections.h" #include -#include #include -#include -#include #include #include "utility.h" #include "parser.h" #include "builtin.h" +#include const parser_map parsers[] = { {'\'', &parse_quotes}, {'\0', NULL} }; -char *strcat_realloc(char *dest, char *src) -{ - if (dest) { - dest = realloc(dest, sizeof(char) * (strlen(dest) + strlen(src) + 1)); - if (!dest) - return (NULL); - } else { - dest = malloc(sizeof(char) * (strlen(src) + 1)); - if (!dest) - return (NULL); - dest[0] = '\0'; - } - strcat(dest, src); - return (dest); -} - bool is_character_valid(char c) { static bool is_valid = false; @@ -55,21 +37,6 @@ bool is_character_valid(char c) return (false); } -char *add_to_buffer(char *buffer, char *ptr, int nb) -{ - char *new; - - if (nb <= 0) - return (buffer); - new = strndup(ptr, nb + 1); - if (!new) - return (NULL); - new[nb] = '\0'; - buffer = strcat_realloc(buffer, new); - free(new); - return (buffer); -} - int call_parsers(char *cmd, int index, char **data) { int new_index = 0; diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c new file mode 100644 index 0000000..45ca858 --- /dev/null +++ b/src/parser/parser_utilities.c @@ -0,0 +1,40 @@ +/* +** EPITECH PROJECT, 2020 +** PSU_minishell2_2019 +** File description: +** parser_utilities +*/ + +#include +#include "parser.h" + +char *strcat_realloc(char *dest, char *src) +{ + if (dest) { + dest = realloc(dest, sizeof(char) * (strlen(dest) + strlen(src) + 1)); + if (!dest) + return (NULL); + } else { + dest = malloc(sizeof(char) * (strlen(src) + 1)); + if (!dest) + return (NULL); + dest[0] = '\0'; + } + strcat(dest, src); + return (dest); +} + +char *add_to_buffer(char *buffer, char *ptr, int nb) +{ + char *new; + + if (nb <= 0) + return (buffer); + new = strndup(ptr, nb + 1); + if (!new) + return (NULL); + new[nb] = '\0'; + buffer = strcat_realloc(buffer, new); + free(new); + return (buffer); +} \ No newline at end of file From 870b1df1ae70aa5a0decc635b77f38691e709bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 14:12:04 +0200 Subject: [PATCH 14/46] inhibitor are now removed correctly --- include/parser.h | 4 +++- src/parser/parser.c | 6 +++--- src/parser/parser_utilities.c | 18 +++++++++++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/include/parser.h b/include/parser.h index a3986fc..638a8ea 100644 --- a/include/parser.h +++ b/include/parser.h @@ -20,4 +20,6 @@ char **parse_input(char *cmd); int parse_quotes(char *ptr, char **data); char *strcat_realloc(char *dest, char *src); -char *add_to_buffer(char *buffer, char *ptr, int nb); \ No newline at end of file +char *add_to_buffer(char *buffer, char *ptr, int nb, bool inhibitors); + +void remove_inhibitors_symbols_n_limit(char *str, int nb); \ No newline at end of file diff --git a/src/parser/parser.c b/src/parser/parser.c index d99283d..17f2995 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -59,8 +59,8 @@ int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char if (new_index == -1) return (-1); if (new_index > 0) { - *buffer = add_to_buffer(*buffer, *ptr, (*inc) - 1); - *buffer = add_to_buffer(*buffer, data, strlen(data)); + *buffer = add_to_buffer(*buffer, *ptr, (*inc) - 1, true); + *buffer = add_to_buffer(*buffer, data, strlen(data), false); free(data); *inc = -1; *ptr = cmd + index + 1; @@ -94,7 +94,7 @@ char **parse_input(char *cmd) inc = 0; continue; } - buffer = add_to_buffer(buffer, ptr, inc - 1); + buffer = add_to_buffer(buffer, ptr, inc - 1, true); if (!buffer) return (NULL); ret[ret_inc++] = buffer; diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index 45ca858..04bb2a8 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -8,6 +8,8 @@ #include #include "parser.h" + + char *strcat_realloc(char *dest, char *src) { if (dest) { @@ -24,7 +26,7 @@ char *strcat_realloc(char *dest, char *src) return (dest); } -char *add_to_buffer(char *buffer, char *ptr, int nb) +char *add_to_buffer(char *buffer, char *ptr, int nb, bool inhibitors) { char *new; @@ -34,7 +36,21 @@ char *add_to_buffer(char *buffer, char *ptr, int nb) if (!new) return (NULL); new[nb] = '\0'; + if (inhibitors) + remove_inhibitors_symbols_n_limit(new, nb); buffer = strcat_realloc(buffer, new); free(new); return (buffer); +} + +void remove_inhibitors_symbols_n_limit(char *str, int nb) +{ + for (int i = 0; str[i] && i < nb; i++) { + if (str[i] == '\\') { + for (int j = i; str[j]; j++) { + str[j] = str[j + 1]; + } + i++; + } + } } \ No newline at end of file From 3486bd99db817e902afaedb3eba78f0b7683bd3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 14:26:37 +0200 Subject: [PATCH 15/46] fixing the bugs when you write after quotes the ptr was not incremented correctly --- src/parser/parser.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index 17f2995..aecfe3e 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -62,8 +62,8 @@ int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char *buffer = add_to_buffer(*buffer, *ptr, (*inc) - 1, true); *buffer = add_to_buffer(*buffer, data, strlen(data), false); free(data); - *inc = -1; - *ptr = cmd + index + 1; + *inc = 0; + *ptr = cmd + index + new_index + 1; if (!(*buffer)) return (-1); return (new_index); From 3e7f10e59655bfe476d900058daaf5f5ce5c3f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 14:44:06 +0200 Subject: [PATCH 16/46] making some norm compliance --- src/parser/parser.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index aecfe3e..591641f 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -50,12 +50,12 @@ int call_parsers(char *cmd, int index, char **data) return (0); } -int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char **ptr) +int manage_specials_parsers(char *cmd, char **buffer, int *inc, char **ptr) { int new_index = 0; char *data = NULL; - new_index = call_parsers(cmd, index, &data); + new_index = call_parsers(cmd, 0, &data); if (new_index == -1) return (-1); if (new_index > 0) { @@ -63,7 +63,7 @@ int manage_specials_parsers(char *cmd, int index, char **buffer, int *inc, char *buffer = add_to_buffer(*buffer, data, strlen(data), false); free(data); *inc = 0; - *ptr = cmd + index + new_index + 1; + *ptr = cmd + new_index + 1; if (!(*buffer)) return (-1); return (new_index); @@ -83,7 +83,7 @@ char **parse_input(char *cmd) return (NULL); for (int i = 0, inc = 1; i <= (int)strlen(cmd); i++, inc++) { if (is_character_valid(cmd[i])) { - new_index = manage_specials_parsers(cmd, i, &buffer, &inc, &ptr); + new_index = manage_specials_parsers(&cmd[i], &buffer, &inc, &ptr); if (new_index == -1) return (NULL); i += new_index; From 82ddadbea308ff712a510b836b51adf299c08d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 18:12:21 +0200 Subject: [PATCH 17/46] vars are correctly parsed in deouble quotes --- Makefile | 4 ++- include/parser.h | 14 ++++++-- src/parser/double_quotes.c | 28 +++++++++++++++ src/parser/parser.c | 18 ++++++---- src/parser/parser_utilities.c | 47 +++++++++++++++++++++++++ src/parser/parser_vars_utilities.c | 56 ++++++++++++++++++++++++++++++ src/parser/quotes.c | 14 ++------ src/prompt.c | 10 +++--- 8 files changed, 164 insertions(+), 27 deletions(-) create mode 100644 src/parser/double_quotes.c create mode 100644 src/parser/parser_vars_utilities.c diff --git a/Makefile b/Makefile index 1fd2b91..8109826 100644 --- a/Makefile +++ b/Makefile @@ -37,10 +37,12 @@ SRC = src/shell.c \ src/utility/envpath.c \ src/utility/fusion.c \ src/utility/split_commands.c \ - src/utility/get_return.c \ + src/utility/get_return.c \ src/parser/parser.c \ src/parser/quotes.c \ + src/parser/double_quotes.c \ src/parser/parser_utilities.c \ + src/parser/parser_vars_utilities.c \ src/key_bindings/basic_typing_functions.c \ src/key_bindings/default_bindings.c \ src/key_bindings/control_commands.c \ diff --git a/include/parser.h b/include/parser.h index 638a8ea..b72bd92 100644 --- a/include/parser.h +++ b/include/parser.h @@ -13,13 +13,21 @@ typedef struct parser_map { char key; - int (*parser)(char *, char **); + int (*parser)(char *, char **, env_t *); } parser_map; -char **parse_input(char *cmd); -int parse_quotes(char *ptr, char **data); +char **parse_input(char *cmd, env_t *env); + +int parse_quotes(char *ptr, char **data, env_t *env); +int parse_double_quotes(char *ptr, char **data, env_t *env); char *strcat_realloc(char *dest, char *src); char *add_to_buffer(char *buffer, char *ptr, int nb, bool inhibitors); +char *get_var_value(char *var, env_t *env); + +void insert_substring(char *dest, char *src, int position); + +char *process_vars(char *cmd, env_t *env); +void rm_n_char(char *ptr, int n); void remove_inhibitors_symbols_n_limit(char *str, int nb); \ No newline at end of file diff --git a/src/parser/double_quotes.c b/src/parser/double_quotes.c new file mode 100644 index 0000000..cd24e07 --- /dev/null +++ b/src/parser/double_quotes.c @@ -0,0 +1,28 @@ +/* +** EPITECH PROJECT, 2020 +** PSU_minishell2_2019 +** File description: +** redirections +*/ + +#include "parser.h" +#include + +int parse_double_quotes(char *ptr, char **data, env_t *env) +{ + int length = 0; + char *ptr_end = strchr(&ptr[1], '"'); + char *cmd; + + if (!ptr_end) { + dprintf(2, "Unmatched '\"'.\n"); + return (-1); + } + length = (ptr_end - ptr) / sizeof(char); + cmd = strndup(&ptr[1], length); + if (!cmd) + return (-1); + cmd[length - 1] = '\0'; + *data = process_vars(cmd, env); + return (length); +} \ No newline at end of file diff --git a/src/parser/parser.c b/src/parser/parser.c index 591641f..5b43c5d 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -18,6 +18,7 @@ const parser_map parsers[] = { {'\'', &parse_quotes}, + {'"', &parse_double_quotes}, {'\0', NULL} }; @@ -37,25 +38,27 @@ bool is_character_valid(char c) return (false); } -int call_parsers(char *cmd, int index, char **data) +int call_parsers(char *cmd, int index, char **data, env_t *env) { int new_index = 0; for (int i = 0; parsers[i].key; i++) { if (cmd[index] != parsers[i].key) continue; - new_index = parsers[i].parser(&cmd[index], data); + new_index = parsers[i].parser(&cmd[index], data, env); + if (!(*data)) + return (-1); return (new_index); } return (0); } -int manage_specials_parsers(char *cmd, char **buffer, int *inc, char **ptr) +int manage_specials_parsers(char *cmd, char **buffer, int *inc, char **ptr, env_t *env) { int new_index = 0; char *data = NULL; - new_index = call_parsers(cmd, 0, &data); + new_index = call_parsers(cmd, 0, &data, env); if (new_index == -1) return (-1); if (new_index > 0) { @@ -71,7 +74,7 @@ int manage_specials_parsers(char *cmd, char **buffer, int *inc, char **ptr) return (0); } -char **parse_input(char *cmd) +char **parse_input(char *cmd, env_t *env) { char **ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); char *ptr = cmd; @@ -83,13 +86,13 @@ char **parse_input(char *cmd) return (NULL); for (int i = 0, inc = 1; i <= (int)strlen(cmd); i++, inc++) { if (is_character_valid(cmd[i])) { - new_index = manage_specials_parsers(&cmd[i], &buffer, &inc, &ptr); + new_index = manage_specials_parsers(&cmd[i], &buffer, &inc, &ptr, env); if (new_index == -1) return (NULL); i += new_index; continue; } - if (inc == 1) { + if (inc == 1 && !new_index) { ptr = cmd + i + 1; inc = 0; continue; @@ -101,6 +104,7 @@ char **parse_input(char *cmd) buffer = NULL; ptr = cmd + i + 1; inc = 0; + new_index = 0; } ret[ret_inc] = NULL; return (ret); diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index 04bb2a8..ca08832 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -8,7 +8,22 @@ #include #include "parser.h" +char *get_var_value(char *var, env_t *env) +{ + char *value; + if (!var) + return (NULL); + value = my_getenv(env->env, var); + if (value) + return (value); + value = my_getenv(env->vars, var); + if (value) + return (value); + printf("%s: Undefined variable.\n", var); + env->vars = my_setenv(env->vars, "?", "1"); + return (NULL); +} char *strcat_realloc(char *dest, char *src) { @@ -53,4 +68,36 @@ void remove_inhibitors_symbols_n_limit(char *str, int nb) i++; } } +} + +char *substring(char *string, int position, int length) +{ + char *pointer = malloc(length + 1); + int i; + + if(pointer == NULL) + return (NULL); + for(i = 0; i < length; i++) + *(pointer + i) = *((string + position - 1) + i); + *(pointer + i) = '\0'; + return (pointer); +} + +void insert_substring(char *dest, char *src, int position) +{ + char *f; + char *e; + int length; + + length = strlen(dest); + + f = substring(dest, 1, position - 1); + e = substring(dest, position, length - position + 1); + + strcpy(dest, ""); + strcat(dest, f); + free(f); + strcat(dest, src); + strcat(dest, e); + free(e); } \ No newline at end of file diff --git a/src/parser/parser_vars_utilities.c b/src/parser/parser_vars_utilities.c new file mode 100644 index 0000000..9ec48de --- /dev/null +++ b/src/parser/parser_vars_utilities.c @@ -0,0 +1,56 @@ +/* +** EPITECH PROJECT, 2020 +** PSU_minishell2_2019 +** File description: +** redirections +*/ + +#include "parser.h" +#include +#include + +int get_var_name(char *ptr, char **name) +{ + int length = 0; + + for (int i = 1; ptr[i] && ptr[i] != ' ' && ptr[i] != '$'; i++) { + length++; + } + *name = strndup(&ptr[1], length); + return (length + 1); +} + +void rm_n_char(char *ptr, int n) +{ + int i; + + for (i = 0; ptr[i + n]; i++) { + ptr[i] = ptr[i + n]; + } + ptr[i] = '\0'; +} + +char *process_vars(char *cmd, env_t *env) +{ + char *name = NULL; + char *value; + int new_index; + int length = strlen(cmd); + + for (int i = 0; i < length; i++, length = strlen(cmd)) { + if (cmd[i] != '$') + continue; + new_index = get_var_name(&cmd[i], &name); + value = get_var_value(name, env); + if (!value) + return (NULL); + cmd = realloc(cmd, sizeof(char) * (strlen(value) + length + 2)); + if (!cmd) + return (NULL); + rm_n_char(&cmd[i], strlen(name) + 1); + insert_substring(cmd, value, i + 1); + i += new_index; + free(name); + } + return (cmd); +} \ No newline at end of file diff --git a/src/parser/quotes.c b/src/parser/quotes.c index f9a51ce..ca0f276 100644 --- a/src/parser/quotes.c +++ b/src/parser/quotes.c @@ -5,22 +5,14 @@ ** redirections */ - -#include "shell.h" -#include "redirections.h" -#include -#include -#include +#include "parser.h" #include -#include -#include -#include "utility.h" -#include "builtin.h" -int parse_quotes(char *ptr, char **data) +int parse_quotes(char *ptr, char **data, env_t *env) { int length = 0; char *ptr_end = strchr(&ptr[1], '\''); + (void)env; if (!ptr_end) { dprintf(2, "Unmatched '''.\n"); diff --git a/src/prompt.c b/src/prompt.c index 417373a..7f9eb37 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -34,16 +34,16 @@ const builtin builtins[] = { int prompt_run(char *cmd, redirection *inout[2], env_t *env) { //char **argv = get_argv(cmd); - char **argv = parse_input(cmd); + char **argv = parse_input(cmd, env); + if (!argv) { + //perror(SHELL_NAME); + return (0); + } for (int i = 0; argv[i]; i++) { printf("'%s'\n", argv[i]); } return (0); - if (!argv) { - perror(SHELL_NAME); - return (-1); - } for (int i = 0; argv[i]; i++) printf("argv[%i] : %s\n", i , argv[i]); if (!argv[0]) From 106a06a58093df4cd2ba3caf3444d1a7e781bad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 18:32:30 +0200 Subject: [PATCH 18/46] removing a param to manage_specials_parsers --- src/parser/parser.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index 5b43c5d..d67016c 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -53,7 +53,7 @@ int call_parsers(char *cmd, int index, char **data, env_t *env) return (0); } -int manage_specials_parsers(char *cmd, char **buffer, int *inc, char **ptr, env_t *env) +int manage_specials_parsers(char *cmd, char **buffer, int *inc, env_t *env) { int new_index = 0; char *data = NULL; @@ -62,11 +62,10 @@ int manage_specials_parsers(char *cmd, char **buffer, int *inc, char **ptr, env_ if (new_index == -1) return (-1); if (new_index > 0) { - *buffer = add_to_buffer(*buffer, *ptr, (*inc) - 1, true); + *buffer = add_to_buffer(*buffer, &cmd[(*inc) * -1], (*inc) - 1, true); *buffer = add_to_buffer(*buffer, data, strlen(data), false); free(data); *inc = 0; - *ptr = cmd + new_index + 1; if (!(*buffer)) return (-1); return (new_index); @@ -86,7 +85,7 @@ char **parse_input(char *cmd, env_t *env) return (NULL); for (int i = 0, inc = 1; i <= (int)strlen(cmd); i++, inc++) { if (is_character_valid(cmd[i])) { - new_index = manage_specials_parsers(&cmd[i], &buffer, &inc, &ptr, env); + new_index = manage_specials_parsers(&cmd[i], &buffer, &inc, env); if (new_index == -1) return (NULL); i += new_index; From e2d3565ee2312c49d381d5e78adfc62cb0d71fc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 19:08:45 +0200 Subject: [PATCH 19/46] big norm compliance enhancement --- src/parser/parser.c | 48 ++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index d67016c..ff1c6f3 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -73,38 +73,50 @@ int manage_specials_parsers(char *cmd, char **buffer, int *inc, env_t *env) return (0); } +int parser_loop(char *cmd, char **buffer, char **ptr, void **pack) +{ + int *i = pack[0]; + int *inc = pack[1]; + int *new_index = pack[2]; + env_t *env = pack[3]; + + if (is_character_valid(cmd[*i])) { + (*new_index) = manage_specials_parsers(&cmd[(*i)], buffer, inc, env); + if ((*new_index) == -1) + return (-1); + (*i) += (*new_index); + return (1); + } + if (*inc == 1 && !(*new_index)) { + (*ptr) = cmd + (*i) + 1; + (*inc) = 0; + return (1); + } + return (0); +} + char **parse_input(char *cmd, env_t *env) { char **ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); char *ptr = cmd; - int ret_inc = 0; + int idx[3] = {0}; char *buffer = NULL; - int new_index = 0; if (!ret) return (NULL); for (int i = 0, inc = 1; i <= (int)strlen(cmd); i++, inc++) { - if (is_character_valid(cmd[i])) { - new_index = manage_specials_parsers(&cmd[i], &buffer, &inc, env); - if (new_index == -1) - return (NULL); - i += new_index; + idx[2] = parser_loop(cmd, &buffer, &ptr, (void *[4]){&i, &inc, &idx[1], env}); + if (idx[2] < 0) + return (NULL); + else if (idx[2]) continue; - } - if (inc == 1 && !new_index) { - ptr = cmd + i + 1; - inc = 0; - continue; - } buffer = add_to_buffer(buffer, ptr, inc - 1, true); if (!buffer) return (NULL); - ret[ret_inc++] = buffer; - buffer = NULL; + ret[idx[0]++] = buffer; ptr = cmd + i + 1; - inc = 0; - new_index = 0; + idx[1] = inc = buffer = 0; } - ret[ret_inc] = NULL; + ret[idx[0]] = NULL; return (ret); } \ No newline at end of file From 2b39416efa448f13856a8081c4b415bf7f8d94cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 19:43:48 +0200 Subject: [PATCH 20/46] fix quotes with soe norm --- src/parser/parser.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index ff1c6f3..a856dc8 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -33,9 +33,7 @@ bool is_character_valid(char c) if (c == '\\') { is_valid = true; } - if (c >= 33 && c <= 126) - return (true); - return (false); + return (c >= 33 && c <= 126); } int call_parsers(char *cmd, int index, char **data, env_t *env) @@ -62,10 +60,11 @@ int manage_specials_parsers(char *cmd, char **buffer, int *inc, env_t *env) if (new_index == -1) return (-1); if (new_index > 0) { - *buffer = add_to_buffer(*buffer, &cmd[(*inc) * -1], (*inc) - 1, true); + (*inc)--; + *buffer = add_to_buffer(*buffer, &cmd[(*inc) * -1], (*inc), true); *buffer = add_to_buffer(*buffer, data, strlen(data), false); free(data); - *inc = 0; + (*inc) = 0; if (!(*buffer)) return (-1); return (new_index); @@ -85,6 +84,8 @@ int parser_loop(char *cmd, char **buffer, char **ptr, void **pack) if ((*new_index) == -1) return (-1); (*i) += (*new_index); + if (*new_index) + (*ptr) = cmd + (*i) + 1; return (1); } if (*inc == 1 && !(*new_index)) { @@ -100,22 +101,22 @@ char **parse_input(char *cmd, env_t *env) char **ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); char *ptr = cmd; int idx[3] = {0}; - char *buffer = NULL; + char *buf = NULL; if (!ret) return (NULL); for (int i = 0, inc = 1; i <= (int)strlen(cmd); i++, inc++) { - idx[2] = parser_loop(cmd, &buffer, &ptr, (void *[4]){&i, &inc, &idx[1], env}); + idx[2] = parser_loop(cmd, &buf, &ptr, (void *[4]){&i, &inc, &idx[1], env}); if (idx[2] < 0) return (NULL); else if (idx[2]) continue; - buffer = add_to_buffer(buffer, ptr, inc - 1, true); - if (!buffer) + buf = add_to_buffer(buf, ptr, inc - 1, true); + if (!buf) return (NULL); - ret[idx[0]++] = buffer; + ret[idx[0]++] = buf; ptr = cmd + i + 1; - idx[1] = inc = buffer = 0; + idx[1] = inc = buf = 0; } ret[idx[0]] = NULL; return (ret); From a5096a5a2364a90c9cd018b3d90a0c812aca7417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 20:00:29 +0200 Subject: [PATCH 21/46] adding parsing of vars in normal parsing --- include/parser.h | 2 +- src/parser/parser.c | 9 ++++----- src/parser/parser_utilities.c | 6 ++++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/parser.h b/include/parser.h index b72bd92..d8fe780 100644 --- a/include/parser.h +++ b/include/parser.h @@ -22,7 +22,7 @@ int parse_quotes(char *ptr, char **data, env_t *env); int parse_double_quotes(char *ptr, char **data, env_t *env); char *strcat_realloc(char *dest, char *src); -char *add_to_buffer(char *buffer, char *ptr, int nb, bool inhibitors); +char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env); char *get_var_value(char *var, env_t *env); void insert_substring(char *dest, char *src, int position); diff --git a/src/parser/parser.c b/src/parser/parser.c index a856dc8..d55be20 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -61,8 +61,8 @@ int manage_specials_parsers(char *cmd, char **buffer, int *inc, env_t *env) return (-1); if (new_index > 0) { (*inc)--; - *buffer = add_to_buffer(*buffer, &cmd[(*inc) * -1], (*inc), true); - *buffer = add_to_buffer(*buffer, data, strlen(data), false); + *buffer = add_to_buffer(*buffer, &cmd[(*inc) * -1], (*inc), env); + *buffer = add_to_buffer(*buffer, data, strlen(data), NULL); free(data); (*inc) = 0; if (!(*buffer)) @@ -111,12 +111,11 @@ char **parse_input(char *cmd, env_t *env) return (NULL); else if (idx[2]) continue; - buf = add_to_buffer(buf, ptr, inc - 1, true); - if (!buf) + if (!(buf = add_to_buffer(buf, ptr, inc - 1, env))) return (NULL); ret[idx[0]++] = buf; ptr = cmd + i + 1; - idx[1] = inc = buf = 0; + buf = idx[1] = inc = 0; } ret[idx[0]] = NULL; return (ret); diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index ca08832..8d84200 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -41,7 +41,7 @@ char *strcat_realloc(char *dest, char *src) return (dest); } -char *add_to_buffer(char *buffer, char *ptr, int nb, bool inhibitors) +char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) { char *new; @@ -51,8 +51,10 @@ char *add_to_buffer(char *buffer, char *ptr, int nb, bool inhibitors) if (!new) return (NULL); new[nb] = '\0'; - if (inhibitors) + if (env) { remove_inhibitors_symbols_n_limit(new, nb); + new = process_vars(new, env); + } buffer = strcat_realloc(buffer, new); free(new); return (buffer); From 940f1cbc5740fa551fc3e32f4e88a1c0f3ca6313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 20:02:59 +0200 Subject: [PATCH 22/46] fixing segfault --- src/parser/parser_utilities.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index 8d84200..b110200 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -44,6 +44,7 @@ char *strcat_realloc(char *dest, char *src) char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) { char *new; + char *tmp; if (nb <= 0) return (buffer); @@ -53,7 +54,9 @@ char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) new[nb] = '\0'; if (env) { remove_inhibitors_symbols_n_limit(new, nb); - new = process_vars(new, env); + tmp = process_vars(new, env); + if (tmp) + new = tmp; } buffer = strcat_realloc(buffer, new); free(new); From 8e2504bb92422baf38538b52d030fd06f42c4ba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 20:22:33 +0200 Subject: [PATCH 23/46] parser should be done --- src/parser/parser_utilities.c | 40 ++++++++---------------------- src/parser/parser_vars_utilities.c | 17 +++++++++++++ src/prompt.c | 10 +------- 3 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index b110200..2e709e5 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -8,23 +8,6 @@ #include #include "parser.h" -char *get_var_value(char *var, env_t *env) -{ - char *value; - - if (!var) - return (NULL); - value = my_getenv(env->env, var); - if (value) - return (value); - value = my_getenv(env->vars, var); - if (value) - return (value); - printf("%s: Undefined variable.\n", var); - env->vars = my_setenv(env->vars, "?", "1"); - return (NULL); -} - char *strcat_realloc(char *dest, char *src) { if (dest) { @@ -44,7 +27,6 @@ char *strcat_realloc(char *dest, char *src) char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) { char *new; - char *tmp; if (nb <= 0) return (buffer); @@ -54,9 +36,9 @@ char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) new[nb] = '\0'; if (env) { remove_inhibitors_symbols_n_limit(new, nb); - tmp = process_vars(new, env); - if (tmp) - new = tmp; + new = process_vars(new, env); + if (!new) + return (NULL); } buffer = strcat_realloc(buffer, new); free(new); @@ -80,11 +62,11 @@ char *substring(char *string, int position, int length) char *pointer = malloc(length + 1); int i; - if(pointer == NULL) + if (pointer == NULL) return (NULL); - for(i = 0; i < length; i++) - *(pointer + i) = *((string + position - 1) + i); - *(pointer + i) = '\0'; + for (i = 0; i < length; i++) + *(pointer + i) = *((string + position - 1) + i); + *(pointer + i) = '\0'; return (pointer); } @@ -93,12 +75,10 @@ void insert_substring(char *dest, char *src, int position) char *f; char *e; int length; - - length = strlen(dest); - - f = substring(dest, 1, position - 1); - e = substring(dest, position, length - position + 1); + length = strlen(dest); + f = substring(dest, 1, position - 1); + e = substring(dest, position, length - position + 1); strcpy(dest, ""); strcat(dest, f); free(f); diff --git a/src/parser/parser_vars_utilities.c b/src/parser/parser_vars_utilities.c index 9ec48de..a1ca9e6 100644 --- a/src/parser/parser_vars_utilities.c +++ b/src/parser/parser_vars_utilities.c @@ -9,6 +9,23 @@ #include #include +char *get_var_value(char *var, env_t *env) +{ + char *value; + + if (!var) + return (NULL); + value = my_getenv(env->env, var); + if (value) + return (value); + value = my_getenv(env->vars, var); + if (value) + return (value); + printf("%s: Undefined variable.\n", var); + env->vars = my_setenv(env->vars, "?", "1"); + return (NULL); +} + int get_var_name(char *ptr, char **name) { int length = 0; diff --git a/src/prompt.c b/src/prompt.c index 7f9eb37..cfa8c40 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -33,19 +33,11 @@ const builtin builtins[] = { int prompt_run(char *cmd, redirection *inout[2], env_t *env) { - //char **argv = get_argv(cmd); char **argv = parse_input(cmd, env); - if (!argv) { - //perror(SHELL_NAME); + if (!argv) { return (0); } - for (int i = 0; argv[i]; i++) { - printf("'%s'\n", argv[i]); - } - return (0); - for (int i = 0; argv[i]; i++) - printf("argv[%i] : %s\n", i , argv[i]); if (!argv[0]) return (0); argv = globbing(argv); From ffdebe1eff316777a5ab47efe365cdafb3b6ee24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 20:32:40 +0200 Subject: [PATCH 24/46] adding frees for the array and commenting glob (temporary) --- include/parser.h | 1 + src/parser/parser_vars_utilities.c | 8 ++++++++ src/prompt.c | 4 ++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/parser.h b/include/parser.h index d8fe780..765baef 100644 --- a/include/parser.h +++ b/include/parser.h @@ -17,6 +17,7 @@ typedef struct parser_map { } parser_map; char **parse_input(char *cmd, env_t *env); +void free_array(char **array); int parse_quotes(char *ptr, char **data, env_t *env); int parse_double_quotes(char *ptr, char **data, env_t *env); diff --git a/src/parser/parser_vars_utilities.c b/src/parser/parser_vars_utilities.c index a1ca9e6..8966453 100644 --- a/src/parser/parser_vars_utilities.c +++ b/src/parser/parser_vars_utilities.c @@ -70,4 +70,12 @@ char *process_vars(char *cmd, env_t *env) free(name); } return (cmd); +} + +void free_array(char **array) +{ + for (int i = 0; array[i]; i++) { + free(array[i]); + } + free(array); } \ No newline at end of file diff --git a/src/prompt.c b/src/prompt.c index cfa8c40..3446f26 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -40,7 +40,7 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env) } if (!argv[0]) return (0); - argv = globbing(argv); + //argv = globbing(argv); if (!argv) return (0); if (env->window && inout[1] == NULL) @@ -51,7 +51,7 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env) if (!strcmp(argv[0], builtins[i].name)) return (run_builtin(&builtins[i], argv, inout, env)); run_cmd(argv, inout, env); - free(argv); + free_array(argv); return (0); } From 9b2ed015325e8a2648c450576d23961d35fd9e2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 20:38:36 +0200 Subject: [PATCH 25/46] fixing a too long line --- src/parser/parser.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index d55be20..826df12 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -96,25 +96,25 @@ int parser_loop(char *cmd, char **buffer, char **ptr, void **pack) return (0); } -char **parse_input(char *cmd, env_t *env) +char **parse_input(char *cmd, env_t *e) { char **ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); - char *ptr = cmd; + char *p = cmd; int idx[3] = {0}; char *buf = NULL; if (!ret) return (NULL); for (int i = 0, inc = 1; i <= (int)strlen(cmd); i++, inc++) { - idx[2] = parser_loop(cmd, &buf, &ptr, (void *[4]){&i, &inc, &idx[1], env}); + idx[2] = parser_loop(cmd, &buf, &p, (void *[4]){&i, &inc, &idx[1], e}); if (idx[2] < 0) return (NULL); else if (idx[2]) continue; - if (!(buf = add_to_buffer(buf, ptr, inc - 1, env))) + if (!(buf = add_to_buffer(buf, p, inc - 1, e))) return (NULL); ret[idx[0]++] = buf; - ptr = cmd + i + 1; + p = cmd + i + 1; buf = idx[1] = inc = 0; } ret[idx[0]] = NULL; From 56bd37d8ce087f1228c84d1b6329cfbc0de50a6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 22:30:55 +0200 Subject: [PATCH 26/46] reenabling globbing (buggy) --- src/prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/prompt.c b/src/prompt.c index 3446f26..a5f20ce 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -40,7 +40,7 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env) } if (!argv[0]) return (0); - //argv = globbing(argv); + argv = globbing(argv); if (!argv) return (0); if (env->window && inout[1] == NULL) From da11943aede456dd86d13e16728db1c5204c57aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 21 May 2020 22:54:38 +0200 Subject: [PATCH 27/46] fixing indent --- src/parser/parser_utilities.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index 2e709e5..1c48044 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -65,8 +65,8 @@ char *substring(char *string, int position, int length) if (pointer == NULL) return (NULL); for (i = 0; i < length; i++) - *(pointer + i) = *((string + position - 1) + i); - *(pointer + i) = '\0'; + *(pointer + i) = *((string + position - 1) + i); + *(pointer + i) = '\0'; return (pointer); } From a44c0e52eff089af01fafbe125d835ca21229e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Fri, 22 May 2020 19:08:10 +0200 Subject: [PATCH 28/46] fixing warning compil time --- src/parser/parser_utilities.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index 1c48044..1dcaa8a 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -66,7 +66,7 @@ char *substring(char *string, int position, int length) return (NULL); for (i = 0; i < length; i++) *(pointer + i) = *((string + position - 1) + i); - *(pointer + i) = '\0'; + *(pointer + i) = '\0'; return (pointer); } From 485c41aea0cc07f2fcfa41e5a6828d1cbc87b629 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Fri, 22 May 2020 19:28:06 +0200 Subject: [PATCH 29/46] fixing a compil warning in parser --- src/parser/parser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index 826df12..2c5a503 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -115,7 +115,7 @@ char **parse_input(char *cmd, env_t *e) return (NULL); ret[idx[0]++] = buf; p = cmd + i + 1; - buf = idx[1] = inc = 0; + idx[1] = inc = (long)(buf = NULL); } ret[idx[0]] = NULL; return (ret); From e23c1cc4c20bcde2a9b0f99ced453980ccf20828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 00:41:29 +0200 Subject: [PATCH 30/46] modifying glob --- src/glob.c | 4 ++-- src/parser/parser_utilities.c | 16 +++++++++++++++- src/prompt.c | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/glob.c b/src/glob.c index 8a7e113..a804aa3 100644 --- a/src/glob.c +++ b/src/glob.c @@ -19,7 +19,7 @@ char **glob_error(char **argv, int err) fprintf(stderr, "%s: %s\n", argv[0], "No match."); if (err == GLOB_NOSPACE) fprintf(stderr, "%s: %s\n", argv[0], "No space."); - free(argv); + free(argv[0]); return (NULL); } @@ -37,6 +37,6 @@ char **globbing(char **argv) globfree(&results); return (glob_error(argv, ret)); } - free(argv); + //free(argv); return (&results.gl_pathv[0]); } \ No newline at end of file diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index 1dcaa8a..9a8c3d9 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -6,8 +6,12 @@ */ #include +#include +#include "shell.h" #include "parser.h" +char **glob_error(char **argv, int err); + char *strcat_realloc(char *dest, char *src) { if (dest) { @@ -27,7 +31,10 @@ char *strcat_realloc(char *dest, char *src) char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) { char *new; - + static glob_t results; + int flags = GLOB_DOOFFS | GLOB_NOMAGIC | GLOB_NOCHECK; + int ret = 0; + if (nb <= 0) return (buffer); new = strndup(ptr, nb + 1); @@ -35,6 +42,13 @@ char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) return (NULL); new[nb] = '\0'; if (env) { + ret = glob(new, flags, NULL, &results); + if (ret != 0) { + globfree(&results); + return ((char *)glob_error(&new, ret)); + } + free(new); + new = results.gl_pathv[0]; remove_inhibitors_symbols_n_limit(new, nb); new = process_vars(new, env); if (!new) diff --git a/src/prompt.c b/src/prompt.c index 9621c16..595fd48 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -41,7 +41,7 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env) } if (!argv[0]) return (0); - argv = globbing(argv); + //argv = globbing(argv); if (!argv) return (0); if (**argv == '!' && argv[0][1] && argv[0][1] != ' ') From 7631b5897d1c7621ab48ce4ed9ab3ae8a3ad9a4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 01:09:58 +0200 Subject: [PATCH 31/46] reworking glob ordering and starting to implement reallincing parser array dynamically --- src/parser/parser.c | 1 - src/parser/parser_utilities.c | 31 ++++++++++++++----------- src/parser/specials.c | 43 +++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 14 deletions(-) create mode 100644 src/parser/specials.c diff --git a/src/parser/parser.c b/src/parser/parser.c index 2c5a503..67cdf64 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -5,7 +5,6 @@ ** redirections */ - #include "shell.h" #include "redirections.h" #include diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index 9a8c3d9..bc7e22a 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -28,12 +28,27 @@ char *strcat_realloc(char *dest, char *src) return (dest); } -char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) +char *process_str(char *new, int nb, env_t *env) { - char *new; static glob_t results; int flags = GLOB_DOOFFS | GLOB_NOMAGIC | GLOB_NOCHECK; int ret = 0; + + ret = glob(new, flags, NULL, &results); + if (ret != 0) { + globfree(&results); + return ((char *)glob_error(&new, ret)); + } + free(new); + new = results.gl_pathv[0]; + remove_inhibitors_symbols_n_limit(new, nb); + new = process_vars(new, env); + return (new); +} + +char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) +{ + char *new; if (nb <= 0) return (buffer); @@ -42,17 +57,7 @@ char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) return (NULL); new[nb] = '\0'; if (env) { - ret = glob(new, flags, NULL, &results); - if (ret != 0) { - globfree(&results); - return ((char *)glob_error(&new, ret)); - } - free(new); - new = results.gl_pathv[0]; - remove_inhibitors_symbols_n_limit(new, nb); - new = process_vars(new, env); - if (!new) - return (NULL); + new = process_str(new, nb, env); } buffer = strcat_realloc(buffer, new); free(new); diff --git a/src/parser/specials.c b/src/parser/specials.c new file mode 100644 index 0000000..3913445 --- /dev/null +++ b/src/parser/specials.c @@ -0,0 +1,43 @@ +/* +** EPITECH PROJECT, 2020 +** PSU_minishell2_2019 +** File description: +** redirections +*/ + +#include "parser.h" + +static void *my_global_bank(char *cmd, bool get_inc, int add_nb) +{ + static char **ret = NULL; + static int inc_ret = 0; + + if (cmd) { + ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); + return (ret); + } + inc_ret += add_nb; + if (get_inc || add_nb != 0) + return ((void *)&inc_ret); + return (NULL); +} + +char **get_ret(char *cmd) +{ + return ((char **)my_global_bank(cmd, false, 0)); +} + +char **set_ret(char *cmd) +{ + return ((char **)my_global_bank(cmd, false, 0)); +} + +int get_inc_ret(void) +{ + return (*(int *)(my_global_bank(NULL, true, 0))); +} + +void add_inc_ret(int nb) +{ + return (*(int *)(my_global_bank(NULL, true, nb))); +} \ No newline at end of file From 2af0f31fefb2bb5e7a00d7a52bff6a6d86819e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 01:31:42 +0200 Subject: [PATCH 32/46] executing globbing before parsing --- src/glob.c | 6 +++-- src/parser/parser_utilities.c | 4 ++-- src/parser/specials.c | 43 ----------------------------------- src/prompt.c | 13 ++++++----- 4 files changed, 13 insertions(+), 53 deletions(-) delete mode 100644 src/parser/specials.c diff --git a/src/glob.c b/src/glob.c index a804aa3..cec9aad 100644 --- a/src/glob.c +++ b/src/glob.c @@ -26,9 +26,11 @@ char **glob_error(char **argv, int err) char **globbing(char **argv) { static glob_t results; - int flags = GLOB_DOOFFS | GLOB_NOMAGIC; + int flags = GLOB_DOOFFS | GLOB_NOMAGIC | GLOB_NOCHECK; int ret = 0; + if (!argv) + return (NULL); for (int i = 0; argv[i] && ret == 0; i++) { flags |= (i > 0 ? GLOB_APPEND : 0); ret = glob(argv[i], flags, NULL, &results); @@ -37,6 +39,6 @@ char **globbing(char **argv) globfree(&results); return (glob_error(argv, ret)); } - //free(argv); + free(argv); return (&results.gl_pathv[0]); } \ No newline at end of file diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index bc7e22a..56607cb 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -30,7 +30,7 @@ char *strcat_realloc(char *dest, char *src) char *process_str(char *new, int nb, env_t *env) { - static glob_t results; + /*static glob_t results; int flags = GLOB_DOOFFS | GLOB_NOMAGIC | GLOB_NOCHECK; int ret = 0; @@ -40,7 +40,7 @@ char *process_str(char *new, int nb, env_t *env) return ((char *)glob_error(&new, ret)); } free(new); - new = results.gl_pathv[0]; + new = results.gl_pathv[0];*/ remove_inhibitors_symbols_n_limit(new, nb); new = process_vars(new, env); return (new); diff --git a/src/parser/specials.c b/src/parser/specials.c deleted file mode 100644 index 3913445..0000000 --- a/src/parser/specials.c +++ /dev/null @@ -1,43 +0,0 @@ -/* -** EPITECH PROJECT, 2020 -** PSU_minishell2_2019 -** File description: -** redirections -*/ - -#include "parser.h" - -static void *my_global_bank(char *cmd, bool get_inc, int add_nb) -{ - static char **ret = NULL; - static int inc_ret = 0; - - if (cmd) { - ret = malloc(sizeof(char *) * (strlen(cmd) + 1)); - return (ret); - } - inc_ret += add_nb; - if (get_inc || add_nb != 0) - return ((void *)&inc_ret); - return (NULL); -} - -char **get_ret(char *cmd) -{ - return ((char **)my_global_bank(cmd, false, 0)); -} - -char **set_ret(char *cmd) -{ - return ((char **)my_global_bank(cmd, false, 0)); -} - -int get_inc_ret(void) -{ - return (*(int *)(my_global_bank(NULL, true, 0))); -} - -void add_inc_ret(int nb) -{ - return (*(int *)(my_global_bank(NULL, true, nb))); -} \ No newline at end of file diff --git a/src/prompt.c b/src/prompt.c index 595fd48..0f03d2f 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -34,14 +34,15 @@ const builtin builtins[] = { int prompt_run(char *cmd, redirection *inout[2], env_t *env) { - char **argv = parse_input(cmd, env); + char **argv = globbing(get_argv(cmd)); - if (!argv) { + if (!argv) return (0); - } - if (!argv[0]) - return (0); - //argv = globbing(argv); + cmd = fusion(argv[0], argv); + free(argv); + if (!cmd) + return (-1); + argv = parse_input(cmd, env); if (!argv) return (0); if (**argv == '!' && argv[0][1] && argv[0][1] != ' ') From efe3e85518a018b4e85ff658d66fb47d5b277927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 01:36:13 +0200 Subject: [PATCH 33/46] adding a free --- src/prompt.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/prompt.c b/src/prompt.c index 0f03d2f..abeb6fb 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -38,6 +38,7 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env) if (!argv) return (0); + free(cmd); cmd = fusion(argv[0], argv); free(argv); if (!cmd) From 5c5e0aba129d6cc4b67ae888e77787dad64b0bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 16:34:24 +0200 Subject: [PATCH 34/46] remarge master in parser --- Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Makefile b/Makefile index f2f3040..ffbd9d7 100644 --- a/Makefile +++ b/Makefile @@ -39,15 +39,12 @@ SRC = src/shell.c \ src/utility/fusion.c \ src/utility/split_commands.c \ src/utility/get_return.c \ -<<<<<<< HEAD src/parser/parser.c \ src/parser/quotes.c \ src/parser/double_quotes.c \ src/parser/parser_utilities.c \ src/parser/parser_vars_utilities.c \ -======= src/utility/eof.c \ ->>>>>>> d4a4ccaaf7fef237a46420f6f1dc26b0dbf40982 src/key_bindings/basic_typing_functions.c \ src/key_bindings/default_bindings.c \ src/key_bindings/control_commands.c \ From 1001222c5464096e16165693bfc65b87cfb41974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 16:50:51 +0200 Subject: [PATCH 35/46] implmenting really nice function --- src/parser/parser.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index e98d10b..87025b0 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -101,8 +101,10 @@ int parser_loop(char *cmd, char **buffer, char **ptr, void **pack) char **parse_input(char *cmd, env_t *e) { wordexp_t truc; - int ret = wordexp(cmd, &truc, WRDE_SHOWERR); + int ret; + cmd = process_vars(cmd, e); + ret = wordexp(cmd, &truc, WRDE_SHOWERR); if (ret) { perror("Wordexp"); return (NULL); From 5471c59eb7b9da09cca335fd9f0463ad8b6d0fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 17:00:54 +0200 Subject: [PATCH 36/46] parser and globbing working nicely --- include/parser.h | 3 ++- src/parser/parser.c | 8 +++----- src/prompt.c | 13 ++++--------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/include/parser.h b/include/parser.h index 765baef..4c167f6 100644 --- a/include/parser.h +++ b/include/parser.h @@ -8,6 +8,7 @@ #pragma once #include "shell.h" +#include #include #include @@ -16,7 +17,7 @@ typedef struct parser_map { int (*parser)(char *, char **, env_t *); } parser_map; -char **parse_input(char *cmd, env_t *env); +char **parse_input(char *cmd, env_t *env, wordexp_t *parser); void free_array(char **array); int parse_quotes(char *ptr, char **data, env_t *env); diff --git a/src/parser/parser.c b/src/parser/parser.c index 87025b0..6430e88 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -16,7 +16,6 @@ #include "parser.h" #include "builtin.h" #include -#include const parser_map parsers[] = { {'\'', &parse_quotes}, @@ -98,16 +97,15 @@ int parser_loop(char *cmd, char **buffer, char **ptr, void **pack) return (0); } -char **parse_input(char *cmd, env_t *e) +char **parse_input(char *cmd, env_t *e, wordexp_t *parser) { - wordexp_t truc; int ret; cmd = process_vars(cmd, e); - ret = wordexp(cmd, &truc, WRDE_SHOWERR); + ret = wordexp(cmd, parser, WRDE_SHOWERR); if (ret) { perror("Wordexp"); return (NULL); } - return (truc.we_wordv); + return (parser->we_wordv); } \ No newline at end of file diff --git a/src/prompt.c b/src/prompt.c index 6128f01..496baa4 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -34,16 +34,10 @@ const builtin builtins[] = { int prompt_run(char *cmd, redirection *inout[2], env_t *env) { - //char **argv = globbing(get_argv(cmd)); char **argv; - // if (!argv) - // return (0); - //free(cmd); - // cmd = fusion(argv[0], argv); - //free(argv); - //if (!cmd) - // return (-1); - argv = parse_input(cmd, env); + wordexp_t parser; + + argv = parse_input(cmd, env, &parser); if (!argv) return (0); if (**argv == '!' && argv[0][1] && argv[0][1] != ' ') @@ -53,6 +47,7 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env) return (run_builtin(&builtins[i], argv, inout, env)); run_cmd(argv, inout, env); free_array(argv); + // wordfree(&parser); return (0); } From d94d1a3d4408553b458956d478b6c0ab2a7f980d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 17:12:26 +0200 Subject: [PATCH 37/46] fixing some norm issues --- src/parser/parser_utilities.c | 51 ++++++++++++----------------------- src/utility/eof.c | 4 +-- 2 files changed, 19 insertions(+), 36 deletions(-) diff --git a/src/parser/parser_utilities.c b/src/parser/parser_utilities.c index 56607cb..24b2065 100644 --- a/src/parser/parser_utilities.c +++ b/src/parser/parser_utilities.c @@ -28,28 +28,10 @@ char *strcat_realloc(char *dest, char *src) return (dest); } -char *process_str(char *new, int nb, env_t *env) -{ - /*static glob_t results; - int flags = GLOB_DOOFFS | GLOB_NOMAGIC | GLOB_NOCHECK; - int ret = 0; - - ret = glob(new, flags, NULL, &results); - if (ret != 0) { - globfree(&results); - return ((char *)glob_error(&new, ret)); - } - free(new); - new = results.gl_pathv[0];*/ - remove_inhibitors_symbols_n_limit(new, nb); - new = process_vars(new, env); - return (new); -} - char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) { char *new; - + if (nb <= 0) return (buffer); new = strndup(ptr, nb + 1); @@ -57,7 +39,8 @@ char *add_to_buffer(char *buffer, char *ptr, int nb, env_t *env) return (NULL); new[nb] = '\0'; if (env) { - new = process_str(new, nb, env); + remove_inhibitors_symbols_n_limit(new, nb); + new = process_vars(new, env); } buffer = strcat_realloc(buffer, new); free(new); @@ -82,26 +65,26 @@ char *substring(char *string, int position, int length) int i; if (pointer == NULL) - return (NULL); + return (NULL); for (i = 0; i < length; i++) *(pointer + i) = *((string + position - 1) + i); *(pointer + i) = '\0'; - return (pointer); + return (pointer); } void insert_substring(char *dest, char *src, int position) { - char *f; - char *e; - int length; + char *f; + char *e; + int length; - length = strlen(dest); - f = substring(dest, 1, position - 1); - e = substring(dest, position, length - position + 1); - strcpy(dest, ""); - strcat(dest, f); - free(f); - strcat(dest, src); - strcat(dest, e); - free(e); + length = strlen(dest); + f = substring(dest, 1, position - 1); + e = substring(dest, position, length - position + 1); + strcpy(dest, ""); + strcat(dest, f); + free(f); + strcat(dest, src); + strcat(dest, e); + free(e); } \ No newline at end of file diff --git a/src/utility/eof.c b/src/utility/eof.c index 92a209b..ef2ddab 100644 --- a/src/utility/eof.c +++ b/src/utility/eof.c @@ -16,10 +16,10 @@ int get_max_eof(char *ignoreeof) bool correct = true; for (int i = 0; ignoreeof[i] && correct; i++) - if(!is_num(ignoreeof[i])) + if (!is_num(ignoreeof[i])) correct = false; if (correct && strcmp(ignoreeof, "0") && strcmp(ignoreeof, "")) - return(strtol(ignoreeof, NULL, 10)); + return (strtol(ignoreeof, NULL, 10)); return (26); } From 620537c7915d1780f1983351bb93b9f9e6c63fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 17:32:19 +0200 Subject: [PATCH 38/46] removing unwanted fress --- src/builtin/builtin_env.c | 4 ---- src/builtin/builtin_manager.c | 3 --- src/prompt.c | 18 ++++++++++++------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/builtin/builtin_env.c b/src/builtin/builtin_env.c index 57f073e..c8932b8 100644 --- a/src/builtin/builtin_env.c +++ b/src/builtin/builtin_env.c @@ -18,7 +18,6 @@ int builtin_env(char **argv, env_t *env) write(1, "\n", 1); } env->vars = my_setenv(env->vars, "?", "0"); - free(argv); return (0); } @@ -39,7 +38,6 @@ int builtin_setenv(char **argv, env_t *env) } env->env = my_setenv(env->env, argv[1], argv[2]); env->vars = my_setenv(env->vars, "?", "0"); - free(argv); return (0); } @@ -48,13 +46,11 @@ int builtin_unsetenv(char **argv, env_t *env) if (!argv[1]) { write(2, "unsetenv: Too few arguments.\n", 29); env->vars = my_setenv(env->vars, "?", "1"); - free(argv); return (0); } for (int i = 1; argv[i]; i++) if (!strchr(argv[i], '=')) env->env = my_unsetenv(env->env, argv[i]); env->vars = my_setenv(env->vars, "?", "0"); - free(argv); return (0); } \ No newline at end of file diff --git a/src/builtin/builtin_manager.c b/src/builtin/builtin_manager.c index 2f062e8..801284d 100644 --- a/src/builtin/builtin_manager.c +++ b/src/builtin/builtin_manager.c @@ -46,7 +46,6 @@ int builtin_cd(char **argv, env_t *env) if (get_argc(argv) > 2) { write(2, "cd: Too many arguments.\n", 25); - free(argv); env->vars = my_setenv(env->vars, "?", "1"); return (0); } @@ -61,7 +60,6 @@ int builtin_cd(char **argv, env_t *env) } else env->env = my_setenv(env->env, "OLDPWD", old); free(old); - free(argv); return (0); } @@ -69,6 +67,5 @@ int builtin_exit(char **argv, env_t *env) { if (argv[1]) env->vars = my_setenv(env->vars, "?", "1"); - free(argv); return (-1); } diff --git a/src/prompt.c b/src/prompt.c index 496baa4..5471c7c 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -36,18 +36,24 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env) { char **argv; wordexp_t parser; + int ret; argv = parse_input(cmd, env, &parser); if (!argv) return (0); - if (**argv == '!' && argv[0][1] && argv[0][1] != ' ') - return (run_builtin(&builtins[5], argv, inout, env)); + if (**argv == '!' && argv[0][1] && argv[0][1] != ' ') { + ret = run_builtin(&builtins[5], argv, inout, env); + wordfree(&parser); + return (ret); + } for (int i = 0; builtins[i].name; i++) - if (!strcmp(argv[0], builtins[i].name)) - return (run_builtin(&builtins[i], argv, inout, env)); + if (!strcmp(argv[0], builtins[i].name)) { + ret = run_builtin(&builtins[i], argv, inout, env); + wordfree(&parser); + return (ret); + } run_cmd(argv, inout, env); - free_array(argv); - // wordfree(&parser); + wordfree(&parser); return (0); } From 58972490d33d05485dceaadda8610d2db3ede28e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 17:52:01 +0200 Subject: [PATCH 39/46] adding frees --- include/shell.h | 2 +- src/prompt.c | 27 +++++++++++++------------- src/redirections/redirection_manager.c | 6 +++--- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/include/shell.h b/include/shell.h index 23de00a..31cc485 100644 --- a/include/shell.h +++ b/include/shell.h @@ -54,7 +54,7 @@ typedef struct env_s void start_shell(env_t *env); void free_env(env_t *env); -int prompt_run(char *cmd, redirection *inout[2], env_t *env); +int prompt_run(char *cmd, redirection *inout[2], env_t *env, redirection *red); void prompt_prepare(buffer_t *buffer, env_t *env); int eval_raw_cmd(char *cmd, env_t *env); diff --git a/src/prompt.c b/src/prompt.c index 5471c7c..ea57e11 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -32,29 +32,28 @@ const builtin builtins[] = { {NULL, NULL} }; -int prompt_run(char *cmd, redirection *inout[2], env_t *env) +int prompt_run(char *cmd, redirection *inout[2], env_t *env, redirection *cmds) { - char **argv; wordexp_t parser; - int ret; + char **argv = parse_input(cmd, env, &parser); + int ret = -2; - argv = parse_input(cmd, env, &parser); if (!argv) return (0); - if (**argv == '!' && argv[0][1] && argv[0][1] != ' ') { + if (**argv == '!' && argv[0][1] && argv[0][1] != ' ') ret = run_builtin(&builtins[5], argv, inout, env); - wordfree(&parser); - return (ret); - } for (int i = 0; builtins[i].name; i++) - if (!strcmp(argv[0], builtins[i].name)) { + if (!strcmp(argv[0], builtins[i].name)) ret = run_builtin(&builtins[i], argv, inout, env); - wordfree(&parser); - return (ret); - } - run_cmd(argv, inout, env); + if (ret == -2) { + run_cmd(argv, inout, env); + ret = 0; + } wordfree(&parser); - return (0); + free(cmd); + if (cmds) + free(cmds); + return (ret); } void prompt_prepare(buffer_t *buffer, env_t *env) diff --git a/src/redirections/redirection_manager.c b/src/redirections/redirection_manager.c index 4cfd1ab..45fc5ab 100644 --- a/src/redirections/redirection_manager.c +++ b/src/redirections/redirection_manager.c @@ -66,16 +66,16 @@ int run_with_redirections(char *cmd, env_t *env, redirection *input) inout[0] = input; inout[1] = NULL; if (!cmds || !cmds[0].type) - return (prompt_run(cmd, inout, env)); + return (prompt_run(cmd, inout, env, cmds)); for (int i = 0; cmds[i].type; i++) { if (cmds[i].type->type & INPUT) inout[0] = &cmds[i]; else inout[1] = &cmds[i]; if (cmds[i].type->type & PIPE) - return (prompt_run(cmd, inout, env)); + return (prompt_run(cmd, inout, env, cmds)); } - return (prompt_run(cmd, inout, env)); + return (prompt_run(cmd, inout, env, cmds)); } int command_format_is_invalid(char **cmds, env_t *env, int *return_values) From eed64a10e5328a8bbb66960c3979c92eed87da07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 19:01:51 +0200 Subject: [PATCH 40/46] Fixing aliases --- include/shell.h | 1 - include/utility.h | 3 +- src/alias.c | 35 ----------- src/builtin/builtin_alias.c | 12 ++-- src/builtin/builtin_history.c | 4 +- src/builtin/builtin_source.c | 2 +- src/key_bindings/basic_typing_functions.c | 2 +- src/parser/parser.c | 23 +++++-- src/prompt.c | 1 - src/redirections/redirection_manager.c | 8 +-- src/utility/split_str.c | 77 +++++++++++------------ 11 files changed, 70 insertions(+), 98 deletions(-) diff --git a/include/shell.h b/include/shell.h index 31cc485..73bd461 100644 --- a/include/shell.h +++ b/include/shell.h @@ -81,7 +81,6 @@ char **globbing(char **argv); char *get_alias(char *cmd, alias_t *alias); char *add_separator(char *cmd, int *return_values, int index); -char *replace_alias(char *cmd, alias_t *alias); char *get_alias_command(char *cmd, alias_t *alias); diff --git a/include/utility.h b/include/utility.h index acba45c..a5b2349 100644 --- a/include/utility.h +++ b/include/utility.h @@ -17,11 +17,10 @@ bool is_alpha(char c); bool is_num(char c); bool envvar_is_valid(const char *str); int count_str(char *str, char *delim); -char **split_str(char *str, char delim); +char **split_str(char *str, char **delims); char *same_var(char *str, const char *to_find); void destroy_str_arr(char **arr); char *fusion(char *command, char **args); -char **split_commands(char *cmd); int *get_return_separator(char *cmd); int split_is_invalid(char **cmds, int *return_values, int i); int count_char(const char *str, char c); diff --git a/src/alias.c b/src/alias.c index 8cb30fc..f480dc7 100644 --- a/src/alias.c +++ b/src/alias.c @@ -12,41 +12,6 @@ #include #include -char *get_alias(char *cmd, alias_t *alias) -{ - char **array = split_commands(cmd); - int *return_values = get_return_separator(cmd); - char *final_command = NULL; - - if (!array) - return (cmd); - for (int i = 0; array[i]; i++) { - if (strlen(array[i]) && (strncmp("alias ", array[i], 6) - && strncmp("unalias ", array[i], 8))) - array[i] = replace_alias(array[i], alias); - array[i] = add_separator(array[i], return_values, i); - if (!array[i]) - return (NULL); - } - final_command = fusion(array[0], array); - return (final_command); -} - -char *replace_alias(char *cmd, alias_t *alias) -{ - char **arg_array = split_str(cmd, ' '); - char *final_str = NULL; - - if (!arg_array) - return (NULL); - for (int i = 0; arg_array[i]; i++) { - arg_array[i] = get_alias_command(arg_array[i], alias); - if (!arg_array[i]) - return (NULL); - } - final_str = fusion(arg_array[0], arg_array); - return (final_str); -} char *get_alias_command(char *cmd, alias_t *alias) { diff --git a/src/builtin/builtin_alias.c b/src/builtin/builtin_alias.c index c548416..1225ede 100644 --- a/src/builtin/builtin_alias.c +++ b/src/builtin/builtin_alias.c @@ -33,8 +33,10 @@ int add_alias(alias_t **list, char *alias, char **command) elem = malloc(sizeof(alias_t)); if (!elem) return (-1); - *elem = (alias_t){alias, concatenate(command), NULL}; - if (!elem->command) + elem->alias = strdup(alias); + elem->command = concatenate(command); + elem->next = NULL; + if (!elem->command || !elem->alias) return (-1); if (*list == NULL) { *list = elem; @@ -75,7 +77,7 @@ char *concatenate(char **command) int pos = 0; if (!command[1]) - return (command[0]); + return (strdup(command[0])); for (int i = 0; command[i]; i++) total_len += strlen(command[i]) + 1; concatened = calloc(total_len + 1, sizeof(char)); @@ -93,8 +95,6 @@ char *concatenate(char **command) void print_aliases(alias_t *list) { - for (alias_t *tmp = list; tmp; tmp = tmp->next) { + for (alias_t *tmp = list; tmp; tmp = tmp->next) printf("%s\t%s\n", tmp->alias, tmp->command); - fflush(stdout); - } } \ No newline at end of file diff --git a/src/builtin/builtin_history.c b/src/builtin/builtin_history.c index 77804b0..eba538d 100644 --- a/src/builtin/builtin_history.c +++ b/src/builtin/builtin_history.c @@ -37,8 +37,10 @@ int add_to_history(char *cmd, env_t *env) char *command = cmd; for (; *command && (*command == ' ' || *command == '\t'); command++); - if (!strlen(command)) + if (!strlen(command)) { + free(log); return (0); + } if (!log) return (-1); for (tmp = env->history; tmp && tmp->next; tmp = tmp->next); diff --git a/src/builtin/builtin_source.c b/src/builtin/builtin_source.c index a823c2b..e4653f0 100644 --- a/src/builtin/builtin_source.c +++ b/src/builtin/builtin_source.c @@ -25,7 +25,7 @@ char **get_arr_from_fd(int fd, char *filepath, char *str) str = malloc(st_buff.st_size + 1); if (str) { read(fd, str, st_buff.st_size); - arr = split_str(str, '\n'); + arr = split_str(str, (char *[]){"\n", NULL}); } return (arr); } diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index 3b9490a..a759b24 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -66,7 +66,7 @@ int newline_command(int key, buffer_t *buffer, env_t *env) if (buffer->buffer) { add_to_history(buffer->buffer, env); my_npause(env->window); - ret = eval_raw_cmd(buffer->buffer, env); + ret = eval_raw_cmd(strdup(buffer->buffer), env); my_nresume(env->window); buffer->buffer[0] = '\0'; buffer->pos = 0; diff --git a/src/parser/parser.c b/src/parser/parser.c index 6430e88..560a136 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -97,15 +97,26 @@ int parser_loop(char *cmd, char **buffer, char **ptr, void **pack) return (0); } -char **parse_input(char *cmd, env_t *e, wordexp_t *parser) +char **parse_input(char *cmd, env_t *env, wordexp_t *parser) { - int ret; + int bin_len; - cmd = process_vars(cmd, e); - ret = wordexp(cmd, parser, WRDE_SHOWERR); - if (ret) { - perror("Wordexp"); + for (bin_len = 0; cmd[bin_len]; bin_len++) { + if (cmd[bin_len] == ' ' || cmd[bin_len] == '\t') + break; + } + cmd = process_vars(cmd, env); + for (alias_t *al = env->alias; al; al = al->next) { + if (!strncmp(al->alias, cmd, bin_len)) { + cmd = realloc(cmd, strlen(cmd) + strlen(al->command) + 1 - bin_len); + rm_n_char(cmd, bin_len); + insert_substring(cmd, al->command, 1); + } + } + if (wordexp(cmd, parser, WRDE_SHOWERR)) { + perror(SHELL_NAME); return (NULL); } + free(cmd); return (parser->we_wordv); } \ No newline at end of file diff --git a/src/prompt.c b/src/prompt.c index ea57e11..43c94d1 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -50,7 +50,6 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env, redirection *cmds) ret = 0; } wordfree(&parser); - free(cmd); if (cmds) free(cmds); return (ret); diff --git a/src/redirections/redirection_manager.c b/src/redirections/redirection_manager.c index 45fc5ab..135aeea 100644 --- a/src/redirections/redirection_manager.c +++ b/src/redirections/redirection_manager.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "utility.h" #include "builtin.h" @@ -85,7 +86,7 @@ int command_format_is_invalid(char **cmds, env_t *env, int *return_values) env->env = my_setenv(env->vars, "?", "1"); return (1); } else if (split_is_invalid(cmds, return_values, i)) { - write(2, "Invalid null command.\n", 22); + dprintf(2, "Invalid null command.\n"); env->vars = my_setenv(env->vars, "?", "1"); return (1); } @@ -99,11 +100,8 @@ int eval_raw_cmd(char *cmd, env_t *env) char **cmds = NULL; int ret = 0; - cmd = get_alias(cmd, env->alias); - if (!cmd) - return (0); return_values = get_return_separator(cmd); - cmds = split_commands(cmd); + cmds = split_str(cmd, (char *[]){";", "||", "&&", NULL}); if (!cmds) return (-1); if (command_format_is_invalid(cmds, env, return_values)) diff --git a/src/utility/split_str.c b/src/utility/split_str.c index 37eedfa..c54edd9 100644 --- a/src/utility/split_str.c +++ b/src/utility/split_str.c @@ -1,36 +1,20 @@ /* ** EPITECH PROJECT, 2020 -** PSU_minishell2_2019 +** Utility ** File description: ** split_str */ +#include #include #include -#include -int ncount_char(const char *str, int end, char c) +static char *get_delimiter(char *str, char **delims) { - int count = 0; - - if (str == NULL) - return (0); - while (*str && end-- > 0) - if (*(str++) == c) - count++; - return (count); -} - -int count_char(const char *str, char c) -{ - int count = 0; - - if (str == NULL) - return (0); - while (*str) - if (*(str++) == c) - count++; - return (count); + for (int i = 0; delims[i]; i++) + if (!strncmp(str, delims[i], strlen(delims[i]))) + return (delims[i]); + return (NULL); } int count_str(char *str, char *delim) @@ -44,27 +28,42 @@ int count_str(char *str, char *delim) return (count); } -char **split_str(char *str, char delim) +static int get_splitted_count(char *str, char **delims) { - char **splited = malloc(sizeof(char *) * (count_char(str, delim) + 2)); - int i; - int j = 0; + int count = 1; + char *delim; + for (int i = 0; str[i]; i++) { + delim = get_delimiter(str + i, delims); + if (delim) { + count++; + i += strlen(delim); + } + } + return (count); +} + +char **split_str(char *str, char **delims) +{ + char **arr = malloc(sizeof(char *) * (get_splitted_count(str, delims) + 1)); + int index = 0; + int i; + char *delim; + + if (!arr) + return (NULL); for (i = 0; str[i]; i++) { - if (str[i] != delim) + if (!(delim = get_delimiter(str + i, delims))) continue; str[i] = '\0'; - if (i > 0) { - splited[j] = str; - j++; - } - str += i + 1; + arr[index] = str; + str += i + strlen(delim); + if (i > 0) + index++; i = -1; } - if (i > 0) { - splited[j] = str; - j++; - } - splited[j] = NULL; - return (splited); + if (i > 0) + arr[index++] = str; + arr[index] = NULL; + return (arr); } \ No newline at end of file From 42d24f859587eb1fc157c1bb197af1494673eea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 19:13:39 +0200 Subject: [PATCH 41/46] starting fixing a test --- tests/tsource.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/tsource.c b/tests/tsource.c index 305be80..8e7c7b2 100644 --- a/tests/tsource.c +++ b/tests/tsource.c @@ -15,7 +15,7 @@ Test(get_special_arg_at, at_arg) { - char **argv = split_str(strdup("source file a b c"), ' '); + char **argv = split_str(strdup("source file a b c"), (char *[]) {" "}); int argv_len = 5; char *res = NULL; @@ -26,7 +26,7 @@ Test(get_special_arg_at, at_arg) Test(get_special_arg_star, at_arg) { - char **argv = split_str(strdup("source file a b c"), ' '); + char **argv = split_str(strdup("source file a b c"), (char *[]) {" "}); int argv_len = 5; char *res = NULL; From 2a15ae6e14cda19ddd232f03b2eec0ce215515c6 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Sat, 23 May 2020 19:17:31 +0200 Subject: [PATCH 42/46] Solving tests --- Makefile | 2 +- tests/tsource.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ffbd9d7..151c5f8 100644 --- a/Makefile +++ b/Makefile @@ -83,7 +83,7 @@ $(NAME): $(OBJ) $(CC) -o $(NAME) $(OBJ) $(LDFLAGS) tests_run: clean - $(CC) -o $(UT) $(TESTS) $(SRC) $(COVERAGE) $(CFLAGS) $(LDFLAGS) + $(CC) -o $(UT) $(TESTS) $(SRC) $(COVERAGE) -g $(CFLAGS) $(LDFLAGS) $(UT) func: all diff --git a/tests/tsource.c b/tests/tsource.c index 8e7c7b2..00f5803 100644 --- a/tests/tsource.c +++ b/tests/tsource.c @@ -15,7 +15,7 @@ Test(get_special_arg_at, at_arg) { - char **argv = split_str(strdup("source file a b c"), (char *[]) {" "}); + char **argv = split_str(strdup("source file a b c"), (char *[]) {" ", NULL}); int argv_len = 5; char *res = NULL; @@ -26,7 +26,7 @@ Test(get_special_arg_at, at_arg) Test(get_special_arg_star, at_arg) { - char **argv = split_str(strdup("source file a b c"), (char *[]) {" "}); + char **argv = split_str(strdup("source file a b c"), (char *[]) {" ", NULL}); int argv_len = 5; char *res = NULL; From b28472127d5213c7041d41e54a341ff14953fdd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Sat, 23 May 2020 19:27:51 +0200 Subject: [PATCH 43/46] fixing invalid free --- src/key_bindings/basic_typing_functions.c | 2 +- src/parser/parser.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index a759b24..3b9490a 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -66,7 +66,7 @@ int newline_command(int key, buffer_t *buffer, env_t *env) if (buffer->buffer) { add_to_history(buffer->buffer, env); my_npause(env->window); - ret = eval_raw_cmd(strdup(buffer->buffer), env); + ret = eval_raw_cmd(buffer->buffer, env); my_nresume(env->window); buffer->buffer[0] = '\0'; buffer->pos = 0; diff --git a/src/parser/parser.c b/src/parser/parser.c index 560a136..85dbf27 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -7,16 +7,18 @@ #define _XOPEN_SOURCE +#include "parser.h" #include "shell.h" #include "redirections.h" +#include "utility.h" +#include "builtin.h" #include #include #include -#include "utility.h" -#include "parser.h" -#include "builtin.h" #include +char *strdup(const char *); + const parser_map parsers[] = { {'\'', &parse_quotes}, {'"', &parse_double_quotes}, @@ -101,6 +103,7 @@ char **parse_input(char *cmd, env_t *env, wordexp_t *parser) { int bin_len; + cmd = strdup(cmd); for (bin_len = 0; cmd[bin_len]; bin_len++) { if (cmd[bin_len] == ' ' || cmd[bin_len] == '\t') break; From f52e8e9d2a552ef3aceff725f518d6e54d4bb87f Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Sat, 23 May 2020 21:58:53 +0200 Subject: [PATCH 44/46] Fixing alias with spaces before command --- Makefile | 3 +- src/alias.c | 53 ---------------------------- src/parser/parser.c | 84 ++++----------------------------------------- 3 files changed, 8 insertions(+), 132 deletions(-) delete mode 100644 src/alias.c diff --git a/Makefile b/Makefile index 151c5f8..511f0d9 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,6 @@ SRC = src/shell.c \ src/prompt.c \ - src/alias.c \ src/execute.c \ src/glob.c \ src/redirections/redirection_manager.c \ @@ -60,7 +59,7 @@ TESTS = tests/tenv.c \ tests/targc.c \ tests/texecute.c \ tests/tcd.c \ - tests/tsource.c \ + tests/tsource.c \ tests/techo.c COVERAGE = -lcriterion --coverage diff --git a/src/alias.c b/src/alias.c deleted file mode 100644 index f480dc7..0000000 --- a/src/alias.c +++ /dev/null @@ -1,53 +0,0 @@ -/* -** EPITECH PROJECT, 2020 -** alias.c -** File description: -** alias -*/ - -#include "shell.h" -#include "builtin.h" -#include "utility.h" -#include -#include -#include - - -char *get_alias_command(char *cmd, alias_t *alias) -{ - alias_t *tmp = NULL; - - tmp = alias; - for (; tmp; tmp = tmp->next) { - if (!strcmp(cmd, alias->alias)) { - cmd = strdup(alias->command); - tmp = alias; - } - } - return (cmd); -} - -char *add_separator(char *cmd, int *return_values, int index) -{ - int pos = 0; - char *new_cmd = NULL; - - if (!cmd) - return (NULL); - new_cmd = calloc(strlen(cmd) + 3, sizeof(char)); - if (!new_cmd) - return (NULL); - for (int i = 0; cmd[i]; i++) - new_cmd[i] = cmd[pos++]; - if (return_values[index + 1] != -2) { - new_cmd[pos] = ';'; - if (return_values[index + 1] == 1) { - new_cmd[pos++] = '|'; - new_cmd[pos++] = '|'; - } else if (return_values[index + 1] == 0) { - new_cmd[pos++] = '&'; - new_cmd[pos++] = '&'; - } - } - return (new_cmd); -} \ No newline at end of file diff --git a/src/parser/parser.c b/src/parser/parser.c index 85dbf27..5119b61 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -19,91 +19,21 @@ char *strdup(const char *); -const parser_map parsers[] = { - {'\'', &parse_quotes}, - {'"', &parse_double_quotes}, - {'\0', NULL} -}; - -bool is_character_valid(char c) +int count_trailing_spaces(char *cmd) { - static bool is_valid = false; + int i = 0; - if (is_valid) { - is_valid = false; - return (true); - } - if (c == '\\') { - is_valid = true; - } - return (c >= 33 && c <= 126); -} - -int call_parsers(char *cmd, int index, char **data, env_t *env) -{ - int new_index = 0; - - for (int i = 0; parsers[i].key; i++) { - if (cmd[index] != parsers[i].key) - continue; - new_index = parsers[i].parser(&cmd[index], data, env); - if (!(*data)) - return (-1); - return (new_index); - } - return (0); -} - -int manage_specials_parsers(char *cmd, char **buffer, int *inc, env_t *env) -{ - int new_index = 0; - char *data = NULL; - - new_index = call_parsers(cmd, 0, &data, env); - if (new_index == -1) - return (-1); - if (new_index > 0) { - (*inc)--; - *buffer = add_to_buffer(*buffer, &cmd[(*inc) * -1], (*inc), env); - *buffer = add_to_buffer(*buffer, data, strlen(data), NULL); - free(data); - (*inc) = 0; - if (!(*buffer)) - return (-1); - return (new_index); - } - return (0); -} - -int parser_loop(char *cmd, char **buffer, char **ptr, void **pack) -{ - int *i = pack[0]; - int *inc = pack[1]; - int *new_index = pack[2]; - env_t *env = pack[3]; - - if (is_character_valid(cmd[*i])) { - (*new_index) = manage_specials_parsers(&cmd[(*i)], buffer, inc, env); - if ((*new_index) == -1) - return (-1); - (*i) += (*new_index); - if (*new_index) - (*ptr) = cmd + (*i) + 1; - return (1); - } - if (*inc == 1 && !(*new_index)) { - (*ptr) = cmd + (*i) + 1; - (*inc) = 0; - return (1); - } - return (0); + for (i = 0; cmd[i]; i++) + if (cmd[i] != ' ' && cmd[i] != '\t') + break; + return (i); } char **parse_input(char *cmd, env_t *env, wordexp_t *parser) { int bin_len; - cmd = strdup(cmd); + cmd = strdup(cmd + count_trailing_spaces(cmd)); for (bin_len = 0; cmd[bin_len]; bin_len++) { if (cmd[bin_len] == ' ' || cmd[bin_len] == '\t') break; From ecd2e01941f39a228923717ce2fe59def77e4797 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Sun, 24 May 2020 01:13:43 +0200 Subject: [PATCH 45/46] Fixing mosts of the functional tests --- include/utility.h | 4 +++- src/parser/parser.c | 26 +++++++++++++++++++++++--- src/redirections/redirection_manager.c | 16 +++++++++------- src/utility/split_str.c | 4 ++-- tests/tester/tests | 10 +--------- 5 files changed, 38 insertions(+), 22 deletions(-) diff --git a/include/utility.h b/include/utility.h index a5b2349..91eaf9c 100644 --- a/include/utility.h +++ b/include/utility.h @@ -26,4 +26,6 @@ int split_is_invalid(char **cmds, int *return_values, int i); int count_char(const char *str, char c); int ncount_char(const char *str, int end, char c); int get_max_eof(char *ignoreeof); -int skip_eof(buffer_t *buffer, env_t *env); \ No newline at end of file +int skip_eof(buffer_t *buffer, env_t *env); +int count_trailing_spaces(char *cmd); +char **remove_leading_entries(char **cmds); \ No newline at end of file diff --git a/src/parser/parser.c b/src/parser/parser.c index 5119b61..75f6d1e 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -29,23 +29,43 @@ int count_trailing_spaces(char *cmd) return (i); } -char **parse_input(char *cmd, env_t *env, wordexp_t *parser) +char **remove_leading_entries(char **cmds) +{ + if (!cmds) + return (NULL); + for (int i = 0; cmds[i]; i++) + if (cmds[i][count_trailing_spaces(cmds[i])]) + return (cmds + i); + return (cmds); +} + +char *process_aliases(char *cmd, env_t *env) { int bin_len; - cmd = strdup(cmd + count_trailing_spaces(cmd)); for (bin_len = 0; cmd[bin_len]; bin_len++) { if (cmd[bin_len] == ' ' || cmd[bin_len] == '\t') break; } - cmd = process_vars(cmd, env); for (alias_t *al = env->alias; al; al = al->next) { if (!strncmp(al->alias, cmd, bin_len)) { cmd = realloc(cmd, strlen(cmd) + strlen(al->command) + 1 - bin_len); + if (!cmd) + return (NULL); rm_n_char(cmd, bin_len); insert_substring(cmd, al->command, 1); } } + return (cmd); +} + +char **parse_input(char *cmd, env_t *env, wordexp_t *parser) +{ + if (!(cmd = strdup(cmd + count_trailing_spaces(cmd)))) + return (NULL); + if (!(cmd = process_vars(cmd, env))) + return (NULL); + cmd = process_aliases(cmd, env); if (wordexp(cmd, parser, WRDE_SHOWERR)) { perror(SHELL_NAME); return (NULL); diff --git a/src/redirections/redirection_manager.c b/src/redirections/redirection_manager.c index 135aeea..8fa2e5c 100644 --- a/src/redirections/redirection_manager.c +++ b/src/redirections/redirection_manager.c @@ -79,19 +79,20 @@ int run_with_redirections(char *cmd, env_t *env, redirection *input) return (prompt_run(cmd, inout, env, cmds)); } -int command_format_is_invalid(char **cmds, env_t *env, int *return_values) +bool command_format_is_invalid(char **cmds, env_t *env, int *return_values) { for (int i = 0; cmds[i]; i++) { - if (redirections_are_invalid(cmds[i])) { - env->env = my_setenv(env->vars, "?", "1"); - return (1); - } else if (split_is_invalid(cmds, return_values, i)) { + if (!cmds[i] || !cmds[i][count_trailing_spaces(cmds[i])] + || split_is_invalid(cmds, return_values, i)) { dprintf(2, "Invalid null command.\n"); env->vars = my_setenv(env->vars, "?", "1"); - return (1); + return (true); + } else if (redirections_are_invalid(cmds[i])) { + env->env = my_setenv(env->vars, "?", "1"); + return (true); } } - return (0); + return (false); } int eval_raw_cmd(char *cmd, env_t *env) @@ -102,6 +103,7 @@ int eval_raw_cmd(char *cmd, env_t *env) return_values = get_return_separator(cmd); cmds = split_str(cmd, (char *[]){";", "||", "&&", NULL}); + cmds = remove_leading_entries(cmds); if (!cmds) return (-1); if (command_format_is_invalid(cmds, env, return_values)) diff --git a/src/utility/split_str.c b/src/utility/split_str.c index c54edd9..30bc132 100644 --- a/src/utility/split_str.c +++ b/src/utility/split_str.c @@ -62,8 +62,8 @@ char **split_str(char *str, char **delims) index++; i = -1; } - if (i > 0) - arr[index++] = str; + // if (i > 0) + arr[index++] = str; arr[index] = NULL; return (arr); } \ No newline at end of file diff --git a/tests/tester/tests b/tests/tester/tests index dcbde9a..d7f5d86 100644 --- a/tests/tester/tests +++ b/tests/tester/tests @@ -332,7 +332,7 @@ NAME="933" SETUP="" CLEAN="" TESTS= - echo ' || ls' + echo ' && ls' [933-END] [934] @@ -343,14 +343,6 @@ TESTS= echo ' || ' [934-END] -[935] -NAME="935" -SETUP="" -CLEAN="" -TESTS= - echo ' && ' -[935-END] - [936] NAME="936" SETUP="" From 94c667cbff9080e33037c3976288657a4c62771c Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Sun, 24 May 2020 14:57:12 +0200 Subject: [PATCH 46/46] Completing the merge --- Makefile | 2 +- src/alias.c | 61 ----------------------------------------------------- 2 files changed, 1 insertion(+), 62 deletions(-) diff --git a/Makefile b/Makefile index 059bd7a..155adde 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ SRC = src/shell.c \ src/prompt.c \ src/execute.c \ - src/glob.c \ + src/alias.c \ src/redirections/redirection_manager.c \ src/redirections/redirections.c \ src/redirections/redirections_functions.c \ diff --git a/src/alias.c b/src/alias.c index 37d89dd..d3139cb 100644 --- a/src/alias.c +++ b/src/alias.c @@ -12,42 +12,6 @@ #include #include -char *get_alias(char *cmd, alias_t *alias) -{ - char **array = split_commands(cmd); - int *return_values = get_return_separator(cmd); - char *final_command = NULL; - - if (!array) - return (cmd); - for (int i = 0; array[i]; i++) { - if (strlen(array[i]) && (strncmp("alias ", array[i], 6) - && strncmp("unalias ", array[i], 8))) - array[i] = replace_alias(array[i], alias); - array[i] = add_separator(array[i], return_values, i); - if (!array[i]) - return (NULL); - } - final_command = fusion(array[0], array); - return (final_command); -} - -char *replace_alias(char *cmd, alias_t *alias) -{ - char **arg_array = split_str(cmd, ' '); - char *final_str = NULL; - - if (!arg_array) - return (NULL); - for (int i = 0; i == 0; i++) { - arg_array[i] = get_alias_command(arg_array[i], alias); - if (!arg_array[i]) - return (NULL); - } - final_str = fusion(arg_array[0], arg_array); - return (final_str); -} - char *get_alias_command(char *cmd, alias_t *alias) { alias_t *tmp = NULL; @@ -60,29 +24,4 @@ char *get_alias_command(char *cmd, alias_t *alias) } } return (cmd); -} - -char *add_separator(char *cmd, int *return_values, int index) -{ - int pos = 0; - char *new_cmd = NULL; - - if (!cmd) - return (NULL); - new_cmd = calloc(strlen(cmd) + 3, sizeof(char)); - if (!new_cmd) - return (NULL); - for (int i = 0; cmd[i]; i++) - new_cmd[i] = cmd[pos++]; - if (return_values[index + 1] != -2) { - new_cmd[pos] = ';'; - if (return_values[index + 1] == 1) { - new_cmd[pos++] = '|'; - new_cmd[pos++] = '|'; - } else if (return_values[index + 1] == 0) { - new_cmd[pos++] = '&'; - new_cmd[pos++] = '&'; - } - } - return (new_cmd); } \ No newline at end of file