/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ft_printf.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: gvoelkne +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/04/29 09:00:02 by gvoelkne #+# #+# */ /* Updated: 2026/05/31 00:00:00 by gvoelkne ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" static int format_alloc(int fd, char fmt, va_list args) { char *str; int result; str = NULL; if (fmt == 'd' || fmt == 'i') str = ft_ntoa(va_arg(args, int), 10); if (fmt == 'u') str = ft_untoa((unsigned int)va_arg(args, int), 10); if (fmt == 'X') str = ft_untoa(va_arg(args, unsigned int), 16); if (fmt == 'x') { str = ft_untoa(va_arg(args, unsigned int), 16); if (str) str = ft_strlower(str); } if (!str) return (0); result = ft_putstr(fd, str); free(str); return (result); } static int format(int fd, char fmt, va_list args) { if (fmt == 'c') return (ft_putchar(fd, va_arg(args, int))); if (fmt == 's') return (ft_putstr(fd, va_arg(args, char *))); if (fmt == 'p') return (ft_putptr(va_arg(args, void *))); if (fmt == '%') return (ft_putchar(fd, '%')); return (format_alloc(fd, fmt, args)); } static int ft_vprintf(int fd, const char *s, va_list args) { int idx; int total; idx = 0; total = 0; if (!s) return (-1); while (s[idx]) { if (s[idx] == '%' && s[idx + 1]) { idx += 1; if (!str_contains("csp%diuXx", s[idx])) return (-1); total += format(fd, s[idx], args); } else (ft_putchar(fd, s[idx]), total += 1); idx += 1; } return (total); } int ft_printf(int fd, const char *s, ...) { va_list args; int ret; va_start(args, s); ret = ft_vprintf(fd, s, args); va_end(args); return (ret); }