Skip to content

Commit

Permalink
* stdio-common/vfscanf.c: Fix problems in width accounting.
Browse files Browse the repository at this point in the history
	* stdio-common/tst-sscanf.c (double_tests): New tests.
	(main): Hook them up.
  • Loading branch information
Ulrich Drepper committed Feb 18, 2007
1 parent da50f00 commit ac2ca02
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 3 deletions.
4 changes: 4 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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.

Expand Down
27 changes: 26 additions & 1 deletion stdio-common/tst-sscanf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}
9 changes: 7 additions & 2 deletions stdio-common/vfscanf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ();

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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'
Expand Down

0 comments on commit ac2ca02

Please sign in to comment.