summaryrefslogtreecommitdiff
path: root/libft/ft_vdprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'libft/ft_vdprintf.c')
-rw-r--r--libft/ft_vdprintf.c67
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);
+}