From 6ea4606cd3f74377691d200d69df8398f90cc2ff Mon Sep 17 00:00:00 2001 From: Charles Date: Sat, 12 Oct 2019 10:43:01 +0200 Subject: Basic conversion parsing Using a list to store each format conversion informations. --- ft_printf.c | 75 ++++++++++++++++++++++++++++++------------------------------- 1 file changed, 37 insertions(+), 38 deletions(-) (limited to 'ft_printf.c') diff --git a/ft_printf.c b/ft_printf.c index c7bc473..1c0d8ea 100644 --- a/ft_printf.c +++ b/ft_printf.c @@ -1,55 +1,45 @@ #include #include #include -#include "ft_printf.h" +#include "header.h" int ft_printf(const char *format, ...) { int i; va_list ap; - /* char *convertions_flags; */ - - /* convertions_flags = "cspdiuxX%"; */ + t_list *format_list; + t_conversion conv; + if ((format_list = parse(format)) == NULL) + return (-1); va_start(ap, format); i = -1; while (format[++i]) { if (format[i] == '%') { - switch (format[++i]) - { - case 'c': - ft_putchar(va_arg(ap, char)); - break; - case 's': - ft_putstr(va_arg(ap, char*)); - break; - case 'p': - ft_putstr("0x"); - PUTXNBR(va_arg(ap, int)); - break; - case 'd': - ft_putnbr(va_arg(ap, int)); - break; - case 'i': - ft_putnbr(va_arg(ap, int)); - break; - case 'u': - ft_putunbr(va_arg(ap, unsigned int)); - break; - case 'x': - ft_putstr("0x"); - PUTXNBR(va_arg(ap, int)); - break; - case 'X': - ft_putstr("0x"); - PUTXMAJNBR(va_arg(ap, int)); - break; - case '%': - ft_putchar('%'); - break; - } + conv = format_list->data->conversion; + if (conv == CONVERSION_CHAR) + ft_putchar(va_arg(ap, char)); + else if (conv == CONVERSION_STR) + ft_putstr(va_arg(ap, char*)); + else if (conv == CONVERSION_PTR) + { + ft_putstr("0x"); + PUTXNBR(va_arg(ap, long unsigned int)); + } + else if (conv == CONVERSION_DECIMAL || conv == CONVERSION_INT) + ft_putnbr(va_arg(ap, int)); + else if (conv == CONVERSION_UINT) + ft_putunbr(va_arg(ap, unsigned int)); + else if (conv == CONVERSION_HEX_LOWER) + PUTXNBR(va_arg(ap, unsigned int)); + else if (conv == CONVERSION_HEX_UPPER) + PUTXMAJNBR(va_arg(ap, unsigned int)); + else if (conv == CONVERSION_PERCENT) + ft_putchar('%'); + i += format_list->data->len; + list_pop_front(&format_list); } else write(STDOUT_FILENO, format + i, 1); @@ -60,6 +50,15 @@ int ft_printf(const char *format, ...) int main() { - ft_printf("b%conjo %X ur%p\n", 'r', 0xec54, NULL); + int test; + + ft_printf("char: %c\n", 'r'); + ft_printf("string: %s\n", "bonjour"); + ft_printf("pointer: %p\n", &test); + ft_printf("int: %d or %i\n", 45, 54); + ft_printf("uint: %u\n", 1 << 31); + ft_printf("hex lower: %x\n", 0xabcf012); + ft_printf("hex upper: %X\n", 0xabcf012); + ft_printf("percent: %%\n"); return 0; } -- cgit