
#include "libft.h"

long long ft_atoll(const char *str)
{
	long long nbr;
	int i;
	int sign;

	i = 0;
	sign = 1;
	nbr = 0;

	// skip leading whitespace
	while (ft_isspace(str[i]))
		i++;

	// handle optional sign
	if (str[i] == '-')
		sign = -1;
	if (str[i] == '+' || str[i] == '-')
		i++;

	// parse digits with overflow check for `long long`
	while (str[i] >= '0' && str[i] <= '9')
	{
		// check if multiplying by 10 would overflow
		if (nbr > LLONG_MAX / 10)
			return (sign > 0) ? LLONG_MAX : LLONG_MIN;
		// check if adding the next digit would overflow
		if (nbr == LLONG_MAX / 10 && (str[i] - '0') > LLONG_MAX % 10)
			return (sign > 0) ? LLONG_MAX : LLONG_MIN;

		nbr = nbr * 10 + (str[i] - '0');
		i++;
	}

	return (nbr * sign);
}
