From 6401e1759f08f7af153968dfcbc88135b0be94ac Mon Sep 17 00:00:00 2001 From: Antoine Riard Date: Wed, 15 Mar 2017 21:06:35 +0100 Subject: [PATCH] gestion d erreurs math builtin --- 42sh/includes/builtin.h | 8 +++++++- 42sh/libft | 2 +- 42sh/src/builtin/builtin_cd.c | 2 +- 42sh/src/builtin/builtin_math.c | 24 ++++++++++++++++-------- 42sh/src/glob/word_is_assignment.c | 2 +- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/42sh/includes/builtin.h b/42sh/includes/builtin.h index faa35a15..69284aac 100644 --- a/42sh/includes/builtin.h +++ b/42sh/includes/builtin.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/14 22:59:57 by jhalford #+# #+# */ -/* Updated: 2017/03/15 00:48:28 by ariard ### ########.fr */ +/* Updated: 2017/03/15 20:37:38 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,12 @@ # define BT_EXPORT_LP (1 << 0) +# define MATHERR_0 "{red}math : invalid number of arguments {eoc}\n" +# define MATHERR_1 "{red}math : invalid variable name {eoc}\n" +# define MATHERR_2 "{red}math : invalid operator {eoc}\n" +# define MATHERR_3 "{red}math : invalid operand {eoc}\n" +# define MATHERR_4 "{red}math : division by 0 {eoc}\n" + t_execf *is_builtin(t_process *p); int builtin_export(const char *path, char *const av[], char *const envp[]); int builtin_unset(const char *path, char *const av[], char *const envp[]); diff --git a/42sh/libft b/42sh/libft index 938a355b..89d3f6e6 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit 938a355bac5f6d4c7941968d3ef0da0d984a9329 +Subproject commit 89d3f6e67e707e42fca42cc89e3f39e5f840908a diff --git a/42sh/src/builtin/builtin_cd.c b/42sh/src/builtin/builtin_cd.c index 711a2828..c99503f6 100644 --- a/42sh/src/builtin/builtin_cd.c +++ b/42sh/src/builtin/builtin_cd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:57:53 by jhalford #+# #+# */ -/* Updated: 2017/03/15 10:52:44 by gwojda ### ########.fr */ +/* Updated: 2017/03/15 20:55:40 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/builtin/builtin_math.c b/42sh/src/builtin/builtin_math.c index 3bcbd1ea..05f80f7f 100644 --- a/42sh/src/builtin/builtin_math.c +++ b/42sh/src/builtin/builtin_math.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/07 10:58:49 by ariard #+# #+# */ -/* Updated: 2017/03/14 22:45:23 by ariard ### ########.fr */ +/* Updated: 2017/03/15 21:02:59 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,6 +25,8 @@ static int get_value(char **var, char **value) { char *temp; + if (!word_is_assignment(var)) + return (ft_error_message(MATHERR_1)); temp = ft_sstrstr(data_singleton()->local_var, *var); if (temp) { @@ -51,10 +53,8 @@ static int do_math(char **value, char *operator, char *operand) ope2 = ft_atoi(operand); else ope2 = 0; - if (ft_strlen(operator) > 1) - return (0); if ((operator[0] == '/' || operator[0] == '%') && ope2 == 0) - ope1 = 0; + return (ft_error_message(MATHERR_4)); else { ope1 = (operator[0] == '+') ? ope1 + ope2 : ope1; @@ -77,13 +77,21 @@ int builtin_math(const char *path, char *const av[], char *const envp[]) (void)path; (void)envp; + if (!av || !av[1] || !av[2] || !av[3] || av[4]) + return (ft_error_message(MATHERR_0)); init_math(&var, &value, &operator, &operand); var = av[1]; - get_value(&var, &value); + if (get_value(&var, &value) == -1) + return (-1); operator = av[2]; - operand = av[3]; -// DG("math %s %s %s", var, operator, operand); - do_math(&value, operator, operand); + if (!(ft_strlen(operator) == 1 && (operator[0] == '+' || operator[0] == '-' + || operator[0] == '/' || operator[0] == '*' || operator[0] == '%'))) + return (ft_error_message(MATHERR_2)); + operand = av[3]; + if (!ft_stris(operand, &ft_isdigit)) + return (ft_error_message(MATHERR_3)); + if (do_math(&value, operator, operand) == -1) + return (-1); builtin_setenv("setenv", (char *[]){"local", var, value, 0}, data_singleton()->local_var); return (0); } diff --git a/42sh/src/glob/word_is_assignment.c b/42sh/src/glob/word_is_assignment.c index e4dc0de8..cc010e51 100644 --- a/42sh/src/glob/word_is_assignment.c +++ b/42sh/src/glob/word_is_assignment.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/07 18:59:11 by wescande #+# #+# */ -/* Updated: 2017/03/11 20:47:05 by ariard ### ########.fr */ +/* Updated: 2017/03/15 20:55:15 by ariard ### ########.fr */ /* */ /* ************************************************************************** */