about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-06-04 16:22:02 -0400
committerRich Felker <dalias@aerifal.cx>2013-06-04 16:22:02 -0400
commit1ab59de81e94e7802f85d314a709f8350a0e9b65 (patch)
tree7a0eda9ee4a6d85439416378c9a1462947a88145
parentf18846dd3a048598676e10b2a7b9f931bb3d1d6a (diff)
downloadmusl-1ab59de81e94e7802f85d314a709f8350a0e9b65.tar.gz
musl-1ab59de81e94e7802f85d314a709f8350a0e9b65.tar.xz
musl-1ab59de81e94e7802f85d314a709f8350a0e9b65.zip
simplify some logic in scanf and remove redundant invalid-format check
-rw-r--r--src/stdio/vfscanf.c26
1 files changed, 8 insertions, 18 deletions
diff --git a/src/stdio/vfscanf.c b/src/stdio/vfscanf.c
index 62bf47f6..d8f9ae6b 100644
--- a/src/stdio/vfscanf.c
+++ b/src/stdio/vfscanf.c
@@ -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);