More simplifications of floating-point reader.
This commit is contained in:
Ulrich Drepper 2007-02-18 09:43:44 +00:00
parent e9bb524634
commit da50f00107
2 changed files with 1 additions and 57 deletions

View File

@ -1,6 +1,7 @@
2007-02-18 Ulrich Drepper <drepper@redhat.com>
* stdio-common/vfscanf.c: Remove unused WIDTH handling.
More simplifications of floating-point reader.
* stdio-common/Makefile (tests): Add tst-swscanf.
* stdio-common/tst-sscanf.c: Make tests usable for swscanf

View File

@ -1597,63 +1597,6 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
if (__builtin_expect (width == 0 || inchar () == EOF, 0))
/* EOF is only an input error before we read any chars. */
conv_error ();
if (! ISDIGIT (c) && TOLOWER (c) != L_('i')
&& TOLOWER (c) != L_('n'))
{
#ifdef COMPILE_WSCANF
if (__builtin_expect (c != decimal, 0))
{
/* This is no valid number. */
ungetc (c, s);
conv_error ();
}
#else
/* Match against the decimal point. At this point
we are taking advantage of the fact that we can
push more than one character back. This is
(almost) never necessary since the decimal point
string hopefully never contains more than one
byte. */
const char *cmpp = decimal;
int avail = width > 0 ? width : INT_MAX;
while ((unsigned char) *cmpp == c && avail-- > 0)
if (*++cmpp == '\0')
break;
else
{
if (inchar () == EOF)
break;
}
if (__builtin_expect (*cmpp != '\0', 0))
{
/* This is no valid number. */
while (1)
{
ungetc (c, s);
if (cmpp == decimal)
break;
c = (unsigned char) *--cmpp;
}
conv_error ();
}
else
{
/* Add all the characters. */
for (cmpp = decimal; *cmpp != '\0'; ++cmpp)
ADDW ((unsigned char) *cmpp);
if (width > 0)
width = avail;
got_dot = 1;
c = inchar ();
}
if (width > 0)
width = avail;
#endif
}
if (width > 0)
--width;
}