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.
This commit is contained in:
Ori Bernstein 2020-05-09 15:10:39 -07:00
parent 758edf2b14
commit bfc8cdfff5
2 changed files with 8 additions and 7 deletions

View file

@ -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;

View file

@ -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;