OSDN Git Service

Fix printf bug (%.s should be %.0s not %s) reported by Isabella Parakiss.
authorRob Landley <rob@landley.net>
Sat, 28 Mar 2015 18:22:27 +0000 (13:22 -0500)
committerRob Landley <rob@landley.net>
Sat, 28 Mar 2015 18:22:27 +0000 (13:22 -0500)
tests/printf.test
toys/posix/printf.c

index 5cbefb5..20d5982 100644 (file)
@@ -57,3 +57,5 @@ testing "printf '%u %u' -1 -2" "$PRINTF '%u %u' -1 -2" \
 testing "printf '%x %X' 78 79" "$PRINTF '%x %X' 78 79" "4e 4F" "" ""
 testing "printf '%g %G' 78 79" "$PRINTF '%g %G' 78 79" "78 79" "" ""
 testing "printf '%s %s' 78 79" "$PRINTF '%s %s' 78 79" "78 79" "" ""
+
+testing "printf %.s acts like %.0s" "$PRINTF %.s_ 1 2 3 4 5" "_____" "" ""
index 4c9de28..30ae931 100644 (file)
@@ -91,19 +91,17 @@ void printf_main(void)
       // Handle %escape
       else {
         char c, *end = 0, *aa, *to = toybuf;
-        int wp[] = {0,-1}, i;
+        int wp[] = {0,-1}, i = 0;
 
         // Parse width.precision between % and type indicator.
         *to++ = '%';
         while (strchr("-+# '0", *f) && (to-toybuf)<10) *to++ = *f++;
-        for (i=0; i<2; i++) {
+        for (;;) {
           if (eat(&f, '*')) {
             if (*arg) wp[i] = atolx(*arg++);
-          } else while (*f >= '0' && *f <= '9') {
-            if (wp[i]<0) wp[i] = 0;
-            wp[i] = (wp[i]*10)+(*f++)-'0';
-          }
-          if (!eat(&f, '.')) break;
+          } else while (*f >= '0' && *f <= '9') wp[i] = (wp[i]*10)+(*f++)-'0';
+          if (i++ || !eat(&f, '.')) break;
+          wp[1] = 0;
         }
         c = *f++;
         seen = sprintf(to, "*.*%c", c);;