diff --git a/ft_printf.c b/ft_printf.c index 2543f3d..81e21e6 100644 --- a/ft_printf.c +++ b/ft_printf.c @@ -14,6 +14,7 @@ #include #include #include "libft.h" +#include "libft/libft.h" #include "ft_printf.h" int ft_isbase(char *str) @@ -161,7 +162,7 @@ int print_hex(va_list args, int uppercase) return (wrote); } -int print_pointer(va_list args, int uppercase) +int print_pointer(va_list args) { long n; size_t len; @@ -172,19 +173,17 @@ int print_pointer(va_list args, int uppercase) n = va_arg(args, unsigned long); if (!n) { - write(1,"(nil)", 5); + 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); + + ft_strlcpy(str, "0x", 3); + ft_putnbr_base(n, "0123456789abcdef", str); len = ft_strlen(str); - wrote = write(1, "0x", 2); - wrote += write(1, str, len); + wrote = write(1, str, len); free(str); return (wrote); } @@ -203,7 +202,7 @@ int parse_conversion(const char **format, va_list args) else if (ft_strchr("u", **format)) wrote = print_unumber(args); else if (ft_strchr("p", **format)) - wrote = print_pointer(args, 0); + wrote = print_pointer(args); else if (ft_strchr("x", **format)) wrote = print_hex(args, 0); else if (ft_strchr("X", **format)) @@ -230,20 +229,27 @@ int parse_placeholder(const char **format, va_list args) int ft_printf(const char *format, ...) { int wrote; + int result; va_list args; - wrote = 0; + result = 0; va_start(args, format); - while (*format) + while (*format && result >= 0) { if (*format == '%') - wrote += parse_placeholder(&format, args); + wrote = parse_placeholder(&format, args); else - wrote += write(1, format, 1); + wrote = write(1, format, 1); + if (wrote < 0) + { + result = wrote; + break; + } + result += wrote; format++; } va_end(args); - return (wrote); + return (result); } /* diff --git a/ft_printf.h b/ft_printf.h index 27ef21c..2f241d9 100644 --- a/ft_printf.h +++ b/ft_printf.h @@ -13,6 +13,20 @@ #ifndef FT_PRINTF_H # define FT_PRINTF_H -int ft_printf(const char *format, ...); +# include + +int ft_printf(const char *format, ...); +int ft_isbase(char *str); +void ft_write_str(char c, char *str); +void ft_putnbr_base(unsigned long nbr, char *base, char *result); +void ft_putnbr_signed(long nbr, char *base, char *result); +int print_char(va_list args); +int print_string(va_list args); +int print_number(va_list args); +int print_unumber(va_list args); +int print_hex(va_list args, int uppercase); +int print_pointer(va_list args); +int parse_conversion(const char **format, va_list args); +int parse_placeholder(const char **format, va_list args); #endif diff --git a/libft/libft.h b/libft/libft.h index 72ad276..c38cff9 100644 --- a/libft/libft.h +++ b/libft/libft.h @@ -55,8 +55,8 @@ void ft_putstr_fd(char *s, int fd); void ft_putendl_fd(char *s, int fd); void ft_putnbr_fd(int n, int fd); -/* - * BONUS +/* + * BONUS */ t_list *ft_lstnew(void *content); @@ -69,4 +69,10 @@ void ft_lstclear(t_list **lst, void (*del)(void *)); void ft_lstiter(t_list *lst, void (*f)(void *)); t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)); +/* + * ft_printf + */ + +int ft_printf(const char *format, ...); + #endif