ft_atof.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   atof.c                                             :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: salee2 <salee2@student.42seoul.kr>         +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2022/09/23 16:19:09 by salee2            #+#    #+#             */
 9  /*   Updated: 2022/09/23 16:19:12 by salee2           ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "include/minirt.h"
14  
15  long long	tollp(const char *str, size_t i, int *precision)
16  {
17  	long long		acc;
18  	const long long	llmax = LONG_LONG_MAX;
19  
20  	acc = 0;
21  	*precision = 0;
22  	while (str[i])
23  	{
24  		if (acc > llmax / 10 || (acc == llmax / 10 && str[i] - '0' \
25  		> (llmax % 10)) || !ft_isdigit(str[i]) || *precision >= 15)
26  			exit(EXIT_FAILURE);
27  		acc = acc * 10 + str[i] - '0';
28  		++*precision;
29  		++i;
30  	}
31  	return (acc);
32  }
33  
34  double	ft_atof(const char *str)
35  {
36  	size_t	i;
37  	double	ret;
38  	double	sign;
39  	int		precision;
40  	t_bool	is_error;
41  
42  	is_error = 0;
43  	ret = ft_atoi(str, &is_error, &sign);
44  	if (is_error)
45  		exit(EXIT_FAILURE);
46  	i = 0;
47  	while (str[i] && str[i] != '.')
48  		++i;
49  	if (str[i] == 0)
50  		return (ret);
51  	if (str[i + 1] == 0)
52  		exit(EXIT_FAILURE);
53  	if (sign == 1)
54  		ret = ret + tollp(str, i + 1, &precision) * pow(10, -1 * precision);
55  	else
56  		ret = ret - tollp(str, i + 1, &precision) * pow(10, -1 * precision);
57  	return (ret);
58  }