-#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
#include <errno.h>
#include <math.h>
#include <float.h>
+#include <inttypes.h>
#include "stdio_impl.h"
#include "shgetc.h"
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;
}
if (*p != '%' || p[1] == '%') {
p += *p=='%';
+ shlim(f, 0);
c = shgetc(f);
if (c!=*p) {
shunget(f);
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};
int_common:
x = __intscan(f, base, 0, ULLONG_MAX);
if (!shcnt(f)) goto match_fail;
- if (t=='p') *(void **)dest = (void *)(uintptr_t)x;
+ if (t=='p' && dest) *(void **)dest = (void *)(uintptr_t)x;
else store_int(dest, size, x);
break;
case 'a': case 'A':
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:
if (readwc(c, &wcs, &st) < 0)
goto input_fail;
}
+ shunget(f);
if (!mbsinit(&st)) goto input_fail;
if (dest) *wcs++ = 0;
break;