/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ft_atoi.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tischmid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/27 19:51:48 by tischmid #+# #+# */ /* Updated: 2023/03/31 21:58:42 by tischmid ### ########.fr */ /* */ /* ************************************************************************** */ unsigned int char_count(const char *str, char c) { unsigned int count; count = 0; while (*str) { if (*str == c) ++count; ++str; } return (count); } // Return 0 if the base is invalid or the length of the base otherwise unsigned int is_valid_base(const char *base) { unsigned int size; size = 0; while (*base) { if (*base == '+' || *base == '-' || *base == ' ') return (0); if (char_count(base, *base) > 1) return (0); ++size; ++base; } if (size < 2) return (0); return (size); } int char_index(const char *str, const char c) { int idx; idx = 0; while (*str) { if (*str++ == c) return (idx); ++idx; } return (-1); } int ft_atoi(char *str) { int sign; int abs; int index_in_base; unsigned int base_len; abs = 0; sign = 1; base_len = is_valid_base("0123456789"); if (!base_len) return (0); while (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r' || *str == '\f' || *str == '\v') ++str; while (*str == '+' || *str == '-') if (*str++ == '-') sign *= -1; index_in_base = char_index("0123456789", *str); while (index_in_base >= 0) { abs = abs * base_len + index_in_base; ++str; index_in_base = char_index("0123456789", *str); } return (sign * abs); } /* //// #include int main(void) { printf("Expected:<> Actual:<%d>\n", ft_atoi("")); printf("Expected:<0> Actual:<%d>\n", ft_atoi("0")); printf("Expected:<1> Actual:<%d>\n", ft_atoi("1")); printf("Expected:<14> Actual:<%d>\n", ft_atoi("14")); printf("Expected:<120> Actual:<%d>\n", ft_atoi("120")); printf("Expected:<-0> Actual:<%d>\n", ft_atoi("-0")); printf("Expected:<-1> Actual:<%d>\n", ft_atoi("-1")); printf("Expected:<-14> Actual:<%d>\n", ft_atoi("-14")); printf("Expected:<-120> Actual:<%d>\n", ft_atoi("-120")); printf("Expected:<2147483647> Actual:<%d>\n", ft_atoi("2147483647")); printf("Expected:<-2147483648> Actual:<%d>\n", ft_atoi("-2147483648")); printf("Expected:<--2147483648> Actual:<%d>\n", ft_atoi("--2147483648")); printf("Expected:<---2147483648> Actual:<%d>\n", ft_atoi("---2147483648")); printf("Expected:<----2147483648> Actual:<%d>\n", ft_atoi("----2147483648")); printf("Expected:<+-+14> Actual:<%d>\n", ft_atoi("+-+14")); printf("Expected:<-+-+14> Actual:<%d>\n", ft_atoi("-+-+14")); printf("Expected:<-+-14> Actual:<%d>\n", ft_atoi("-+-14")); printf("Expected:<+-+-14> Actual:<%d>\n", ft_atoi("+-+-14")); printf("Expected:< -14> Actual:<%d>\n", ft_atoi(" -14")); printf("Expected:< +-+14> Actual:<%d>\n", ft_atoi(" +-+14")); printf("Expected:< -+-+14> Actual:<%d>\n", ft_atoi(" -+-+14")); printf("Expected:< -+-14> Actual:<%d>\n", ft_atoi(" -+-14")); printf("Expected:< +-+-14> Actual:<%d>\n", ft_atoi(" +-+-14")); printf("Expected:< -14> Actual:<%d>\n", ft_atoi(" -14")); printf("Expected:< +-+14> Actual:<%d>\n", ft_atoi(" +-+14")); printf("Expected:< -+-+14> Actual:<%d>\n", ft_atoi(" -+-+14")); printf("Expected:< -+-14> Actual:<%d>\n", ft_atoi(" -+-14")); printf("Expected:< +-+-14> Actual:<%d>\n", ft_atoi(" +-+-14")); printf("Expected:<\t\t-14> Actual:<%d>\n", ft_atoi("\t\t-14")); printf("Expected:<\t\t+-+14> Actual:<%d>\n", ft_atoi("\t\t+-+14")); printf("Expected:<\t\t-+-+14> Actual:<%d>\n", ft_atoi("\t\t-+-+14")); printf("Expected:<\t\t-+-14> Actual:<%d>\n", ft_atoi("\t\t-+-14")); printf("Expected:<\t\t+-+-14> Actual:<%d>\n", ft_atoi("\t\t+-+-14")); printf("Expected:<\n\n-14> Actual:<%d>\n", ft_atoi("\n\n-14")); printf("Expected:<\n\n+-+14> Actual:<%d>\n", ft_atoi("\n\n+-+14")); printf("Expected:<\n\n-+-+14> Actual:<%d>\n", ft_atoi("\n\n-+-+14")); printf("Expected:<\n\n-+-14> Actual:<%d>\n", ft_atoi("\n\n-+-14")); printf("Expected:<\n\n+-+-14> Actual:<%d>\n", ft_atoi("\n\n+-+-14")); printf("Expected:<\n\n-14baba1> Actual:<%d>\n", ft_atoi("\n\n-14baba1")); printf("Expected:<\n\n+-+14baba1> Actual:<%d>\n", ft_atoi("\n\n+-+14baba1")); printf("Expected:<\n\n-+-+14baba1> Actual:<%d>\n", ft_atoi("\n\n-+-+14baba1")); printf("Expected:<\n\n-+-14baba1> Actual:<%d>\n", ft_atoi("\n\n-+-14baba1")); printf("Expected:<\n\n+-+-14baba1> Actual:<%d>\n", ft_atoi("\n\n+-+-14baba1")); } */ ////