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 }