about summary refs log tree commit diff
path: root/stdlib/bug-strtod.c
diff options
context:
space:
mode:
authorPaul E. Murphy <murphyp@linux.vnet.ibm.com>2016-05-06 16:00:39 -0500
committerPaul E. Murphy <murphyp@linux.vnet.ibm.com>2016-05-23 14:13:11 -0500
commitdba0832af1eeb0d749aec072ce20f9811fb4b7d6 (patch)
treec848f0bed5085fbe6ed635f609baf1c304c4d890 /stdlib/bug-strtod.c
parentbc779a1a5b3035133024b21e2f339fe4219fb11c (diff)
downloadglibc-dba0832af1eeb0d749aec072ce20f9811fb4b7d6.tar.gz
glibc-dba0832af1eeb0d749aec072ce20f9811fb4b7d6.tar.xz
glibc-dba0832af1eeb0d749aec072ce20f9811fb4b7d6.zip
Refactor bug-strtod.c to better test new types.
This introduces tst-strtod.h to contain some macros
to assist with updating strto{f,d,ld} test code to
support additional variants of this function.
Diffstat (limited to 'stdlib/bug-strtod.c')
-rw-r--r--stdlib/bug-strtod.c104
1 files changed, 39 insertions, 65 deletions
diff --git a/stdlib/bug-strtod.c b/stdlib/bug-strtod.c
index 82e7d30b42..c8b56aa7e1 100644
--- a/stdlib/bug-strtod.c
+++ b/stdlib/bug-strtod.c
@@ -21,73 +21,47 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "tst-strtod.h"
+
+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, FTOSTRM, LSUF, CSUF)		\
+static int								\
+test_strto ## FSUF (void)						\
+{									\
+  char buf[300];							\
+  int cnt;								\
+  int result = 0;							\
+									\
+  for (cnt = 0; cnt < 200; ++cnt)					\
+    {									\
+      ssize_t n;							\
+      FTYPE f;								\
+									\
+      n = sprintf (buf, "%d", cnt);					\
+      memset (buf + n, '0', cnt);					\
+      sprintf (buf + n + cnt, ".000e-%d", cnt);				\
+      f = strto ## FSUF (buf, NULL);					\
+									\
+      if (f != (FTYPE) cnt)						\
+	{								\
+	  char fstr[FSTRLENMAX];					\
+	  char fcntstr[FSTRLENMAX];					\
+	  FTOSTR (fstr, sizeof (fstr), "%" FTOSTRM "g", f);		\
+	  FTOSTR (fcntstr, sizeof (fstr), "%" FTOSTRM "g", (FTYPE) cnt); \
+	  printf ("strto" #FSUF "(\"%s\") "				\
+		  "failed for cnt == %d (%s instead of %s)\n",		\
+		  buf, cnt, fstr, fcntstr);				\
+	  result = 1;							\
+	}								\
+      else								\
+	printf ( "strto" #FSUF "() fine for cnt == %d\n", cnt);		\
+    }									\
+  return result;							\
+}
+
+GEN_TEST_STRTOD_FOREACH (TEST_STRTOD)
 
 int
 main (void)
 {
-  char buf[300];
-  int cnt;
-  int result = 0;
-
-  for (cnt = 0; cnt < 200; ++cnt)
-    {
-      ssize_t n;
-      float f;
-
-      n = sprintf (buf, "%d", cnt);
-      memset (buf + n, '0', cnt);
-      sprintf (buf + n + cnt, ".000e-%d", cnt);
-      f = strtof (buf, NULL);
-
-      if (f != (float) cnt)
-	{
-	  printf ("strtof(\"%s\") failed for cnt == %d (%g instead of %g)\n",
-		  buf, cnt, f, (float) cnt);
-	  result = 1;
-	}
-      else
-	printf ("strtof() fine for cnt == %d\n", cnt);
-    }
-
-  for (cnt = 0; cnt < 200; ++cnt)
-    {
-      ssize_t n;
-      double f;
-
-      n = sprintf (buf, "%d", cnt);
-      memset (buf + n, '0', cnt);
-      sprintf (buf + n + cnt, ".000e-%d", cnt);
-      f = strtod (buf, NULL);
-
-      if (f != (double) cnt)
-	{
-	  printf ("strtod(\"%s\") failed for cnt == %d (%g instead of %g)\n",
-		  buf, cnt, f, (double) cnt);
-	  result = 1;
-	}
-      else
-	printf ("strtod() fine for cnt == %d\n", cnt);
-    }
-
-  for (cnt = 0; cnt < 200; ++cnt)
-    {
-      ssize_t n;
-      long double f;
-
-      n = sprintf (buf, "%d", cnt);
-      memset (buf + n, '0', cnt);
-      sprintf (buf + n + cnt, ".000e-%d", cnt);
-      f = strtold (buf, NULL);
-
-      if (f != (long double) cnt)
-	{
-	  printf ("strtold(\"%s\") failed for cnt == %d (%Lg instead of %Lg)\n",
-		  buf, cnt, f, (long double) cnt);
-	  result = 1;
-	}
-      else
-	printf ("strtold() fine for cnt == %d\n", cnt);
-    }
-
-  return result;
+  return STRTOD_TEST_FOREACH (test_strto);
 }