use restrict everywhere it's required by c99 and/or posix 2008
[musl] / src / stdio / vfscanf.c
index 926d8a9..54d0849 100644 (file)
@@ -71,7 +71,7 @@ static int readwc(int c, wchar_t **wcs, mbstate_t *st)
        return 0;
 }
 
-int vfscanf(FILE *f, const char *fmt, va_list ap)
+int vfscanf(FILE *restrict f, const char *restrict fmt, va_list ap)
 {
        int width;
        int size;
@@ -103,6 +103,7 @@ int vfscanf(FILE *f, const char *fmt, va_list ap)
                }
                if (*p != '%' || p[1] == '%') {
                        p += *p=='%';
+                       shlim(f, 0);
                        c = shgetc(f);
                        if (c!=*p) {
                                shunget(f);
@@ -227,14 +228,14 @@ int vfscanf(FILE *f, const char *fmt, va_list ap)
 
                        scanset[0] = 0;
                        if (*p == '-') p++, scanset[1+'-'] = 1-invert;
-                       if (*p == ']') p++, scanset[1+']'] = 1-invert;
-                       for (; *p && *p != ']'; p++) {
-                               if (*p=='-' && p[1] != ']')
+                       else if (*p == ']') p++, scanset[1+']'] = 1-invert;
+                       for (; *p != ']'; p++) {
+                               if (!*p) goto fmt_fail;
+                               if (*p=='-' && p[1] && p[1] != ']')
                                        for (c=p++[-1]; c<*p; c++)
                                                scanset[1+c] = 1-invert;
                                scanset[1+*p] = 1-invert;
                        }
-                       if (!*p) goto fmt_fail;
 
                        if (size == SIZE_l) {
                                st = (mbstate_t){0};
@@ -291,7 +292,7 @@ int vfscanf(FILE *f, const char *fmt, va_list ap)
                case 'e': case 'E':
                case 'f': case 'F':
                case 'g': case 'G':
-                       y = __floatscan(f, -1, size, 0);
+                       y = __floatscan(f, size, 0);
                        if (!shcnt(f)) goto match_fail;
                        if (dest) switch (size) {
                        case SIZE_def:
@@ -312,6 +313,7 @@ int vfscanf(FILE *f, const char *fmt, va_list ap)
                                if (readwc(c, &wcs, &st) < 0)
                                        goto input_fail;
                        }
+                       shunget(f);
                        if (!mbsinit(&st)) goto input_fail;
                        if (dest) *wcs++ = 0;
                        break;