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.
-12345678, 987654321, 123456789, 987654321, 123456789, 987654321
};
-struct int_test
+struct test
{
const CHAR *str;
const CHAR *fmt;
{ 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)
{
}
}
+ 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;
}
case L_('a'):
case L_('A'):
c = inchar ();
+ if (width > 0)
+ --width;
if (__builtin_expect (c == EOF, 0))
input_error ();
}
}
- do
+ while (1)
{
if (ISDIGIT (c))
ADDW (c);
}
#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'