summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/ap/stdio
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2020-05-09 15:10:39 -0700
committerOri Bernstein <ori@eigenstate.org>2020-05-09 15:10:39 -0700
commitbfc8cdfff5aba1da7ddef1c2ef7e1167f8dd2e8d (patch)
tree68860e9c2f3f89e26fb459995af324dae5829323 /sys/src/ape/lib/ap/stdio
parent758edf2b1448bcc461bc2f99eeaabad1a077351d (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/lib/ap/stdio')
-rw-r--r--sys/src/ape/lib/ap/stdio/vfscanf.c8
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;