(root)/
gettext-0.22.4/
gettext-tools/
gnulib-tests/
test-vasnprintf.c
       1  /* Test of vasnprintf() and asnprintf() functions.
       2     Copyright (C) 2007-2023 Free Software Foundation, Inc.
       3  
       4     This program is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation, either version 3 of the License, or
       7     (at your option) any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
      18  
      19  #include <config.h>
      20  
      21  #include "vasnprintf.h"
      22  
      23  #include <stdarg.h>
      24  #include <stdlib.h>
      25  #include <string.h>
      26  
      27  #include "macros.h"
      28  
      29  static void
      30  test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
      31  {
      32    char buf[8];
      33    int size;
      34  
      35    for (size = 0; size <= 8; size++)
      36      {
      37        size_t length = size;
      38        char *result = my_asnprintf (NULL, &length, "%d", 12345);
      39        ASSERT (result != NULL);
      40        ASSERT (strcmp (result, "12345") == 0);
      41        ASSERT (length == 5);
      42        free (result);
      43      }
      44  
      45    for (size = 0; size <= 8; size++)
      46      {
      47        size_t length;
      48        char *result;
      49  
      50        memcpy (buf, "DEADBEEF", 8);
      51        length = size;
      52        result = my_asnprintf (buf, &length, "%d", 12345);
      53        ASSERT (result != NULL);
      54        ASSERT (strcmp (result, "12345") == 0);
      55        ASSERT (length == 5);
      56        if (size < 5 + 1)
      57          ASSERT (result != buf);
      58        ASSERT (memcmp (buf + size, &"DEADBEEF"[size], 8 - size) == 0);
      59        if (result != buf)
      60          free (result);
      61      }
      62  
      63    /* Note: This test assumes IEEE 754 representation of 'double' floats.  */
      64    for (size = 0; size <= 8; size++)
      65      {
      66        size_t length;
      67        char *result;
      68  
      69        memcpy (buf, "DEADBEEF", 8);
      70        length = size;
      71        result = my_asnprintf (buf, &length, "%2.0f", 1.6314159265358979e+125);
      72        ASSERT (result != NULL);
      73        /* The exact result and the result on glibc systems is
      74           163141592653589790215729350939528493057529598899734151772468186268423257777068536614838678161083520756952076273094236944990208
      75           On Cygwin, the result is
      76           163141592653589790215729350939528493057529600000000000000000000000000000000000000000000000000000000000000000000000000000000000
      77           On HP-UX 11.31 / hppa and IRIX 6.5, the result is
      78           163141592653589790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
      79         */
      80        ASSERT (strlen (result) == 126);
      81        ASSERT (memcmp (result, "163141592653589790", 18) == 0);
      82        ASSERT (length == 126);
      83        if (size < 126 + 1)
      84          ASSERT (result != buf);
      85        ASSERT (memcmp (buf + size, &"DEADBEEF"[size], 8 - size) == 0);
      86        if (result != buf)
      87          free (result);
      88      }
      89  }
      90  
      91  static char *
      92  my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
      93  {
      94    va_list args;
      95    char *ret;
      96  
      97    va_start (args, format);
      98    ret = vasnprintf (resultbuf, lengthp, format, args);
      99    va_end (args);
     100    return ret;
     101  }
     102  
     103  static void
     104  test_vasnprintf ()
     105  {
     106    test_function (my_asnprintf);
     107  }
     108  
     109  static void
     110  test_asnprintf ()
     111  {
     112    test_function (asnprintf);
     113  }
     114  
     115  int
     116  main ()
     117  {
     118    test_vasnprintf ();
     119    test_asnprintf ();
     120    return 0;
     121  }