1 /* Test for the long double conversions in *warn* functions.
2 Copyright (C) 2018-2022 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
do_one_test(int select,const char * format,va_list args,long double arg1,double arg2,long double arg3,double arg4,const char * expected)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
do_test_call_varg(const char * format,...)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
do_test_call_rarg(const char * format,long double arg1,double arg2,long double arg3,double arg4)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
do_test(void)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>
125