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
29enum {WARN, WARNX, VWARN, VWARNX};
30
31static void
32do_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: &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: &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 (ptr: stream.buffer);
80}
81
82static void
83do_test_call_varg (const char *format, ...)
84{
85 va_list args;
86
87 va_start (args, format);
88 do_one_test (select: VWARN, format, args, arg1: 0, arg2: 0, arg3: 0, arg4: 0,
89 expected: "-1.000000 - -2.000000 - -3.000000 - -4.000000: Success\n");
90 va_end (args);
91
92 va_start (args, format);
93 do_one_test (select: VWARNX, format, args, arg1: 0, arg2: 0, arg3: 0, arg4: 0,
94 expected: "-1.000000 - -2.000000 - -3.000000 - -4.000000\n");
95 va_end (args);
96}
97
98static void
99do_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 (select: WARN, format, args, arg1, arg2, arg3, arg4,
105 expected: "-1.000000 - -2.000000 - -3.000000 - -4.000000: Success\n");
106 do_one_test (select: WARNX, format, args, arg1, arg2, arg3, arg4,
107 expected: "-1.000000 - -2.000000 - -3.000000 - -4.000000\n");
108}
109
110static int
111do_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 (format: "%Lf - %f - %Lf - %f", arg1, arg2, arg3, arg4);
119 do_test_call_varg (format: "%Lf - %f - %Lf - %f", arg1, arg2, arg3, arg4);
120
121 return 0;
122}
123
124#include <support/test-driver.c>
125

source code of glibc/misc/tst-ldbl-warn.c