diff options
author | Ori Bernstein <ori@eigenstate.org> | 2020-05-09 15:10:39 -0700 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2020-05-09 15:10:39 -0700 |
commit | bfc8cdfff5aba1da7ddef1c2ef7e1167f8dd2e8d (patch) | |
tree | 68860e9c2f3f89e26fb459995af324dae5829323 /sys/src/ape | |
parent | 758edf2b1448bcc461bc2f99eeaabad1a077351d (diff) |
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.
Diffstat (limited to 'sys/src/ape')
-rw-r--r-- | sys/src/ape/lib/ap/stdio/vfscanf.c | 8 |
1 files changed, 4 insertions, 4 deletions
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; |