ft_printf_handlers.c
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* ft_printf_handlers.c :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: ll-hotel <ll-hotel@student.42.fr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2023/11/27 03:56:34 by ll-hotel #+# #+# */ 9 /* Updated: 2024/08/20 17:50:28 by ll-hotel ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "ft_basics.h" 14 #include "ft_math.h" 15 #include <stdarg.h> 16 #include <stdlib.h> 17 18 int handle_string(const char f, va_list *args) 19 { 20 char *s; 21 22 if (f == '%') 23 return (ft_putchar_fd('%', 1), 1); 24 else if (f == 'c') 25 return (ft_putchar_fd(va_arg(*args, int), 1), 1); 26 else if (f == 's') 27 { 28 s = va_arg(*args, char *); 29 if (!s) 30 s = "(null)"; 31 return (ft_putstr_fd(s, 1), ft_strlen(s)); 32 } 33 return (0); 34 } 35 36 int handle_number(const char f, va_list *args) 37 { 38 int i; 39 40 i = 0; 41 if (f == 'i' || f == 'd') 42 i = va_arg(*args, int); 43 else 44 return (0); 45 return (ft_putnbr_fd(i, 1), ft_log_b(i, 10) + 1 + (i < 0)); 46 } 47 48 int handle_special(const char f, va_list *args) 49 { 50 char *s; 51 int len; 52 53 s = 0; 54 if (f == 'p') 55 s = ft_xtoa(va_arg(*args, unsigned long), 1, 0); 56 else if (f == 'X' || f == 'x') 57 s = ft_xtoa(va_arg(*args, unsigned int), 0, f == 'X'); 58 else if (f == 'u') 59 s = ft_utoa(va_arg(*args, unsigned int)); 60 len = 0; 61 if (s) 62 { 63 if (f == 'p' && !ft_strncmp(s, "0x0", 3)) 64 s = (free(s), "(nil)"); 65 len = (ft_putstr_fd(s, 1), ft_strlen(s)); 66 if (ft_strncmp(s, "(nil)", 3)) 67 free(s); 68 } 69 return (len); 70 } 71 72 int handle_format(const char *f, va_list *args, int *count) 73 { 74 int err; 75 76 if (!*f) 77 return (0); 78 err = 0; 79 if (*f == '%' || *f == 'c' || *f == 's') 80 err = handle_string(*f, args); 81 else if (*f == 'i' || *f == 'd') 82 err = handle_number(*f, args); 83 else if (*f == 'p' || *f == 'u' || *f == 'x' || *f == 'X') 84 err = handle_special(*f, args); 85 if (err > 0) 86 *count += err; 87 return ((err >= 0) - (err < 0)); 88 }