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:
parent
758edf2b14
commit
bfc8cdfff5
2 changed files with 8 additions and 7 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue