/ libft / ft_atoi.c
ft_atoi.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   ft_atoi.c                                          :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: gychoi <marvin@42.fr>                      +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2022/07/09 13:29:42 by gychoi            #+#    #+#             */
 9  /*   Updated: 2022/07/16 13:43:02 by gychoi           ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "libft.h"
14  
15  int	is_space(const char *str, int i)
16  {
17  	if (str[i] == '\t' || str[i] == '\n' || str[i] == '\v' \
18  		|| str[i] == '\f' || str[i] == '\r' || str[i] == ' ')
19  		return (1);
20  	return (0);
21  }
22  
23  int	ft_atoi(const char *str)
24  {
25  	int					i;
26  	int					sign;
27  	unsigned long long	v;
28  	unsigned long long	t;
29  
30  	i = 0;
31  	sign = 1;
32  	v = 0;
33  	while (is_space(str, i))
34  		i++;
35  	if (str[i] == '-' || str[i] == '+')
36  	{
37  		if (str[i++] == '-')
38  			sign *= -1;
39  	}
40  	while (('0' <= str[i] && str[i] <= '9') && str[i] != '\0')
41  	{
42  		v = v * 10 + (str[i++] - '0');
43  		if (sign < 0 && (v > 9223372036854775807 || (i > 19 && v < t)))
44  			return (0);
45  		if (v > 9223372036854775807 || (i > 18 && v < t))
46  			return (-1);
47  		t = v;
48  	}
49  	return ((int)(v * sign));
50  }