From 23fd5258745d9799c9503ae7c2028aea59437769 Mon Sep 17 00:00:00 2001 From: Louis Date: Sun, 24 May 2020 21:51:25 +0200 Subject: [PATCH] error handling --- include/builtin.h | 2 +- src/builtin/builtin_if.c | 45 ++++++++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/include/builtin.h b/include/builtin.h index 0285cec..54694b3 100644 --- a/include/builtin.h +++ b/include/builtin.h @@ -62,6 +62,6 @@ void remove_alias(char *alias, alias_t **list); int print_char(char *str, int i); //if - +char *get_expr(char **argv); int get_test_return_value(char **argv, env_t *env); int get_max_cmd_len(char **argv); \ No newline at end of file diff --git a/src/builtin/builtin_if.c b/src/builtin/builtin_if.c index 131915b..de55c14 100644 --- a/src/builtin/builtin_if.c +++ b/src/builtin/builtin_if.c @@ -11,6 +11,25 @@ #include "shell.h" #include "builtin.h" +int matched_parenthesis(char **argv) +{ + int left_p = 0; + int right_p = 0; + + for (int i = 0; argv[i]; i++) + for (int j = 0; argv[i][j]; j++) { + left_p = argv[i][j] == '(' ? left_p + 1 : left_p; + right_p = argv[i][j] == ')' ? right_p + 1 : right_p; + } + if (left_p > right_p) + printf("Too many ('s.\n"); + if (right_p > left_p) + printf("Too many )'s.\n"); + if (left_p == right_p) + return (1); + return (0); +} + int get_max_cmd_len(char **argv) { int len = 0; @@ -48,30 +67,30 @@ int execute_one_liner(char **argv, env_t *env) return (0); } -int is_valid_expression(char **argv) +int is_valid_if_cmd(char **argv) { int len = 0; for (; argv[len]; len++); - if (len < 1) + if (len < 1) { + printf("if: Too few arguments\n"); return (0); - if (argv[1][0] != '(') + } + if (!matched_parenthesis(argv)) return (0); - for (int i = 1; argv[i]; i++) - for (int j = 0; argv[i][j]; j++) - if (argv[i][j] == ')') - return (1); - return (0); + if (argv[1][0] != '(') { + printf("if: Expression Syntax.\n"); + return (0); + } + return (1); } int builtin_if(char **argv, env_t *env) { - if (is_valid_expression(argv)) { + if (is_valid_if_cmd(argv)) { execute_one_liner(argv, env); - } else { - printf("if: Expression Syntax.\n"); - fflush(stdout); + env->vars = my_setenv(env->vars, "?", "0"); + } else env->vars = my_setenv(env->vars, "?", "1"); - } return (0); } \ No newline at end of file