all flags setup, some fixes is needed

This commit is contained in:
David Gailleton
2025-11-20 16:54:00 +01:00
parent bd1c66d86f
commit 24887c810c
12 changed files with 181 additions and 63 deletions

View File

@@ -6,7 +6,7 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/19 15:52:18 by dgaillet #+# #+# */
/* Updated: 2025/11/19 18:29:53 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 14:26:50 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
@@ -20,11 +20,12 @@ t_arg *ft_create_arg(void)
arg = malloc(sizeof(t_arg));
if (!arg)
return (NULL);
arg->minus = 0;
arg->zero = 0;
arg->dot = 0;
arg->hash = 0;
arg->space = 0;
arg->plus = 0;
arg->padding = -1;
arg->minus = -1;
arg->zero = -1;
arg->dot = -1;
arg->hash = -1;
arg->space = -1;
arg->plus = -1;
return (arg);
}

View File

@@ -6,7 +6,7 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/19 15:35:15 by dgaillet #+# #+# */
/* Updated: 2025/11/19 19:09:25 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 14:36:01 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
@@ -31,9 +31,36 @@ static int nb_to_skip(char *str)
return (1 + next_not_digit(&str[1]));
else if (*str == '.')
return (1 + next_not_digit(&str[1]));
else if (*str == ' ')
return (1 + next_not_digit(&str[1]));
return (1);
}
static void ft_parse_str(t_arg *arg, char *str, char main_arg)
{
if (*str != '0' && ft_isdigit(*str))
{
arg->padding = ft_atoi(str);
str += nb_to_skip(str);
}
while (*str != main_arg)
{
if (*str == '-')
arg->minus = ft_atoi(&str[1]);
else if (*str == '0')
arg->zero = ft_atoi(&str[1]);
else if (*str == '.')
arg->dot = ft_atoi(&str[1]);
else if (*str == '#')
arg->hash = 1;
else if (*str == ' ')
arg->space = ft_atoi(&str[1]);
else if (*str == '+')
arg->plus = 1;
str += nb_to_skip(str);
}
}
t_arg *ft_parsing(char *str)
{
t_arg *arg;
@@ -44,21 +71,6 @@ t_arg *ft_parsing(char *str)
if (!arg)
return (0);
arg->arg = main_arg;
while (*str != main_arg)
{
if (*str == '-')
arg->minus = ft_atoi(&str[1]);
else if (*str == '0')
arg->zero = ft_atoi(&str[1]);
else if (*str == '.')
arg->dot = ft_atoi(&str[1]);
else if (*str == '#')
arg->hash = 1;
else if (*str == ' ')
arg->space = 1;
else if (*str == '+')
arg->zero = 1;
str += nb_to_skip(str);
}
ft_parse_str(arg, str, main_arg);
return (arg);
}

View File

@@ -6,7 +6,7 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/17 10:54:03 by dgaillet #+# #+# */
/* Updated: 2025/11/19 20:50:02 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 14:47:12 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
@@ -25,11 +25,11 @@ static int ft_print_arg_flags(t_arg *arg, va_list args)
else if (arg->arg == 's')
count += print_str(arg, va_arg(args, char *));
else if (arg->arg == 'p')
count += print_pointer(arg, va_arg(args, unsigned long long));
count += print_pointer(arg, va_arg(args, long long));
else if (arg->arg == 'd' || arg->arg == 'i')
count += print_number(arg, va_arg(args, int));
else if (arg->arg == 'u')
count += print_unsigned(arg, va_arg(args, unsigned long));
count += print_unsigned(arg, va_arg(args, unsigned int));
else if (arg->arg == 'x' || arg->arg == 'X')
count += print_hex(arg, va_arg(args, unsigned int));
count += print_chars(arg->minus - count, ' ');

View File

@@ -1,24 +1,56 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_putnbr_base.c :+: :+: :+: */
/* ft_putnbr_base_bonus.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/17 12:16:44 by dgaillet #+# #+# */
/* Updated: 2025/11/17 12:43:17 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 16:18:24 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
#include "libft.h"
int ft_putnbr_base(unsigned long long nbr, char *base, int base_size)
static int ft_putnbr_base_extra(unsigned int nbr, char *base, int base_size)
{
int i;
if (nbr == 0)
return (0);
i = 1 + ft_putnbr_base(nbr / base_size, base, base_size);
i = 1 + ft_putnbr_base_extra(nbr / base_size, base, base_size);
ft_putchar_fd(base[nbr % base_size], 1);
return (i);
}
int ft_putnbr_base(unsigned int nbr, char *base, int base_size)
{
if (nbr == 0)
{
ft_putchar_fd(base[0], 1);
return (1);
}
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)
{
int i;
if (nbr == 0)
return (0);
i = 1 + ft_putnbr_base_ll_extra(nbr / base_size, base, base_size);
ft_putchar_fd(base[nbr % base_size], 1);
return (i);
}
int ft_putnbr_base_ll(unsigned long long nbr, char *base, int base_size)
{
if (nbr == 0)
{
ft_putchar_fd(base[0], 1);
return (1);
}
return (ft_putnbr_base_ll_extra(nbr, base, base_size));
}

View File

@@ -6,7 +6,7 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/17 11:56:36 by dgaillet #+# #+# */
/* Updated: 2025/11/19 19:42:20 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 14:40:30 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
@@ -19,6 +19,7 @@ int print_char(t_arg *arg, char c)
int count;
count = 0;
count += print_chars(arg->padding - 1, ' ');
if (!arg->minus && arg->zero)
count += print_chars(arg->zero - 1, ' ');
count += write(1, &c, 1);

View File

@@ -6,27 +6,33 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/17 12:06:35 by dgaillet #+# #+# */
/* Updated: 2025/11/19 20:14:08 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 14:47:53 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
#include "ft_printf_bonus.h"
#include <unistd.h>
int print_hex(t_arg *arg, unsigned long long nbr)
int print_hex(t_arg *arg, unsigned int nbr)
{
int count;
count = 0;
count += print_chars(arg->padding - nbr_size_base(nbr, 16), ' ');
if (nbr == 0)
{
count += write(1, "0", 1);
count += print_chars(arg->zero - count, '0');
count += print_chars(arg->dot - count, '0');
}
else
{
if (arg->hash && arg->arg == 'X')
if (arg->hash > 0 && arg->arg == 'X')
count += write(1, "0X", 2);
else if (arg->hash)
else if (arg->hash > 0)
count += write(1, "0x", 2);
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);
else

View File

@@ -6,13 +6,57 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/17 12:26:23 by dgaillet #+# #+# */
/* Updated: 2025/11/19 19:56:04 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 16:52:30 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
#include "ft_printf_bonus.h"
#include <unistd.h>
static int padding_size(int space, int plus, t_arg *arg, int nbr)
{
int padding;
int dot;
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)
nbr_size = dot;
padding = padding - nbr_size;
if (arg->zero >= 0)
padding = padding - arg->zero;
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;
if (arg->plus >= 0 || arg->space < 0)
space = 0;
else
space = 1;
padding = padding_size(space, plus, arg, nbr);
count = 0;
count += print_chars(padding, ' ');
count += print_chars(space, ' ');
count += print_chars(plus, '+');
return (count);
}
int print_number(t_arg *arg, int nbr)
{
unsigned int p_nbr;
@@ -20,8 +64,7 @@ int print_number(t_arg *arg, int nbr)
count = 0;
p_nbr = nbr;
if (nbr == 0)
count += write(1, "0", 1);
count += print_nb_flags(arg, nbr);
if (nbr < 0)
{
count += write(1, "-", 1);
@@ -30,5 +73,6 @@ int print_number(t_arg *arg, int nbr)
}
else
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));
}

View File

@@ -6,12 +6,13 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/17 12:19:16 by dgaillet #+# #+# */
/* Updated: 2025/11/19 20:16:31 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 15:03:57 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
#include "libft.h"
#include "ft_printf_bonus.h"
#include <unistd.h>
int print_pointer(t_arg *arg, unsigned long long p)
{
@@ -20,11 +21,11 @@ int print_pointer(t_arg *arg, unsigned long long p)
count = 0;
if (!p)
{
count += print_chars(arg->padding - 5, ' ');
ft_putstr_fd("(nil)", 1);
return (5);
}
if (arg->arg)
ft_putstr_fd("", 1);
count += print_chars(arg->padding - nbr_size_base(p, 16), ' ');
count += write(1, "0x", 2);
return (count + ft_putnbr_base(p, "0123456789abcdef", 16));
return (count + ft_putnbr_base_ll(p, "0123456789abcdef", 16));
}

View File

@@ -6,7 +6,7 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/17 12:02:03 by dgaillet #+# #+# */
/* Updated: 2025/11/19 20:16:48 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 15:34:58 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
@@ -15,13 +15,22 @@
int print_str(t_arg *arg, char *str)
{
int count;
count = 0;
if (!str)
{
ft_putstr_fd("(null)", 1);
return (6);
if (arg->dot < 6 && arg->dot >= 0)
return (print_chars(arg->padding, ' '));
if (arg->padding > 6)
count += print_chars(arg->padding - 6, ' ');
return (count + write(1, "(null)", 6));
}
if (arg->arg)
ft_putstr_fd("", 1);
ft_putstr_fd(str, 1);
return (ft_strlen(str));
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, ' ');
else if (!str[0] && arg->space > 0)
return (write(1, " ", 1));
return (count + write(1, str, arg->dot));
}

View File

@@ -6,21 +6,21 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/17 12:26:23 by dgaillet #+# #+# */
/* Updated: 2025/11/19 20:56:30 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 16:17:12 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
#include "ft_printf_bonus.h"
#include <unistd.h>
int print_unsigned(t_arg *arg, unsigned long nbr)
int print_unsigned(t_arg *arg, unsigned int nbr)
{
int count;
count = 0;
if (nbr == 0)
count += write(1, "0", 1);
count += print_chars(arg->padding - nbr_size_base(nbr, 10), ' ');
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);
return (count);
}

View File

@@ -6,7 +6,7 @@
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/17 10:52:23 by dgaillet #+# #+# */
/* Updated: 2025/11/19 20:48:36 by dgaillet ### ########lyon.fr */
/* Updated: 2025/11/20 16:34:46 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
@@ -16,6 +16,7 @@
typedef struct s_arg
{
char arg;
int padding;
int minus;
int zero;
int dot;
@@ -26,7 +27,8 @@ typedef struct s_arg
int ft_printf(const char *first_arg, ...);
int ft_putnbr_base(unsigned long long nbr, char *base, 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);
char ft_main_arg(char *str);
t_arg *ft_create_arg(void);
t_arg *ft_parsing(char *str);
@@ -37,7 +39,7 @@ 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 long nbr);
int print_hex(t_arg *arg, unsigned long long p);
int print_unsigned(t_arg *arg, unsigned int nbr);
int print_hex(t_arg *arg, unsigned int nbr);
#endif

20
test.c
View File

@@ -1,12 +1,22 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* test.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: dgaillet <dgaillet@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/11/20 16:11:53 by dgaillet #+# #+# */
/* Updated: 2025/11/20 16:19:29 by dgaillet ### ########lyon.fr */
/* */
/* ************************************************************************** */
#include <stdio.h>
#include "ft_printf_bonus.h"
#include <limits.h>
int main(void)
{
printf("===\t-\t===\n\n");
printf("%d - ", printf("...%#x...\n", 1358454));
printf("%d\n\n", ft_printf("...%#x...\n", 1358454));
printf("%d - ", printf("...%-1u...\n", 0));
printf("%d\n\n", ft_printf("...%-1u...\n", 0));
printf("%d - ", printf("...%8.5i...\n", 34));
printf("%d\n\n", ft_printf("...%8.5i...\n", 34));
}