1 /* Test for the long double variants of *scanf functions.
2 Copyright (C) 2019-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 <stdarg.h>
20 #include <stdint.h>
21 #include <stdio.h>
22 #include <string.h>
23 #include <wchar.h>
24
25 #include <support/check.h>
26
27 #define CLEAR_VARGS \
28 va_start (args, format); \
29 ldptr = va_arg (args, long double *); \
30 fptr = va_arg (args, float *); \
31 *ldptr = 0; \
32 *fptr = 0; \
33 va_end (args);
34
35 #define CHECK_VARGS \
36 va_start (args, format); \
37 ldptr = va_arg (args, long double *); \
38 fptr = va_arg (args, float *); \
39 va_end (args); \
40 if (*ldptr == -1 && *fptr == -2) \
41 printf ("OK"); \
42 else \
43 printf ("ERROR (%Lf %f)", *ldptr, *fptr); \
44 printf ("\n");
45
46 #define CLEAR_VALUE \
47 ld = 0; \
48 f = 0;
49
50 #define CHECK_VALUE \
51 if (ld == -1 && f == -2) \
52 printf ("OK"); \
53 else \
54 printf ("ERROR (%Lf %f)", ld, f); \
55 printf ("\n");
56
57 static void
do_test_call(FILE * stream,CHAR * string,const CHAR * format,...)58 do_test_call (FILE *stream, CHAR *string, const CHAR *format, ...)
59 {
60 float f;
61 long double ld;
62 float *fptr;
63 long double *ldptr;
64 va_list args;
65
66 CLEAR_VALUE
67 printf ("fscanf: ");
68 FSCANF (stream, format, &ld, &f);
69 CHECK_VALUE
70
71 CLEAR_VALUE
72 printf ("scanf: ");
73 SCANF (format, &ld, &f);
74 CHECK_VALUE
75
76 CLEAR_VALUE
77 printf ("sscanf: ");
78 SSCANF (string, format, &ld, &f);
79 CHECK_VALUE
80
81 CLEAR_VARGS
82 printf ("vfscanf: ");
83 va_start (args, format);
84 VFSCANF (stream, format, args);
85 va_end (args);
86 CHECK_VARGS
87
88 CLEAR_VARGS
89 printf ("vscanf: ");
90 va_start (args, format);
91 VSCANF (format, args);
92 va_end (args);
93 CHECK_VARGS
94
95 CLEAR_VARGS
96 printf ("vsscanf: ");
97 va_start (args, format);
98 VSSCANF (string, format, args);
99 va_end (args);
100 CHECK_VARGS
101 }
102
103 static int
do_test(void)104 do_test (void)
105 {
106 CHAR string[256];
107 float f;
108 long double ld;
109
110 /* Scan in decimal notation. */
111 STRCPY (string,
112 L ("-1.0 -2.0\n")
113 L ("-1.0 -2.0\n") );
114 do_test_call (stdin, string, L("%Lf %f"), &ld, &f);
115
116 /* Scan in hexadecimal notation. */
117 STRCPY (string,
118 L ("-0x1.0p+0 -0x2.0p+0\n")
119 L ("-0x1.0p+0 -0x2.0p+0\n") );
120 /* For ISO C99, scan the single-precision value with "%as" to test
121 that __isoc99_*scanf ignores the 's'. For DEPRECATED_SCANF, do not
122 use "%as", because that would try to scan a string and allocate
123 space for it. */
124 #if __GLIBC_USE (DEPRECATED_SCANF)
125 # define FMT "%La %a"
126 #else
127 # define FMT "%La %as"
128 #endif
129 do_test_call (stdin, string, L(FMT), &ld, &f);
130
131 return 0;
132 }
133
134 #include <support/test-driver.c>
135