More tests of printf %f.
authorBruno Haible <bruno@clisp.org>
Fri, 18 May 2007 22:10:17 +0000 (22:10 +0000)
committerBruno Haible <bruno@clisp.org>
Fri, 18 May 2007 22:10:17 +0000 (22:10 +0000)
ChangeLog
tests/test-snprintf-posix.c
tests/test-snprintf-posix.h
tests/test-sprintf-posix.c
tests/test-sprintf-posix.h
tests/test-vasnprintf-posix.c
tests/test-vasprintf-posix.c
tests/test-vsnprintf-posix.c
tests/test-vsprintf-posix.c

index 09012a6caf2ce755fdc26efae7e45c2aaa23688f..4e630f58a3ed4eab73a3656158f3b1f7847cb8d8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2007-05-18  Bruno Haible  <bruno@clisp.org>
+
+       * tests/test-vasnprintf-posix.c (SIZEOF): New macro.
+       (strmatch): New function.
+       (test_function): Test the %f directive on numbers of various exponents.
+       * tests/test-vasprintf-posix.c (SIZEOF): New macro.
+       (strmatch): New function.
+       (test_function): Test the %f directive on numbers of various exponents.
+       * tests/test-snprintf-posix.h (strmatch): New function.
+       (test_function): Test the %f directive on numbers of various exponents.
+       * tests/test-sprintf-posix.h (strmatch): New function.
+       (test_function): Test the %f directive on numbers of various exponents.
+       * tests/test-snprintf-posix.c (SIZEOF): New macro.
+       * tests/test-sprintf-posix.c (SIZEOF): New macro.
+       * tests/test-vsnprintf-posix.c (SIZEOF): New macro.
+       * tests/test-vsprintf-posix.c (SIZEOF): New macro.
+
 2007-05-18  Bruno Haible  <bruno@clisp.org>
 
        Add support for 'long double' number output.
index bbdf3e351cad3d49dea2b1fa41eb39c833c63ab4..563835d9ce51801478100eb694fbd13da5c584b5 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
 #define ASSERT(expr) \
   do                                                                        \
     {                                                                       \
index 8803edf9d70c485e31ed7a0d7dcbf88b113299a3..40366894ab9204918962c42f2e89b4f91bbc1985 100644 (file)
@@ -29,6 +29,17 @@ NaN ()
 # define NaN() (0.0 / 0.0)
 #endif
 
+static int
+strmatch (const char *pattern, const char *string)
+{
+  if (strlen (pattern) != strlen (string))
+    return 0;
+  for (; *pattern != '\0'; pattern++, string++)
+    if (*pattern != '*' && *string != *pattern)
+      return 0;
+  return 1;
+}
+
 static void
 test_function (int (*my_snprintf) (char *, size_t, const char *, ...))
 {
@@ -633,6 +644,95 @@ test_function (int (*my_snprintf) (char *, size_t, const char *, ...))
     ASSERT (retval == strlen (result));
   }
 
+  { /* Small and large positive numbers.  */
+    static struct { double value; const char *string; } data[] =
+      {
+       { 1.234321234321234e-37, "0.000000" },
+       { 1.234321234321234e-36, "0.000000" },
+       { 1.234321234321234e-35, "0.000000" },
+       { 1.234321234321234e-34, "0.000000" },
+       { 1.234321234321234e-33, "0.000000" },
+       { 1.234321234321234e-32, "0.000000" },
+       { 1.234321234321234e-31, "0.000000" },
+       { 1.234321234321234e-30, "0.000000" },
+       { 1.234321234321234e-29, "0.000000" },
+       { 1.234321234321234e-28, "0.000000" },
+       { 1.234321234321234e-27, "0.000000" },
+       { 1.234321234321234e-26, "0.000000" },
+       { 1.234321234321234e-25, "0.000000" },
+       { 1.234321234321234e-24, "0.000000" },
+       { 1.234321234321234e-23, "0.000000" },
+       { 1.234321234321234e-22, "0.000000" },
+       { 1.234321234321234e-21, "0.000000" },
+       { 1.234321234321234e-20, "0.000000" },
+       { 1.234321234321234e-19, "0.000000" },
+       { 1.234321234321234e-18, "0.000000" },
+       { 1.234321234321234e-17, "0.000000" },
+       { 1.234321234321234e-16, "0.000000" },
+       { 1.234321234321234e-15, "0.000000" },
+       { 1.234321234321234e-14, "0.000000" },
+       { 1.234321234321234e-13, "0.000000" },
+       { 1.234321234321234e-12, "0.000000" },
+       { 1.234321234321234e-11, "0.000000" },
+       { 1.234321234321234e-10, "0.000000" },
+       { 1.234321234321234e-9, "0.000000" },
+       { 1.234321234321234e-8, "0.000000" },
+       { 1.234321234321234e-7, "0.000000" },
+       { 1.234321234321234e-6, "0.000001" },
+       { 1.234321234321234e-5, "0.000012" },
+       { 1.234321234321234e-4, "0.000123" },
+       { 1.234321234321234e-3, "0.001234" },
+       { 1.234321234321234e-2, "0.012343" },
+       { 1.234321234321234e-1, "0.123432" },
+       { 1.234321234321234, "1.234321" },
+       { 1.234321234321234e1, "12.343212" },
+       { 1.234321234321234e2, "123.432123" },
+       { 1.234321234321234e3, "1234.321234" },
+       { 1.234321234321234e4, "12343.212343" },
+       { 1.234321234321234e5, "123432.123432" },
+       { 1.234321234321234e6, "1234321.234321" },
+       { 1.234321234321234e7, "12343212.343212" },
+       { 1.234321234321234e8, "123432123.432123" },
+       { 1.234321234321234e9, "1234321234.321234" },
+       { 1.234321234321234e10, "12343212343.2123**" },
+       { 1.234321234321234e11, "123432123432.123***" },
+       { 1.234321234321234e12, "1234321234321.23****" },
+       { 1.234321234321234e13, "12343212343212.3*****" },
+       { 1.234321234321234e14, "123432123432123.******" },
+       { 1.234321234321234e15, "1234321234321234.000000" },
+       { 1.234321234321234e16, "123432123432123**.000000" },
+       { 1.234321234321234e17, "123432123432123***.000000" },
+       { 1.234321234321234e18, "123432123432123****.000000" },
+       { 1.234321234321234e19, "123432123432123*****.000000" },
+       { 1.234321234321234e20, "123432123432123******.000000" },
+       { 1.234321234321234e21, "123432123432123*******.000000" },
+       { 1.234321234321234e22, "123432123432123********.000000" },
+       { 1.234321234321234e23, "123432123432123*********.000000" },
+       { 1.234321234321234e24, "123432123432123**********.000000" },
+       { 1.234321234321234e25, "123432123432123***********.000000" },
+       { 1.234321234321234e26, "123432123432123************.000000" },
+       { 1.234321234321234e27, "123432123432123*************.000000" },
+       { 1.234321234321234e28, "123432123432123**************.000000" },
+       { 1.234321234321234e29, "123432123432123***************.000000" },
+       { 1.234321234321234e30, "123432123432123****************.000000" },
+       { 1.234321234321234e31, "123432123432123*****************.000000" },
+       { 1.234321234321234e32, "123432123432123******************.000000" },
+       { 1.234321234321234e33, "123432123432123*******************.000000" },
+       { 1.234321234321234e34, "123432123432123********************.000000" },
+       { 1.234321234321234e35, "123432123432123*********************.000000" },
+       { 1.234321234321234e36, "123432123432123**********************.000000" }
+      };
+    size_t k;
+    for (k = 0; k < SIZEOF (data); k++)
+      {
+       char result[100];
+       int retval =
+         my_snprintf (result, sizeof (result), "%f", data[k].value);
+       ASSERT (strmatch (data[k].string, result));
+       ASSERT (retval == strlen (result));
+      }
+  }
+
   { /* A negative number.  */
     char result[100];
     int retval =
@@ -786,6 +886,95 @@ test_function (int (*my_snprintf) (char *, size_t, const char *, ...))
     ASSERT (retval == strlen (result));
   }
 
+  { /* Small and large positive numbers.  */
+    static struct { long double value; const char *string; } data[] =
+      {
+       { 1.234321234321234e-37L, "0.000000" },
+       { 1.234321234321234e-36L, "0.000000" },
+       { 1.234321234321234e-35L, "0.000000" },
+       { 1.234321234321234e-34L, "0.000000" },
+       { 1.234321234321234e-33L, "0.000000" },
+       { 1.234321234321234e-32L, "0.000000" },
+       { 1.234321234321234e-31L, "0.000000" },
+       { 1.234321234321234e-30L, "0.000000" },
+       { 1.234321234321234e-29L, "0.000000" },
+       { 1.234321234321234e-28L, "0.000000" },
+       { 1.234321234321234e-27L, "0.000000" },
+       { 1.234321234321234e-26L, "0.000000" },
+       { 1.234321234321234e-25L, "0.000000" },
+       { 1.234321234321234e-24L, "0.000000" },
+       { 1.234321234321234e-23L, "0.000000" },
+       { 1.234321234321234e-22L, "0.000000" },
+       { 1.234321234321234e-21L, "0.000000" },
+       { 1.234321234321234e-20L, "0.000000" },
+       { 1.234321234321234e-19L, "0.000000" },
+       { 1.234321234321234e-18L, "0.000000" },
+       { 1.234321234321234e-17L, "0.000000" },
+       { 1.234321234321234e-16L, "0.000000" },
+       { 1.234321234321234e-15L, "0.000000" },
+       { 1.234321234321234e-14L, "0.000000" },
+       { 1.234321234321234e-13L, "0.000000" },
+       { 1.234321234321234e-12L, "0.000000" },
+       { 1.234321234321234e-11L, "0.000000" },
+       { 1.234321234321234e-10L, "0.000000" },
+       { 1.234321234321234e-9L, "0.000000" },
+       { 1.234321234321234e-8L, "0.000000" },
+       { 1.234321234321234e-7L, "0.000000" },
+       { 1.234321234321234e-6L, "0.000001" },
+       { 1.234321234321234e-5L, "0.000012" },
+       { 1.234321234321234e-4L, "0.000123" },
+       { 1.234321234321234e-3L, "0.001234" },
+       { 1.234321234321234e-2L, "0.012343" },
+       { 1.234321234321234e-1L, "0.123432" },
+       { 1.234321234321234L, "1.234321" },
+       { 1.234321234321234e1L, "12.343212" },
+       { 1.234321234321234e2L, "123.432123" },
+       { 1.234321234321234e3L, "1234.321234" },
+       { 1.234321234321234e4L, "12343.212343" },
+       { 1.234321234321234e5L, "123432.123432" },
+       { 1.234321234321234e6L, "1234321.234321" },
+       { 1.234321234321234e7L, "12343212.343212" },
+       { 1.234321234321234e8L, "123432123.432123" },
+       { 1.234321234321234e9L, "1234321234.321234" },
+       { 1.234321234321234e10L, "12343212343.2123**" },
+       { 1.234321234321234e11L, "123432123432.123***" },
+       { 1.234321234321234e12L, "1234321234321.23****" },
+       { 1.234321234321234e13L, "12343212343212.3*****" },
+       { 1.234321234321234e14L, "123432123432123.******" },
+       { 1.234321234321234e15L, "1234321234321234.000000" },
+       { 1.234321234321234e16L, "123432123432123**.000000" },
+       { 1.234321234321234e17L, "123432123432123***.000000" },
+       { 1.234321234321234e18L, "123432123432123****.000000" },
+       { 1.234321234321234e19L, "123432123432123*****.000000" },
+       { 1.234321234321234e20L, "123432123432123******.000000" },
+       { 1.234321234321234e21L, "123432123432123*******.000000" },
+       { 1.234321234321234e22L, "123432123432123********.000000" },
+       { 1.234321234321234e23L, "123432123432123*********.000000" },
+       { 1.234321234321234e24L, "123432123432123**********.000000" },
+       { 1.234321234321234e25L, "123432123432123***********.000000" },
+       { 1.234321234321234e26L, "123432123432123************.000000" },
+       { 1.234321234321234e27L, "123432123432123*************.000000" },
+       { 1.234321234321234e28L, "123432123432123**************.000000" },
+       { 1.234321234321234e29L, "123432123432123***************.000000" },
+       { 1.234321234321234e30L, "123432123432123****************.000000" },
+       { 1.234321234321234e31L, "123432123432123*****************.000000" },
+       { 1.234321234321234e32L, "123432123432123******************.000000" },
+       { 1.234321234321234e33L, "123432123432123*******************.000000" },
+       { 1.234321234321234e34L, "123432123432123********************.000000" },
+       { 1.234321234321234e35L, "123432123432123*********************.000000" },
+       { 1.234321234321234e36L, "123432123432123**********************.000000" }
+      };
+    size_t k;
+    for (k = 0; k < SIZEOF (data); k++)
+      {
+       char result[100];
+       int retval =
+         my_snprintf (result, sizeof (result), "%Lf", data[k].value);
+       ASSERT (strmatch (data[k].string, result));
+       ASSERT (retval == strlen (result));
+      }
+  }
+
   { /* A negative number.  */
     char result[100];
     int retval =
index 54e7117a7d464c7719f9f744b11bb6b59ae483f0..5070106248d6ee81cf4597b9258d2488c53f5c7f 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
 #define ASSERT(expr) \
   do                                                                        \
     {                                                                       \
index 2de6d0f2f1357204f4fe2daff48bf9ec0ef8d2cc..9a27b3f190ac8e274e664dc5785e578866f4f7fb 100644 (file)
@@ -29,6 +29,17 @@ NaN ()
 # define NaN() (0.0 / 0.0)
 #endif
 
+static int
+strmatch (const char *pattern, const char *string)
+{
+  if (strlen (pattern) != strlen (string))
+    return 0;
+  for (; *pattern != '\0'; pattern++, string++)
+    if (*pattern != '*' && *string != *pattern)
+      return 0;
+  return 1;
+}
+
 static void
 test_function (int (*my_sprintf) (char *, const char *, ...))
 {
@@ -619,6 +630,95 @@ test_function (int (*my_sprintf) (char *, const char *, ...))
     ASSERT (retval == strlen (result));
   }
 
+  { /* Small and large positive numbers.  */
+    static struct { double value; const char *string; } data[] =
+      {
+       { 1.234321234321234e-37, "0.000000" },
+       { 1.234321234321234e-36, "0.000000" },
+       { 1.234321234321234e-35, "0.000000" },
+       { 1.234321234321234e-34, "0.000000" },
+       { 1.234321234321234e-33, "0.000000" },
+       { 1.234321234321234e-32, "0.000000" },
+       { 1.234321234321234e-31, "0.000000" },
+       { 1.234321234321234e-30, "0.000000" },
+       { 1.234321234321234e-29, "0.000000" },
+       { 1.234321234321234e-28, "0.000000" },
+       { 1.234321234321234e-27, "0.000000" },
+       { 1.234321234321234e-26, "0.000000" },
+       { 1.234321234321234e-25, "0.000000" },
+       { 1.234321234321234e-24, "0.000000" },
+       { 1.234321234321234e-23, "0.000000" },
+       { 1.234321234321234e-22, "0.000000" },
+       { 1.234321234321234e-21, "0.000000" },
+       { 1.234321234321234e-20, "0.000000" },
+       { 1.234321234321234e-19, "0.000000" },
+       { 1.234321234321234e-18, "0.000000" },
+       { 1.234321234321234e-17, "0.000000" },
+       { 1.234321234321234e-16, "0.000000" },
+       { 1.234321234321234e-15, "0.000000" },
+       { 1.234321234321234e-14, "0.000000" },
+       { 1.234321234321234e-13, "0.000000" },
+       { 1.234321234321234e-12, "0.000000" },
+       { 1.234321234321234e-11, "0.000000" },
+       { 1.234321234321234e-10, "0.000000" },
+       { 1.234321234321234e-9, "0.000000" },
+       { 1.234321234321234e-8, "0.000000" },
+       { 1.234321234321234e-7, "0.000000" },
+       { 1.234321234321234e-6, "0.000001" },
+       { 1.234321234321234e-5, "0.000012" },
+       { 1.234321234321234e-4, "0.000123" },
+       { 1.234321234321234e-3, "0.001234" },
+       { 1.234321234321234e-2, "0.012343" },
+       { 1.234321234321234e-1, "0.123432" },
+       { 1.234321234321234, "1.234321" },
+       { 1.234321234321234e1, "12.343212" },
+       { 1.234321234321234e2, "123.432123" },
+       { 1.234321234321234e3, "1234.321234" },
+       { 1.234321234321234e4, "12343.212343" },
+       { 1.234321234321234e5, "123432.123432" },
+       { 1.234321234321234e6, "1234321.234321" },
+       { 1.234321234321234e7, "12343212.343212" },
+       { 1.234321234321234e8, "123432123.432123" },
+       { 1.234321234321234e9, "1234321234.321234" },
+       { 1.234321234321234e10, "12343212343.2123**" },
+       { 1.234321234321234e11, "123432123432.123***" },
+       { 1.234321234321234e12, "1234321234321.23****" },
+       { 1.234321234321234e13, "12343212343212.3*****" },
+       { 1.234321234321234e14, "123432123432123.******" },
+       { 1.234321234321234e15, "1234321234321234.000000" },
+       { 1.234321234321234e16, "123432123432123**.000000" },
+       { 1.234321234321234e17, "123432123432123***.000000" },
+       { 1.234321234321234e18, "123432123432123****.000000" },
+       { 1.234321234321234e19, "123432123432123*****.000000" },
+       { 1.234321234321234e20, "123432123432123******.000000" },
+       { 1.234321234321234e21, "123432123432123*******.000000" },
+       { 1.234321234321234e22, "123432123432123********.000000" },
+       { 1.234321234321234e23, "123432123432123*********.000000" },
+       { 1.234321234321234e24, "123432123432123**********.000000" },
+       { 1.234321234321234e25, "123432123432123***********.000000" },
+       { 1.234321234321234e26, "123432123432123************.000000" },
+       { 1.234321234321234e27, "123432123432123*************.000000" },
+       { 1.234321234321234e28, "123432123432123**************.000000" },
+       { 1.234321234321234e29, "123432123432123***************.000000" },
+       { 1.234321234321234e30, "123432123432123****************.000000" },
+       { 1.234321234321234e31, "123432123432123*****************.000000" },
+       { 1.234321234321234e32, "123432123432123******************.000000" },
+       { 1.234321234321234e33, "123432123432123*******************.000000" },
+       { 1.234321234321234e34, "123432123432123********************.000000" },
+       { 1.234321234321234e35, "123432123432123*********************.000000" },
+       { 1.234321234321234e36, "123432123432123**********************.000000" }
+      };
+    size_t k;
+    for (k = 0; k < SIZEOF (data); k++)
+      {
+       char result[1000];
+       int retval =
+         my_sprintf (result, "%f", data[k].value);
+       ASSERT (strmatch (data[k].string, result));
+       ASSERT (retval == strlen (result));
+      }
+  }
+
   { /* A negative number.  */
     char result[1000];
     int retval =
@@ -766,6 +866,95 @@ test_function (int (*my_sprintf) (char *, const char *, ...))
     ASSERT (retval == strlen (result));
   }
 
+  { /* Small and large positive numbers.  */
+    static struct { long double value; const char *string; } data[] =
+      {
+       { 1.234321234321234e-37L, "0.000000" },
+       { 1.234321234321234e-36L, "0.000000" },
+       { 1.234321234321234e-35L, "0.000000" },
+       { 1.234321234321234e-34L, "0.000000" },
+       { 1.234321234321234e-33L, "0.000000" },
+       { 1.234321234321234e-32L, "0.000000" },
+       { 1.234321234321234e-31L, "0.000000" },
+       { 1.234321234321234e-30L, "0.000000" },
+       { 1.234321234321234e-29L, "0.000000" },
+       { 1.234321234321234e-28L, "0.000000" },
+       { 1.234321234321234e-27L, "0.000000" },
+       { 1.234321234321234e-26L, "0.000000" },
+       { 1.234321234321234e-25L, "0.000000" },
+       { 1.234321234321234e-24L, "0.000000" },
+       { 1.234321234321234e-23L, "0.000000" },
+       { 1.234321234321234e-22L, "0.000000" },
+       { 1.234321234321234e-21L, "0.000000" },
+       { 1.234321234321234e-20L, "0.000000" },
+       { 1.234321234321234e-19L, "0.000000" },
+       { 1.234321234321234e-18L, "0.000000" },
+       { 1.234321234321234e-17L, "0.000000" },
+       { 1.234321234321234e-16L, "0.000000" },
+       { 1.234321234321234e-15L, "0.000000" },
+       { 1.234321234321234e-14L, "0.000000" },
+       { 1.234321234321234e-13L, "0.000000" },
+       { 1.234321234321234e-12L, "0.000000" },
+       { 1.234321234321234e-11L, "0.000000" },
+       { 1.234321234321234e-10L, "0.000000" },
+       { 1.234321234321234e-9L, "0.000000" },
+       { 1.234321234321234e-8L, "0.000000" },
+       { 1.234321234321234e-7L, "0.000000" },
+       { 1.234321234321234e-6L, "0.000001" },
+       { 1.234321234321234e-5L, "0.000012" },
+       { 1.234321234321234e-4L, "0.000123" },
+       { 1.234321234321234e-3L, "0.001234" },
+       { 1.234321234321234e-2L, "0.012343" },
+       { 1.234321234321234e-1L, "0.123432" },
+       { 1.234321234321234L, "1.234321" },
+       { 1.234321234321234e1L, "12.343212" },
+       { 1.234321234321234e2L, "123.432123" },
+       { 1.234321234321234e3L, "1234.321234" },
+       { 1.234321234321234e4L, "12343.212343" },
+       { 1.234321234321234e5L, "123432.123432" },
+       { 1.234321234321234e6L, "1234321.234321" },
+       { 1.234321234321234e7L, "12343212.343212" },
+       { 1.234321234321234e8L, "123432123.432123" },
+       { 1.234321234321234e9L, "1234321234.321234" },
+       { 1.234321234321234e10L, "12343212343.2123**" },
+       { 1.234321234321234e11L, "123432123432.123***" },
+       { 1.234321234321234e12L, "1234321234321.23****" },
+       { 1.234321234321234e13L, "12343212343212.3*****" },
+       { 1.234321234321234e14L, "123432123432123.******" },
+       { 1.234321234321234e15L, "1234321234321234.000000" },
+       { 1.234321234321234e16L, "123432123432123**.000000" },
+       { 1.234321234321234e17L, "123432123432123***.000000" },
+       { 1.234321234321234e18L, "123432123432123****.000000" },
+       { 1.234321234321234e19L, "123432123432123*****.000000" },
+       { 1.234321234321234e20L, "123432123432123******.000000" },
+       { 1.234321234321234e21L, "123432123432123*******.000000" },
+       { 1.234321234321234e22L, "123432123432123********.000000" },
+       { 1.234321234321234e23L, "123432123432123*********.000000" },
+       { 1.234321234321234e24L, "123432123432123**********.000000" },
+       { 1.234321234321234e25L, "123432123432123***********.000000" },
+       { 1.234321234321234e26L, "123432123432123************.000000" },
+       { 1.234321234321234e27L, "123432123432123*************.000000" },
+       { 1.234321234321234e28L, "123432123432123**************.000000" },
+       { 1.234321234321234e29L, "123432123432123***************.000000" },
+       { 1.234321234321234e30L, "123432123432123****************.000000" },
+       { 1.234321234321234e31L, "123432123432123*****************.000000" },
+       { 1.234321234321234e32L, "123432123432123******************.000000" },
+       { 1.234321234321234e33L, "123432123432123*******************.000000" },
+       { 1.234321234321234e34L, "123432123432123********************.000000" },
+       { 1.234321234321234e35L, "123432123432123*********************.000000" },
+       { 1.234321234321234e36L, "123432123432123**********************.000000" }
+      };
+    size_t k;
+    for (k = 0; k < SIZEOF (data); k++)
+      {
+       char result[1000];
+       int retval =
+         my_sprintf (result, "%Lf", data[k].value);
+       ASSERT (strmatch (data[k].string, result));
+       ASSERT (retval == strlen (result));
+      }
+  }
+
   { /* A negative number.  */
     char result[1000];
     int retval =
index a058fc97d2f39338321543e790dc63dab754fecf..b54846c27a502e4a1fc3a187137ba9813578fded 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
 #define ASSERT(expr) \
   do                                                                        \
     {                                                                       \
@@ -53,6 +54,17 @@ NaN ()
 # define NaN() (0.0 / 0.0)
 #endif
 
+static int
+strmatch (const char *pattern, const char *string)
+{
+  if (strlen (pattern) != strlen (string))
+    return 0;
+  for (; *pattern != '\0'; pattern++, string++)
+    if (*pattern != '*' && *string != *pattern)
+      return 0;
+  return 1;
+}
+
 static void
 test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
 {
@@ -775,6 +787,97 @@ test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
     free (result);
   }
 
+  { /* Small and large positive numbers.  */
+    static struct { double value; const char *string; } data[] =
+      {
+       { 1.234321234321234e-37, "0.000000" },
+       { 1.234321234321234e-36, "0.000000" },
+       { 1.234321234321234e-35, "0.000000" },
+       { 1.234321234321234e-34, "0.000000" },
+       { 1.234321234321234e-33, "0.000000" },
+       { 1.234321234321234e-32, "0.000000" },
+       { 1.234321234321234e-31, "0.000000" },
+       { 1.234321234321234e-30, "0.000000" },
+       { 1.234321234321234e-29, "0.000000" },
+       { 1.234321234321234e-28, "0.000000" },
+       { 1.234321234321234e-27, "0.000000" },
+       { 1.234321234321234e-26, "0.000000" },
+       { 1.234321234321234e-25, "0.000000" },
+       { 1.234321234321234e-24, "0.000000" },
+       { 1.234321234321234e-23, "0.000000" },
+       { 1.234321234321234e-22, "0.000000" },
+       { 1.234321234321234e-21, "0.000000" },
+       { 1.234321234321234e-20, "0.000000" },
+       { 1.234321234321234e-19, "0.000000" },
+       { 1.234321234321234e-18, "0.000000" },
+       { 1.234321234321234e-17, "0.000000" },
+       { 1.234321234321234e-16, "0.000000" },
+       { 1.234321234321234e-15, "0.000000" },
+       { 1.234321234321234e-14, "0.000000" },
+       { 1.234321234321234e-13, "0.000000" },
+       { 1.234321234321234e-12, "0.000000" },
+       { 1.234321234321234e-11, "0.000000" },
+       { 1.234321234321234e-10, "0.000000" },
+       { 1.234321234321234e-9, "0.000000" },
+       { 1.234321234321234e-8, "0.000000" },
+       { 1.234321234321234e-7, "0.000000" },
+       { 1.234321234321234e-6, "0.000001" },
+       { 1.234321234321234e-5, "0.000012" },
+       { 1.234321234321234e-4, "0.000123" },
+       { 1.234321234321234e-3, "0.001234" },
+       { 1.234321234321234e-2, "0.012343" },
+       { 1.234321234321234e-1, "0.123432" },
+       { 1.234321234321234, "1.234321" },
+       { 1.234321234321234e1, "12.343212" },
+       { 1.234321234321234e2, "123.432123" },
+       { 1.234321234321234e3, "1234.321234" },
+       { 1.234321234321234e4, "12343.212343" },
+       { 1.234321234321234e5, "123432.123432" },
+       { 1.234321234321234e6, "1234321.234321" },
+       { 1.234321234321234e7, "12343212.343212" },
+       { 1.234321234321234e8, "123432123.432123" },
+       { 1.234321234321234e9, "1234321234.321234" },
+       { 1.234321234321234e10, "12343212343.2123**" },
+       { 1.234321234321234e11, "123432123432.123***" },
+       { 1.234321234321234e12, "1234321234321.23****" },
+       { 1.234321234321234e13, "12343212343212.3*****" },
+       { 1.234321234321234e14, "123432123432123.******" },
+       { 1.234321234321234e15, "1234321234321234.000000" },
+       { 1.234321234321234e16, "123432123432123**.000000" },
+       { 1.234321234321234e17, "123432123432123***.000000" },
+       { 1.234321234321234e18, "123432123432123****.000000" },
+       { 1.234321234321234e19, "123432123432123*****.000000" },
+       { 1.234321234321234e20, "123432123432123******.000000" },
+       { 1.234321234321234e21, "123432123432123*******.000000" },
+       { 1.234321234321234e22, "123432123432123********.000000" },
+       { 1.234321234321234e23, "123432123432123*********.000000" },
+       { 1.234321234321234e24, "123432123432123**********.000000" },
+       { 1.234321234321234e25, "123432123432123***********.000000" },
+       { 1.234321234321234e26, "123432123432123************.000000" },
+       { 1.234321234321234e27, "123432123432123*************.000000" },
+       { 1.234321234321234e28, "123432123432123**************.000000" },
+       { 1.234321234321234e29, "123432123432123***************.000000" },
+       { 1.234321234321234e30, "123432123432123****************.000000" },
+       { 1.234321234321234e31, "123432123432123*****************.000000" },
+       { 1.234321234321234e32, "123432123432123******************.000000" },
+       { 1.234321234321234e33, "123432123432123*******************.000000" },
+       { 1.234321234321234e34, "123432123432123********************.000000" },
+       { 1.234321234321234e35, "123432123432123*********************.000000" },
+       { 1.234321234321234e36, "123432123432123**********************.000000" }
+      };
+    size_t k;
+    for (k = 0; k < SIZEOF (data); k++)
+      {
+       size_t length;
+       char *result =
+         my_asnprintf (NULL, &length, "%f", data[k].value);
+       ASSERT (result != NULL);
+       ASSERT (strmatch (data[k].string, result));
+       ASSERT (length == strlen (result));
+       free (result);
+      }
+  }
+
   { /* A negative number.  */
     size_t length;
     char *result =
@@ -958,6 +1061,97 @@ test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
     free (result);
   }
 
+  { /* Small and large positive numbers.  */
+    static struct { long double value; const char *string; } data[] =
+      {
+       { 1.234321234321234e-37L, "0.000000" },
+       { 1.234321234321234e-36L, "0.000000" },
+       { 1.234321234321234e-35L, "0.000000" },
+       { 1.234321234321234e-34L, "0.000000" },
+       { 1.234321234321234e-33L, "0.000000" },
+       { 1.234321234321234e-32L, "0.000000" },
+       { 1.234321234321234e-31L, "0.000000" },
+       { 1.234321234321234e-30L, "0.000000" },
+       { 1.234321234321234e-29L, "0.000000" },
+       { 1.234321234321234e-28L, "0.000000" },
+       { 1.234321234321234e-27L, "0.000000" },
+       { 1.234321234321234e-26L, "0.000000" },
+       { 1.234321234321234e-25L, "0.000000" },
+       { 1.234321234321234e-24L, "0.000000" },
+       { 1.234321234321234e-23L, "0.000000" },
+       { 1.234321234321234e-22L, "0.000000" },
+       { 1.234321234321234e-21L, "0.000000" },
+       { 1.234321234321234e-20L, "0.000000" },
+       { 1.234321234321234e-19L, "0.000000" },
+       { 1.234321234321234e-18L, "0.000000" },
+       { 1.234321234321234e-17L, "0.000000" },
+       { 1.234321234321234e-16L, "0.000000" },
+       { 1.234321234321234e-15L, "0.000000" },
+       { 1.234321234321234e-14L, "0.000000" },
+       { 1.234321234321234e-13L, "0.000000" },
+       { 1.234321234321234e-12L, "0.000000" },
+       { 1.234321234321234e-11L, "0.000000" },
+       { 1.234321234321234e-10L, "0.000000" },
+       { 1.234321234321234e-9L, "0.000000" },
+       { 1.234321234321234e-8L, "0.000000" },
+       { 1.234321234321234e-7L, "0.000000" },
+       { 1.234321234321234e-6L, "0.000001" },
+       { 1.234321234321234e-5L, "0.000012" },
+       { 1.234321234321234e-4L, "0.000123" },
+       { 1.234321234321234e-3L, "0.001234" },
+       { 1.234321234321234e-2L, "0.012343" },
+       { 1.234321234321234e-1L, "0.123432" },
+       { 1.234321234321234L, "1.234321" },
+       { 1.234321234321234e1L, "12.343212" },
+       { 1.234321234321234e2L, "123.432123" },
+       { 1.234321234321234e3L, "1234.321234" },
+       { 1.234321234321234e4L, "12343.212343" },
+       { 1.234321234321234e5L, "123432.123432" },
+       { 1.234321234321234e6L, "1234321.234321" },
+       { 1.234321234321234e7L, "12343212.343212" },
+       { 1.234321234321234e8L, "123432123.432123" },
+       { 1.234321234321234e9L, "1234321234.321234" },
+       { 1.234321234321234e10L, "12343212343.2123**" },
+       { 1.234321234321234e11L, "123432123432.123***" },
+       { 1.234321234321234e12L, "1234321234321.23****" },
+       { 1.234321234321234e13L, "12343212343212.3*****" },
+       { 1.234321234321234e14L, "123432123432123.******" },
+       { 1.234321234321234e15L, "1234321234321234.000000" },
+       { 1.234321234321234e16L, "123432123432123**.000000" },
+       { 1.234321234321234e17L, "123432123432123***.000000" },
+       { 1.234321234321234e18L, "123432123432123****.000000" },
+       { 1.234321234321234e19L, "123432123432123*****.000000" },
+       { 1.234321234321234e20L, "123432123432123******.000000" },
+       { 1.234321234321234e21L, "123432123432123*******.000000" },
+       { 1.234321234321234e22L, "123432123432123********.000000" },
+       { 1.234321234321234e23L, "123432123432123*********.000000" },
+       { 1.234321234321234e24L, "123432123432123**********.000000" },
+       { 1.234321234321234e25L, "123432123432123***********.000000" },
+       { 1.234321234321234e26L, "123432123432123************.000000" },
+       { 1.234321234321234e27L, "123432123432123*************.000000" },
+       { 1.234321234321234e28L, "123432123432123**************.000000" },
+       { 1.234321234321234e29L, "123432123432123***************.000000" },
+       { 1.234321234321234e30L, "123432123432123****************.000000" },
+       { 1.234321234321234e31L, "123432123432123*****************.000000" },
+       { 1.234321234321234e32L, "123432123432123******************.000000" },
+       { 1.234321234321234e33L, "123432123432123*******************.000000" },
+       { 1.234321234321234e34L, "123432123432123********************.000000" },
+       { 1.234321234321234e35L, "123432123432123*********************.000000" },
+       { 1.234321234321234e36L, "123432123432123**********************.000000" }
+      };
+    size_t k;
+    for (k = 0; k < SIZEOF (data); k++)
+      {
+       size_t length;
+       char *result =
+         my_asnprintf (NULL, &length, "%Lf", data[k].value);
+       ASSERT (result != NULL);
+       ASSERT (strmatch (data[k].string, result));
+       ASSERT (length == strlen (result));
+       free (result);
+      }
+  }
+
   { /* A negative number.  */
     size_t length;
     char *result =
index ca9dbabca2dedff8239ce98d065985bd9163b815..a57b197deadbd27058dd0cb0a350e8cf28dae577 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
 #define ASSERT(expr) \
   do                                                                        \
     {                                                                       \
@@ -53,6 +54,17 @@ NaN ()
 # define NaN() (0.0 / 0.0)
 #endif
 
+static int
+strmatch (const char *pattern, const char *string)
+{
+  if (strlen (pattern) != strlen (string))
+    return 0;
+  for (; *pattern != '\0'; pattern++, string++)
+    if (*pattern != '*' && *string != *pattern)
+      return 0;
+  return 1;
+}
+
 static void
 test_function (int (*my_asprintf) (char **, const char *, ...))
 {
@@ -756,6 +768,97 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
     free (result);
   }
 
+  { /* Small and large positive numbers.  */
+    static struct { double value; const char *string; } data[] =
+      {
+       { 1.234321234321234e-37, "0.000000" },
+       { 1.234321234321234e-36, "0.000000" },
+       { 1.234321234321234e-35, "0.000000" },
+       { 1.234321234321234e-34, "0.000000" },
+       { 1.234321234321234e-33, "0.000000" },
+       { 1.234321234321234e-32, "0.000000" },
+       { 1.234321234321234e-31, "0.000000" },
+       { 1.234321234321234e-30, "0.000000" },
+       { 1.234321234321234e-29, "0.000000" },
+       { 1.234321234321234e-28, "0.000000" },
+       { 1.234321234321234e-27, "0.000000" },
+       { 1.234321234321234e-26, "0.000000" },
+       { 1.234321234321234e-25, "0.000000" },
+       { 1.234321234321234e-24, "0.000000" },
+       { 1.234321234321234e-23, "0.000000" },
+       { 1.234321234321234e-22, "0.000000" },
+       { 1.234321234321234e-21, "0.000000" },
+       { 1.234321234321234e-20, "0.000000" },
+       { 1.234321234321234e-19, "0.000000" },
+       { 1.234321234321234e-18, "0.000000" },
+       { 1.234321234321234e-17, "0.000000" },
+       { 1.234321234321234e-16, "0.000000" },
+       { 1.234321234321234e-15, "0.000000" },
+       { 1.234321234321234e-14, "0.000000" },
+       { 1.234321234321234e-13, "0.000000" },
+       { 1.234321234321234e-12, "0.000000" },
+       { 1.234321234321234e-11, "0.000000" },
+       { 1.234321234321234e-10, "0.000000" },
+       { 1.234321234321234e-9, "0.000000" },
+       { 1.234321234321234e-8, "0.000000" },
+       { 1.234321234321234e-7, "0.000000" },
+       { 1.234321234321234e-6, "0.000001" },
+       { 1.234321234321234e-5, "0.000012" },
+       { 1.234321234321234e-4, "0.000123" },
+       { 1.234321234321234e-3, "0.001234" },
+       { 1.234321234321234e-2, "0.012343" },
+       { 1.234321234321234e-1, "0.123432" },
+       { 1.234321234321234, "1.234321" },
+       { 1.234321234321234e1, "12.343212" },
+       { 1.234321234321234e2, "123.432123" },
+       { 1.234321234321234e3, "1234.321234" },
+       { 1.234321234321234e4, "12343.212343" },
+       { 1.234321234321234e5, "123432.123432" },
+       { 1.234321234321234e6, "1234321.234321" },
+       { 1.234321234321234e7, "12343212.343212" },
+       { 1.234321234321234e8, "123432123.432123" },
+       { 1.234321234321234e9, "1234321234.321234" },
+       { 1.234321234321234e10, "12343212343.2123**" },
+       { 1.234321234321234e11, "123432123432.123***" },
+       { 1.234321234321234e12, "1234321234321.23****" },
+       { 1.234321234321234e13, "12343212343212.3*****" },
+       { 1.234321234321234e14, "123432123432123.******" },
+       { 1.234321234321234e15, "1234321234321234.000000" },
+       { 1.234321234321234e16, "123432123432123**.000000" },
+       { 1.234321234321234e17, "123432123432123***.000000" },
+       { 1.234321234321234e18, "123432123432123****.000000" },
+       { 1.234321234321234e19, "123432123432123*****.000000" },
+       { 1.234321234321234e20, "123432123432123******.000000" },
+       { 1.234321234321234e21, "123432123432123*******.000000" },
+       { 1.234321234321234e22, "123432123432123********.000000" },
+       { 1.234321234321234e23, "123432123432123*********.000000" },
+       { 1.234321234321234e24, "123432123432123**********.000000" },
+       { 1.234321234321234e25, "123432123432123***********.000000" },
+       { 1.234321234321234e26, "123432123432123************.000000" },
+       { 1.234321234321234e27, "123432123432123*************.000000" },
+       { 1.234321234321234e28, "123432123432123**************.000000" },
+       { 1.234321234321234e29, "123432123432123***************.000000" },
+       { 1.234321234321234e30, "123432123432123****************.000000" },
+       { 1.234321234321234e31, "123432123432123*****************.000000" },
+       { 1.234321234321234e32, "123432123432123******************.000000" },
+       { 1.234321234321234e33, "123432123432123*******************.000000" },
+       { 1.234321234321234e34, "123432123432123********************.000000" },
+       { 1.234321234321234e35, "123432123432123*********************.000000" },
+       { 1.234321234321234e36, "123432123432123**********************.000000" }
+      };
+    size_t k;
+    for (k = 0; k < SIZEOF (data); k++)
+      {
+       char *result;
+       int retval =
+         my_asprintf (&result, "%f", data[k].value);
+       ASSERT (result != NULL);
+       ASSERT (strmatch (data[k].string, result));
+       ASSERT (retval == strlen (result));
+       free (result);
+      }
+  }
+
   { /* A negative number.  */
     char *result;
     int retval =
@@ -939,6 +1042,97 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
     free (result);
   }
 
+  { /* Small and large positive numbers.  */
+    static struct { long double value; const char *string; } data[] =
+      {
+       { 1.234321234321234e-37L, "0.000000" },
+       { 1.234321234321234e-36L, "0.000000" },
+       { 1.234321234321234e-35L, "0.000000" },
+       { 1.234321234321234e-34L, "0.000000" },
+       { 1.234321234321234e-33L, "0.000000" },
+       { 1.234321234321234e-32L, "0.000000" },
+       { 1.234321234321234e-31L, "0.000000" },
+       { 1.234321234321234e-30L, "0.000000" },
+       { 1.234321234321234e-29L, "0.000000" },
+       { 1.234321234321234e-28L, "0.000000" },
+       { 1.234321234321234e-27L, "0.000000" },
+       { 1.234321234321234e-26L, "0.000000" },
+       { 1.234321234321234e-25L, "0.000000" },
+       { 1.234321234321234e-24L, "0.000000" },
+       { 1.234321234321234e-23L, "0.000000" },
+       { 1.234321234321234e-22L, "0.000000" },
+       { 1.234321234321234e-21L, "0.000000" },
+       { 1.234321234321234e-20L, "0.000000" },
+       { 1.234321234321234e-19L, "0.000000" },
+       { 1.234321234321234e-18L, "0.000000" },
+       { 1.234321234321234e-17L, "0.000000" },
+       { 1.234321234321234e-16L, "0.000000" },
+       { 1.234321234321234e-15L, "0.000000" },
+       { 1.234321234321234e-14L, "0.000000" },
+       { 1.234321234321234e-13L, "0.000000" },
+       { 1.234321234321234e-12L, "0.000000" },
+       { 1.234321234321234e-11L, "0.000000" },
+       { 1.234321234321234e-10L, "0.000000" },
+       { 1.234321234321234e-9L, "0.000000" },
+       { 1.234321234321234e-8L, "0.000000" },
+       { 1.234321234321234e-7L, "0.000000" },
+       { 1.234321234321234e-6L, "0.000001" },
+       { 1.234321234321234e-5L, "0.000012" },
+       { 1.234321234321234e-4L, "0.000123" },
+       { 1.234321234321234e-3L, "0.001234" },
+       { 1.234321234321234e-2L, "0.012343" },
+       { 1.234321234321234e-1L, "0.123432" },
+       { 1.234321234321234L, "1.234321" },
+       { 1.234321234321234e1L, "12.343212" },
+       { 1.234321234321234e2L, "123.432123" },
+       { 1.234321234321234e3L, "1234.321234" },
+       { 1.234321234321234e4L, "12343.212343" },
+       { 1.234321234321234e5L, "123432.123432" },
+       { 1.234321234321234e6L, "1234321.234321" },
+       { 1.234321234321234e7L, "12343212.343212" },
+       { 1.234321234321234e8L, "123432123.432123" },
+       { 1.234321234321234e9L, "1234321234.321234" },
+       { 1.234321234321234e10L, "12343212343.2123**" },
+       { 1.234321234321234e11L, "123432123432.123***" },
+       { 1.234321234321234e12L, "1234321234321.23****" },
+       { 1.234321234321234e13L, "12343212343212.3*****" },
+       { 1.234321234321234e14L, "123432123432123.******" },
+       { 1.234321234321234e15L, "1234321234321234.000000" },
+       { 1.234321234321234e16L, "123432123432123**.000000" },
+       { 1.234321234321234e17L, "123432123432123***.000000" },
+       { 1.234321234321234e18L, "123432123432123****.000000" },
+       { 1.234321234321234e19L, "123432123432123*****.000000" },
+       { 1.234321234321234e20L, "123432123432123******.000000" },
+       { 1.234321234321234e21L, "123432123432123*******.000000" },
+       { 1.234321234321234e22L, "123432123432123********.000000" },
+       { 1.234321234321234e23L, "123432123432123*********.000000" },
+       { 1.234321234321234e24L, "123432123432123**********.000000" },
+       { 1.234321234321234e25L, "123432123432123***********.000000" },
+       { 1.234321234321234e26L, "123432123432123************.000000" },
+       { 1.234321234321234e27L, "123432123432123*************.000000" },
+       { 1.234321234321234e28L, "123432123432123**************.000000" },
+       { 1.234321234321234e29L, "123432123432123***************.000000" },
+       { 1.234321234321234e30L, "123432123432123****************.000000" },
+       { 1.234321234321234e31L, "123432123432123*****************.000000" },
+       { 1.234321234321234e32L, "123432123432123******************.000000" },
+       { 1.234321234321234e33L, "123432123432123*******************.000000" },
+       { 1.234321234321234e34L, "123432123432123********************.000000" },
+       { 1.234321234321234e35L, "123432123432123*********************.000000" },
+       { 1.234321234321234e36L, "123432123432123**********************.000000" }
+      };
+    size_t k;
+    for (k = 0; k < SIZEOF (data); k++)
+      {
+       char *result;
+       int retval =
+         my_asprintf (&result, "%Lf", data[k].value);
+       ASSERT (result != NULL);
+       ASSERT (strmatch (data[k].string, result));
+       ASSERT (retval == strlen (result));
+       free (result);
+      }
+  }
+
   { /* A negative number.  */
     char *result;
     int retval =
index 097872f939292dca24a8be437ca3bb13dbd9158b..6e7f5d326ab7b6116594749acab66df3fd6e27c1 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
 #define ASSERT(expr) \
   do                                                                        \
     {                                                                       \
index 20cc4b2a0f9df1b26ae8017f95d2b6c57673916b..ecbd256e9e35d0f93a43fe8da044b3cf0dc80962 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
 #define ASSERT(expr) \
   do                                                                        \
     {                                                                       \