* stdio-common/vfscanf.c: Fix problems in width accounting.

* stdio-common/tst-sscanf.c (double_tests): New tests.
	(main): Hook them up.
This commit is contained in:
Ulrich Drepper 2007-02-18 19:03:30 +00:00
parent da50f00107
commit ac2ca0229a
3 changed files with 37 additions and 3 deletions

View File

@ -1,5 +1,9 @@
2007-02-18 Ulrich Drepper <drepper@redhat.com>
* stdio-common/vfscanf.c: Fix problems in width accounting.
* stdio-common/tst-sscanf.c (double_tests): New tests.
(main): Hook them up.
* stdio-common/vfscanf.c: Remove unused WIDTH handling.
More simplifications of floating-point reader.

View File

@ -65,7 +65,7 @@ const long int val_long[] =
-12345678, 987654321, 123456789, 987654321, 123456789, 987654321
};
struct int_test
struct test
{
const CHAR *str;
const CHAR *fmt;
@ -99,6 +99,17 @@ struct int_test
{ L("foo \t %bar1"), L("foo%%bar%d"), 1 }
};
struct test double_tests[] =
{
{ L("-1"), L("%1g"), 0 },
{ L("-.1"), L("%2g"), 0 },
{ L("-inf"), L("%3g"), 0 },
{ L("+0"), L("%1g"), },
{ L("-0x1p0"), L("%2g"), 1 },
{ L("-..1"), L("%g"), 0 },
{ L("-inf"), L("%g"), 1 }
};
int
main (void)
{
@ -172,5 +183,19 @@ main (void)
}
}
for (i = 0; i < sizeof (double_tests) / sizeof (double_tests[0]); ++i)
{
double dummy;
int ret;
if ((ret = SSCANF (double_tests[i].str, double_tests[i].fmt,
&dummy)) != double_tests[i].retval)
{
printf ("double_tests[%d] returned %d != %d\n",
i, ret, double_tests[i].retval);
result = 1;
}
}
return result;
}

View File

@ -1585,6 +1585,8 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
case L_('a'):
case L_('A'):
c = inchar ();
if (width > 0)
--width;
if (__builtin_expect (c == EOF, 0))
input_error ();
@ -1712,7 +1714,7 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
}
}
do
while (1)
{
if (ISDIGIT (c))
ADDW (c);
@ -1818,10 +1820,13 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
}
#endif
}
if (width == 0 || inchar () == EOF)
break;
if (width > 0)
--width;
}
while (width != 0 && inchar () != EOF);
/* Have we read any character? If we try to read a number
in hexadecimal notation and we have read only the `0x'