From 374a9c43da4c2ee0ac19798abc840cd57cb7cf15 Mon Sep 17 00:00:00 2001 From: Charles Date: Sun, 13 Oct 2019 16:02:48 +0200 Subject: Handled wildcard overwrite --- ft_printf.c | 10 +++++++--- parse.c | 6 ++---- printer.c | 19 ++++++++++++++++--- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ft_printf.c b/ft_printf.c index f154685..bad3fa3 100644 --- a/ft_printf.c +++ b/ft_printf.c @@ -67,9 +67,13 @@ int main() /* ft_printf("zero padding |%09d|\n", 43); */ /* ft_printf("left adjusted |%-9d|\n", 43); */ /* ft_printf("string padding |%9s|\n", "bon"); */ + /* */ + /* ft_printf("width wildcard |%*d|\n", 5, 43); */ + /* ft_printf("precision wildcard |%.*d|\n", 5, 43); */ + /* ft_printf("precision/width wildcard |%*.*d|\n", 5, 3, 43); */ + /* ft_printf("left adjusted |%*d|\n", -5, 43); */ - ft_printf("width wildcard |%*d|\n", 5, 43); - ft_printf("precision wildcard |%.*d|\n", 3, 43); - ft_printf("precision wildcard |%*.*d|\n", 5, 3, 43); + ft_printf("overwrite |%*3d|\n", 5, 43); + ft_printf("overwrite |%*-1d|\n", 0, 43); return 0; } diff --git a/parse.c b/parse.c index 3d1fb00..66ff9ee 100644 --- a/parse.c +++ b/parse.c @@ -67,6 +67,7 @@ t_pformat *parse_conversion(char *conversion) start++; } pformat->min_field_width_wildcard = FALSE; + pformat->min_field_width = -1; if (*start == '*') { pformat->min_field_width_wildcard = TRUE; @@ -74,23 +75,20 @@ t_pformat *parse_conversion(char *conversion) } if (ft_isdigit(*start)) { + /* pformat->min_field_width_wildcard = FALSE; */ pformat->min_field_width = ft_atoi(start); while (ft_isdigit(*start)) start++; } - else - pformat->min_field_width = -1; pformat->precision = -1; pformat->precision_wildcard = FALSE; if (*start == '.') { start++; - /* printf("\n%s\n", start); */ if (*start == '*') pformat->precision_wildcard = TRUE; else { - pformat->precision_wildcard = FALSE; pformat->precision = ft_atoi(start); while (ft_isdigit(*start)) start++; diff --git a/printer.c b/printer.c index 764cbff..043bf23 100644 --- a/printer.c +++ b/printer.c @@ -119,11 +119,21 @@ char *convert_to_str(t_pformat *pformat, va_list ap) str = NULL; if (pformat->min_field_width_wildcard) - pformat->min_field_width = va_arg(ap, int); + { + if (pformat->min_field_width != -1) + va_arg(ap, int); + else + { + pformat->min_field_width = va_arg(ap, int); + if (pformat->min_field_width < 0) + { + pformat->left_adjusted = TRUE; + pformat->min_field_width = -pformat->min_field_width; + } + } + } if (pformat->precision_wildcard) pformat->precision = va_arg(ap, int); - /* printf("\n%d\n", pformat->precision); */ - /* pformat->precision = 45; */ if (conversion == CONVERSION_CHAR) { if ((str = ft_strnew(2)) == NULL) @@ -133,7 +143,10 @@ char *convert_to_str(t_pformat *pformat, va_list ap) else if (conversion == CONVERSION_STR) str = ft_strdup(va_arg(ap, char*)); else if (conversion == CONVERSION_PTR) + { + // handle 0x with and without zero padding str = ITOA_HEX_UPPER(va_arg(ap, int)); + } else if (conversion == CONVERSION_DECIMAL || conversion == CONVERSION_INT) str = ITOA_DEC(va_arg(ap, int)); else if (conversion == CONVERSION_UINT) -- cgit