diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-01-15 11:40:48 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-01-15 11:40:48 +0100 |
| commit | 496afe8e8a82d6db730bf835eb5fbe1ef3a142be (patch) | |
| tree | bf9f12c2abb32d436783743045fc900a2172ecdc /src/str | |
| parent | 1e9b077e0d9f3c50d7d518bf6ea7f08e7f5ec590 (diff) | |
| download | libft-496afe8e8a82d6db730bf835eb5fbe1ef3a142be.tar.gz libft-496afe8e8a82d6db730bf835eb5fbe1ef3a142be.tar.bz2 libft-496afe8e8a82d6db730bf835eb5fbe1ef3a142be.zip | |
Added ft_strtol, ft_isspace, ft_todigit, ft_strict_atoi, modified ft_atoi to use ft_strtol
Diffstat (limited to 'src/str')
| -rw-r--r-- | src/str/ft_atoi.c | 29 | ||||
| -rw-r--r-- | src/str/ft_strict_atoi.c | 38 | ||||
| -rw-r--r-- | src/str/ft_strtol.c | 78 |
3 files changed, 118 insertions, 27 deletions
diff --git a/src/str/ft_atoi.c b/src/str/ft_atoi.c index 0ad6022..fa31407 100644 --- a/src/str/ft_atoi.c +++ b/src/str/ft_atoi.c @@ -6,38 +6,13 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/07 09:46:16 by cacharle #+# #+# */ -/* Updated: 2020/01/15 09:26:14 by cacharle ### ########.fr */ +/* Updated: 2020/01/15 10:56:06 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" -#define MIN_INT -2147483648 -#define MAX_INT 2147483647 - int ft_atoi(const char *str) { - unsigned int nb; - int i; - int is_negative; - - while (*str == ' ' || *str == '\t' || *str == '\n' - || *str == '\v' || *str == '\f' || *str == '\r') - str++; - is_negative = 0; - if (*str == '-' || *str == '+') - if (*str++ == '-') - is_negative = 1; - i = 0; - nb = 0; - while (ft_isdigit(str[i])) - { - if (!is_negative && nb > (unsigned int)MAX_INT) - return (-1); - else if (nb > (unsigned int)MIN_INT) - return (0); - nb *= 10; - nb += str[i++] & 0x0F; - } - return ((int)(is_negative ? -nb : nb)); + return ((int)ft_strtol(str, (char**)NULL, 10)); } diff --git a/src/str/ft_strict_atoi.c b/src/str/ft_strict_atoi.c new file mode 100644 index 0000000..c25ebdd --- /dev/null +++ b/src/str/ft_strict_atoi.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strict_atoi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/15 10:06:29 by cacharle #+# #+# */ +/* Updated: 2020/01/15 11:32:17 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strict_atoi(const char *s) +{ + char *end; + long ret; + + if (*s != '-' && !ft_isdigit(*s)) + { + errno = EINVAL; + return (0); + } + errno = 0; + ret = ft_strtol(s, &end, 10); + if (errno == ERANGE || ret > INT_MAX || ret < INT_MIN) + { + errno = ERANGE; + return (0); + } + if (*end != '\0') + { + errno = EINVAL; + return (0); + } + return (ret); +} diff --git a/src/str/ft_strtol.c b/src/str/ft_strtol.c new file mode 100644 index 0000000..447f1af --- /dev/null +++ b/src/str/ft_strtol.c @@ -0,0 +1,78 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strtol.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/15 10:26:45 by cacharle #+# #+# */ +/* Updated: 2020/01/15 11:39:34 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +#define STRTOL_STD_BASE "0123456789abcdefghijklmnopqrstuvwxyz" + +static int strtol_handle_base(int base, const char **str) +{ + if (base != 16 && base != 0) + return (base); + if (base == 16 && **str == '0' && (*str)[1] == 'x') + { + *str += 2; + return (base); + } + if (**str == '0') + { + (*str)++; + if (**str == 'x') + { + (*str)++; + return (16); + } + else + return (8); + } + return (10); +} + +static long errno_return(int err) +{ + errno = err; + return (0); +} + +/* +** If there is no digits doesn't put str in endptr like the original, +** instead it puts the address of the char after spaces and sign. +** Too much lines and annoyance, I can't be bothered. +*/ + +long ft_strtol(const char *str, char **endptr, int base) +{ + t_bool is_negative; + long long nb; + char base_str[37]; + + if (base > 36) + return (errno_return(EINVAL)); + while (ft_isspace(*str)) + str++; + is_negative = *str == '-' ? TRUE : FALSE; + if (*str == '-' || *str == '+') + str++; + base = strtol_handle_base(base, &str); + ft_strncpy(base_str, STRTOL_STD_BASE, base); + nb = 0; + while (ft_strchr(base_str, *str) != NULL) + { + nb *= base; + nb += ft_strchr(base_str, ft_tolower(*str)) - base_str; + if (((long)nb ^ (long)(nb / base)) < 0) + return (errno_return(ERANGE)); + } + if (endptr != NULL) + *endptr = (char*)str; + return (is_negative ? -nb : nb); +} |
