Siddhesh Poyarekar 730a16f
commit a4966c6104918ac884ee1131a4ed23c5ad6b4c5a
Siddhesh Poyarekar 730a16f
Author: Andreas Schwab <schwab@suse.de>
Siddhesh Poyarekar 730a16f
Date:   Thu Oct 31 12:51:03 2013 +0100
Siddhesh Poyarekar 730a16f
Siddhesh Poyarekar 730a16f
    Fix parsing of 0e+0 as float
Siddhesh Poyarekar 730a16f
Siddhesh Poyarekar 730a16f
diff --git a/stdio-common/tst-sscanf.c b/stdio-common/tst-sscanf.c
Siddhesh Poyarekar 730a16f
index 1edb227..3c34f58 100644
Siddhesh Poyarekar 730a16f
--- a/stdio-common/tst-sscanf.c
Siddhesh Poyarekar 730a16f
+++ b/stdio-common/tst-sscanf.c
Siddhesh Poyarekar 730a16f
@@ -109,6 +109,19 @@ struct test double_tests[] =
Siddhesh Poyarekar 730a16f
   { L("-inf"), L("%g"), 1 }
Siddhesh Poyarekar 730a16f
 };
Siddhesh Poyarekar 730a16f
 
Siddhesh Poyarekar 730a16f
+struct test2
Siddhesh Poyarekar 730a16f
+{
Siddhesh Poyarekar 730a16f
+  const CHAR *str;
Siddhesh Poyarekar 730a16f
+  const CHAR *fmt;
Siddhesh Poyarekar 730a16f
+  int retval;
Siddhesh Poyarekar 730a16f
+  char residual;
Siddhesh Poyarekar 730a16f
+} double_tests2[] =
Siddhesh Poyarekar 730a16f
+{
Siddhesh Poyarekar 730a16f
+  { L("0e+0"), L("%g%c"), 1, 0 },
Siddhesh Poyarekar 730a16f
+  { L("0xe+0"), L("%g%c"), 2, '+' },
Siddhesh Poyarekar 730a16f
+  { L("0x.e+0"), L("%g%c"), 2, '+' },
Siddhesh Poyarekar 730a16f
+};
Siddhesh Poyarekar 730a16f
+
Siddhesh Poyarekar 730a16f
 int
Siddhesh Poyarekar 730a16f
 main (void)
Siddhesh Poyarekar 730a16f
 {
Siddhesh Poyarekar 730a16f
@@ -196,5 +209,26 @@ main (void)
Siddhesh Poyarekar 730a16f
 	}
Siddhesh Poyarekar 730a16f
     }
Siddhesh Poyarekar 730a16f
 
Siddhesh Poyarekar 730a16f
+  for (i = 0; i < sizeof (double_tests2) / sizeof (double_tests2[0]); ++i)
Siddhesh Poyarekar 730a16f
+    {
Siddhesh Poyarekar 730a16f
+      double dummy;
Siddhesh Poyarekar 730a16f
+      int ret;
Siddhesh Poyarekar 730a16f
+      char c = 0;
Siddhesh Poyarekar 730a16f
+
Siddhesh Poyarekar 730a16f
+      if ((ret = SSCANF (double_tests2[i].str, double_tests2[i].fmt,
Siddhesh Poyarekar 730a16f
+			 &dummy, &c)) != double_tests2[i].retval)
Siddhesh Poyarekar 730a16f
+	{
Siddhesh Poyarekar 730a16f
+	  printf ("double_tests2[%d] returned %d != %d\n",
Siddhesh Poyarekar 730a16f
+		  i, ret, double_tests2[i].retval);
Siddhesh Poyarekar 730a16f
+	  result = 1;
Siddhesh Poyarekar 730a16f
+	}
Siddhesh Poyarekar 730a16f
+      else if (ret == 2 && c != double_tests2[i].residual)
Siddhesh Poyarekar 730a16f
+	{
Siddhesh Poyarekar 730a16f
+	  printf ("double_tests2[%d] stopped at '%c' != '%c'\n",
Siddhesh Poyarekar 730a16f
+		  i, c, double_tests2[i].residual);
Siddhesh Poyarekar 730a16f
+	  result = 1;
Siddhesh Poyarekar 730a16f
+	}
Siddhesh Poyarekar 730a16f
+    }
Siddhesh Poyarekar 730a16f
+
Siddhesh Poyarekar 730a16f
   return result;
Siddhesh Poyarekar 730a16f
 }
Siddhesh Poyarekar 730a16f
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c
Siddhesh Poyarekar 730a16f
index 78dc2fc..e6fa8f3 100644
Siddhesh Poyarekar 730a16f
--- a/stdio-common/vfscanf.c
Siddhesh Poyarekar 730a16f
+++ b/stdio-common/vfscanf.c
Siddhesh Poyarekar 730a16f
@@ -1966,6 +1966,8 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
Siddhesh Poyarekar 730a16f
 		  if (width > 0)
Siddhesh Poyarekar 730a16f
 		    --width;
Siddhesh Poyarekar 730a16f
 		}
Siddhesh Poyarekar 730a16f
+	      else
Siddhesh Poyarekar 730a16f
+		got_digit = 1;
Siddhesh Poyarekar 730a16f
 	    }
Siddhesh Poyarekar 730a16f
 
Siddhesh Poyarekar 730a16f
 	  while (1)