From b620f5ecdb9c5a43b7d8b425d190bfb479f0f307 Mon Sep 17 00:00:00 2001 From: David GAILLETON Date: Mon, 6 Apr 2026 02:50:46 +0200 Subject: [PATCH] some fix on printf --- bonus/ft_create_arg_bonus.c | 2 +- bonus/ft_main_arg_bonus.c | 4 ++-- bonus/ft_parsing_bonus.c | 8 ++++---- bonus/ft_printf_bonus.c | 29 ++++++++++++++++++----------- bonus/ft_putnbr_base_bonus.c | 4 ++-- bonus/print_char_bonus.c | 2 +- bonus/print_pointer_bonus.c | 2 +- bonus/print_str_bonus.c | 4 ++-- include/ft_printf.h | 1 + include/ft_printf_bonus.h | 34 +++++++++++++++++++--------------- src/ft_printf.c | 11 ++++++----- src/print_pointer.c | 2 +- 12 files changed, 58 insertions(+), 45 deletions(-) diff --git a/bonus/ft_create_arg_bonus.c b/bonus/ft_create_arg_bonus.c index 0500781..7434ee0 100644 --- a/bonus/ft_create_arg_bonus.c +++ b/bonus/ft_create_arg_bonus.c @@ -10,8 +10,8 @@ /* */ /* ************************************************************************** */ -#include #include "ft_printf_bonus.h" +#include t_arg *ft_create_arg(void) { diff --git a/bonus/ft_main_arg_bonus.c b/bonus/ft_main_arg_bonus.c index 1d834b5..e408ce7 100644 --- a/bonus/ft_main_arg_bonus.c +++ b/bonus/ft_main_arg_bonus.c @@ -12,8 +12,8 @@ static int is_main_arg(char c) { - if (c == 'c' || c == 's' || c == 'p' || c == 'd' - || c == 'i' || c == 'u' || c == 'x' || c == 'X' || c == '%') + if (c == 'c' || c == 's' || c == 'p' || c == 'd' || c == 'i' || c == 'u' + || c == 'x' || c == 'X' || c == '%') return (1); return (0); } diff --git a/bonus/ft_parsing_bonus.c b/bonus/ft_parsing_bonus.c index d240b3a..8f9b17d 100644 --- a/bonus/ft_parsing_bonus.c +++ b/bonus/ft_parsing_bonus.c @@ -41,12 +41,12 @@ static void ft_parse_str(t_arg *arg, char *str, char main_arg) if (*str == '.') { arg->dot = ft_atoi(str + 1); - if (!(arg->minus >= 0 || arg->hash >= 0 - || arg->space >= 0 || arg->plus >= 0)) + if (!(arg->minus >= 0 || arg->hash >= 0 || arg->space >= 0 + || arg->plus >= 0)) get_padding(arg, str); } - else if (!(arg->minus >= 0 || arg->hash >= 0 - || arg->space >= 0 || arg->plus >= 0)) + else if (!(arg->minus >= 0 || arg->hash >= 0 || arg->space >= 0 + || arg->plus >= 0)) get_padding(arg, str); } diff --git a/bonus/ft_printf_bonus.c b/bonus/ft_printf_bonus.c index 68dbbb8..833a5d5 100644 --- a/bonus/ft_printf_bonus.c +++ b/bonus/ft_printf_bonus.c @@ -71,6 +71,16 @@ static int ft_to_skip(char *str) return (count); } +static int handle_arg(const char *s, va_list args, int *i) +{ + int n; + + (*i)++; + n = ft_print_arg((char *)&s[*i], args); + *i += ft_to_skip((char *)&s[*i]); + return (n); +} + int ft_printf(const char *first_arg, ...) { va_list args; @@ -78,23 +88,20 @@ int ft_printf(const char *first_arg, ...) int i; int temp; + if (!first_arg) + return (-1); nb_print = 0; + i = -1; va_start(args, first_arg); - i = 0; - while (first_arg[i]) + while (first_arg[++i]) { temp = nb_print; - if (first_arg[i] == '%' && first_arg[i + 1] != '\0') - { - i++; - nb_print += ft_print_arg((char *)&first_arg[i], args); - i += ft_to_skip((char *)&first_arg[i]); - } - else + if (first_arg[i] == '%' && first_arg[i + 1]) + nb_print += handle_arg(first_arg, args, &i); + else if (first_arg[i] != '%') nb_print += write(1, &first_arg[i], 1); - if (temp > nb_print) + if (temp >= nb_print) return (-1); - i++; } va_end(args); return (nb_print); diff --git a/bonus/ft_putnbr_base_bonus.c b/bonus/ft_putnbr_base_bonus.c index 3036e8c..500e3df 100644 --- a/bonus/ft_putnbr_base_bonus.c +++ b/bonus/ft_putnbr_base_bonus.c @@ -40,8 +40,8 @@ int ft_putnbr_base(unsigned int nbr, char *base, int base_size, int limit) return (ft_putnbr_base_extra(nbr, base, base_size)); } -static int ft_putnbr_base_ll_extra(unsigned long long nbr - , char *base, int base_size) +static int ft_putnbr_base_ll_extra(unsigned long long nbr, char *base, + int base_size) { int i; char temp; diff --git a/bonus/print_char_bonus.c b/bonus/print_char_bonus.c index 1e86dfa..a192e05 100644 --- a/bonus/print_char_bonus.c +++ b/bonus/print_char_bonus.c @@ -15,7 +15,7 @@ int print_char(t_arg *arg, char c) { - int count; + int count; count = 0; count += print_chars(arg->padding - 1, ' '); diff --git a/bonus/print_pointer_bonus.c b/bonus/print_pointer_bonus.c index 6dc1d1c..e3372a2 100644 --- a/bonus/print_pointer_bonus.c +++ b/bonus/print_pointer_bonus.c @@ -10,8 +10,8 @@ /* */ /* ************************************************************************** */ -#include "libft.h" #include "ft_printf_bonus.h" +#include "libft.h" #include int print_pointer(t_arg *arg, unsigned long long p) diff --git a/bonus/print_str_bonus.c b/bonus/print_str_bonus.c index 444da7e..23431a7 100644 --- a/bonus/print_str_bonus.c +++ b/bonus/print_str_bonus.c @@ -10,8 +10,8 @@ /* */ /* ************************************************************************** */ -#include "libft.h" #include "ft_printf_bonus.h" +#include "libft.h" int print_str(t_arg *arg, char *str) { @@ -28,7 +28,7 @@ int print_str(t_arg *arg, char *str) return (-10000); return (count + 6); } - if (arg->dot > (int) ft_strlen(str) || arg->dot < 0) + if (arg->dot > (int)ft_strlen(str) || arg->dot < 0) arg->dot = ft_strlen(str); if (arg->padding > 0) count += print_chars(arg->padding - arg->dot, ' '); diff --git a/include/ft_printf.h b/include/ft_printf.h index 0cb500a..6f1ba57 100644 --- a/include/ft_printf.h +++ b/include/ft_printf.h @@ -13,6 +13,7 @@ #ifndef FT_PRINTF_H # define FT_PRINTF_H +int ft_printf(const char *first_arg, ...) __attribute__((format(printf, 1, 2))); int ft_printf(const char *first_arg, ...); int ft_putnbr_base(unsigned long long nbr, char *base, int base_size); diff --git a/include/ft_printf_bonus.h b/include/ft_printf_bonus.h index 49acacf..7c6fe38 100644 --- a/include/ft_printf_bonus.h +++ b/include/ft_printf_bonus.h @@ -23,23 +23,27 @@ typedef struct s_arg int hash; int space; int plus; -} t_arg; +} t_arg; -int ft_printf(const char *first_arg, ...); +int ft_printf(const char *first_arg, ...) __attribute__((format(printf, + 1, 2))); +int ft_printf(const char *first_arg, ...); -int ft_putnbr_base_ll(unsigned long long nbr, char *base, int base_size); -int ft_putnbr_base(unsigned int nbr, char *base, int base_size, int limit); -char ft_main_arg(char *str); -t_arg *ft_create_arg(void); -t_arg *ft_parsing(char *str); -int print_chars(int nb, char c); -int nbr_size_base(unsigned long long nb, int base_size); +int ft_putnbr_base_ll(unsigned long long nbr, char *base, + int base_size); +int ft_putnbr_base(unsigned int nbr, char *base, int base_size, + int limit); +char ft_main_arg(char *str); +t_arg *ft_create_arg(void); +t_arg *ft_parsing(char *str); +int print_chars(int nb, char c); +int nbr_size_base(unsigned long long nb, int base_size); -int print_char(t_arg *arg, char c); -int print_str(t_arg *arg, char *str); -int print_pointer(t_arg *arg, unsigned long long p); -int print_number(t_arg *arg, int nbr); -int print_unsigned(t_arg *arg, unsigned int nbr); -int print_hex(t_arg *arg, unsigned int nbr); +int print_char(t_arg *arg, char c); +int print_str(t_arg *arg, char *str); +int print_pointer(t_arg *arg, unsigned long long p); +int print_number(t_arg *arg, int nbr); +int print_unsigned(t_arg *arg, unsigned int nbr); +int print_hex(t_arg *arg, unsigned int nbr); #endif diff --git a/src/ft_printf.c b/src/ft_printf.c index 2fb4f80..30e8717 100644 --- a/src/ft_printf.c +++ b/src/ft_printf.c @@ -42,10 +42,12 @@ int ft_printf(const char *first_arg, ...) int i; int temp; + if (!first_arg) + return (-1); nb_print = 0; va_start(args, first_arg); - i = 0; - while (first_arg[i]) + i = -1; + while (first_arg[++i]) { temp = nb_print; if (first_arg[i] == '%' && first_arg[i + 1] != '\0') @@ -53,11 +55,10 @@ int ft_printf(const char *first_arg, ...) i++; nb_print += ft_print_arg(first_arg[i], args); } - else + else if (first_arg[i] != '%') nb_print += write(1, &first_arg[i], 1); - if (temp > nb_print) + if (temp >= nb_print) return (-1); - i++; } va_end(args); return (nb_print); diff --git a/src/print_pointer.c b/src/print_pointer.c index 5630f1e..943265e 100644 --- a/src/print_pointer.c +++ b/src/print_pointer.c @@ -10,8 +10,8 @@ /* */ /* ************************************************************************** */ -#include "libft.h" #include "ft_printf.h" +#include "libft.h" int print_pointer(unsigned long long p) {