vasnprintf-posix: handle large precision via %.*d
authorEric Blake <ebb9@byu.net>
Tue, 2 Sep 2008 03:28:44 +0000 (21:28 -0600)
committerEric Blake <ebb9@byu.net>
Tue, 2 Sep 2008 12:14:08 +0000 (06:14 -0600)
* lib/vasnprintf.c (VASNPRINTF): Don't pass precision to snprintf
when handling it ourselves.
* tests/test-vasnprintf-posix.c (test_function): Add test.
* tests/test-snprintf-posix.h (test_function): Likewise.
* tests/test-sprintf-posix.h (test_function): Likewise.
* tests/test-vasprintf-posix.c (test_function): Likewise.
Reported by Alain Guibert.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
lib/vasnprintf.c
tests/test-snprintf-posix.h
tests/test-sprintf-posix.h
tests/test-vasnprintf-posix.c
tests/test-vasprintf-posix.c

index 0277d1c5f63ed59077319ed95010c4de59359362..23443eeee5cdec15157ced50bb0951a1350d05fe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-09-02  Eric Blake  <ebb9@byu.net>
+
+       vasnprintf-posix: handle large precision via %.*d
+       * lib/vasnprintf.c (VASNPRINTF): Don't pass precision to snprintf
+       when handling it ourselves.
+       * tests/test-vasnprintf-posix.c (test_function): Add test.
+       * tests/test-snprintf-posix.h (test_function): Likewise.
+       * tests/test-sprintf-posix.h (test_function): Likewise.
+       * tests/test-vasprintf-posix.c (test_function): Likewise.
+       Reported by Alain Guibert.
+
 2008-09-01  Eric Blake  <ebb9@byu.net>
 
        c-stack: make configure-time check more robust
 2008-09-01  Eric Blake  <ebb9@byu.net>
 
        c-stack: make configure-time check more robust
index 89829c9a4a7dc9c228b67614bcc905b4f5a3ff31..4ddf45fa09ac00b0ae360402aecf0f4f852debad 100644 (file)
@@ -4176,7 +4176,7 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
                      abort ();
                    prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
                  }
                      abort ();
                    prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
                  }
-               if (dp->precision_arg_index != ARG_NONE)
+               if (!prec_ourselves && dp->precision_arg_index != ARG_NONE)
                  {
                    if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
                      abort ();
                  {
                    if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
                      abort ();
index 1134d80b5862dcb58aadfd42841287a32aefe77d..43329300b8976da270b17ca8035f7bcdf45ebc3f 100644 (file)
@@ -2947,6 +2947,18 @@ test_function (int (*my_snprintf) (char *, size_t, const char *, ...))
     ASSERT (retval == strlen (result));
   }
 
     ASSERT (retval == strlen (result));
   }
 
+  {
+    char result[5000];
+    int retval =
+      my_snprintf (result, sizeof (result), "%.*d %d", 4000, 1234567, 99);
+    size_t i;
+    ASSERT (result != NULL);
+    for (i = 0; i < 4000 - 7; i++)
+      ASSERT (result[i] == '0');
+    ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+    ASSERT (retval == strlen (result));
+  }
+
   {
     char result[5000];
     int retval =
   {
     char result[5000];
     int retval =
index 5beadca664a33ec57474a29f9ba4aa9ebae097d2..7767c89bcf559921e65e117d7b5c38d38bc02ec7 100644 (file)
@@ -2921,6 +2921,18 @@ test_function (int (*my_sprintf) (char *, const char *, ...))
     ASSERT (retval == strlen (result));
   }
 
     ASSERT (retval == strlen (result));
   }
 
+  {
+    char result[5000];
+    int retval =
+      my_sprintf (result, "%.*d %d", 4000, 1234567, 99);
+    size_t i;
+    ASSERT (result != NULL);
+    for (i = 0; i < 4000 - 7; i++)
+      ASSERT (result[i] == '0');
+    ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+    ASSERT (retval == strlen (result));
+  }
+
   {
     char result[5000];
     int retval =
   {
     char result[5000];
     int retval =
index 42d9267cdaa72036aa24336db55b51075ce5fd3a..4c9d47e236b53b9f83bcc7bca8630ae40e36c24b 100644 (file)
@@ -3454,6 +3454,19 @@ test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
     free (result);
   }
 
     free (result);
   }
 
+  {
+    size_t length;
+    char *result =
+      my_asnprintf (NULL, &length, "%.*d %d", 4000, 1234567, 99);
+    size_t i;
+    ASSERT (result != NULL);
+    for (i = 0; i < 4000 - 7; i++)
+      ASSERT (result[i] == '0');
+    ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+    ASSERT (length == strlen (result));
+    free (result);
+  }
+
   {
     size_t length;
     char *result =
   {
     size_t length;
     char *result =
index e75e15d386874f2a21e5b8c183fb5932c15bfebb..135d955df5c6f5582d606ca13734ddc8736436fd 100644 (file)
@@ -3435,6 +3435,19 @@ test_function (int (*my_asprintf) (char **, const char *, ...))
     free (result);
   }
 
     free (result);
   }
 
+  {
+    char *result;
+    int retval =
+      my_asprintf (&result, "%.*d %d", 4000, 1234567, 99);
+    size_t i;
+    ASSERT (result != NULL);
+    for (i = 0; i < 4000 - 7; i++)
+      ASSERT (result[i] == '0');
+    ASSERT (strcmp (result + 4000 - 7, "1234567 99") == 0);
+    ASSERT (retval == strlen (result));
+    free (result);
+  }
+
   {
     char *result;
     int retval =
   {
     char *result;
     int retval =