mirror of git://git.musl-libc.org/musl
fix wide scanf to respect field width for strings
This commit is contained in:
parent
e0d9f780d1
commit
0072251572
|
@ -83,7 +83,7 @@ static int in_set(const wchar_t *set, int c)
|
|||
|
||||
#undef ungetwc
|
||||
#define ungetwc(c,f) \
|
||||
((f)->rend && (c)<128 ? *--(f)->rpos : ungetwc((c),(f)))
|
||||
((f)->rend && (c)<128U ? *--(f)->rpos : ungetwc((c),(f)))
|
||||
#endif
|
||||
|
||||
int vfwscanf(FILE *f, const wchar_t *fmt, va_list ap)
|
||||
|
@ -215,19 +215,22 @@ int vfwscanf(FILE *f, const wchar_t *fmt, va_list ap)
|
|||
|
||||
case 's':
|
||||
s = dest;
|
||||
while (!iswspace(c=getwc(f)) && c!=EOF) {
|
||||
while (width && !iswspace(c=getwc(f)) && c!=EOF) {
|
||||
int l = wctomb(s?s:tmp, c);
|
||||
if (l<0) goto input_fail;
|
||||
if (s) s+=l;
|
||||
pos++;
|
||||
width--;
|
||||
}
|
||||
if (width) ungetwc(c, f);
|
||||
if (s) *s = 0;
|
||||
break;
|
||||
|
||||
case 'S':
|
||||
wcs = dest;
|
||||
while (!iswspace(c=getwc(f)) && c!=EOF)
|
||||
pos++, *wcs++ = c;
|
||||
while (width && !iswspace(c=getwc(f)) && c!=EOF)
|
||||
width--, pos++, *wcs++ = c;
|
||||
if (width) ungetwc(c, f);
|
||||
if (wcs) *wcs = 0;
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue