aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ft_printf.c10
-rw-r--r--parse.c6
-rw-r--r--printer.c19
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)