ft_atoi.c
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* ft_atoi.c :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: salee2 <salee2@student.42seoul.kr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2022/08/01 13:24:41 by salee2 #+# #+# */ 9 /* Updated: 2022/08/01 13:24:52 by salee2 ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "include/minirt.h" 14 15 int is_space(int c) 16 { 17 if ((9 <= c && c <= 13) || c == 32) 18 return (1); 19 return (0); 20 } 21 22 long long toll(const char *str, long long sign, size_t i) 23 { 24 long long acc; 25 const long long llmax = LONG_LONG_MAX; 26 27 acc = 0; 28 while (str[i] && str[i] != '.') 29 { 30 if (acc > llmax / 10 || (acc == llmax / 10 && str[i] - '0' \ 31 > (llmax % 10)) || !ft_isdigit(str[i])) 32 { 33 if (sign == 1) 34 return (LONG_LONG_MAX); 35 else 36 return (LONG_LONG_MIN); 37 } 38 acc = acc * 10 + str[i] - '0'; 39 ++i; 40 } 41 return (sign * acc); 42 } 43 44 int ft_atoi(const char *str, int *is_error, double *sign) 45 { 46 size_t i; 47 long long ret; 48 49 i = 0; 50 *sign = 1; 51 while (is_space(str[i])) 52 ++i; 53 if (str[i] == '+' || str[i] == '-') 54 { 55 if (str[i] == '-') 56 *sign = -1; 57 ++i; 58 } 59 ret = toll(str, *sign, i); 60 if (str[i] == 0 || ret > INT_MAX || ret < INT_MIN) 61 *is_error = 1; 62 return ((int) ret); 63 }