ft_printf.c
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* ft_printf.c :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: ll-hotel <ll-hotel@student.42lyon.fr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2023/11/14 15:39:41 by ll-hotel #+# #+# */ 9 /* Updated: 2024/08/20 17:50:08 by ll-hotel ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "ft_printf.h" 14 #include "ft_basics.h" 15 #include <stdarg.h> 16 #include <unistd.h> 17 18 int handle_format(const char *f, va_list *args, int *count); 19 int handle_string(const char f, va_list *args); 20 int handle_number(const char f, va_list *args); 21 int handle_special(const char f, va_list *args); 22 23 static int to_next_symbol(const char *f) 24 { 25 int i; 26 27 if (!f) 28 return (0); 29 i = 0; 30 while (f[i] && f[i] != '%') 31 i += 1; 32 return (write(1, f, i)); 33 } 34 35 int ft_printf(const char *format, ...) 36 { 37 const unsigned long len = ft_strlen(format); 38 va_list args; 39 unsigned long l; 40 int count; 41 int tmp; 42 43 va_start(args, format); 44 l = 0; 45 count = 0; 46 tmp = 0; 47 while (l < len) 48 { 49 tmp = to_next_symbol(format + l); 50 l += tmp + 1; 51 count += tmp; 52 if (!format[l - 1]) 53 continue ; 54 tmp = handle_format(format + l, &args, &count); 55 if (tmp < 0) 56 return (va_end(args), -1); 57 l += tmp; 58 } 59 va_end(args); 60 return (count); 61 }