diff options
Diffstat (limited to 'libft/ft_vdprintf.c')
-rw-r--r-- | libft/ft_vdprintf.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/libft/ft_vdprintf.c b/libft/ft_vdprintf.c new file mode 100644 index 0000000..3d6b5da --- /dev/null +++ b/libft/ft_vdprintf.c @@ -0,0 +1,67 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vdprintf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx <kdx @student.42angouleme.fr +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/09/30 05:04:45 by kdx #+# #+# */ +/* Updated: 2022/10/14 02:26:57 by kdx ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include <unistd.h> + +static t_i32 put_ptr(void *ptr, int fd) +{ + t_i32 rv; + + rv = 0; + if (ptr != NULL) + { + rv += ft_putstr_fd("0x", fd); + rv += ft_putu128x_fd((t_u64)ptr, fd, 0); + } + else + rv += ft_putstr_fd("(nil)", fd); + return (rv); +} + +static t_i32 put_element(t_i32 fd, const char *fmt, va_list va) +{ + if (*fmt == '%') + return (ft_putchar_fd(*fmt, fd)); + if (*fmt == 'c') + return (ft_putchar_fd(va_arg(va, int), fd)); + if (*fmt == 'd' || *fmt == 'i') + return (ft_puti128_fd(va_arg(va, int), fd)); + if (*fmt == 'u') + return (ft_puti128_fd(va_arg(va, unsigned int), fd)); + if (*fmt == 'p') + return (put_ptr(va_arg(va, void *), fd)); + if (*fmt == 'x' || *fmt == 'X') + return (ft_putu128x_fd(va_arg(va, unsigned int), fd, *fmt == 'X')); + if (*fmt == 's') + return (ft_putstr_fd(va_arg(va, char *), fd)); + return (0); +} + +t_i32 ft_vdprintf(t_i32 fd, const char *fmt, va_list va) +{ + t_i32 rv; + + rv = 0; + while (*fmt != '\0') + { + if (*fmt == '%' && ft_strchr("cdiupxXs%", fmt[1]) != NULL) + { + fmt += 1; + rv += put_element(fd, fmt, va); + } + else + rv += ft_putchar_fd(*fmt, fd); + fmt += 1; + } + return (rv); +} |