(root)/
glibc-2.38/
misc/
tst-ldbl-warn.c
       1  /* Test for the long double conversions in *warn* functions.
       2     Copyright (C) 2018-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <err.h>
      20  #include <errno.h>
      21  #include <stdarg.h>
      22  #include <stdio.h>
      23  #include <stdlib.h>
      24  #include <string.h>
      25  
      26  #include <support/check.h>
      27  #include <support/xmemstream.h>
      28  
      29  enum {WARN, WARNX, VWARN, VWARNX};
      30  
      31  static void
      32  do_one_test (int select, const char *format, va_list args,
      33  	     long double arg1, double arg2, long double arg3,
      34  	     double arg4, const char *expected)
      35  {
      36    /* Prepare in-memory buffer to hold the output.  */
      37    struct xmemstream stream;
      38    xopen_memstream (&stream);
      39    FILE *old_stderr = stderr;
      40    stderr = stream.out;
      41  
      42    /* Write to the buffer using one of the *warn* functions.  */
      43    errno = 0;
      44    switch (select)
      45      {
      46        case WARN:
      47  	warn (format, arg1, arg2, arg3, arg4);
      48  	break;
      49        case WARNX:
      50  	warnx (format, arg1, arg2, arg3, arg4);
      51  	break;
      52        case VWARN:
      53  	vwarn (format, args);
      54  	break;
      55        case VWARNX:
      56  	vwarnx (format, args);
      57  	break;
      58      }
      59  
      60    stderr = old_stderr;
      61  
      62    /* Close the in-memory stream.  */
      63    xfclose_memstream (&stream);
      64  
      65    /* Filter out the name of the program (which should always end with
      66       warn), so that the test case can be reused by ldbl-opt and
      67       ldbl-128ibm-compat.  */
      68    const char *needle = "warn: ";
      69    char *message;
      70    message = strstr (stream.buffer, needle);
      71    if (message == NULL)
      72      FAIL_EXIT1 ("test case error");
      73    message += strlen (needle);
      74  
      75    /* Check that the rest of the output is as expected.  */
      76    TEST_COMPARE_STRING (message, expected);
      77  
      78    if (stream.buffer != NULL)
      79      free (stream.buffer);
      80  }
      81  
      82  static void
      83  do_test_call_varg (const char *format, ...)
      84  {
      85    va_list args;
      86  
      87    va_start (args, format);
      88    do_one_test (VWARN, format, args, 0, 0, 0, 0,
      89  	       "-1.000000 - -2.000000 - -3.000000 - -4.000000: Success\n");
      90    va_end (args);
      91  
      92    va_start (args, format);
      93    do_one_test (VWARNX, format, args, 0, 0, 0, 0,
      94  	       "-1.000000 - -2.000000 - -3.000000 - -4.000000\n");
      95    va_end (args);
      96  }
      97  
      98  static void
      99  do_test_call_rarg (const char *format, long double arg1, double arg2,
     100  		   long double arg3, double arg4)
     101  {
     102    va_list args;
     103    memset (&args, 0, sizeof (args));
     104    do_one_test (WARN, format, args, arg1, arg2, arg3, arg4,
     105  	       "-1.000000 - -2.000000 - -3.000000 - -4.000000: Success\n");
     106    do_one_test (WARNX, format, args, arg1, arg2, arg3, arg4,
     107  	       "-1.000000 - -2.000000 - -3.000000 - -4.000000\n");
     108  }
     109  
     110  static int
     111  do_test (void)
     112  {
     113    long double arg1 = -1;
     114    long double arg3 = -3;
     115    double arg2 = -2;
     116    double arg4 = -4;
     117  
     118    do_test_call_rarg ("%Lf - %f - %Lf - %f", arg1, arg2, arg3, arg4);
     119    do_test_call_varg ("%Lf - %f - %Lf - %f", arg1, arg2, arg3, arg4);
     120  
     121    return 0;
     122  }
     123  
     124  #include <support/test-driver.c>