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  }