Ko in p and % and mix

This commit is contained in:
whaffman 2024-10-23 20:20:52 +02:00
parent fcb984218b
commit ed5e23f863
2 changed files with 68 additions and 6 deletions

View File

@ -33,7 +33,8 @@ lib/libft.a:
mv libft/libft.a lib/libft.a mv libft/libft.a lib/libft.a
$(NAME): lib/libft.a $(OBJECTS) $(NAME): lib/libft.a $(OBJECTS)
$(AR) -r $@ $? cp lib/libft.a $(NAME)
$(AR) -rcs $@ $?
%.o: %.c %.o: %.c
$(CC) -I./inc -L./lib -lft -c $(CFLAGS) $? $(CC) -I./inc -L./lib -lft -c $(CFLAGS) $?

View File

@ -16,7 +16,6 @@
#include "libft.h" #include "libft.h"
#include "ft_printf.h" #include "ft_printf.h"
int ft_isbase(char *str) int ft_isbase(char *str)
{ {
int i; int i;
@ -95,6 +94,11 @@ int print_string(va_list args)
size_t len; size_t len;
str = va_arg(args, char *); str = va_arg(args, char *);
if (!str)
{
write(1, "(null)", 6);
return (6);
}
len = ft_strlen(str); len = ft_strlen(str);
return (write(1, str, len)); return (write(1, str, len));
} }
@ -118,6 +122,25 @@ int print_number(va_list args)
return (wrote); 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) int print_hex(va_list args, int uppercase)
{ {
long n; long n;
@ -140,6 +163,34 @@ int print_hex(va_list args, int uppercase)
return (wrote); 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 parse_conversion(const char **format, va_list args)
{ {
int wrote; int wrote;
@ -149,9 +200,13 @@ int parse_conversion(const char **format, va_list args)
wrote = print_char(args); wrote = print_char(args);
else if (**format == 's') else if (**format == 's')
wrote = print_string(args); wrote = print_string(args);
else if (ft_strchr("diu", **format)) else if (ft_strchr("di", **format))
wrote = print_number(args); 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); wrote = print_hex(args, 0);
else if (ft_strchr("X", **format)) else if (ft_strchr("X", **format))
wrote = print_hex(args, 1); wrote = print_hex(args, 1);
@ -164,14 +219,14 @@ int parse_placeholder(const char **format, va_list args)
int wrote; int wrote;
(*format)++; (*format)++;
(void) args; wrote = 0;
while (**format && !ft_strchr(conversions, **format)) while (**format && !ft_strchr(conversions, **format))
(*format)++; (*format)++;
if (**format == '%') if (**format == '%')
write(1, *format, 1); write(1, *format, 1);
else else
wrote = parse_conversion(format, args); wrote = parse_conversion(format, args);
return (1); return (wrote);
} }
int ft_printf(const char *format, ...) int ft_printf(const char *format, ...)
@ -193,6 +248,7 @@ int ft_printf(const char *format, ...)
return (wrote); return (wrote);
} }
/*
int main(void) int main(void)
{ {
const char str[] = "HOIe"; const char str[] = "HOIe";
@ -207,5 +263,10 @@ int main(void)
ft_printf("%%p = %p\n--\n", str); ft_printf("%%p = %p\n--\n", str);
ft_printf("%%x = %x\n--\n", 255); ft_printf("%%x = %x\n--\n", 255);
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); return (0);
} }
*/