1538aa54Garrett D'Amore/*
2538aa54Garrett D'Amore * This file and its contents are supplied under the terms of the
3538aa54Garrett D'Amore * Common Development and Distribution License ("CDDL"), version 1.0.
4538aa54Garrett D'Amore * You may only use this file in accordance with the terms of version
5538aa54Garrett D'Amore * 1.0 of the CDDL.
6538aa54Garrett D'Amore *
7538aa54Garrett D'Amore * A full copy of the text of the CDDL should have accompanied this
8538aa54Garrett D'Amore * source.  A copy of the CDDL is also available via the Internet at
9538aa54Garrett D'Amore * http://www.illumos.org/license/CDDL.
10538aa54Garrett D'Amore */
11538aa54Garrett D'Amore
12538aa54Garrett D'Amore/*
13538aa54Garrett D'Amore * Copyright 2014 Garrett D'Amore <garrett@damore.org>
14538aa54Garrett D'Amore */
15538aa54Garrett D'Amore
16538aa54Garrett D'Amore/*
17538aa54Garrett D'Amore * This program tests that wcsrtombs and friends work properly.
18538aa54Garrett D'Amore * In order for it to work, it requires that some additional locales
19538aa54Garrett D'Amore * be installed.
20538aa54Garrett D'Amore */
21538aa54Garrett D'Amore
22538aa54Garrett D'Amore#include <stdio.h>
23538aa54Garrett D'Amore#include <stdlib.h>
24538aa54Garrett D'Amore#include <string.h>
25538aa54Garrett D'Amore#include <locale.h>
26538aa54Garrett D'Amore#include <wchar.h>
27538aa54Garrett D'Amore#include <err.h>
28538aa54Garrett D'Amore#include <errno.h>
29538aa54Garrett D'Amore#include <unistd.h>
30538aa54Garrett D'Amore#include <xlocale.h>
31538aa54Garrett D'Amore#include <note.h>
32538aa54Garrett D'Amore#include "test_common.h"
33538aa54Garrett D'Amore
34538aa54Garrett D'Amoreint extra_debug = 0;
35538aa54Garrett D'Amore
36538aa54Garrett D'Amore#define	NUMTHR	300
37538aa54Garrett D'Amore#define	NUMITR	300
38538aa54Garrett D'Amore
39538aa54Garrett D'Amore/*
40538aa54Garrett D'Amore * Note that this file is easiest edited with a UTF-8 capable editor,
41538aa54Garrett D'Amore * as there are embedded UTF-8 symbols in some of the strings.
42538aa54Garrett D'Amore */
43538aa54Garrett D'Amorestruct wcsrtombs_test {
44538aa54Garrett D'Amore	char		mbs[32];
45538aa54Garrett D'Amore	wchar_t		wcs[32];
46538aa54Garrett D'Amore};
47538aa54Garrett D'Amore
48538aa54Garrett D'Amore#define	TESTING_MBS	"TESTING"
49538aa54Garrett D'Amore#define	TESTING_WCS 	{ 'T', 'E', 'S', 'T', 'I', 'N', 'G', 0 }
50538aa54Garrett D'Amore#define	HELLO_RU_MBS	"������������"
51538aa54Garrett D'Amore#define	HELLO_RU_WCS	{ 1055, 1056, 1048, 1042, 1045, 1058, 0 }
52538aa54Garrett D'Amore#define	HELLO_EN_MBS	"HELLO"
53538aa54Garrett D'Amore#define	HELLO_EN_WCS	{ 'H', 'E', 'L', 'L', 'O', 0 }
54538aa54Garrett D'Amore
55538aa54Garrett D'Amore/* Unicode values never have the high order bit set */
56538aa54Garrett D'Amore#define	BAD_WCS		{ 'B', 'A', 'D', (wchar_t)0xf000f000, 'W', 'C', 'S' }
57538aa54Garrett D'Amore
58538aa54Garrett D'Amorestruct wcsrtombs_test C_data[] = {
59538aa54Garrett D'Amore	{ TESTING_MBS,	TESTING_WCS },
60538aa54Garrett D'Amore	{ HELLO_EN_MBS,	HELLO_EN_WCS },
61538aa54Garrett D'Amore	{ 0, 0 },
62538aa54Garrett D'Amore};
63538aa54Garrett D'Amore
64538aa54Garrett D'Amorestruct wcsrtombs_test utf8_data[] = {
65538aa54Garrett D'Amore	{ TESTING_MBS,	TESTING_WCS },
66538aa54Garrett D'Amore	{ HELLO_EN_MBS,	HELLO_EN_WCS },
67538aa54Garrett D'Amore	{ HELLO_RU_MBS,	HELLO_RU_WCS },
68538aa54Garrett D'Amore	{ 0, 0 },
69538aa54Garrett D'Amore};
70538aa54Garrett D'Amore
71538aa54Garrett D'Amorestruct {
72538aa54Garrett D'Amore	const char *locale;
73538aa54Garrett D'Amore	struct wcsrtombs_test *test;
74538aa54Garrett D'Amore} locales[] =  {
75538aa54Garrett D'Amore	{ "C",			C_data },
76538aa54Garrett D'Amore	{ "en_US.UTF-8",	utf8_data },
77538aa54Garrett D'Amore	{ NULL, 		NULL }
78538aa54Garrett D'Amore};
79538aa54Garrett D'Amore
80538aa54Garrett D'Amorevoid
81538aa54Garrett D'Amoretest_wcsrtombs_1(const char *locale, struct wcsrtombs_test *test)
82538aa54Garrett D'Amore{
83538aa54Garrett D'Amore	test_t		t;
84538aa54Garrett D'Amore	char 		*v;
85538aa54Garrett D'Amore	mbstate_t	ms;
86538aa54Garrett D'Amore
87538aa54Garrett D'Amore	t = test_start("wcsrtombs (locale %s)", locale);
88538aa54Garrett D'Amore
89538aa54Garrett D'Amore	v = setlocale(LC_ALL, locale);
90538aa54Garrett D'Amore	if (v == NULL) {
91538aa54Garrett D'Amore		test_failed(t, "setlocale failed: %s", strerror(errno));
92538aa54Garrett D'Amore	}
93538aa54Garrett D'Amore	if (strcmp(v, locale) != 0) {
94538aa54Garrett D'Amore		test_failed(t, "setlocale got %s instead of %s", v, locale);
95538aa54Garrett D'Amore	}
96538aa54Garrett D'Amore
97538aa54Garrett D'Amore	for (int i = 0; test[i].mbs[0] != 0; i++) {
98538aa54Garrett D'Amore		char mbs[32];
99538aa54Garrett D'Amore		const wchar_t *wcs = test[i].wcs;
100538aa54Garrett D'Amore		size_t cnt;
101538aa54Garrett D'Amore
102538aa54Garrett D'Amore		(void) memset(&ms, 0, sizeof (ms));
103538aa54Garrett D'Amore		(void) memset(mbs, 0, sizeof (mbs));
104538aa54Garrett D'Amore		cnt = wcsrtombs(mbs, &wcs, sizeof (mbs), &ms);
105538aa54Garrett D'Amore		if (cnt != strlen(test[i].mbs)) {
106538aa54Garrett D'Amore			test_failed(t, "incorrect return value: %d != %d",
107538aa54Garrett D'Amore			    cnt, strlen(test[i].mbs));
108538aa54Garrett D'Amore		}
109538aa54Garrett D'Amore		if (strcmp(mbs, test[i].mbs) != 0) {
110538aa54Garrett D'Amore			test_failed(t, "wrong result: %s != %s",
111538aa54Garrett D'Amore			    mbs, test[i].mbs);
112538aa54Garrett D'Amore		}
113538aa54Garrett D'Amore		if (extra_debug) {
114538aa54Garrett D'Amore			test_debugf(t, "mbs is %s", mbs);
115538aa54Garrett D'Amore		}
116538aa54Garrett D'Amore	}
117538aa54Garrett D'Amore	test_passed(t);
118538aa54Garrett D'Amore}
119538aa54Garrett D'Amore
120538aa54Garrett D'Amorevoid
121538aa54Garrett D'Amoretest_wcsrtombs_l(const char *locale, struct wcsrtombs_test *test)
122538aa54Garrett D'Amore{
123538aa54Garrett D'Amore	test_t	t;
124538aa54Garrett D'Amore	locale_t loc;
125538aa54Garrett D'Amore	char 	*v;
126538aa54Garrett D'Amore	mbstate_t	ms;
127538aa54Garrett D'Amore
128538aa54Garrett D'Amore	t = test_start("wcsrtombs_l (locale %s)", locale);
129538aa54Garrett D'Amore
130538aa54Garrett D'Amore	v = setlocale(LC_ALL, "C");
131538aa54Garrett D'Amore	if (v == NULL) {
132538aa54Garrett D'Amore		test_failed(t, "setlocale failed: %s", strerror(errno));
133538aa54Garrett D'Amore	}
134538aa54Garrett D'Amore	if (strcmp(v, "C") != 0) {
135538aa54Garrett D'Amore		test_failed(t, "setlocale got %s instead of %s", v, "C");
136538aa54Garrett D'Amore	}
137538aa54Garrett D'Amore
138538aa54Garrett D'Amore	loc = newlocale(LC_ALL_MASK, locale, NULL);
139538aa54Garrett D'Amore	if (loc == NULL) {
140538aa54Garrett D'Amore		test_failed(t, "newlocale failed: %s", strerror(errno));
141538aa54Garrett D'Amore	}
142538aa54Garrett D'Amore
143538aa54Garrett D'Amore	for (int i = 0; test[i].mbs[0] != 0; i++) {
144538aa54Garrett D'Amore		char mbs[32];
145538aa54Garrett D'Amore		const wchar_t *wcs = test[i].wcs;
146538aa54Garrett D'Amore		size_t cnt;
147538aa54Garrett D'Amore
148538aa54Garrett D'Amore		(void) memset(&ms, 0, sizeof (ms));
149538aa54Garrett D'Amore		(void) memset(mbs, 0, sizeof (mbs));
150538aa54Garrett D'Amore		cnt = wcsrtombs_l(mbs, &wcs, sizeof (mbs), &ms, loc);
151538aa54Garrett D'Amore		if (cnt != strlen(test[i].mbs)) {
152538aa54Garrett D'Amore			test_failed(t, "incorrect return value: %d != %d",
153538aa54Garrett D'Amore			    cnt, strlen(test[i].mbs));
154538aa54Garrett D'Amore		}
155538aa54Garrett D'Amore		if (strcmp(mbs, test[i].mbs) != 0) {
156538aa54Garrett D'Amore			test_failed(t, "wrong result: %s != %s", mbs,
157538aa54Garrett D'Amore			    test[i].mbs);
158538aa54Garrett D'Amore		}
159538aa54Garrett D'Amore		if (extra_debug) {
160538aa54Garrett D'Amore			test_debugf(t, "mbs is %s", mbs);
161538aa54Garrett D'Amore		}
162538aa54Garrett D'Amore	}
163538aa54Garrett D'Amore	test_passed(t);
164538aa54Garrett D'Amore}
165538aa54Garrett D'Amore
166538aa54Garrett D'Amorevoid
167538aa54Garrett D'Amoretest_wcsrtombs_thr_iter(test_t t, const char *locale,
168538aa54Garrett D'Amore    struct wcsrtombs_test *test)
169538aa54Garrett D'Amore{
170538aa54Garrett D'Amore	locale_t loc;
171538aa54Garrett D'Amore	mbstate_t	ms;
172538aa54Garrett D'Amore
173538aa54Garrett D'Amore	loc = newlocale(LC_ALL_MASK, locale, NULL);
174538aa54Garrett D'Amore	if (loc == NULL) {
175538aa54Garrett D'Amore		test_failed(t, "newlocale failed: %s", strerror(errno));
176538aa54Garrett D'Amore	}
177538aa54Garrett D'Amore
178538aa54Garrett D'Amore	for (int i = 0; test[i].mbs[0] != 0; i++) {
179538aa54Garrett D'Amore		char mbs[32];
180538aa54Garrett D'Amore		const wchar_t *wcs = test[i].wcs;
181538aa54Garrett D'Amore		size_t cnt;
182538aa54Garrett D'Amore
183538aa54Garrett D'Amore		(void) memset(&ms, 0, sizeof (ms));
184538aa54Garrett D'Amore		(void) memset(mbs, 0, sizeof (mbs));
185538aa54Garrett D'Amore		cnt = wcsrtombs_l(mbs, &wcs, sizeof (mbs), &ms, loc);
186538aa54Garrett D'Amore		if (cnt != strlen(test[i].mbs)) {
187538aa54Garrett D'Amore			test_failed(t, "incorrect return value: %d != %d",
188538aa54Garrett D'Amore			    cnt, strlen(test[i].mbs));
189538aa54Garrett D'Amore		}
190538aa54Garrett D'Amore		if (strcmp(mbs, test[i].mbs) != 0) {
191538aa54Garrett D'Amore			test_failed(t, "wrong result: %s != %s", mbs,
192538aa54Garrett D'Amore			    test[i].mbs);
193538aa54Garrett D'Amore		}
194538aa54Garrett D'Amore		if (extra_debug) {
195538aa54Garrett D'Amore			test_debugf(t, "mbs is %s", mbs);
196538aa54Garrett D'Amore		}
197538aa54Garrett D'Amore	}
198538aa54Garrett D'Amore
199538aa54Garrett D'Amore	freelocale(loc);
200538aa54Garrett D'Amore}
201538aa54Garrett D'Amore
202538aa54Garrett D'Amorevoid
203538aa54Garrett D'Amoretest_wcsrtombs_thr_work(test_t t, void *arg)
204538aa54Garrett D'Amore{
205538aa54Garrett D'Amore	_NOTE(ARGUNUSED(arg));
206538aa54Garrett D'Amore	for (int j = 0; j < NUMITR; j++) {
207538aa54Garrett D'Amore		test_debugf(t, "iteration %d", j);
208538aa54Garrett D'Amore		for (int i = 0; locales[i].locale != NULL; i++) {
209538aa54Garrett D'Amore			test_wcsrtombs_thr_iter(t, locales[i].locale,
210538aa54Garrett D'Amore			    locales[i].test);
211538aa54Garrett D'Amore		}
212538aa54Garrett D'Amore	}
213538aa54Garrett D'Amore	test_passed(t);
214538aa54Garrett D'Amore}
215538aa54Garrett D'Amore
216538aa54Garrett D'Amorevoid
217538aa54Garrett D'Amoretest_wcsrtombs_threaded(void)
218538aa54Garrett D'Amore{
219538aa54Garrett D'Amore	(void) setlocale(LC_ALL, "C");
220538aa54Garrett D'Amore	test_run(NUMTHR, test_wcsrtombs_thr_work, NULL, "wcsrtombs_threaded");
221538aa54Garrett D'Amore}
222538aa54Garrett D'Amore
223538aa54Garrett D'Amorevoid
224538aa54Garrett D'Amoretest_wcsrtombs_partial(void)
225538aa54Garrett D'Amore{
226538aa54Garrett D'Amore	test_t		t;
227538aa54Garrett D'Amore	mbstate_t	ms;
228538aa54Garrett D'Amore	wchar_t		src[32] = HELLO_RU_WCS;
229538aa54Garrett D'Amore	char		mbs[32];
230538aa54Garrett D'Amore	char		*dst;
231538aa54Garrett D'Amore	const wchar_t	*wcs;
232538aa54Garrett D'Amore	size_t 		cnt;
233538aa54Garrett D'Amore
234538aa54Garrett D'Amore
235538aa54Garrett D'Amore	(void) memset(&ms, 0, sizeof (ms));
236538aa54Garrett D'Amore	t = test_start("wcsrtombs_partial");
237538aa54Garrett D'Amore
238538aa54Garrett D'Amore	if (setlocale(LC_ALL, "ru_RU.UTF-8") == NULL) {
239538aa54Garrett D'Amore		test_failed(t, "setlocale failed: %s", strerror(errno));
240538aa54Garrett D'Amore	}
241538aa54Garrett D'Amore
242538aa54Garrett D'Amore	wcs = src;
243538aa54Garrett D'Amore	dst = mbs;
244538aa54Garrett D'Amore	cnt = wcsrtombs(dst, &wcs, 1, &ms);
245538aa54Garrett D'Amore	if (cnt != 0) {
246538aa54Garrett D'Amore		test_failed(t, "gave back a conversion cnt %d != 0", cnt);
247538aa54Garrett D'Amore	}
248538aa54Garrett D'Amore	if (wcs != src) {
249538aa54Garrett D'Amore		test_failed(t, "incorrectly advanced wcs");
250538aa54Garrett D'Amore	}
251538aa54Garrett D'Amore
252538aa54Garrett D'Amore	cnt = wcsrtombs(dst, &wcs, 2, &ms);
253538aa54Garrett D'Amore	if (cnt != 2) {
254538aa54Garrett D'Amore		test_failed(t, "gave back a conversion cnt %d != 2", cnt);
255538aa54Garrett D'Amore	}
256538aa54Garrett D'Amore	dst += cnt;
257538aa54Garrett D'Amore
258538aa54Garrett D'Amore	cnt = wcsrtombs(dst, &wcs, 4, &ms);
259538aa54Garrett D'Amore	dst += cnt;
260538aa54Garrett D'Amore
261538aa54Garrett D'Amore	cnt = wcsrtombs(dst, &wcs, sizeof (mbs) - strlen(mbs), &ms);
262538aa54Garrett D'Amore	if (extra_debug) {
263538aa54Garrett D'Amore		test_debugf(t, "mbs is %s", mbs);
264538aa54Garrett D'Amore	}
265538aa54Garrett D'Amore	if (strcmp(mbs, HELLO_RU_MBS) != 0) {
266538aa54Garrett D'Amore		test_failed(t, "wrong result: %s != %s", mbs, HELLO_RU_MBS);
267538aa54Garrett D'Amore	}
268538aa54Garrett D'Amore	test_passed(t);
269538aa54Garrett D'Amore}
270538aa54Garrett D'Amore
271538aa54Garrett D'Amorevoid
272538aa54Garrett D'Amoretest_wcsrtombs_negative(void)
273538aa54Garrett D'Amore{
274538aa54Garrett D'Amore	mbstate_t	ms;
275538aa54Garrett D'Amore	const wchar_t	*wcs;
276538aa54Garrett D'Amore	char		mbs[32];
277538aa54Garrett D'Amore	char		*dst;
278538aa54Garrett D'Amore	int		e;
279538aa54Garrett D'Amore	wchar_t		src[32] = BAD_WCS;
280538aa54Garrett D'Amore	test_t		t;
281538aa54Garrett D'Amore	int		cnt;
282538aa54Garrett D'Amore
283538aa54Garrett D'Amore	t = test_start("wcsrtombs_negative");
284538aa54Garrett D'Amore
285538aa54Garrett D'Amore	(void) memset(&ms, 0, sizeof (ms));
286538aa54Garrett D'Amore	if (setlocale(LC_ALL, "ru_RU.UTF-8") == NULL) {
287538aa54Garrett D'Amore		test_failed(t, "setlocale failed: %s", strerror(errno));
288538aa54Garrett D'Amore	}
289538aa54Garrett D'Amore
290538aa54Garrett D'Amore	wcs = src;
291538aa54Garrett D'Amore	dst = mbs;
292538aa54Garrett D'Amore	cnt = wcsrtombs(dst, &wcs, sizeof (mbs), &ms);
293538aa54Garrett D'Amore	if (cnt != -1) {
294538aa54Garrett D'Amore		test_failed(t, "bogus success (%d)", cnt);
295538aa54Garrett D'Amore	}
296538aa54Garrett D'Amore	if ((e = errno) != EILSEQ) {
297538aa54Garrett D'Amore		test_failed(t, "wrong errno, wanted %d (EILSEQ), got %d: %s",
298538aa54Garrett D'Amore		    EILSEQ, e, strerror(e));
299538aa54Garrett D'Amore	}
300538aa54Garrett D'Amore	test_passed(t);
301538aa54Garrett D'Amore}
302538aa54Garrett D'Amore
303538aa54Garrett D'Amorevoid
304538aa54Garrett D'Amoretest_wcsnrtombs_partial(void)
305538aa54Garrett D'Amore{
306538aa54Garrett D'Amore	test_t		t;
307538aa54Garrett D'Amore	mbstate_t	ms;
308538aa54Garrett D'Amore	wchar_t		src[32] = HELLO_RU_WCS;
309538aa54Garrett D'Amore	char		mbs[32];
310538aa54Garrett D'Amore	char		*dst;
311538aa54Garrett D'Amore	const wchar_t	*wcs;
312538aa54Garrett D'Amore	size_t 		cnt;
313538aa54Garrett D'Amore
314538aa54Garrett D'Amore
315538aa54Garrett D'Amore	(void) memset(&ms, 0, sizeof (ms));
316538aa54Garrett D'Amore	t = test_start("wcsrntombs_partial");
317538aa54Garrett D'Amore
318538aa54Garrett D'Amore	if (setlocale(LC_ALL, "ru_RU.UTF-8") == NULL) {
319538aa54Garrett D'Amore		test_failed(t, "setlocale failed: %s", strerror(errno));
320538aa54Garrett D'Amore	}
321538aa54Garrett D'Amore
322538aa54Garrett D'Amore	wcs = src;
323538aa54Garrett D'Amore	dst = mbs;
324538aa54Garrett D'Amore	cnt = wcsnrtombs(dst, &wcs, 1, 1, &ms);
325538aa54Garrett D'Amore	if (cnt != 0) {
326538aa54Garrett D'Amore		test_failed(t, "gave back a conversion cnt %d != 0", cnt);
327538aa54Garrett D'Amore	}
328538aa54Garrett D'Amore	if (wcs != src) {
329538aa54Garrett D'Amore		test_failed(t, "incorrectly advanced wcs");
330538aa54Garrett D'Amore	}
331538aa54Garrett D'Amore
332538aa54Garrett D'Amore	/* we should get just 2 wide characters (expanding to 4 bytes) */
333538aa54Garrett D'Amore	cnt = wcsnrtombs(dst, &wcs, 2, sizeof (mbs), &ms);
334538aa54Garrett D'Amore	if (cnt != 4) {
335538aa54Garrett D'Amore		test_failed(t, "gave back a conversion cnt %d != 4", cnt);
336538aa54Garrett D'Amore	}
337538aa54Garrett D'Amore	dst += cnt;
338538aa54Garrett D'Amore
339538aa54Garrett D'Amore	cnt = wcsnrtombs(dst, &wcs, 32, sizeof (mbs) - strlen(mbs), &ms);
340538aa54Garrett D'Amore	if (extra_debug) {
341538aa54Garrett D'Amore		test_debugf(t, "mbs is %s", mbs);
342538aa54Garrett D'Amore	}
343538aa54Garrett D'Amore	if (strcmp(mbs, HELLO_RU_MBS) != 0) {
344538aa54Garrett D'Amore		test_failed(t, "wrong result: %s != %s", mbs, HELLO_RU_MBS);
345538aa54Garrett D'Amore	}
346538aa54Garrett D'Amore	test_passed(t);
347538aa54Garrett D'Amore}
348538aa54Garrett D'Amore
349538aa54Garrett D'Amorevoid
350538aa54Garrett D'Amoretest_wcsrtombs(void)
351538aa54Garrett D'Amore{
352538aa54Garrett D'Amore	for (int i = 0; locales[i].locale != NULL; i++) {
353538aa54Garrett D'Amore		test_wcsrtombs_1(locales[i].locale, locales[i].test);
354538aa54Garrett D'Amore		test_wcsrtombs_l(locales[i].locale, locales[i].test);
355538aa54Garrett D'Amore	}
356538aa54Garrett D'Amore}
357538aa54Garrett D'Amore
358538aa54Garrett D'Amoreint
359538aa54Garrett D'Amoremain(int argc, char **argv)
360538aa54Garrett D'Amore{
361538aa54Garrett D'Amore	int optc;
362538aa54Garrett D'Amore
363538aa54Garrett D'Amore	while ((optc = getopt(argc, argv, "dfD")) != EOF) {
364538aa54Garrett D'Amore		switch (optc) {
365538aa54Garrett D'Amore		case 'd':
366538aa54Garrett D'Amore			test_set_debug();
367538aa54Garrett D'Amore			break;
368538aa54Garrett D'Amore		case 'f':
369538aa54Garrett D'Amore			test_set_force();
370538aa54Garrett D'Amore			break;
371538aa54Garrett D'Amore		case 'D':
372538aa54Garrett D'Amore			test_set_debug();
373538aa54Garrett D'Amore			extra_debug++;
374538aa54Garrett D'Amore			break;
375538aa54Garrett D'Amore		default:
376538aa54Garrett D'Amore			(void) fprintf(stderr, "Usage: %s [-dfD]\n", argv[0]);
377538aa54Garrett D'Amore			exit(1);
378538aa54Garrett D'Amore		}
379538aa54Garrett D'Amore	}
380538aa54Garrett D'Amore
381538aa54Garrett D'Amore	test_wcsrtombs();
382538aa54Garrett D'Amore	test_wcsrtombs_partial();
383538aa54Garrett D'Amore	test_wcsrtombs_negative();
384538aa54Garrett D'Amore	test_wcsrtombs_threaded();
385538aa54Garrett D'Amore	test_wcsnrtombs_partial();
386538aa54Garrett D'Amore
387538aa54Garrett D'Amore	exit(0);
388538aa54Garrett D'Amore}