157718be8SEnji Cooper /* $NetBSD: t_wcstod.c,v 1.3 2011/10/01 17:56:11 christos Exp $ */
257718be8SEnji Cooper 
357718be8SEnji Cooper /*-
457718be8SEnji Cooper  * Copyright (c) 2011 The NetBSD Foundation, Inc.
557718be8SEnji Cooper  * All rights reserved.
657718be8SEnji Cooper  *
757718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
857718be8SEnji Cooper  * modification, are permitted provided that the following conditions
957718be8SEnji Cooper  * are met:
1057718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
1157718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
1257718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
1357718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
1457718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
1557718be8SEnji Cooper  *
1657718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1757718be8SEnji Cooper  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1857718be8SEnji Cooper  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1957718be8SEnji Cooper  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2057718be8SEnji Cooper  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2157718be8SEnji Cooper  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2257718be8SEnji Cooper  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2357718be8SEnji Cooper  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2457718be8SEnji Cooper  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2557718be8SEnji Cooper  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2657718be8SEnji Cooper  * POSSIBILITY OF SUCH DAMAGE.
2757718be8SEnji Cooper  */
2857718be8SEnji Cooper 
2957718be8SEnji Cooper /*-
3057718be8SEnji Cooper  * Copyright (c)2005 Citrus Project,
3157718be8SEnji Cooper  * All rights reserved.
3257718be8SEnji Cooper  *
3357718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
3457718be8SEnji Cooper  * modification, are permitted provided that the following conditions
3557718be8SEnji Cooper  * are met:
3657718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
3757718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
3857718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
3957718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
4057718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
4157718be8SEnji Cooper  *
4257718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
4357718be8SEnji Cooper  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4457718be8SEnji Cooper  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4557718be8SEnji Cooper  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4657718be8SEnji Cooper  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4757718be8SEnji Cooper  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4857718be8SEnji Cooper  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4957718be8SEnji Cooper  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
5057718be8SEnji Cooper  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5157718be8SEnji Cooper  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5257718be8SEnji Cooper  * SUCH DAMAGE.
5357718be8SEnji Cooper  *
5457718be8SEnji Cooper  */
5557718be8SEnji Cooper 
5657718be8SEnji Cooper #include <sys/cdefs.h>
5757718be8SEnji Cooper __COPYRIGHT("@(#) Copyright (c) 2011\
5857718be8SEnji Cooper  The NetBSD Foundation, inc. All rights reserved.");
5957718be8SEnji Cooper __RCSID("$NetBSD: t_wcstod.c,v 1.3 2011/10/01 17:56:11 christos Exp $");
6057718be8SEnji Cooper 
6157718be8SEnji Cooper #include <errno.h>
6257718be8SEnji Cooper #include <math.h>
6357718be8SEnji Cooper #include <stdlib.h>
6457718be8SEnji Cooper #include <string.h>
6557718be8SEnji Cooper #include <wchar.h>
6657718be8SEnji Cooper 
6757718be8SEnji Cooper #include <atf-c.h>
6857718be8SEnji Cooper 
69ff0ba872SEnji Cooper #ifdef __FreeBSD__
70b081e68cSEnji Cooper #include <stdio.h>
71b081e68cSEnji Cooper #endif
72b081e68cSEnji Cooper 
7357718be8SEnji Cooper #define	ALT_HUGE_VAL		-1
7457718be8SEnji Cooper #define	ALT_MINUS_HUGE_VAL	-2
7557718be8SEnji Cooper #define	ALT_NAN			-3
7657718be8SEnji Cooper 
7757718be8SEnji Cooper #if !defined(__vax__)
7857718be8SEnji Cooper static struct test {
7957718be8SEnji Cooper 	const wchar_t *wcs;
8057718be8SEnji Cooper 	size_t len;
8157718be8SEnji Cooper 	double val;
8257718be8SEnji Cooper 	int err;
8357718be8SEnji Cooper } tests[] = {
8457718be8SEnji Cooper { L"IN",		0,	0,			0 },
8557718be8SEnji Cooper { L"+IN",		0,	0,			0 },
8657718be8SEnji Cooper { L"-IN",		0,	0,			0 },
8757718be8SEnji Cooper { L"INX",		0,	0,			0 },
8857718be8SEnji Cooper { L"+INX",		0,	0,			0 },
8957718be8SEnji Cooper { L"-INX",		0,	0,			0 },
9057718be8SEnji Cooper { L"INF",		3,	ALT_HUGE_VAL,		0 },
9157718be8SEnji Cooper { L"+INF",		4,	ALT_HUGE_VAL,		0 },
9257718be8SEnji Cooper { L"-INF",		4,	ALT_MINUS_HUGE_VAL,	0 },
9357718be8SEnji Cooper { L"INFX",		3,	ALT_HUGE_VAL,		0 },
9457718be8SEnji Cooper { L"+INFX",		4,	ALT_HUGE_VAL,		0 },
9557718be8SEnji Cooper { L"-INFX",		4,	ALT_MINUS_HUGE_VAL,	0 },
9657718be8SEnji Cooper { L"     IN",		0,	0,			0 },
9757718be8SEnji Cooper { L"     +IN",		0,	0,			0 },
9857718be8SEnji Cooper { L"     -IN",		0,	0,			0 },
9957718be8SEnji Cooper { L"     INX",		0,	0,			0 },
10057718be8SEnji Cooper { L"     +INX",		0,	0,			0 },
10157718be8SEnji Cooper { L"     -INX",		0,	0,			0 },
10257718be8SEnji Cooper { L"+     INF",		0,	0,			0 },
10357718be8SEnji Cooper { L"-     INF",		0,	0,			0 },
10457718be8SEnji Cooper { L"     INF",		8,	ALT_HUGE_VAL,		0 },
10557718be8SEnji Cooper { L"     +INF",		9,	ALT_HUGE_VAL,		0 },
10657718be8SEnji Cooper { L"     -INF",		9,	ALT_MINUS_HUGE_VAL,	0 },
10757718be8SEnji Cooper { L"     INFX",		8,	ALT_HUGE_VAL,		0 },
10857718be8SEnji Cooper { L"     +INFX",	9,	ALT_HUGE_VAL,		0 },
10957718be8SEnji Cooper { L"     -INFX",	9,	ALT_MINUS_HUGE_VAL,	0 },
11057718be8SEnji Cooper { L"     INFINIT",	8,	ALT_HUGE_VAL,		0 },
11157718be8SEnji Cooper { L"     +INFINIT",	9,	ALT_HUGE_VAL,		0 },
11257718be8SEnji Cooper { L"     -INFINIT",	9,	ALT_MINUS_HUGE_VAL,	0 },
11357718be8SEnji Cooper { L"     INFINITY",	13,	ALT_HUGE_VAL,		0 },
11457718be8SEnji Cooper { L"     +INFINITY",	14,	ALT_HUGE_VAL,		0 },
11557718be8SEnji Cooper { L"     -INFINITY",	14,	ALT_MINUS_HUGE_VAL,	0 },
11657718be8SEnji Cooper { L"     INFINITYX",	13,	ALT_HUGE_VAL,		0 },
11757718be8SEnji Cooper { L"     +INFINITYX",	14,	ALT_HUGE_VAL,		0 },
11857718be8SEnji Cooper { L"     -INFINITYX",	14,	ALT_MINUS_HUGE_VAL,	0 },
11957718be8SEnji Cooper 
12057718be8SEnji Cooper /* NAN */
12157718be8SEnji Cooper { L"NA",		0,	0,			0 },
12257718be8SEnji Cooper { L"+NA",		0,	0,			0 },
12357718be8SEnji Cooper { L"-NA",		0,	0,			0 },
12457718be8SEnji Cooper { L"NAX",		0,	0,			0 },
12557718be8SEnji Cooper { L"+NAX",		0,	0,			0 },
12657718be8SEnji Cooper { L"-NAX",		0,	0,			0 },
12757718be8SEnji Cooper { L"NAN",		3,	ALT_NAN,		0 },
12857718be8SEnji Cooper { L"+NAN",		4,	ALT_NAN,		0 },
12957718be8SEnji Cooper { L"-NAN",		4,	ALT_NAN,		0 },
13057718be8SEnji Cooper { L"NANX",		3,	ALT_NAN,		0 },
13157718be8SEnji Cooper { L"+NANX",		4,	ALT_NAN,		0 },
13257718be8SEnji Cooper { L"-NANX",		4,	ALT_NAN,		0 },
13357718be8SEnji Cooper { L"     NA",		0,	0,			0 },
13457718be8SEnji Cooper { L"     +NA",		0,	0,			0 },
13557718be8SEnji Cooper { L"     -NA",		0,	0,			0 },
13657718be8SEnji Cooper { L"     NAX",		0,	0,			0 },
13757718be8SEnji Cooper { L"     +NAX",		0,	0,			0 },
13857718be8SEnji Cooper { L"     -NAX",		0,	0,			0 },
13957718be8SEnji Cooper { L"+     NAN",		0,	0,			0 },
14057718be8SEnji Cooper { L"-     NAN",		0,	0,			0 },
14157718be8SEnji Cooper { L"     NAN",		8,	ALT_NAN,		0 },
14257718be8SEnji Cooper { L"     +NAN",		9,	ALT_NAN,		0 },
14357718be8SEnji Cooper { L"     -NAN",		9,	ALT_NAN,		0 },
14457718be8SEnji Cooper { L"     NANX",		8,	ALT_NAN,		0 },
14557718be8SEnji Cooper { L"     +NANX",	9,	ALT_NAN,		0 },
14657718be8SEnji Cooper { L"     -NANX",	9,	ALT_NAN,		0 },
14757718be8SEnji Cooper 
14857718be8SEnji Cooper { L"0",			1,	0,			0 },
14957718be8SEnji Cooper { L"+0",		2,	0,			0 },
15057718be8SEnji Cooper { L"-0",		2,	0,			0 },
15157718be8SEnji Cooper { L"          0",	11,	0,			0 },
15257718be8SEnji Cooper { L"          +0",	12,	0,			0 },
15357718be8SEnji Cooper { L"          -0",	12,	0,			0 },
15457718be8SEnji Cooper { L"+          0",	0,	0,			0 },
15557718be8SEnji Cooper { L"-          0",	0,	0,			0 },
15657718be8SEnji Cooper 
15757718be8SEnji Cooper { L".",			0,	0,			0 },
15857718be8SEnji Cooper { L".0",		2,	0,			0 },
15957718be8SEnji Cooper { L".00",		3,	0,			0 },
16057718be8SEnji Cooper { L".000",		4,	0,			0 },
16157718be8SEnji Cooper 
16257718be8SEnji Cooper { L"0.",		2,	0,			0 },
16357718be8SEnji Cooper { L"+0.",		3,	0,			0 },
16457718be8SEnji Cooper { L"-0.",		3,	0,			0 },
16557718be8SEnji Cooper { L"          0.",	12,	0,			0 },
16657718be8SEnji Cooper { L"          +0.",	13,	0,			0 },
16757718be8SEnji Cooper { L"          -0.",	13,	0,			0 },
16857718be8SEnji Cooper 
16957718be8SEnji Cooper { L"0.0",		3,	0,			0 },
17057718be8SEnji Cooper { L"+0.0",		4,	0,			0 },
17157718be8SEnji Cooper { L"-0.0",		4,	0,			0 },
17257718be8SEnji Cooper { L"          0.0",	13,	0,			0 },
17357718be8SEnji Cooper { L"          +0.0",	14,	0,			0 },
17457718be8SEnji Cooper { L"          -0.0",	14,	0,			0 },
17557718be8SEnji Cooper 
17657718be8SEnji Cooper { L"000",		3,	0,			0 },
17757718be8SEnji Cooper { L"+000",		4,	0,			0 },
17857718be8SEnji Cooper { L"-000",		4,	0,			0 },
17957718be8SEnji Cooper { L"          000",	13,	0,			0 },
18057718be8SEnji Cooper { L"          +000",	14,	0,			0 },
18157718be8SEnji Cooper { L"          -000",	14,	0,			0 },
18257718be8SEnji Cooper 
18357718be8SEnji Cooper { L"000.",		4,	0,			0 },
18457718be8SEnji Cooper { L"+000.",		5,	0,			0 },
18557718be8SEnji Cooper { L"-000.",		5,	0,			0 },
18657718be8SEnji Cooper { L"          000.",	14,	0,			0 },
18757718be8SEnji Cooper { L"          +000.",	15,	0,			0 },
18857718be8SEnji Cooper { L"          -000.",	15,	0,			0 },
18957718be8SEnji Cooper 
19057718be8SEnji Cooper { L"000.0",		5,	0,			0 },
19157718be8SEnji Cooper { L"+000.0",		6,	0,			0 },
19257718be8SEnji Cooper { L"-000.0",		6,	0,			0 },
19357718be8SEnji Cooper { L"          000.0",	15,	0,			0 },
19457718be8SEnji Cooper { L"          +000.0",	16,	0,			0 },
19557718be8SEnji Cooper { L"          -000.0",	16,	0,			0 },
19657718be8SEnji Cooper 
19757718be8SEnji Cooper 
19857718be8SEnji Cooper { L"0.0.",		3,	0,			0 },
19957718be8SEnji Cooper { L"+0.0.",		4,	0,			0 },
20057718be8SEnji Cooper { L"-0.0.",		4,	0,			0 },
20157718be8SEnji Cooper { L"          0.0.",	13,	0,			0 },
20257718be8SEnji Cooper { L"          +0.0.",	14,	0,			0 },
20357718be8SEnji Cooper { L"          -0.0.",	14,	0,			0 },
20457718be8SEnji Cooper 
20557718be8SEnji Cooper { L"0.0.0",		3,	0,			0 },
20657718be8SEnji Cooper { L"+0.0.0",		4,	0,			0 },
20757718be8SEnji Cooper { L"-0.0.0",		4,	0,			0 },
20857718be8SEnji Cooper { L"          0.0.0",	13,	0,			0 },
20957718be8SEnji Cooper { L"          +0.0.0",	14,	0,			0 },
21057718be8SEnji Cooper { L"          -0.0.0",	14,	0,			0 },
21157718be8SEnji Cooper 
21257718be8SEnji Cooper /* XXX: FIXME */
21357718be8SEnji Cooper #if defined(__linux__)
21457718be8SEnji Cooper { L"0X",		2,	0,			0 },
21557718be8SEnji Cooper { L"+0X",		3,	0,			0 },
21657718be8SEnji Cooper { L"-0X",		3,	0,			0 },
21757718be8SEnji Cooper #else
21857718be8SEnji Cooper { L"0X",		1,	0,			0 },
21957718be8SEnji Cooper { L"+0X",		2,	0,			0 },
22057718be8SEnji Cooper { L"-0X",		2,	0,			0 },
22157718be8SEnji Cooper #endif
22257718be8SEnji Cooper 
22357718be8SEnji Cooper /* XXX: SunOS 5.8's wcstod(3) doesn't accept hex */
22457718be8SEnji Cooper #if !defined(__SunOS__)
22557718be8SEnji Cooper #if defined(__linux__)
22657718be8SEnji Cooper { L"0X.",		3,	0,			0 },
22757718be8SEnji Cooper { L"+0X.",		4,	0,			0 },
22857718be8SEnji Cooper { L"-0X.",		4,	0,			0 },
22957718be8SEnji Cooper { L"          0X.",	13,	0,			0 },
23057718be8SEnji Cooper { L"          +0X.",	14,	0,			0 },
23157718be8SEnji Cooper { L"          -0X.",	14,	0,			0 },
23257718be8SEnji Cooper #else
23357718be8SEnji Cooper { L"0X.",		1,	0,			0 },
23457718be8SEnji Cooper { L"+0X.",		2,	0,			0 },
23557718be8SEnji Cooper { L"-0X.",		2,	0,			0 },
23657718be8SEnji Cooper { L"          0X.",	11,	0,			0 },
23757718be8SEnji Cooper { L"          +0X.",	12,	0,			0 },
23857718be8SEnji Cooper { L"          -0X.",	12,	0,			0 },
23957718be8SEnji Cooper #endif
24057718be8SEnji Cooper /* XXX: FIXME */
241effc3698SEnji Cooper #if defined(__NetBSD__) || defined(__linux__) || defined(__FreeBSD__)
24257718be8SEnji Cooper { L"0X.0",		4,	0,			0 },
24357718be8SEnji Cooper { L"+0X.0",		5,	0,			0 },
24457718be8SEnji Cooper { L"-0X.0",		5,	0,			0 },
24557718be8SEnji Cooper { L"          0X.0",	14,	0,			0 },
24657718be8SEnji Cooper { L"          +0X.0",	15,	0,			0 },
24757718be8SEnji Cooper { L"          -0X.0",	15,	0,			0 },
24857718be8SEnji Cooper 
24957718be8SEnji Cooper { L"0X.0P",		4,	0,			0 },
25057718be8SEnji Cooper { L"+0X.0P",		5,	0,			0 },
25157718be8SEnji Cooper { L"-0X.0P",		5,	0,			0 },
25257718be8SEnji Cooper { L"          0X.0P",	14,	0,			0 },
25357718be8SEnji Cooper { L"          +0X.0P",	15,	0,			0 },
25457718be8SEnji Cooper { L"          -0X.0P",	15,	0,			0 },
25557718be8SEnji Cooper #else
25657718be8SEnji Cooper { L"0X.0",		1,	0,			0 },
25757718be8SEnji Cooper { L"+0X.0",		2,	0,			0 },
25857718be8SEnji Cooper { L"-0X.0",		2,	0,			0 },
25957718be8SEnji Cooper { L"          0X.0",	11,	0,			0 },
26057718be8SEnji Cooper { L"          +0X.0",	12,	0,			0 },
26157718be8SEnji Cooper { L"          -0X.0",	12,	0,			0 },
26257718be8SEnji Cooper 
26357718be8SEnji Cooper { L"0X.0P",		1,	0,			0 },
26457718be8SEnji Cooper { L"+0X.0P",		2,	0,			0 },
26557718be8SEnji Cooper { L"-0X.0P",		2,	0,			0 },
26657718be8SEnji Cooper { L"          0X.0P",	11,	0,			0 },
26757718be8SEnji Cooper { L"          +0X.0P",	12,	0,			0 },
26857718be8SEnji Cooper { L"          -0X.0P",	12,	0,			0 },
26957718be8SEnji Cooper #endif
27057718be8SEnji Cooper 
27157718be8SEnji Cooper { L"0X0",		3,	0,			0 },
27257718be8SEnji Cooper { L"+0X0",		4,	0,			0 },
27357718be8SEnji Cooper { L"-0X0",		4,	0,			0 },
27457718be8SEnji Cooper { L"          0X0",	13,	0,			0 },
27557718be8SEnji Cooper { L"          +0X0",	14,	0,			0 },
27657718be8SEnji Cooper { L"          -0X0",	14,	0,			0 },
27757718be8SEnji Cooper 
27857718be8SEnji Cooper { L"00X0.0",		2,	0,			0 },
27957718be8SEnji Cooper { L"+00X0.0",		3,	0,			0 },
28057718be8SEnji Cooper { L"-00X0.0",		3,	0,			0 },
28157718be8SEnji Cooper { L"          00X0.0",	12,	0,			0 },
28257718be8SEnji Cooper { L"          +00X0.0",	13,	0,			0 },
28357718be8SEnji Cooper { L"          -00X0.0",	13,	0,			0 },
28457718be8SEnji Cooper 
28557718be8SEnji Cooper { L"0X0P",		3,	0,			0 },
28657718be8SEnji Cooper { L"+0X0P",		4,	0,			0 },
28757718be8SEnji Cooper { L"-0X0P",		4,	0,			0 },
28857718be8SEnji Cooper { L"          0X0P",	13,	0,			0 },
28957718be8SEnji Cooper { L"          +0X0P",	14,	0,			0 },
29057718be8SEnji Cooper { L"          -0X0P",	14,	0,			0 },
29157718be8SEnji Cooper 
29257718be8SEnji Cooper { L"0X0.",		4,	0,			0 },
29357718be8SEnji Cooper { L"+0X0.",		5,	0,			0 },
29457718be8SEnji Cooper { L"-0X0.",		5,	0,			0 },
29557718be8SEnji Cooper { L"          0X0.",	14,	0,			0 },
29657718be8SEnji Cooper { L"          +0X0.",	15,	0,			0 },
29757718be8SEnji Cooper { L"          -0X0.",	15,	0,			0 },
29857718be8SEnji Cooper 
29957718be8SEnji Cooper { L"0X0.0",		5,	0,			0 },
30057718be8SEnji Cooper { L"+0X0.0",		6,	0,			0 },
30157718be8SEnji Cooper { L"-0X0.0",		6,	0,			0 },
30257718be8SEnji Cooper { L"          0X0.0",	15,	0,			0 },
30357718be8SEnji Cooper { L"          +0X0.0",	16,	0,			0 },
30457718be8SEnji Cooper { L"          -0X0.0",	16,	0,			0 },
30557718be8SEnji Cooper 
30657718be8SEnji Cooper { L"0X0.P",		4,	0,			0 },
30757718be8SEnji Cooper { L"+0X0.P",		5,	0,			0 },
30857718be8SEnji Cooper { L"-0X0.P",		5,	0,			0 },
30957718be8SEnji Cooper { L"          0X0.P",	14,	0,			0 },
31057718be8SEnji Cooper { L"          +0X0.P",	15,	0,			0 },
31157718be8SEnji Cooper { L"          -0X0.P",	15,	0,			0 },
31257718be8SEnji Cooper 
31357718be8SEnji Cooper { L"0X0.P",		4,	0,			0 },
31457718be8SEnji Cooper { L"+0X0.P",		5,	0,			0 },
31557718be8SEnji Cooper { L"-0X0.P",		5,	0,			0 },
31657718be8SEnji Cooper { L"          0X0.P",	14,	0,			0 },
31757718be8SEnji Cooper { L"          +0X0.P",	15,	0,			0 },
31857718be8SEnji Cooper { L"          -0X0.P",	15,	0,			0 },
31957718be8SEnji Cooper 
32057718be8SEnji Cooper #endif
32157718be8SEnji Cooper { L"0.12345678",	10,	0.12345678,		0 },
32257718be8SEnji Cooper { L"+0.12345678",	11,	+0.12345678,		0 },
32357718be8SEnji Cooper { L"-0.12345678",	11,	-0.12345678,		0 },
32457718be8SEnji Cooper { L"     0.12345678",	15,	0.12345678,		0 },
32557718be8SEnji Cooper { L"     +0.12345678",	16,	+0.12345678,		0 },
32657718be8SEnji Cooper { L"     -0.12345678",	16,	-0.12345678,		0 },
32757718be8SEnji Cooper 
32857718be8SEnji Cooper { L"0.12345E67",	10,	0.12345E67,		0 },
32957718be8SEnji Cooper { L"+0.12345E67",	11,	+0.12345E67,		0 },
33057718be8SEnji Cooper { L"-0.12345E67",	11,	-0.12345E67,		0 },
33157718be8SEnji Cooper { L"     0.12345E67",	15,	0.12345E67,		0 },
33257718be8SEnji Cooper { L"     +0.12345E67",	16,	+0.12345E67,		0 },
33357718be8SEnji Cooper { L"     -0.12345E67",	16,	-0.12345E67,		0 },
33457718be8SEnji Cooper 
33557718be8SEnji Cooper { L"0.12345E+6",	10,	0.12345E+6,		0 },
33657718be8SEnji Cooper { L"+0.12345E+6",	11,	+0.12345E+6,		0 },
33757718be8SEnji Cooper { L"-0.12345E+6",	11,	-0.12345E+6,		0 },
33857718be8SEnji Cooper { L"     0.12345E+6",	15,	0.12345E+6,		0 },
33957718be8SEnji Cooper { L"     +0.12345E+6",	16,	+0.12345E+6,		0 },
34057718be8SEnji Cooper { L"     -0.12345E+6",	16,	-0.12345E+6,		0 },
34157718be8SEnji Cooper 
34257718be8SEnji Cooper { L"0.98765E-4",	10,	0.98765E-4,		0 },
34357718be8SEnji Cooper { L"+0.98765E-4",	11,	+0.98765E-4,		0 },
34457718be8SEnji Cooper { L"-0.98765E-4",	11,	-0.98765E-4,		0 },
34557718be8SEnji Cooper { L"     0.98765E-4",	15,	0.98765E-4,		0 },
34657718be8SEnji Cooper { L"     +0.98765E-4",	16,	+0.98765E-4,		0 },
34757718be8SEnji Cooper { L"     -0.98765E-4",	16,	-0.98765E-4,		0 },
34857718be8SEnji Cooper 
34957718be8SEnji Cooper { L"12345678E9",	10,	12345678E9,		0 },
35057718be8SEnji Cooper { L"+12345678E9",	11,	+12345678E9,		0 },
35157718be8SEnji Cooper { L"-12345678E9",	11,	-12345678E9,		0 },
35257718be8SEnji Cooper { L"     12345678E9",	15,	12345678E9,		0 },
35357718be8SEnji Cooper { L"     +12345678E9",	16,	+12345678E9,		0 },
35457718be8SEnji Cooper { L"     -12345678E9",	16,	-12345678E9,		0 },
35557718be8SEnji Cooper 
35657718be8SEnji Cooper /* XXX: SunOS 5.8's wcstod(3) doesn't accept hex */
35757718be8SEnji Cooper #if !defined(__SunOS__)
35857718be8SEnji Cooper { L"0x1P+2",		6,	4,			0 },
35957718be8SEnji Cooper { L"+0x1P+2",		7,	+4,			0 },
36057718be8SEnji Cooper { L"-0x1P+2",		7,	-4,			0 },
36157718be8SEnji Cooper { L"     0x1P+2",	11,	4,			0 },
36257718be8SEnji Cooper { L"     +0x1P+2",	12,	+4,			0 },
36357718be8SEnji Cooper { L"     -0x1P+2",	12,	-4,			0 },
36457718be8SEnji Cooper 
36557718be8SEnji Cooper { L"0x1.0P+2",		8,	4,			0 },
36657718be8SEnji Cooper { L"+0x1.0P+2",		9,	+4,			0 },
36757718be8SEnji Cooper { L"-0x1.0P+2",		9,	-4,			0 },
36857718be8SEnji Cooper { L"     0x1.0P+2",	13,	4,			0 },
36957718be8SEnji Cooper { L"     +0x1.0P+2",	14,	+4,			0 },
37057718be8SEnji Cooper { L"     -0x1.0P+2",	14,	-4,			0 },
37157718be8SEnji Cooper 
37257718be8SEnji Cooper { L"0x1P-2",		6,	0.25,			0 },
37357718be8SEnji Cooper { L"+0x1P-2",		7,	+0.25,			0 },
37457718be8SEnji Cooper { L"-0x1P-2",		7,	-0.25,			0 },
37557718be8SEnji Cooper { L"     0x1P-2",	11,	0.25,			0 },
37657718be8SEnji Cooper { L"     +0x1P-2",	12,	+0.25,			0 },
37757718be8SEnji Cooper { L"     -0x1P-2",	12,	-0.25,			0 },
37857718be8SEnji Cooper 
37957718be8SEnji Cooper { L"0x1.0P-2",		8,	0.25,			0 },
38057718be8SEnji Cooper { L"+0x1.0P-2",		9,	+0.25,			0 },
38157718be8SEnji Cooper { L"-0x1.0P-2",		9,	-0.25,			0 },
38257718be8SEnji Cooper { L"     0x1.0P-2",	13,	0.25,			0 },
38357718be8SEnji Cooper { L"     +0x1.0P-2",	14,	+0.25,			0 },
38457718be8SEnji Cooper { L"     -0x1.0P-2",	14,	-0.25,			0 },
38557718be8SEnji Cooper #endif
38657718be8SEnji Cooper 
38757718be8SEnji Cooper { NULL, 0, 0, 0 }
38857718be8SEnji Cooper };
38957718be8SEnji Cooper #endif /* !defined(__vax__) */
39057718be8SEnji Cooper 
39157718be8SEnji Cooper ATF_TC(wcstod);
ATF_TC_HEAD(wcstod,tc)39257718be8SEnji Cooper ATF_TC_HEAD(wcstod, tc)
39357718be8SEnji Cooper {
39457718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Checks wcstod(3)");
39557718be8SEnji Cooper }
ATF_TC_BODY(wcstod,tc)39657718be8SEnji Cooper ATF_TC_BODY(wcstod, tc)
39757718be8SEnji Cooper {
39857718be8SEnji Cooper #if defined(__vax__)
39957718be8SEnji Cooper #else
40057718be8SEnji Cooper 	struct test *t;
40157718be8SEnji Cooper #endif
40257718be8SEnji Cooper 
40357718be8SEnji Cooper #if !defined(__vax__)
40457718be8SEnji Cooper 	for (t = &tests[0]; t->wcs != NULL; ++t) {
40557718be8SEnji Cooper 		double d;
40657718be8SEnji Cooper 		size_t n;
40757718be8SEnji Cooper 		wchar_t *tail;
40857718be8SEnji Cooper 		char *buf;
40957718be8SEnji Cooper 
41057718be8SEnji Cooper 		/* we do not supported %ls nor %S yet. */
41157718be8SEnji Cooper 		n = wcstombs(NULL, t->wcs, 0);
41257718be8SEnji Cooper 		ATF_REQUIRE((buf = (void *)malloc(n + 1)) != NULL);
41357718be8SEnji Cooper 		(void)wcstombs(buf, t->wcs, n + 1);
41457718be8SEnji Cooper 		(void)printf("Checking wcstod(\"%s\", &tail):\n", buf);
41557718be8SEnji Cooper 		free(buf);
41657718be8SEnji Cooper 
41757718be8SEnji Cooper 		errno = 0;
41857718be8SEnji Cooper 		d = wcstod(t->wcs, &tail);
41957718be8SEnji Cooper 		(void)printf("[errno]\n");
42057718be8SEnji Cooper 		(void)printf("  got     : %s\n", strerror(errno));
42157718be8SEnji Cooper 		(void)printf("  expected: %s\n", strerror(t->err));
42257718be8SEnji Cooper 		ATF_REQUIRE_EQ(errno, t->err);
42357718be8SEnji Cooper 
42457718be8SEnji Cooper 		n = (size_t)(tail - t->wcs);
42557718be8SEnji Cooper 		(void)printf("[endptr - nptr]\n");
42657718be8SEnji Cooper 		(void)printf("  got     : %zd\n", n);
42757718be8SEnji Cooper 		(void)printf("  expected: %zd\n", t->len);
42857718be8SEnji Cooper 		ATF_REQUIRE_EQ(n, t->len);
42957718be8SEnji Cooper 
43057718be8SEnji Cooper 		(void)printf("[result]\n");
43157718be8SEnji Cooper 		(void)printf("  real:     %F\n", d);
43257718be8SEnji Cooper 		if (t->val == ALT_HUGE_VAL) {
43357718be8SEnji Cooper 			(void)printf("  expected: %F\n", HUGE_VAL);
43457718be8SEnji Cooper 			ATF_REQUIRE(isinf(d));
43557718be8SEnji Cooper 			ATF_REQUIRE_EQ(d, HUGE_VAL);
43657718be8SEnji Cooper 		} else if (t->val == ALT_MINUS_HUGE_VAL) {
43757718be8SEnji Cooper 			(void)printf("  expected: %F\n", -HUGE_VAL);
43857718be8SEnji Cooper 			ATF_REQUIRE(isinf(d));
43957718be8SEnji Cooper 			ATF_REQUIRE_EQ(d, -HUGE_VAL);
44057718be8SEnji Cooper 		} else if (t->val == ALT_NAN) {
44157718be8SEnji Cooper 			(void)printf("  expected: %F\n", NAN);
44257718be8SEnji Cooper 			ATF_REQUIRE(isnan(d));
44357718be8SEnji Cooper 		} else {
44457718be8SEnji Cooper 			(void)printf("  expected: %F\n", t->val);
44557718be8SEnji Cooper 			ATF_REQUIRE_EQ(d, t->val);
44657718be8SEnji Cooper 		}
44757718be8SEnji Cooper 
44857718be8SEnji Cooper 		(void)printf("\n");
44957718be8SEnji Cooper 	}
45057718be8SEnji Cooper #else /* !defined(__vax__) */
45157718be8SEnji Cooper 	atf_tc_skip("Test is unavailable on vax.");
45257718be8SEnji Cooper #endif /* !defined(__vax__) */
45357718be8SEnji Cooper }
45457718be8SEnji Cooper 
ATF_TP_ADD_TCS(tp)45557718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
45657718be8SEnji Cooper {
45757718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, wcstod);
45857718be8SEnji Cooper 
45957718be8SEnji Cooper 	return atf_no_error();
46057718be8SEnji Cooper }
461