simplify some logic in scanf and remove redundant invalid-format check
authorRich Felker <dalias@aerifal.cx>
Tue, 4 Jun 2013 20:22:02 +0000 (16:22 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 4 Jun 2013 20:22:02 +0000 (16:22 -0400)
src/stdio/vfscanf.c

index 62bf47f..d8f9ae6 100644 (file)
@@ -169,32 +169,22 @@ int vfscanf(FILE *restrict f, const char *restrict fmt, va_list ap)
 
                t = *p;
 
-               switch (t) {
-               case 'C':
-                       if (width < 1) width = 1;
-               case 'S':
+               /* C or S */
+               if ((t&0x2f) == 3) {
                        t |= 32;
                        size = SIZE_l;
-                       break;
+               }
+
+               switch (t) {
                case 'c':
                        if (width < 1) width = 1;
-               case 'd': case 'i': case 'o': case 'u': case 'x':
-               case 'a': case 'e': case 'f': case 'g':
-               case 'A': case 'E': case 'F': case 'G': case 'X':
-               case '[': case 's':
-               case 'p': case 'n':
+               case '[':
                        break;
-               default:
-                       goto fmt_fail;
-               }
-
-               if (t == 'n') {
+               case 'n':
                        store_int(dest, size, pos);
                        /* do not increment match count, etc! */
                        continue;
-               }
-
-               if (t != '[' && (t|32) != 'c') {
+               default:
                        shlim(f, 0);
                        while (isspace(shgetc(f)));
                        shunget(f);