From: Ori Bernstein Date: Sat, 9 May 2020 22:10:39 +0000 (-0700) Subject: fix '%[]' specifiers and '%n' (thanks phil9) X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=bfc8cdfff5aba1da7ddef1c2ef7e1167f8dd2e8d;p=plan9front.git fix '%[]' specifiers and '%n' (thanks phil9) When a match() fails, we need to unget the character we tried to match against, rather than leaving it consumed. Also, we can't break out of a conversion before we reach the end of a format string, because things like the '%n' conversion do not consume anything, and should still be handled. --- diff --git a/sys/src/ape/lib/ap/stdio/vfscanf.c b/sys/src/ape/lib/ap/stdio/vfscanf.c index c44bd7576..95c14b7b2 100644 --- a/sys/src/ape/lib/ap/stdio/vfscanf.c +++ b/sys/src/ape/lib/ap/stdio/vfscanf.c @@ -72,7 +72,6 @@ int vfscanf(FILE *f, const char *s, va_list args) do c=ngetc(f); while(isspace(c)); - if(c==EOF) return ncvt?ncvt:EOF; nungetc(c, f); break; } @@ -396,13 +395,14 @@ icvt_sq(FILE *f, va_list *args, int store, int width, int) if(nn==0) return 0; else goto Done; } - if(!match(c, pat)) - break; + if(!match(c, pat)){ + nungetc(c, f); + return 0; + } if(store) *s++=c; nn++; } - nungetc(c, f); Done: if(store) *s='\0'; return 1; diff --git a/sys/src/libstdio/vfscanf.c b/sys/src/libstdio/vfscanf.c index d17dcf2c4..d811b7803 100644 --- a/sys/src/libstdio/vfscanf.c +++ b/sys/src/libstdio/vfscanf.c @@ -68,7 +68,6 @@ int vfscanf(FILE *f, const char *s, va_list args){ do c=ngetc(f); while(isspace(c)); - if(c==EOF) return ncvt?ncvt:EOF; nungetc(c, f); break; } @@ -353,11 +352,13 @@ static int icvt_sq(FILE *f, va_list *args, int store, int width, int type){ if(nn==0) return 0; else goto Done; } - if(!match(c, pat)) break; + if(!match(c, pat)){ + nungetc(c, f); + return 0; + } if(store) *s++=c; nn++; } - nungetc(c, f); Done: if(store) *s='\0'; return 1;