commit 096da1297ba038efeb64acdc85a25b67757f95ad
Author: FRIGN <[email protected]>
Date:   Thu Mar 26 23:00:02 2015 +0100

    Properly handle width and precision in printf(1)

diff --git a/printf.c b/printf.c
index c87cfcb..770b7cb 100644
--- a/printf.c
+++ b/printf.c
@@ -49,7 +49,7 @@ main(int argc, char *argv[])
                }
 
                /* field width */
-               width = 0;
+               width = -1;
                for (i++; strchr("#-+ 0", format[i]); i++);
                if (format[i] == '*') {
                        if (argi < argc)
@@ -65,17 +65,20 @@ main(int argc, char *argv[])
                                tmp[i - j] = 0;
                                width = estrtonum(tmp, 0, INT_MAX);
                                free(tmp);
+                       } else {
+                               width = 0;
                        }
                }
 
                /* field precision */
-               precision = 6;
+               precision = -1;
                if (format[i] == '.') {
                        if (format[++i] == '*') {
                                if (argi < argc)
                                        precision = estrtonum(argv[argi++], 0, 
INT_MAX);
                                else
                                        cooldown = 1;
+                               i++;
                        } else {
                                j = i;
                                for (; strchr("+-0123456789", format[i]); i++);
@@ -84,6 +87,8 @@ main(int argc, char *argv[])
                                        tmp[i - j] = 0;
                                        precision = estrtonum(tmp, 0, INT_MAX);
                                        free(tmp);
+                               } else {
+                                       precision = 0;
                                }
                        }
                }
@@ -117,7 +122,7 @@ main(int argc, char *argv[])
                        free(rarg);
                        break;
                case 's':
-                       fputs(arg, stdout);
+                       printf("%*.*s", width, precision, arg);
                        break;
                case 'd': case 'i': case 'o': case 'u': case 'x': case 'X':
                        arglen = strlen(arg);

Reply via email to