From ed5e23f863674d868cec5baa4aede2e5dfa9eda1 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 23 Oct 2024 20:20:52 +0200 Subject: [PATCH] Ko in p and % and mix --- Makefile | 3 ++- ft_printf.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 0dc85b9..6f94c80 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,8 @@ lib/libft.a: mv libft/libft.a lib/libft.a $(NAME): lib/libft.a $(OBJECTS) - $(AR) -r $@ $? + cp lib/libft.a $(NAME) + $(AR) -rcs $@ $? %.o: %.c $(CC) -I./inc -L./lib -lft -c $(CFLAGS) $? diff --git a/ft_printf.c b/ft_printf.c index 25ad32d..b2a903f 100644 --- a/ft_printf.c +++ b/ft_printf.c @@ -16,7 +16,6 @@ #include "libft.h" #include "ft_printf.h" - int ft_isbase(char *str) { int i; @@ -95,6 +94,11 @@ int print_string(va_list args) size_t len; str = va_arg(args, char *); + if (!str) + { + write(1, "(null)", 6); + return (6); + } len = ft_strlen(str); return (write(1, str, len)); } @@ -118,6 +122,25 @@ int print_number(va_list args) return (wrote); } +int print_unumber(va_list args) +{ + long n; + size_t len; + char *str; + int wrote; + + wrote = 0; + str = ft_calloc(sizeof(char), 12); + if (!str) + return (wrote); + n = va_arg(args, unsigned int); + ft_putnbr_base(n, "0123456789", str); + len = ft_strlen(str); + wrote = write(1, str, len); + free(str); + return (wrote); +} + int print_hex(va_list args, int uppercase) { long n; @@ -140,6 +163,34 @@ int print_hex(va_list args, int uppercase) return (wrote); } +int print_pointer(va_list args, int uppercase) +{ + long n; + size_t len; + char *str; + int wrote; + + wrote = 0; + n = va_arg(args, unsigned long); + if (!n) + { + write(1,"(nil)", 5); + return (5); + } + str = ft_calloc(sizeof(char), 20); + if (!str) + return (wrote); + if (uppercase) + ft_putnbr_base(n, "0123456789ABCDEF", str); + else + ft_putnbr_base(n, "0123456789abcdef", str); + len = ft_strlen(str); + wrote = write(1, "0x", 2); + wrote += write(1, str, len); + free(str); + return (wrote); +} + int parse_conversion(const char **format, va_list args) { int wrote; @@ -149,9 +200,13 @@ int parse_conversion(const char **format, va_list args) wrote = print_char(args); else if (**format == 's') wrote = print_string(args); - else if (ft_strchr("diu", **format)) + else if (ft_strchr("di", **format)) wrote = print_number(args); - else if (ft_strchr("px", **format)) + else if (ft_strchr("u", **format)) + wrote = print_unumber(args); + else if (ft_strchr("p", **format)) + wrote = print_pointer(args, 0); + else if (ft_strchr("x", **format)) wrote = print_hex(args, 0); else if (ft_strchr("X", **format)) wrote = print_hex(args, 1); @@ -164,14 +219,14 @@ int parse_placeholder(const char **format, va_list args) int wrote; (*format)++; - (void) args; + wrote = 0; while (**format && !ft_strchr(conversions, **format)) (*format)++; if (**format == '%') write(1, *format, 1); else wrote = parse_conversion(format, args); - return (1); + return (wrote); } int ft_printf(const char *format, ...) @@ -193,6 +248,7 @@ int ft_printf(const char *format, ...) return (wrote); } +/* int main(void) { const char str[] = "HOIe"; @@ -207,5 +263,10 @@ int main(void) ft_printf("%%p = %p\n--\n", str); ft_printf("%%x = %x\n--\n", 255); ft_printf("%%X = %X\n--\n", 255); + + ft_printf(" %% %% %%\n"); + ft_printf(" %% %% %%\n"); + ft_printf(" %% %% %%\n"); return (0); } +*/