140 lines
5.0 KiB
C
140 lines
5.0 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* ft_atoi.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: tischmid <marvin@42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* 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 <stdio.h>
|
|
|
|
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"));
|
|
}
|
|
*/ ////
|