1272343Sngie/* $NetBSD: t_wcstod.c,v 1.3 2011/10/01 17:56:11 christos Exp $ */
2272343Sngie
3272343Sngie/*-
4272343Sngie * Copyright (c) 2011 The NetBSD Foundation, Inc.
5272343Sngie * All rights reserved.
6272343Sngie *
7272343Sngie * Redistribution and use in source and binary forms, with or without
8272343Sngie * modification, are permitted provided that the following conditions
9272343Sngie * are met:
10272343Sngie * 1. Redistributions of source code must retain the above copyright
11272343Sngie *    notice, this list of conditions and the following disclaimer.
12272343Sngie * 2. Redistributions in binary form must reproduce the above copyright
13272343Sngie *    notice, this list of conditions and the following disclaimer in the
14272343Sngie *    documentation and/or other materials provided with the distribution.
15272343Sngie *
16272343Sngie * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17272343Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18272343Sngie * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19272343Sngie * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20272343Sngie * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21272343Sngie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22272343Sngie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23272343Sngie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24272343Sngie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25272343Sngie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26272343Sngie * POSSIBILITY OF SUCH DAMAGE.
27272343Sngie */
28272343Sngie
29272343Sngie/*-
30272343Sngie * Copyright (c)2005 Citrus Project,
31272343Sngie * All rights reserved.
32272343Sngie *
33272343Sngie * Redistribution and use in source and binary forms, with or without
34272343Sngie * modification, are permitted provided that the following conditions
35272343Sngie * are met:
36272343Sngie * 1. Redistributions of source code must retain the above copyright
37272343Sngie *    notice, this list of conditions and the following disclaimer.
38272343Sngie * 2. Redistributions in binary form must reproduce the above copyright
39272343Sngie *    notice, this list of conditions and the following disclaimer in the
40272343Sngie *    documentation and/or other materials provided with the distribution.
41272343Sngie *
42272343Sngie * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
43272343Sngie * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44272343Sngie * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45272343Sngie * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
46272343Sngie * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47272343Sngie * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48272343Sngie * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49272343Sngie * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50272343Sngie * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51272343Sngie * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52272343Sngie * SUCH DAMAGE.
53272343Sngie *
54272343Sngie */
55272343Sngie
56272343Sngie#include <sys/cdefs.h>
57272343Sngie__COPYRIGHT("@(#) Copyright (c) 2011\
58272343Sngie The NetBSD Foundation, inc. All rights reserved.");
59272343Sngie__RCSID("$NetBSD: t_wcstod.c,v 1.3 2011/10/01 17:56:11 christos Exp $");
60272343Sngie
61272343Sngie#include <errno.h>
62272343Sngie#include <math.h>
63272343Sngie#include <stdlib.h>
64272343Sngie#include <string.h>
65272343Sngie#include <wchar.h>
66272343Sngie
67272343Sngie#include <atf-c.h>
68272343Sngie
69276478Sngie#ifdef __FreeBSD__
70276478Sngie#include <stdio.h>
71276478Sngie#endif
72276478Sngie
73272343Sngie#define	ALT_HUGE_VAL		-1
74272343Sngie#define	ALT_MINUS_HUGE_VAL	-2
75272343Sngie#define	ALT_NAN			-3
76272343Sngie
77272343Sngie#if !defined(__vax__)
78272343Sngiestatic struct test {
79272343Sngie	const wchar_t *wcs;
80272343Sngie	size_t len;
81272343Sngie	double val;
82272343Sngie	int err;
83272343Sngie} tests[] = {
84272343Sngie{ L"IN",		0,	0,			0 },
85272343Sngie{ L"+IN",		0,	0,			0 },
86272343Sngie{ L"-IN",		0,	0,			0 },
87272343Sngie{ L"INX",		0,	0,			0 },
88272343Sngie{ L"+INX",		0,	0,			0 },
89272343Sngie{ L"-INX",		0,	0,			0 },
90272343Sngie{ L"INF",		3,	ALT_HUGE_VAL,		0 },
91272343Sngie{ L"+INF",		4,	ALT_HUGE_VAL,		0 },
92272343Sngie{ L"-INF",		4,	ALT_MINUS_HUGE_VAL,	0 },
93272343Sngie{ L"INFX",		3,	ALT_HUGE_VAL,		0 },
94272343Sngie{ L"+INFX",		4,	ALT_HUGE_VAL,		0 },
95272343Sngie{ L"-INFX",		4,	ALT_MINUS_HUGE_VAL,	0 },
96272343Sngie{ L"     IN",		0,	0,			0 },
97272343Sngie{ L"     +IN",		0,	0,			0 },
98272343Sngie{ L"     -IN",		0,	0,			0 },
99272343Sngie{ L"     INX",		0,	0,			0 },
100272343Sngie{ L"     +INX",		0,	0,			0 },
101272343Sngie{ L"     -INX",		0,	0,			0 },
102272343Sngie{ L"+     INF",		0,	0,			0 },
103272343Sngie{ L"-     INF",		0,	0,			0 },
104272343Sngie{ L"     INF",		8,	ALT_HUGE_VAL,		0 },
105272343Sngie{ L"     +INF",		9,	ALT_HUGE_VAL,		0 },
106272343Sngie{ L"     -INF",		9,	ALT_MINUS_HUGE_VAL,	0 },
107272343Sngie{ L"     INFX",		8,	ALT_HUGE_VAL,		0 },
108272343Sngie{ L"     +INFX",	9,	ALT_HUGE_VAL,		0 },
109272343Sngie{ L"     -INFX",	9,	ALT_MINUS_HUGE_VAL,	0 },
110272343Sngie{ L"     INFINIT",	8,	ALT_HUGE_VAL,		0 },
111272343Sngie{ L"     +INFINIT",	9,	ALT_HUGE_VAL,		0 },
112272343Sngie{ L"     -INFINIT",	9,	ALT_MINUS_HUGE_VAL,	0 },
113272343Sngie{ L"     INFINITY",	13,	ALT_HUGE_VAL,		0 },
114272343Sngie{ L"     +INFINITY",	14,	ALT_HUGE_VAL,		0 },
115272343Sngie{ L"     -INFINITY",	14,	ALT_MINUS_HUGE_VAL,	0 },
116272343Sngie{ L"     INFINITYX",	13,	ALT_HUGE_VAL,		0 },
117272343Sngie{ L"     +INFINITYX",	14,	ALT_HUGE_VAL,		0 },
118272343Sngie{ L"     -INFINITYX",	14,	ALT_MINUS_HUGE_VAL,	0 },
119272343Sngie
120272343Sngie/* NAN */
121272343Sngie{ L"NA",		0,	0,			0 },
122272343Sngie{ L"+NA",		0,	0,			0 },
123272343Sngie{ L"-NA",		0,	0,			0 },
124272343Sngie{ L"NAX",		0,	0,			0 },
125272343Sngie{ L"+NAX",		0,	0,			0 },
126272343Sngie{ L"-NAX",		0,	0,			0 },
127272343Sngie{ L"NAN",		3,	ALT_NAN,		0 },
128272343Sngie{ L"+NAN",		4,	ALT_NAN,		0 },
129272343Sngie{ L"-NAN",		4,	ALT_NAN,		0 },
130272343Sngie{ L"NANX",		3,	ALT_NAN,		0 },
131272343Sngie{ L"+NANX",		4,	ALT_NAN,		0 },
132272343Sngie{ L"-NANX",		4,	ALT_NAN,		0 },
133272343Sngie{ L"     NA",		0,	0,			0 },
134272343Sngie{ L"     +NA",		0,	0,			0 },
135272343Sngie{ L"     -NA",		0,	0,			0 },
136272343Sngie{ L"     NAX",		0,	0,			0 },
137272343Sngie{ L"     +NAX",		0,	0,			0 },
138272343Sngie{ L"     -NAX",		0,	0,			0 },
139272343Sngie{ L"+     NAN",		0,	0,			0 },
140272343Sngie{ L"-     NAN",		0,	0,			0 },
141272343Sngie{ L"     NAN",		8,	ALT_NAN,		0 },
142272343Sngie{ L"     +NAN",		9,	ALT_NAN,		0 },
143272343Sngie{ L"     -NAN",		9,	ALT_NAN,		0 },
144272343Sngie{ L"     NANX",		8,	ALT_NAN,		0 },
145272343Sngie{ L"     +NANX",	9,	ALT_NAN,		0 },
146272343Sngie{ L"     -NANX",	9,	ALT_NAN,		0 },
147272343Sngie
148272343Sngie{ L"0",			1,	0,			0 },
149272343Sngie{ L"+0",		2,	0,			0 },
150272343Sngie{ L"-0",		2,	0,			0 },
151272343Sngie{ L"          0",	11,	0,			0 },
152272343Sngie{ L"          +0",	12,	0,			0 },
153272343Sngie{ L"          -0",	12,	0,			0 },
154272343Sngie{ L"+          0",	0,	0,			0 },
155272343Sngie{ L"-          0",	0,	0,			0 },
156272343Sngie
157272343Sngie{ L".",			0,	0,			0 },
158272343Sngie{ L".0",		2,	0,			0 },
159272343Sngie{ L".00",		3,	0,			0 },
160272343Sngie{ L".000",		4,	0,			0 },
161272343Sngie
162272343Sngie{ L"0.",		2,	0,			0 },
163272343Sngie{ L"+0.",		3,	0,			0 },
164272343Sngie{ L"-0.",		3,	0,			0 },
165272343Sngie{ L"          0.",	12,	0,			0 },
166272343Sngie{ L"          +0.",	13,	0,			0 },
167272343Sngie{ L"          -0.",	13,	0,			0 },
168272343Sngie
169272343Sngie{ L"0.0",		3,	0,			0 },
170272343Sngie{ L"+0.0",		4,	0,			0 },
171272343Sngie{ L"-0.0",		4,	0,			0 },
172272343Sngie{ L"          0.0",	13,	0,			0 },
173272343Sngie{ L"          +0.0",	14,	0,			0 },
174272343Sngie{ L"          -0.0",	14,	0,			0 },
175272343Sngie
176272343Sngie{ L"000",		3,	0,			0 },
177272343Sngie{ L"+000",		4,	0,			0 },
178272343Sngie{ L"-000",		4,	0,			0 },
179272343Sngie{ L"          000",	13,	0,			0 },
180272343Sngie{ L"          +000",	14,	0,			0 },
181272343Sngie{ L"          -000",	14,	0,			0 },
182272343Sngie
183272343Sngie{ L"000.",		4,	0,			0 },
184272343Sngie{ L"+000.",		5,	0,			0 },
185272343Sngie{ L"-000.",		5,	0,			0 },
186272343Sngie{ L"          000.",	14,	0,			0 },
187272343Sngie{ L"          +000.",	15,	0,			0 },
188272343Sngie{ L"          -000.",	15,	0,			0 },
189272343Sngie
190272343Sngie{ L"000.0",		5,	0,			0 },
191272343Sngie{ L"+000.0",		6,	0,			0 },
192272343Sngie{ L"-000.0",		6,	0,			0 },
193272343Sngie{ L"          000.0",	15,	0,			0 },
194272343Sngie{ L"          +000.0",	16,	0,			0 },
195272343Sngie{ L"          -000.0",	16,	0,			0 },
196272343Sngie
197272343Sngie
198272343Sngie{ L"0.0.",		3,	0,			0 },
199272343Sngie{ L"+0.0.",		4,	0,			0 },
200272343Sngie{ L"-0.0.",		4,	0,			0 },
201272343Sngie{ L"          0.0.",	13,	0,			0 },
202272343Sngie{ L"          +0.0.",	14,	0,			0 },
203272343Sngie{ L"          -0.0.",	14,	0,			0 },
204272343Sngie
205272343Sngie{ L"0.0.0",		3,	0,			0 },
206272343Sngie{ L"+0.0.0",		4,	0,			0 },
207272343Sngie{ L"-0.0.0",		4,	0,			0 },
208272343Sngie{ L"          0.0.0",	13,	0,			0 },
209272343Sngie{ L"          +0.0.0",	14,	0,			0 },
210272343Sngie{ L"          -0.0.0",	14,	0,			0 },
211272343Sngie
212272343Sngie/* XXX: FIXME */
213272343Sngie#if defined(__linux__)
214272343Sngie{ L"0X",		2,	0,			0 },
215272343Sngie{ L"+0X",		3,	0,			0 },
216272343Sngie{ L"-0X",		3,	0,			0 },
217272343Sngie#else
218272343Sngie{ L"0X",		1,	0,			0 },
219272343Sngie{ L"+0X",		2,	0,			0 },
220272343Sngie{ L"-0X",		2,	0,			0 },
221272343Sngie#endif
222272343Sngie
223272343Sngie/* XXX: SunOS 5.8's wcstod(3) doesn't accept hex */
224272343Sngie#if !defined(__SunOS__)
225272343Sngie#if defined(__linux__)
226272343Sngie{ L"0X.",		3,	0,			0 },
227272343Sngie{ L"+0X.",		4,	0,			0 },
228272343Sngie{ L"-0X.",		4,	0,			0 },
229272343Sngie{ L"          0X.",	13,	0,			0 },
230272343Sngie{ L"          +0X.",	14,	0,			0 },
231272343Sngie{ L"          -0X.",	14,	0,			0 },
232272343Sngie#else
233272343Sngie{ L"0X.",		1,	0,			0 },
234272343Sngie{ L"+0X.",		2,	0,			0 },
235272343Sngie{ L"-0X.",		2,	0,			0 },
236272343Sngie{ L"          0X.",	11,	0,			0 },
237272343Sngie{ L"          +0X.",	12,	0,			0 },
238272343Sngie{ L"          -0X.",	12,	0,			0 },
239272343Sngie#endif
240272343Sngie/* XXX: FIXME */
241276478Sngie#if defined(__NetBSD__) || defined(__linux__) || defined(__FreeBSD__)
242272343Sngie{ L"0X.0",		4,	0,			0 },
243272343Sngie{ L"+0X.0",		5,	0,			0 },
244272343Sngie{ L"-0X.0",		5,	0,			0 },
245272343Sngie{ L"          0X.0",	14,	0,			0 },
246272343Sngie{ L"          +0X.0",	15,	0,			0 },
247272343Sngie{ L"          -0X.0",	15,	0,			0 },
248272343Sngie
249272343Sngie{ L"0X.0P",		4,	0,			0 },
250272343Sngie{ L"+0X.0P",		5,	0,			0 },
251272343Sngie{ L"-0X.0P",		5,	0,			0 },
252272343Sngie{ L"          0X.0P",	14,	0,			0 },
253272343Sngie{ L"          +0X.0P",	15,	0,			0 },
254272343Sngie{ L"          -0X.0P",	15,	0,			0 },
255272343Sngie#else
256272343Sngie{ L"0X.0",		1,	0,			0 },
257272343Sngie{ L"+0X.0",		2,	0,			0 },
258272343Sngie{ L"-0X.0",		2,	0,			0 },
259272343Sngie{ L"          0X.0",	11,	0,			0 },
260272343Sngie{ L"          +0X.0",	12,	0,			0 },
261272343Sngie{ L"          -0X.0",	12,	0,			0 },
262272343Sngie
263272343Sngie{ L"0X.0P",		1,	0,			0 },
264272343Sngie{ L"+0X.0P",		2,	0,			0 },
265272343Sngie{ L"-0X.0P",		2,	0,			0 },
266272343Sngie{ L"          0X.0P",	11,	0,			0 },
267272343Sngie{ L"          +0X.0P",	12,	0,			0 },
268272343Sngie{ L"          -0X.0P",	12,	0,			0 },
269272343Sngie#endif
270272343Sngie
271272343Sngie{ L"0X0",		3,	0,			0 },
272272343Sngie{ L"+0X0",		4,	0,			0 },
273272343Sngie{ L"-0X0",		4,	0,			0 },
274272343Sngie{ L"          0X0",	13,	0,			0 },
275272343Sngie{ L"          +0X0",	14,	0,			0 },
276272343Sngie{ L"          -0X0",	14,	0,			0 },
277272343Sngie
278272343Sngie{ L"00X0.0",		2,	0,			0 },
279272343Sngie{ L"+00X0.0",		3,	0,			0 },
280272343Sngie{ L"-00X0.0",		3,	0,			0 },
281272343Sngie{ L"          00X0.0",	12,	0,			0 },
282272343Sngie{ L"          +00X0.0",	13,	0,			0 },
283272343Sngie{ L"          -00X0.0",	13,	0,			0 },
284272343Sngie
285272343Sngie{ L"0X0P",		3,	0,			0 },
286272343Sngie{ L"+0X0P",		4,	0,			0 },
287272343Sngie{ L"-0X0P",		4,	0,			0 },
288272343Sngie{ L"          0X0P",	13,	0,			0 },
289272343Sngie{ L"          +0X0P",	14,	0,			0 },
290272343Sngie{ L"          -0X0P",	14,	0,			0 },
291272343Sngie
292272343Sngie{ L"0X0.",		4,	0,			0 },
293272343Sngie{ L"+0X0.",		5,	0,			0 },
294272343Sngie{ L"-0X0.",		5,	0,			0 },
295272343Sngie{ L"          0X0.",	14,	0,			0 },
296272343Sngie{ L"          +0X0.",	15,	0,			0 },
297272343Sngie{ L"          -0X0.",	15,	0,			0 },
298272343Sngie
299272343Sngie{ L"0X0.0",		5,	0,			0 },
300272343Sngie{ L"+0X0.0",		6,	0,			0 },
301272343Sngie{ L"-0X0.0",		6,	0,			0 },
302272343Sngie{ L"          0X0.0",	15,	0,			0 },
303272343Sngie{ L"          +0X0.0",	16,	0,			0 },
304272343Sngie{ L"          -0X0.0",	16,	0,			0 },
305272343Sngie
306272343Sngie{ L"0X0.P",		4,	0,			0 },
307272343Sngie{ L"+0X0.P",		5,	0,			0 },
308272343Sngie{ L"-0X0.P",		5,	0,			0 },
309272343Sngie{ L"          0X0.P",	14,	0,			0 },
310272343Sngie{ L"          +0X0.P",	15,	0,			0 },
311272343Sngie{ L"          -0X0.P",	15,	0,			0 },
312272343Sngie
313272343Sngie{ L"0X0.P",		4,	0,			0 },
314272343Sngie{ L"+0X0.P",		5,	0,			0 },
315272343Sngie{ L"-0X0.P",		5,	0,			0 },
316272343Sngie{ L"          0X0.P",	14,	0,			0 },
317272343Sngie{ L"          +0X0.P",	15,	0,			0 },
318272343Sngie{ L"          -0X0.P",	15,	0,			0 },
319272343Sngie
320272343Sngie#endif
321272343Sngie{ L"0.12345678",	10,	0.12345678,		0 },
322272343Sngie{ L"+0.12345678",	11,	+0.12345678,		0 },
323272343Sngie{ L"-0.12345678",	11,	-0.12345678,		0 },
324272343Sngie{ L"     0.12345678",	15,	0.12345678,		0 },
325272343Sngie{ L"     +0.12345678",	16,	+0.12345678,		0 },
326272343Sngie{ L"     -0.12345678",	16,	-0.12345678,		0 },
327272343Sngie
328272343Sngie{ L"0.12345E67",	10,	0.12345E67,		0 },
329272343Sngie{ L"+0.12345E67",	11,	+0.12345E67,		0 },
330272343Sngie{ L"-0.12345E67",	11,	-0.12345E67,		0 },
331272343Sngie{ L"     0.12345E67",	15,	0.12345E67,		0 },
332272343Sngie{ L"     +0.12345E67",	16,	+0.12345E67,		0 },
333272343Sngie{ L"     -0.12345E67",	16,	-0.12345E67,		0 },
334272343Sngie
335272343Sngie{ L"0.12345E+6",	10,	0.12345E+6,		0 },
336272343Sngie{ L"+0.12345E+6",	11,	+0.12345E+6,		0 },
337272343Sngie{ L"-0.12345E+6",	11,	-0.12345E+6,		0 },
338272343Sngie{ L"     0.12345E+6",	15,	0.12345E+6,		0 },
339272343Sngie{ L"     +0.12345E+6",	16,	+0.12345E+6,		0 },
340272343Sngie{ L"     -0.12345E+6",	16,	-0.12345E+6,		0 },
341272343Sngie
342272343Sngie{ L"0.98765E-4",	10,	0.98765E-4,		0 },
343272343Sngie{ L"+0.98765E-4",	11,	+0.98765E-4,		0 },
344272343Sngie{ L"-0.98765E-4",	11,	-0.98765E-4,		0 },
345272343Sngie{ L"     0.98765E-4",	15,	0.98765E-4,		0 },
346272343Sngie{ L"     +0.98765E-4",	16,	+0.98765E-4,		0 },
347272343Sngie{ L"     -0.98765E-4",	16,	-0.98765E-4,		0 },
348272343Sngie
349272343Sngie{ L"12345678E9",	10,	12345678E9,		0 },
350272343Sngie{ L"+12345678E9",	11,	+12345678E9,		0 },
351272343Sngie{ L"-12345678E9",	11,	-12345678E9,		0 },
352272343Sngie{ L"     12345678E9",	15,	12345678E9,		0 },
353272343Sngie{ L"     +12345678E9",	16,	+12345678E9,		0 },
354272343Sngie{ L"     -12345678E9",	16,	-12345678E9,		0 },
355272343Sngie
356272343Sngie/* XXX: SunOS 5.8's wcstod(3) doesn't accept hex */
357272343Sngie#if !defined(__SunOS__)
358272343Sngie{ L"0x1P+2",		6,	4,			0 },
359272343Sngie{ L"+0x1P+2",		7,	+4,			0 },
360272343Sngie{ L"-0x1P+2",		7,	-4,			0 },
361272343Sngie{ L"     0x1P+2",	11,	4,			0 },
362272343Sngie{ L"     +0x1P+2",	12,	+4,			0 },
363272343Sngie{ L"     -0x1P+2",	12,	-4,			0 },
364272343Sngie
365272343Sngie{ L"0x1.0P+2",		8,	4,			0 },
366272343Sngie{ L"+0x1.0P+2",		9,	+4,			0 },
367272343Sngie{ L"-0x1.0P+2",		9,	-4,			0 },
368272343Sngie{ L"     0x1.0P+2",	13,	4,			0 },
369272343Sngie{ L"     +0x1.0P+2",	14,	+4,			0 },
370272343Sngie{ L"     -0x1.0P+2",	14,	-4,			0 },
371272343Sngie
372272343Sngie{ L"0x1P-2",		6,	0.25,			0 },
373272343Sngie{ L"+0x1P-2",		7,	+0.25,			0 },
374272343Sngie{ L"-0x1P-2",		7,	-0.25,			0 },
375272343Sngie{ L"     0x1P-2",	11,	0.25,			0 },
376272343Sngie{ L"     +0x1P-2",	12,	+0.25,			0 },
377272343Sngie{ L"     -0x1P-2",	12,	-0.25,			0 },
378272343Sngie
379272343Sngie{ L"0x1.0P-2",		8,	0.25,			0 },
380272343Sngie{ L"+0x1.0P-2",		9,	+0.25,			0 },
381272343Sngie{ L"-0x1.0P-2",		9,	-0.25,			0 },
382272343Sngie{ L"     0x1.0P-2",	13,	0.25,			0 },
383272343Sngie{ L"     +0x1.0P-2",	14,	+0.25,			0 },
384272343Sngie{ L"     -0x1.0P-2",	14,	-0.25,			0 },
385272343Sngie#endif
386272343Sngie
387272343Sngie{ NULL, 0, 0, 0 }
388272343Sngie};
389272343Sngie#endif /* !defined(__vax__) */
390272343Sngie
391272343SngieATF_TC(wcstod);
392272343SngieATF_TC_HEAD(wcstod, tc)
393272343Sngie{
394272343Sngie	atf_tc_set_md_var(tc, "descr", "Checks wcstod(3)");
395272343Sngie}
396272343SngieATF_TC_BODY(wcstod, tc)
397272343Sngie{
398272343Sngie#if defined(__vax__)
399272343Sngie#else
400272343Sngie	struct test *t;
401272343Sngie#endif
402272343Sngie
403272343Sngie#if !defined(__vax__)
404272343Sngie	for (t = &tests[0]; t->wcs != NULL; ++t) {
405272343Sngie		double d;
406272343Sngie		size_t n;
407272343Sngie		wchar_t *tail;
408272343Sngie		char *buf;
409272343Sngie
410272343Sngie		/* we do not supported %ls nor %S yet. */
411272343Sngie		n = wcstombs(NULL, t->wcs, 0);
412272343Sngie		ATF_REQUIRE((buf = (void *)malloc(n + 1)) != NULL);
413272343Sngie		(void)wcstombs(buf, t->wcs, n + 1);
414272343Sngie		(void)printf("Checking wcstod(\"%s\", &tail):\n", buf);
415272343Sngie		free(buf);
416272343Sngie
417272343Sngie		errno = 0;
418272343Sngie		d = wcstod(t->wcs, &tail);
419272343Sngie		(void)printf("[errno]\n");
420272343Sngie		(void)printf("  got     : %s\n", strerror(errno));
421272343Sngie		(void)printf("  expected: %s\n", strerror(t->err));
422272343Sngie		ATF_REQUIRE_EQ(errno, t->err);
423272343Sngie
424272343Sngie		n = (size_t)(tail - t->wcs);
425272343Sngie		(void)printf("[endptr - nptr]\n");
426272343Sngie		(void)printf("  got     : %zd\n", n);
427272343Sngie		(void)printf("  expected: %zd\n", t->len);
428272343Sngie		ATF_REQUIRE_EQ(n, t->len);
429272343Sngie
430272343Sngie		(void)printf("[result]\n");
431272343Sngie		(void)printf("  real:     %F\n", d);
432272343Sngie		if (t->val == ALT_HUGE_VAL) {
433272343Sngie			(void)printf("  expected: %F\n", HUGE_VAL);
434272343Sngie			ATF_REQUIRE(isinf(d));
435272343Sngie			ATF_REQUIRE_EQ(d, HUGE_VAL);
436272343Sngie		} else if (t->val == ALT_MINUS_HUGE_VAL) {
437272343Sngie			(void)printf("  expected: %F\n", -HUGE_VAL);
438272343Sngie			ATF_REQUIRE(isinf(d));
439272343Sngie			ATF_REQUIRE_EQ(d, -HUGE_VAL);
440272343Sngie		} else if (t->val == ALT_NAN) {
441272343Sngie			(void)printf("  expected: %F\n", NAN);
442272343Sngie			ATF_REQUIRE(isnan(d));
443272343Sngie		} else {
444272343Sngie			(void)printf("  expected: %F\n", t->val);
445272343Sngie			ATF_REQUIRE_EQ(d, t->val);
446272343Sngie		}
447272343Sngie
448272343Sngie		(void)printf("\n");
449272343Sngie	}
450272343Sngie#else /* !defined(__vax__) */
451272343Sngie	atf_tc_skip("Test is unavailable on vax.");
452272343Sngie#endif /* !defined(__vax__) */
453272343Sngie}
454272343Sngie
455272343SngieATF_TP_ADD_TCS(tp)
456272343Sngie{
457272343Sngie	ATF_TP_ADD_TC(tp, wcstod);
458272343Sngie
459272343Sngie	return atf_no_error();
460272343Sngie}
461