commit 0b7644941494f9adb3d30c2ecec85a0192c99ae4
parent b333176b8c82859ae5a2dbfc8018f7284949f6b0
Author: FRIGN <dev@frign.de>
Date: Mon, 27 Apr 2015 20:27:37 +0200
Add flag support to printf(1)
We skipped flags before, so no real bug, but it's trivial to add
now, so there's no reason not to do it.
Diffstat:
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/printf.c b/printf.c
@@ -22,7 +22,7 @@ main(int argc, char *argv[])
long long num;
double dou;
int cooldown = 0, width, precision;
- char *format, *tmp, *arg, *fmt;
+ char *format, *tmp, *arg, *fmt, flag;
argv0 = argv[0];
if (argc < 2)
@@ -48,9 +48,13 @@ main(int argc, char *argv[])
continue;
}
+ /* flag */
+ for (flag = ' ', i++; strchr("#-+ 0", format[i]); i++) {
+ flag = format[i];
+ }
+
/* field width */
width = -1;
- for (i++; strchr("#-+ 0", format[i]); i++);
if (format[i] == '*') {
if (argi < argc)
width = estrtonum(argv[argi++], 0, INT_MAX);
@@ -133,14 +137,16 @@ main(int argc, char *argv[])
num = rarg[0];
} else
num = (strlen(arg) > 0) ? estrtonum(arg, LLONG_MIN, LLONG_MAX) : 0;
- fmt = estrdup("%*ll#");
- fmt[4] = format[i];
+ fmt = estrdup("%#*ll#");
+ fmt[1] = flag;
+ fmt[5] = format[i];
printf(fmt, width, num);
free(fmt);
break;
case 'a': case 'A': case 'e': case 'E': case 'f': case 'F': case 'g': case 'G':
- fmt = estrdup("%*.*#");
- fmt[4] = format[i];
+ fmt = estrdup("%#*.*#");
+ fmt[1] = flag;
+ fmt[5] = format[i];
dou = (strlen(arg) > 0) ? estrtod(arg) : 0;
printf(fmt, width, precision, dou);
free(fmt);