From 92e03e0caf9ba4cdcb52d3d6af6181fe7f43fdf3 Mon Sep 17 00:00:00 2001 From: David Gailleton Date: Fri, 21 Nov 2025 12:29:38 +0100 Subject: [PATCH] fix number and unsigned flags behavior --- bonus/ft_parsing_bonus.c | 6 ++-- bonus/ft_putnbr_base_bonus.c | 6 ++-- bonus/print_hex_bonus.c | 6 ++-- bonus/print_number_bonus.c | 17 ++++++------ bonus/print_unsigned_bonus.c | 53 +++++++++++++++++++++++++++++++++--- include/ft_printf_bonus.h | 4 +-- test.c | 6 ++-- 7 files changed, 72 insertions(+), 26 deletions(-) diff --git a/bonus/ft_parsing_bonus.c b/bonus/ft_parsing_bonus.c index 6a4185d..d240b3a 100644 --- a/bonus/ft_parsing_bonus.c +++ b/bonus/ft_parsing_bonus.c @@ -6,7 +6,7 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/19 15:35:15 by dgaillet #+# #+# */ -/* Updated: 2025/11/20 18:07:52 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/11/21 11:49:23 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ @@ -41,11 +41,11 @@ 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->zero >= 0 || arg->hash >= 0 + if (!(arg->minus >= 0 || arg->hash >= 0 || arg->space >= 0 || arg->plus >= 0)) get_padding(arg, str); } - else if (!(arg->minus >= 0 || arg->zero >= 0 || arg->hash >= 0 + else if (!(arg->minus >= 0 || arg->hash >= 0 || arg->space >= 0 || arg->plus >= 0)) get_padding(arg, str); } diff --git a/bonus/ft_putnbr_base_bonus.c b/bonus/ft_putnbr_base_bonus.c index e00b2d7..4d069f1 100644 --- a/bonus/ft_putnbr_base_bonus.c +++ b/bonus/ft_putnbr_base_bonus.c @@ -6,7 +6,7 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/17 12:16:44 by dgaillet #+# #+# */ -/* Updated: 2025/11/20 16:18:24 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/11/21 12:16:33 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ @@ -23,9 +23,9 @@ static int ft_putnbr_base_extra(unsigned int nbr, char *base, int base_size) return (i); } -int ft_putnbr_base(unsigned int nbr, char *base, int base_size) +int ft_putnbr_base(unsigned int nbr, char *base, int base_size, int limit) { - if (nbr == 0) + if (nbr == 0 && limit != 0) { ft_putchar_fd(base[0], 1); return (1); diff --git a/bonus/print_hex_bonus.c b/bonus/print_hex_bonus.c index 398a3fd..55a9508 100644 --- a/bonus/print_hex_bonus.c +++ b/bonus/print_hex_bonus.c @@ -6,7 +6,7 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/17 12:06:35 by dgaillet #+# #+# */ -/* Updated: 2025/11/20 14:47:53 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/11/21 12:13:16 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ @@ -34,9 +34,9 @@ int print_hex(t_arg *arg, unsigned int nbr) count += print_chars(arg->zero - count - nbr_size_base(nbr, 16), '0'); count += print_chars(arg->dot - nbr_size_base(nbr, 16), '0'); if (arg->arg == 'X') - count += ft_putnbr_base(nbr, "0123456789ABCDEF", 16); + count += ft_putnbr_base(nbr, "0123456789ABCDEF", 16, 2147483647); else - count += ft_putnbr_base(nbr, "0123456789abcdef", 16); + count += ft_putnbr_base(nbr, "0123456789abcdef", 16, 2147483647); } return (count); } diff --git a/bonus/print_number_bonus.c b/bonus/print_number_bonus.c index 9cbcfae..61ba0b5 100644 --- a/bonus/print_number_bonus.c +++ b/bonus/print_number_bonus.c @@ -6,7 +6,7 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/17 12:26:23 by dgaillet #+# #+# */ -/* Updated: 2025/11/20 17:26:09 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/11/21 12:18:58 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ @@ -25,11 +25,9 @@ static int padding_size(int space, int plus, t_arg *arg, int nbr) nbr_size = nbr_size_base(nbr * -1, 10); else nbr_size = nbr_size_base(nbr, 10); - if (arg->dot > nbr_size) + if (arg->dot > nbr_size || arg->dot == 0) nbr_size = arg->dot; padding = padding - nbr_size; - if (arg->zero >= 0) - padding = padding - arg->zero; if (nbr < 0) padding--; return (padding); @@ -52,7 +50,8 @@ static int print_nb_flags(t_arg *arg, int nbr) space = 1; padding = padding_size(space, plus, arg, nbr); count = 0; - count += print_chars(padding, ' '); + if (arg->dot >= 0 || arg->zero < 0) + count += print_chars(padding, ' '); count += print_chars(space, ' '); count += print_chars(plus, '+'); return (count); @@ -70,10 +69,12 @@ int print_number(t_arg *arg, int nbr) { count += write(1, "-", 1); p_nbr = nbr * -1; - count += print_chars(arg->zero - nbr_size_base(p_nbr, 10) - 1, '0'); + if (arg->dot < 0) + count += print_chars(arg->zero - nbr_size_base(p_nbr, 10) - 1, '0'); } - else + else if (arg->dot < 0) count += print_chars(arg->zero - nbr_size_base(p_nbr, 10), '0'); count += print_chars(arg->dot - nbr_size_base(p_nbr, 10), '0'); - return (count + ft_putnbr_base(p_nbr, "0123456789", 10)); + count += ft_putnbr_base(p_nbr, "0123456789", 10, arg->dot); + return (count); } diff --git a/bonus/print_unsigned_bonus.c b/bonus/print_unsigned_bonus.c index b9ccd15..1e9b780 100644 --- a/bonus/print_unsigned_bonus.c +++ b/bonus/print_unsigned_bonus.c @@ -6,21 +6,66 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/17 12:26:23 by dgaillet #+# #+# */ -/* Updated: 2025/11/20 16:17:12 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/11/21 12:29:02 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include "ft_printf_bonus.h" #include +static int padding_size(int space, int plus, t_arg *arg, int nbr) +{ + int padding; + int nbr_size; + + if (arg->padding < 0) + return (0); + padding = arg->padding - space - plus; + if (nbr < 0) + nbr_size = nbr_size_base(nbr * -1, 10); + else + nbr_size = nbr_size_base(nbr, 10); + if (arg->dot > nbr_size || arg->dot == 0) + nbr_size = arg->dot; + padding = padding - nbr_size; + if (nbr < 0) + padding--; + return (padding); +} + +static int print_nb_flags(t_arg *arg, int nbr) +{ + int count; + int space; + int padding; + int plus; + + if (arg->plus >= 0 && nbr > 0) + plus = 1; + else + plus = 0; + if (arg->plus >= 0 || arg->space < 0) + space = 0; + else + space = 1; + padding = padding_size(space, plus, arg, nbr); + count = 0; + if (arg->dot >= 0 || arg->zero < 0) + count += print_chars(padding, ' '); + count += print_chars(space, ' '); + count += print_chars(plus, '+'); + return (count); +} + int print_unsigned(t_arg *arg, unsigned int nbr) { int count; count = 0; - count += print_chars(arg->padding - nbr_size_base(nbr, 10), ' '); - count += print_chars(arg->zero - nbr_size_base(nbr, 10), '0'); + count += print_nb_flags(arg, nbr); + if (arg->dot < 0) + count += print_chars(arg->zero - nbr_size_base(nbr, 10), '0'); count += print_chars(arg->dot - nbr_size_base(nbr, 10), '0'); - count += ft_putnbr_base(nbr, "0123456789", 10); + count += ft_putnbr_base(nbr, "0123456789", 10, arg->dot); return (count); } diff --git a/include/ft_printf_bonus.h b/include/ft_printf_bonus.h index 9be91d6..49acacf 100644 --- a/include/ft_printf_bonus.h +++ b/include/ft_printf_bonus.h @@ -6,7 +6,7 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/17 10:52:23 by dgaillet #+# #+# */ -/* Updated: 2025/11/20 16:34:46 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/11/21 12:10:56 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,7 @@ typedef struct s_arg 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 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); diff --git a/test.c b/test.c index e91ff32..20fab53 100644 --- a/test.c +++ b/test.c @@ -6,7 +6,7 @@ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/20 16:11:53 by dgaillet #+# #+# */ -/* Updated: 2025/11/20 18:01:15 by dgaillet ### ########lyon.fr */ +/* Updated: 2025/11/21 12:25:53 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,6 @@ int main(void) { printf("===\t-\t===\n\n"); - printf("%d - ", printf("...%10.s...\n", NULL)); - printf("%d\n\n", ft_printf("...%10.s...\n", NULL)); + printf("%d - ", printf("...%.0u...\n", 0)); + printf("%d\n\n", ft_printf("...%.0u...\n", 0)); }