From b116df83e14c068b261fcbb554ae590ac486df92 Mon Sep 17 00:00:00 2001 From: Takumi Hara Date: Tue, 17 May 2022 12:57:11 +0900 Subject: [PATCH] refac: handle when invalid real number given --- scenes_bonus/err_real_invalid.rt | 7 +++++++ scenes_bonus/err_real_overflow.rt | 7 +++++++ src/rt_params.c | 9 ++++----- src/scene.c | 3 ++- libft/ft_atoi.c => utils/atoi_strict.c | 17 +++++++++-------- utils/utils.h | 1 + 6 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 scenes_bonus/err_real_invalid.rt create mode 100644 scenes_bonus/err_real_overflow.rt rename libft/ft_atoi.c => utils/atoi_strict.c (61%) diff --git a/scenes_bonus/err_real_invalid.rt b/scenes_bonus/err_real_invalid.rt new file mode 100644 index 0000000..3e82c08 --- /dev/null +++ b/scenes_bonus/err_real_invalid.rt @@ -0,0 +1,7 @@ +A 0.1 255,255,255 +L -5,5,-5 1 255,255,255 +C 0,0,-10 0.3,-0.1,1 30 +# C 0,10,0 0,-1,-0 100 + +sp 6,0.5,1 2.0 176,176,176 +ch 10a 10 255,255,255 0,0,255 diff --git a/scenes_bonus/err_real_overflow.rt b/scenes_bonus/err_real_overflow.rt new file mode 100644 index 0000000..b0ff7f0 --- /dev/null +++ b/scenes_bonus/err_real_overflow.rt @@ -0,0 +1,7 @@ +A 0.1 255,255,255 +L -5,5,-5 1 255,255,255 +C 0,0,-10 0.3,-0.1,1 30 +# C 0,10,0 0,-1,-0 100 + +sp 6,0.5,1 2.0 176,176,176 +ch 1000000000000000000000000000000000 50 255,255,255 0,0,255 diff --git a/src/rt_params.c b/src/rt_params.c index fac6668..09a5813 100644 --- a/src/rt_params.c +++ b/src/rt_params.c @@ -1,5 +1,4 @@ #include "../include/scene.h" -#include "../libft/libft.h" char *load_ambient(t_program *p, char **info) { @@ -98,12 +97,12 @@ char *load_checker(t_program *p, char **info) if (object->material.flag == (1 << MFLAG_CHECKER)) return (ERR_DUPLICATE_MATERIAL); object->material.flag |= (1 << MFLAG_CHECKER); - object->material.checker_width = ft_atoi(info[1]); - if (!(0 <= object->material.checker_width)) + if (!(atoi_strict(info[0], &object->material.checker_width) && 0 <= object->material.checker_width)) return (ERR_MISCONFIGURED_CHECKER); - object->material.checker_height = ft_atoi(info[1]); - if (!(0 <= object->material.checker_height)) + printf("%d\n", object->material.checker_width); + if (!(atoi_strict(info[1], &object->material.checker_height) && 0 <= object->material.checker_height)) return (ERR_MISCONFIGURED_CHECKER); + printf("%d\n", object->material.checker_height); if (!(get_color_from_str(info[2], &c) && check_color_range(c, 0.0, 255.0))) return (ERR_MISCONFIGURED_CHECKER); object->material.checker_col1 = color_mult(c, (double)1/255); diff --git a/src/scene.c b/src/scene.c index 233c578..73fe7da 100644 --- a/src/scene.c +++ b/src/scene.c @@ -89,7 +89,8 @@ static void read_rt_file(char *filename, t_program *p) if (err != NO_ERR) break ; } - err = check_lack_of_identifier(ident_flag); + if (err == NO_ERR) + err = check_lack_of_identifier(ident_flag); free(line); x_close(fd); if (err != NO_ERR) diff --git a/libft/ft_atoi.c b/utils/atoi_strict.c similarity index 61% rename from libft/ft_atoi.c rename to utils/atoi_strict.c index fa5bccf..079203c 100644 --- a/libft/ft_atoi.c +++ b/utils/atoi_strict.c @@ -1,6 +1,6 @@ -#include +#include -int ft_atoi(char *str) +bool atoi_strict(char *str, int *dst) { long long rtn; int sign; @@ -13,16 +13,17 @@ int ft_atoi(char *str) sign = -1; if (*str == '+' || *str == '-') str++; + if (*str == '\0') + return (false); while ('0' <= *str && *str <= '9') { if ((rtn * 10 + *str - '0') / 10 != rtn) - { - if (sign == 1) - return ((int)(LONG_MAX)); - return ((int)(LONG_MIN)); - } + return (false); rtn = rtn * 10 + *str - '0'; str++; } - return ((int)(sign * rtn)); + *dst = (int)(sign * rtn); + if (*str == '\0') + return (true); + return (false); } diff --git a/utils/utils.h b/utils/utils.h index 31bc41f..a77d558 100644 --- a/utils/utils.h +++ b/utils/utils.h @@ -14,5 +14,6 @@ void exit_with_error_message(const char *msg); bool ft_strtod(const char *s, double *val); size_t count_2d_array(void **array); void free_2d_array(void ***array); +bool atoi_strict(char *str, int *dst); #endif