/ libft / print_number.c
print_number.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   print_number.c                                     :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: gychoi <gychoi@student.42seoul.kr>         +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2022/09/10 16:43:19 by gychoi            #+#    #+#             */
 9  /*   Updated: 2022/09/13 14:35:19 by gychoi           ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "ft_printf.h"
14  
15  int	ft_putnbr(int num)
16  {
17  	int	printed;
18  
19  	if (num == -2147483648)
20  	{
21  		if ((int)write(1, "-2147483648", 11) < 0)
22  			return (-1);
23  		return (11);
24  	}
25  	printed = 0;
26  	if (num < 0)
27  	{
28  		if ((int)write(1, "-", 1) < 0)
29  			return (-1);
30  		printed++;
31  		num *= -1;
32  	}
33  	if (num >= 10)
34  		printed += ft_putnbr(num / 10);
35  	num = (num % 10) + '0';
36  	if ((int)write(1, &num, 1) < 0)
37  		return (-1);
38  	printed++;
39  	return (printed);
40  }
41  
42  unsigned int	base_len(char *base)
43  {
44  	int	i;
45  
46  	i = 0;
47  	while (base[i] != '\0')
48  		i++;
49  	return (i);
50  }
51  
52  int	print_number_recursive(unsigned int num, char *base)
53  {
54  	int				printed;
55  	unsigned int	blen;
56  	int				ret;
57  
58  	blen = base_len(base);
59  	printed = 0;
60  	if (num >= blen)
61  		printed += print_number_recursive(num / blen, base);
62  	ret = (int)write(1, &base[num % blen], 1);
63  	if (ret < 0)
64  		return (-1);
65  	printed += ret;
66  	return (printed);
67  }
68  
69  int	print_number(int num, char *base, int sign)
70  {
71  	int	printed;
72  
73  	if (sign)
74  		printed = ft_putnbr(num);
75  	else
76  		printed = print_number_recursive((unsigned int)num, base);
77  	if (printed < 0)
78  		return (-1);
79  	return (printed);
80  }