summaryrefslogtreecommitdiff
path: root/libft/ft_itoa.c
blob: 09d0319804712eab7e938295c30c19771b56ede0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   ft_itoa.c                                          :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: kdx    <kdx   @student.42angouleme.fr      +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2022/09/28 19:00:04 by kdx               #+#    #+#             */
/*   Updated: 2022/10/13 22:43:21 by kdx              ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "libft.h"

static char	*_itoa(long v, int sign, long div, char *ptr)
{
	size_t			i;

	i = 0;
	if (sign == -1)
	{
		ptr[i] = '-';
		i += 1;
	}
	while (div / 10 > 0)
	{
		div /= 10;
		ptr[i] = '0' + v / div % 10;
		i += 1;
	}
	ptr[i] = '\0';
	return (ptr);
}

char	*ft_itoa(int n)
{
	long			v;
	int				sign;
	long			div;
	size_t			i;
	char			*ptr;

	if (n == 0)
		return (ft_strdup("0"));
	v = n;
	sign = (v > 0) - (v < 0);
	v *= sign;
	div = 1;
	i = (sign == -1);
	while (div <= v && i + 1)
	{
		i += 1;
		div *= 10;
	}
	ptr = malloc(i + 1);
	if (ptr == NULL)
		return (NULL);
	return (_itoa(v, sign, div, ptr));
}