xref: /freebsd/contrib/netbsd-tests/lib/libc/locale/t_wcstod.c (revision 57718be8fa0bd5edc11ab9a72e68cc71982939a6)
1*57718be8SEnji Cooper /* $NetBSD: t_wcstod.c,v 1.3 2011/10/01 17:56:11 christos Exp $ */
2*57718be8SEnji Cooper 
3*57718be8SEnji Cooper /*-
4*57718be8SEnji Cooper  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5*57718be8SEnji Cooper  * All rights reserved.
6*57718be8SEnji Cooper  *
7*57718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
8*57718be8SEnji Cooper  * modification, are permitted provided that the following conditions
9*57718be8SEnji Cooper  * are met:
10*57718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
11*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
12*57718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
13*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
14*57718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
15*57718be8SEnji Cooper  *
16*57718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17*57718be8SEnji Cooper  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18*57718be8SEnji Cooper  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19*57718be8SEnji Cooper  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20*57718be8SEnji Cooper  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*57718be8SEnji Cooper  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*57718be8SEnji Cooper  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*57718be8SEnji Cooper  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*57718be8SEnji Cooper  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*57718be8SEnji Cooper  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*57718be8SEnji Cooper  * POSSIBILITY OF SUCH DAMAGE.
27*57718be8SEnji Cooper  */
28*57718be8SEnji Cooper 
29*57718be8SEnji Cooper /*-
30*57718be8SEnji Cooper  * Copyright (c)2005 Citrus Project,
31*57718be8SEnji Cooper  * All rights reserved.
32*57718be8SEnji Cooper  *
33*57718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
34*57718be8SEnji Cooper  * modification, are permitted provided that the following conditions
35*57718be8SEnji Cooper  * are met:
36*57718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
37*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
38*57718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
39*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
40*57718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
41*57718be8SEnji Cooper  *
42*57718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
43*57718be8SEnji Cooper  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44*57718be8SEnji Cooper  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45*57718be8SEnji Cooper  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
46*57718be8SEnji Cooper  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47*57718be8SEnji Cooper  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48*57718be8SEnji Cooper  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49*57718be8SEnji Cooper  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50*57718be8SEnji Cooper  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51*57718be8SEnji Cooper  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52*57718be8SEnji Cooper  * SUCH DAMAGE.
53*57718be8SEnji Cooper  *
54*57718be8SEnji Cooper  */
55*57718be8SEnji Cooper 
56*57718be8SEnji Cooper #include <sys/cdefs.h>
57*57718be8SEnji Cooper __COPYRIGHT("@(#) Copyright (c) 2011\
58*57718be8SEnji Cooper  The NetBSD Foundation, inc. All rights reserved.");
59*57718be8SEnji Cooper __RCSID("$NetBSD: t_wcstod.c,v 1.3 2011/10/01 17:56:11 christos Exp $");
60*57718be8SEnji Cooper 
61*57718be8SEnji Cooper #include <errno.h>
62*57718be8SEnji Cooper #include <math.h>
63*57718be8SEnji Cooper #include <stdlib.h>
64*57718be8SEnji Cooper #include <string.h>
65*57718be8SEnji Cooper #include <wchar.h>
66*57718be8SEnji Cooper 
67*57718be8SEnji Cooper #include <atf-c.h>
68*57718be8SEnji Cooper 
69*57718be8SEnji Cooper #define	ALT_HUGE_VAL		-1
70*57718be8SEnji Cooper #define	ALT_MINUS_HUGE_VAL	-2
71*57718be8SEnji Cooper #define	ALT_NAN			-3
72*57718be8SEnji Cooper 
73*57718be8SEnji Cooper #if !defined(__vax__)
74*57718be8SEnji Cooper static struct test {
75*57718be8SEnji Cooper 	const wchar_t *wcs;
76*57718be8SEnji Cooper 	size_t len;
77*57718be8SEnji Cooper 	double val;
78*57718be8SEnji Cooper 	int err;
79*57718be8SEnji Cooper } tests[] = {
80*57718be8SEnji Cooper { L"IN",		0,	0,			0 },
81*57718be8SEnji Cooper { L"+IN",		0,	0,			0 },
82*57718be8SEnji Cooper { L"-IN",		0,	0,			0 },
83*57718be8SEnji Cooper { L"INX",		0,	0,			0 },
84*57718be8SEnji Cooper { L"+INX",		0,	0,			0 },
85*57718be8SEnji Cooper { L"-INX",		0,	0,			0 },
86*57718be8SEnji Cooper { L"INF",		3,	ALT_HUGE_VAL,		0 },
87*57718be8SEnji Cooper { L"+INF",		4,	ALT_HUGE_VAL,		0 },
88*57718be8SEnji Cooper { L"-INF",		4,	ALT_MINUS_HUGE_VAL,	0 },
89*57718be8SEnji Cooper { L"INFX",		3,	ALT_HUGE_VAL,		0 },
90*57718be8SEnji Cooper { L"+INFX",		4,	ALT_HUGE_VAL,		0 },
91*57718be8SEnji Cooper { L"-INFX",		4,	ALT_MINUS_HUGE_VAL,	0 },
92*57718be8SEnji Cooper { L"     IN",		0,	0,			0 },
93*57718be8SEnji Cooper { L"     +IN",		0,	0,			0 },
94*57718be8SEnji Cooper { L"     -IN",		0,	0,			0 },
95*57718be8SEnji Cooper { L"     INX",		0,	0,			0 },
96*57718be8SEnji Cooper { L"     +INX",		0,	0,			0 },
97*57718be8SEnji Cooper { L"     -INX",		0,	0,			0 },
98*57718be8SEnji Cooper { L"+     INF",		0,	0,			0 },
99*57718be8SEnji Cooper { L"-     INF",		0,	0,			0 },
100*57718be8SEnji Cooper { L"     INF",		8,	ALT_HUGE_VAL,		0 },
101*57718be8SEnji Cooper { L"     +INF",		9,	ALT_HUGE_VAL,		0 },
102*57718be8SEnji Cooper { L"     -INF",		9,	ALT_MINUS_HUGE_VAL,	0 },
103*57718be8SEnji Cooper { L"     INFX",		8,	ALT_HUGE_VAL,		0 },
104*57718be8SEnji Cooper { L"     +INFX",	9,	ALT_HUGE_VAL,		0 },
105*57718be8SEnji Cooper { L"     -INFX",	9,	ALT_MINUS_HUGE_VAL,	0 },
106*57718be8SEnji Cooper { L"     INFINIT",	8,	ALT_HUGE_VAL,		0 },
107*57718be8SEnji Cooper { L"     +INFINIT",	9,	ALT_HUGE_VAL,		0 },
108*57718be8SEnji Cooper { L"     -INFINIT",	9,	ALT_MINUS_HUGE_VAL,	0 },
109*57718be8SEnji Cooper { L"     INFINITY",	13,	ALT_HUGE_VAL,		0 },
110*57718be8SEnji Cooper { L"     +INFINITY",	14,	ALT_HUGE_VAL,		0 },
111*57718be8SEnji Cooper { L"     -INFINITY",	14,	ALT_MINUS_HUGE_VAL,	0 },
112*57718be8SEnji Cooper { L"     INFINITYX",	13,	ALT_HUGE_VAL,		0 },
113*57718be8SEnji Cooper { L"     +INFINITYX",	14,	ALT_HUGE_VAL,		0 },
114*57718be8SEnji Cooper { L"     -INFINITYX",	14,	ALT_MINUS_HUGE_VAL,	0 },
115*57718be8SEnji Cooper 
116*57718be8SEnji Cooper /* NAN */
117*57718be8SEnji Cooper { L"NA",		0,	0,			0 },
118*57718be8SEnji Cooper { L"+NA",		0,	0,			0 },
119*57718be8SEnji Cooper { L"-NA",		0,	0,			0 },
120*57718be8SEnji Cooper { L"NAX",		0,	0,			0 },
121*57718be8SEnji Cooper { L"+NAX",		0,	0,			0 },
122*57718be8SEnji Cooper { L"-NAX",		0,	0,			0 },
123*57718be8SEnji Cooper { L"NAN",		3,	ALT_NAN,		0 },
124*57718be8SEnji Cooper { L"+NAN",		4,	ALT_NAN,		0 },
125*57718be8SEnji Cooper { L"-NAN",		4,	ALT_NAN,		0 },
126*57718be8SEnji Cooper { L"NANX",		3,	ALT_NAN,		0 },
127*57718be8SEnji Cooper { L"+NANX",		4,	ALT_NAN,		0 },
128*57718be8SEnji Cooper { L"-NANX",		4,	ALT_NAN,		0 },
129*57718be8SEnji Cooper { L"     NA",		0,	0,			0 },
130*57718be8SEnji Cooper { L"     +NA",		0,	0,			0 },
131*57718be8SEnji Cooper { L"     -NA",		0,	0,			0 },
132*57718be8SEnji Cooper { L"     NAX",		0,	0,			0 },
133*57718be8SEnji Cooper { L"     +NAX",		0,	0,			0 },
134*57718be8SEnji Cooper { L"     -NAX",		0,	0,			0 },
135*57718be8SEnji Cooper { L"+     NAN",		0,	0,			0 },
136*57718be8SEnji Cooper { L"-     NAN",		0,	0,			0 },
137*57718be8SEnji Cooper { L"     NAN",		8,	ALT_NAN,		0 },
138*57718be8SEnji Cooper { L"     +NAN",		9,	ALT_NAN,		0 },
139*57718be8SEnji Cooper { L"     -NAN",		9,	ALT_NAN,		0 },
140*57718be8SEnji Cooper { L"     NANX",		8,	ALT_NAN,		0 },
141*57718be8SEnji Cooper { L"     +NANX",	9,	ALT_NAN,		0 },
142*57718be8SEnji Cooper { L"     -NANX",	9,	ALT_NAN,		0 },
143*57718be8SEnji Cooper 
144*57718be8SEnji Cooper { L"0",			1,	0,			0 },
145*57718be8SEnji Cooper { L"+0",		2,	0,			0 },
146*57718be8SEnji Cooper { L"-0",		2,	0,			0 },
147*57718be8SEnji Cooper { L"          0",	11,	0,			0 },
148*57718be8SEnji Cooper { L"          +0",	12,	0,			0 },
149*57718be8SEnji Cooper { L"          -0",	12,	0,			0 },
150*57718be8SEnji Cooper { L"+          0",	0,	0,			0 },
151*57718be8SEnji Cooper { L"-          0",	0,	0,			0 },
152*57718be8SEnji Cooper 
153*57718be8SEnji Cooper { L".",			0,	0,			0 },
154*57718be8SEnji Cooper { L".0",		2,	0,			0 },
155*57718be8SEnji Cooper { L".00",		3,	0,			0 },
156*57718be8SEnji Cooper { L".000",		4,	0,			0 },
157*57718be8SEnji Cooper 
158*57718be8SEnji Cooper { L"0.",		2,	0,			0 },
159*57718be8SEnji Cooper { L"+0.",		3,	0,			0 },
160*57718be8SEnji Cooper { L"-0.",		3,	0,			0 },
161*57718be8SEnji Cooper { L"          0.",	12,	0,			0 },
162*57718be8SEnji Cooper { L"          +0.",	13,	0,			0 },
163*57718be8SEnji Cooper { L"          -0.",	13,	0,			0 },
164*57718be8SEnji Cooper 
165*57718be8SEnji Cooper { L"0.0",		3,	0,			0 },
166*57718be8SEnji Cooper { L"+0.0",		4,	0,			0 },
167*57718be8SEnji Cooper { L"-0.0",		4,	0,			0 },
168*57718be8SEnji Cooper { L"          0.0",	13,	0,			0 },
169*57718be8SEnji Cooper { L"          +0.0",	14,	0,			0 },
170*57718be8SEnji Cooper { L"          -0.0",	14,	0,			0 },
171*57718be8SEnji Cooper 
172*57718be8SEnji Cooper { L"000",		3,	0,			0 },
173*57718be8SEnji Cooper { L"+000",		4,	0,			0 },
174*57718be8SEnji Cooper { L"-000",		4,	0,			0 },
175*57718be8SEnji Cooper { L"          000",	13,	0,			0 },
176*57718be8SEnji Cooper { L"          +000",	14,	0,			0 },
177*57718be8SEnji Cooper { L"          -000",	14,	0,			0 },
178*57718be8SEnji Cooper 
179*57718be8SEnji Cooper { L"000.",		4,	0,			0 },
180*57718be8SEnji Cooper { L"+000.",		5,	0,			0 },
181*57718be8SEnji Cooper { L"-000.",		5,	0,			0 },
182*57718be8SEnji Cooper { L"          000.",	14,	0,			0 },
183*57718be8SEnji Cooper { L"          +000.",	15,	0,			0 },
184*57718be8SEnji Cooper { L"          -000.",	15,	0,			0 },
185*57718be8SEnji Cooper 
186*57718be8SEnji Cooper { L"000.0",		5,	0,			0 },
187*57718be8SEnji Cooper { L"+000.0",		6,	0,			0 },
188*57718be8SEnji Cooper { L"-000.0",		6,	0,			0 },
189*57718be8SEnji Cooper { L"          000.0",	15,	0,			0 },
190*57718be8SEnji Cooper { L"          +000.0",	16,	0,			0 },
191*57718be8SEnji Cooper { L"          -000.0",	16,	0,			0 },
192*57718be8SEnji Cooper 
193*57718be8SEnji Cooper 
194*57718be8SEnji Cooper { L"0.0.",		3,	0,			0 },
195*57718be8SEnji Cooper { L"+0.0.",		4,	0,			0 },
196*57718be8SEnji Cooper { L"-0.0.",		4,	0,			0 },
197*57718be8SEnji Cooper { L"          0.0.",	13,	0,			0 },
198*57718be8SEnji Cooper { L"          +0.0.",	14,	0,			0 },
199*57718be8SEnji Cooper { L"          -0.0.",	14,	0,			0 },
200*57718be8SEnji Cooper 
201*57718be8SEnji Cooper { L"0.0.0",		3,	0,			0 },
202*57718be8SEnji Cooper { L"+0.0.0",		4,	0,			0 },
203*57718be8SEnji Cooper { L"-0.0.0",		4,	0,			0 },
204*57718be8SEnji Cooper { L"          0.0.0",	13,	0,			0 },
205*57718be8SEnji Cooper { L"          +0.0.0",	14,	0,			0 },
206*57718be8SEnji Cooper { L"          -0.0.0",	14,	0,			0 },
207*57718be8SEnji Cooper 
208*57718be8SEnji Cooper /* XXX: FIXME */
209*57718be8SEnji Cooper #if defined(__linux__)
210*57718be8SEnji Cooper { L"0X",		2,	0,			0 },
211*57718be8SEnji Cooper { L"+0X",		3,	0,			0 },
212*57718be8SEnji Cooper { L"-0X",		3,	0,			0 },
213*57718be8SEnji Cooper #else
214*57718be8SEnji Cooper { L"0X",		1,	0,			0 },
215*57718be8SEnji Cooper { L"+0X",		2,	0,			0 },
216*57718be8SEnji Cooper { L"-0X",		2,	0,			0 },
217*57718be8SEnji Cooper #endif
218*57718be8SEnji Cooper 
219*57718be8SEnji Cooper /* XXX: SunOS 5.8's wcstod(3) doesn't accept hex */
220*57718be8SEnji Cooper #if !defined(__SunOS__)
221*57718be8SEnji Cooper #if defined(__linux__)
222*57718be8SEnji Cooper { L"0X.",		3,	0,			0 },
223*57718be8SEnji Cooper { L"+0X.",		4,	0,			0 },
224*57718be8SEnji Cooper { L"-0X.",		4,	0,			0 },
225*57718be8SEnji Cooper { L"          0X.",	13,	0,			0 },
226*57718be8SEnji Cooper { L"          +0X.",	14,	0,			0 },
227*57718be8SEnji Cooper { L"          -0X.",	14,	0,			0 },
228*57718be8SEnji Cooper #else
229*57718be8SEnji Cooper { L"0X.",		1,	0,			0 },
230*57718be8SEnji Cooper { L"+0X.",		2,	0,			0 },
231*57718be8SEnji Cooper { L"-0X.",		2,	0,			0 },
232*57718be8SEnji Cooper { L"          0X.",	11,	0,			0 },
233*57718be8SEnji Cooper { L"          +0X.",	12,	0,			0 },
234*57718be8SEnji Cooper { L"          -0X.",	12,	0,			0 },
235*57718be8SEnji Cooper #endif
236*57718be8SEnji Cooper /* XXX: FIXME */
237*57718be8SEnji Cooper #if defined(__NetBSD__) || defined(__linux__)
238*57718be8SEnji Cooper { L"0X.0",		4,	0,			0 },
239*57718be8SEnji Cooper { L"+0X.0",		5,	0,			0 },
240*57718be8SEnji Cooper { L"-0X.0",		5,	0,			0 },
241*57718be8SEnji Cooper { L"          0X.0",	14,	0,			0 },
242*57718be8SEnji Cooper { L"          +0X.0",	15,	0,			0 },
243*57718be8SEnji Cooper { L"          -0X.0",	15,	0,			0 },
244*57718be8SEnji Cooper 
245*57718be8SEnji Cooper { L"0X.0P",		4,	0,			0 },
246*57718be8SEnji Cooper { L"+0X.0P",		5,	0,			0 },
247*57718be8SEnji Cooper { L"-0X.0P",		5,	0,			0 },
248*57718be8SEnji Cooper { L"          0X.0P",	14,	0,			0 },
249*57718be8SEnji Cooper { L"          +0X.0P",	15,	0,			0 },
250*57718be8SEnji Cooper { L"          -0X.0P",	15,	0,			0 },
251*57718be8SEnji Cooper #else
252*57718be8SEnji Cooper { L"0X.0",		1,	0,			0 },
253*57718be8SEnji Cooper { L"+0X.0",		2,	0,			0 },
254*57718be8SEnji Cooper { L"-0X.0",		2,	0,			0 },
255*57718be8SEnji Cooper { L"          0X.0",	11,	0,			0 },
256*57718be8SEnji Cooper { L"          +0X.0",	12,	0,			0 },
257*57718be8SEnji Cooper { L"          -0X.0",	12,	0,			0 },
258*57718be8SEnji Cooper 
259*57718be8SEnji Cooper { L"0X.0P",		1,	0,			0 },
260*57718be8SEnji Cooper { L"+0X.0P",		2,	0,			0 },
261*57718be8SEnji Cooper { L"-0X.0P",		2,	0,			0 },
262*57718be8SEnji Cooper { L"          0X.0P",	11,	0,			0 },
263*57718be8SEnji Cooper { L"          +0X.0P",	12,	0,			0 },
264*57718be8SEnji Cooper { L"          -0X.0P",	12,	0,			0 },
265*57718be8SEnji Cooper #endif
266*57718be8SEnji Cooper 
267*57718be8SEnji Cooper { L"0X0",		3,	0,			0 },
268*57718be8SEnji Cooper { L"+0X0",		4,	0,			0 },
269*57718be8SEnji Cooper { L"-0X0",		4,	0,			0 },
270*57718be8SEnji Cooper { L"          0X0",	13,	0,			0 },
271*57718be8SEnji Cooper { L"          +0X0",	14,	0,			0 },
272*57718be8SEnji Cooper { L"          -0X0",	14,	0,			0 },
273*57718be8SEnji Cooper 
274*57718be8SEnji Cooper { L"00X0.0",		2,	0,			0 },
275*57718be8SEnji Cooper { L"+00X0.0",		3,	0,			0 },
276*57718be8SEnji Cooper { L"-00X0.0",		3,	0,			0 },
277*57718be8SEnji Cooper { L"          00X0.0",	12,	0,			0 },
278*57718be8SEnji Cooper { L"          +00X0.0",	13,	0,			0 },
279*57718be8SEnji Cooper { L"          -00X0.0",	13,	0,			0 },
280*57718be8SEnji Cooper 
281*57718be8SEnji Cooper { L"0X0P",		3,	0,			0 },
282*57718be8SEnji Cooper { L"+0X0P",		4,	0,			0 },
283*57718be8SEnji Cooper { L"-0X0P",		4,	0,			0 },
284*57718be8SEnji Cooper { L"          0X0P",	13,	0,			0 },
285*57718be8SEnji Cooper { L"          +0X0P",	14,	0,			0 },
286*57718be8SEnji Cooper { L"          -0X0P",	14,	0,			0 },
287*57718be8SEnji Cooper 
288*57718be8SEnji Cooper { L"0X0.",		4,	0,			0 },
289*57718be8SEnji Cooper { L"+0X0.",		5,	0,			0 },
290*57718be8SEnji Cooper { L"-0X0.",		5,	0,			0 },
291*57718be8SEnji Cooper { L"          0X0.",	14,	0,			0 },
292*57718be8SEnji Cooper { L"          +0X0.",	15,	0,			0 },
293*57718be8SEnji Cooper { L"          -0X0.",	15,	0,			0 },
294*57718be8SEnji Cooper 
295*57718be8SEnji Cooper { L"0X0.0",		5,	0,			0 },
296*57718be8SEnji Cooper { L"+0X0.0",		6,	0,			0 },
297*57718be8SEnji Cooper { L"-0X0.0",		6,	0,			0 },
298*57718be8SEnji Cooper { L"          0X0.0",	15,	0,			0 },
299*57718be8SEnji Cooper { L"          +0X0.0",	16,	0,			0 },
300*57718be8SEnji Cooper { L"          -0X0.0",	16,	0,			0 },
301*57718be8SEnji Cooper 
302*57718be8SEnji Cooper { L"0X0.P",		4,	0,			0 },
303*57718be8SEnji Cooper { L"+0X0.P",		5,	0,			0 },
304*57718be8SEnji Cooper { L"-0X0.P",		5,	0,			0 },
305*57718be8SEnji Cooper { L"          0X0.P",	14,	0,			0 },
306*57718be8SEnji Cooper { L"          +0X0.P",	15,	0,			0 },
307*57718be8SEnji Cooper { L"          -0X0.P",	15,	0,			0 },
308*57718be8SEnji Cooper 
309*57718be8SEnji Cooper { L"0X0.P",		4,	0,			0 },
310*57718be8SEnji Cooper { L"+0X0.P",		5,	0,			0 },
311*57718be8SEnji Cooper { L"-0X0.P",		5,	0,			0 },
312*57718be8SEnji Cooper { L"          0X0.P",	14,	0,			0 },
313*57718be8SEnji Cooper { L"          +0X0.P",	15,	0,			0 },
314*57718be8SEnji Cooper { L"          -0X0.P",	15,	0,			0 },
315*57718be8SEnji Cooper 
316*57718be8SEnji Cooper #endif
317*57718be8SEnji Cooper { L"0.12345678",	10,	0.12345678,		0 },
318*57718be8SEnji Cooper { L"+0.12345678",	11,	+0.12345678,		0 },
319*57718be8SEnji Cooper { L"-0.12345678",	11,	-0.12345678,		0 },
320*57718be8SEnji Cooper { L"     0.12345678",	15,	0.12345678,		0 },
321*57718be8SEnji Cooper { L"     +0.12345678",	16,	+0.12345678,		0 },
322*57718be8SEnji Cooper { L"     -0.12345678",	16,	-0.12345678,		0 },
323*57718be8SEnji Cooper 
324*57718be8SEnji Cooper { L"0.12345E67",	10,	0.12345E67,		0 },
325*57718be8SEnji Cooper { L"+0.12345E67",	11,	+0.12345E67,		0 },
326*57718be8SEnji Cooper { L"-0.12345E67",	11,	-0.12345E67,		0 },
327*57718be8SEnji Cooper { L"     0.12345E67",	15,	0.12345E67,		0 },
328*57718be8SEnji Cooper { L"     +0.12345E67",	16,	+0.12345E67,		0 },
329*57718be8SEnji Cooper { L"     -0.12345E67",	16,	-0.12345E67,		0 },
330*57718be8SEnji Cooper 
331*57718be8SEnji Cooper { L"0.12345E+6",	10,	0.12345E+6,		0 },
332*57718be8SEnji Cooper { L"+0.12345E+6",	11,	+0.12345E+6,		0 },
333*57718be8SEnji Cooper { L"-0.12345E+6",	11,	-0.12345E+6,		0 },
334*57718be8SEnji Cooper { L"     0.12345E+6",	15,	0.12345E+6,		0 },
335*57718be8SEnji Cooper { L"     +0.12345E+6",	16,	+0.12345E+6,		0 },
336*57718be8SEnji Cooper { L"     -0.12345E+6",	16,	-0.12345E+6,		0 },
337*57718be8SEnji Cooper 
338*57718be8SEnji Cooper { L"0.98765E-4",	10,	0.98765E-4,		0 },
339*57718be8SEnji Cooper { L"+0.98765E-4",	11,	+0.98765E-4,		0 },
340*57718be8SEnji Cooper { L"-0.98765E-4",	11,	-0.98765E-4,		0 },
341*57718be8SEnji Cooper { L"     0.98765E-4",	15,	0.98765E-4,		0 },
342*57718be8SEnji Cooper { L"     +0.98765E-4",	16,	+0.98765E-4,		0 },
343*57718be8SEnji Cooper { L"     -0.98765E-4",	16,	-0.98765E-4,		0 },
344*57718be8SEnji Cooper 
345*57718be8SEnji Cooper { L"12345678E9",	10,	12345678E9,		0 },
346*57718be8SEnji Cooper { L"+12345678E9",	11,	+12345678E9,		0 },
347*57718be8SEnji Cooper { L"-12345678E9",	11,	-12345678E9,		0 },
348*57718be8SEnji Cooper { L"     12345678E9",	15,	12345678E9,		0 },
349*57718be8SEnji Cooper { L"     +12345678E9",	16,	+12345678E9,		0 },
350*57718be8SEnji Cooper { L"     -12345678E9",	16,	-12345678E9,		0 },
351*57718be8SEnji Cooper 
352*57718be8SEnji Cooper /* XXX: SunOS 5.8's wcstod(3) doesn't accept hex */
353*57718be8SEnji Cooper #if !defined(__SunOS__)
354*57718be8SEnji Cooper { L"0x1P+2",		6,	4,			0 },
355*57718be8SEnji Cooper { L"+0x1P+2",		7,	+4,			0 },
356*57718be8SEnji Cooper { L"-0x1P+2",		7,	-4,			0 },
357*57718be8SEnji Cooper { L"     0x1P+2",	11,	4,			0 },
358*57718be8SEnji Cooper { L"     +0x1P+2",	12,	+4,			0 },
359*57718be8SEnji Cooper { L"     -0x1P+2",	12,	-4,			0 },
360*57718be8SEnji Cooper 
361*57718be8SEnji Cooper { L"0x1.0P+2",		8,	4,			0 },
362*57718be8SEnji Cooper { L"+0x1.0P+2",		9,	+4,			0 },
363*57718be8SEnji Cooper { L"-0x1.0P+2",		9,	-4,			0 },
364*57718be8SEnji Cooper { L"     0x1.0P+2",	13,	4,			0 },
365*57718be8SEnji Cooper { L"     +0x1.0P+2",	14,	+4,			0 },
366*57718be8SEnji Cooper { L"     -0x1.0P+2",	14,	-4,			0 },
367*57718be8SEnji Cooper 
368*57718be8SEnji Cooper { L"0x1P-2",		6,	0.25,			0 },
369*57718be8SEnji Cooper { L"+0x1P-2",		7,	+0.25,			0 },
370*57718be8SEnji Cooper { L"-0x1P-2",		7,	-0.25,			0 },
371*57718be8SEnji Cooper { L"     0x1P-2",	11,	0.25,			0 },
372*57718be8SEnji Cooper { L"     +0x1P-2",	12,	+0.25,			0 },
373*57718be8SEnji Cooper { L"     -0x1P-2",	12,	-0.25,			0 },
374*57718be8SEnji Cooper 
375*57718be8SEnji Cooper { L"0x1.0P-2",		8,	0.25,			0 },
376*57718be8SEnji Cooper { L"+0x1.0P-2",		9,	+0.25,			0 },
377*57718be8SEnji Cooper { L"-0x1.0P-2",		9,	-0.25,			0 },
378*57718be8SEnji Cooper { L"     0x1.0P-2",	13,	0.25,			0 },
379*57718be8SEnji Cooper { L"     +0x1.0P-2",	14,	+0.25,			0 },
380*57718be8SEnji Cooper { L"     -0x1.0P-2",	14,	-0.25,			0 },
381*57718be8SEnji Cooper #endif
382*57718be8SEnji Cooper 
383*57718be8SEnji Cooper { NULL, 0, 0, 0 }
384*57718be8SEnji Cooper };
385*57718be8SEnji Cooper #endif /* !defined(__vax__) */
386*57718be8SEnji Cooper 
387*57718be8SEnji Cooper ATF_TC(wcstod);
388*57718be8SEnji Cooper ATF_TC_HEAD(wcstod, tc)
389*57718be8SEnji Cooper {
390*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Checks wcstod(3)");
391*57718be8SEnji Cooper }
392*57718be8SEnji Cooper ATF_TC_BODY(wcstod, tc)
393*57718be8SEnji Cooper {
394*57718be8SEnji Cooper #if defined(__vax__)
395*57718be8SEnji Cooper #else
396*57718be8SEnji Cooper 	struct test *t;
397*57718be8SEnji Cooper #endif
398*57718be8SEnji Cooper 
399*57718be8SEnji Cooper #if !defined(__vax__)
400*57718be8SEnji Cooper 	for (t = &tests[0]; t->wcs != NULL; ++t) {
401*57718be8SEnji Cooper 		double d;
402*57718be8SEnji Cooper 		size_t n;
403*57718be8SEnji Cooper 		wchar_t *tail;
404*57718be8SEnji Cooper 		char *buf;
405*57718be8SEnji Cooper 
406*57718be8SEnji Cooper 		/* we do not supported %ls nor %S yet. */
407*57718be8SEnji Cooper 		n = wcstombs(NULL, t->wcs, 0);
408*57718be8SEnji Cooper 		ATF_REQUIRE((buf = (void *)malloc(n + 1)) != NULL);
409*57718be8SEnji Cooper 		(void)wcstombs(buf, t->wcs, n + 1);
410*57718be8SEnji Cooper 		(void)printf("Checking wcstod(\"%s\", &tail):\n", buf);
411*57718be8SEnji Cooper 		free(buf);
412*57718be8SEnji Cooper 
413*57718be8SEnji Cooper 		errno = 0;
414*57718be8SEnji Cooper 		d = wcstod(t->wcs, &tail);
415*57718be8SEnji Cooper 		(void)printf("[errno]\n");
416*57718be8SEnji Cooper 		(void)printf("  got     : %s\n", strerror(errno));
417*57718be8SEnji Cooper 		(void)printf("  expected: %s\n", strerror(t->err));
418*57718be8SEnji Cooper 		ATF_REQUIRE_EQ(errno, t->err);
419*57718be8SEnji Cooper 
420*57718be8SEnji Cooper 		n = (size_t)(tail - t->wcs);
421*57718be8SEnji Cooper 		(void)printf("[endptr - nptr]\n");
422*57718be8SEnji Cooper 		(void)printf("  got     : %zd\n", n);
423*57718be8SEnji Cooper 		(void)printf("  expected: %zd\n", t->len);
424*57718be8SEnji Cooper 		ATF_REQUIRE_EQ(n, t->len);
425*57718be8SEnji Cooper 
426*57718be8SEnji Cooper 		(void)printf("[result]\n");
427*57718be8SEnji Cooper 		(void)printf("  real:     %F\n", d);
428*57718be8SEnji Cooper 		if (t->val == ALT_HUGE_VAL) {
429*57718be8SEnji Cooper 			(void)printf("  expected: %F\n", HUGE_VAL);
430*57718be8SEnji Cooper 			ATF_REQUIRE(isinf(d));
431*57718be8SEnji Cooper 			ATF_REQUIRE_EQ(d, HUGE_VAL);
432*57718be8SEnji Cooper 		} else if (t->val == ALT_MINUS_HUGE_VAL) {
433*57718be8SEnji Cooper 			(void)printf("  expected: %F\n", -HUGE_VAL);
434*57718be8SEnji Cooper 			ATF_REQUIRE(isinf(d));
435*57718be8SEnji Cooper 			ATF_REQUIRE_EQ(d, -HUGE_VAL);
436*57718be8SEnji Cooper 		} else if (t->val == ALT_NAN) {
437*57718be8SEnji Cooper 			(void)printf("  expected: %F\n", NAN);
438*57718be8SEnji Cooper 			ATF_REQUIRE(isnan(d));
439*57718be8SEnji Cooper 		} else {
440*57718be8SEnji Cooper 			(void)printf("  expected: %F\n", t->val);
441*57718be8SEnji Cooper 			ATF_REQUIRE_EQ(d, t->val);
442*57718be8SEnji Cooper 		}
443*57718be8SEnji Cooper 
444*57718be8SEnji Cooper 		(void)printf("\n");
445*57718be8SEnji Cooper 	}
446*57718be8SEnji Cooper #else /* !defined(__vax__) */
447*57718be8SEnji Cooper 	atf_tc_skip("Test is unavailable on vax.");
448*57718be8SEnji Cooper #endif /* !defined(__vax__) */
449*57718be8SEnji Cooper }
450*57718be8SEnji Cooper 
451*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
452*57718be8SEnji Cooper {
453*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, wcstod);
454*57718be8SEnji Cooper 
455*57718be8SEnji Cooper 	return atf_no_error();
456*57718be8SEnji Cooper }
457