* 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> 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. * stdio-common/vfscanf.c: Remove unused WIDTH handling.
More simplifications of floating-point reader. More simplifications of floating-point reader.

View File

@ -65,7 +65,7 @@ const long int val_long[] =
-12345678, 987654321, 123456789, 987654321, 123456789, 987654321 -12345678, 987654321, 123456789, 987654321, 123456789, 987654321
}; };
struct int_test struct test
{ {
const CHAR *str; const CHAR *str;
const CHAR *fmt; const CHAR *fmt;
@ -99,6 +99,17 @@ struct int_test
{ L("foo \t %bar1"), L("foo%%bar%d"), 1 } { 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 int
main (void) 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; 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'):
case L_('A'): case L_('A'):
c = inchar (); c = inchar ();
if (width > 0)
--width;
if (__builtin_expect (c == EOF, 0)) if (__builtin_expect (c == EOF, 0))
input_error (); 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)) if (ISDIGIT (c))
ADDW (c); ADDW (c);
@ -1818,10 +1820,13 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
} }
#endif #endif
} }
if (width == 0 || inchar () == EOF)
break;
if (width > 0) if (width > 0)
--width; --width;
} }
while (width != 0 && inchar () != EOF);
/* Have we read any character? If we try to read a number /* Have we read any character? If we try to read a number
in hexadecimal notation and we have read only the `0x' in hexadecimal notation and we have read only the `0x'