xref: /netbsd-src/lib/libc/locale/multibyte_c90.c (revision 2933c534644848bf783a67fcb47a7e3e913f8ad2)
1*2933c534Sjoerg /*	$NetBSD: multibyte_c90.c,v 1.12 2013/08/18 20:03:48 joerg Exp $	*/
2dc7d18ffStshiozak 
3dc7d18ffStshiozak /*-
452ed7b03Stnozaki  * Copyright (c)2002, 2008 Citrus Project,
5dc7d18ffStshiozak  * All rights reserved.
6dc7d18ffStshiozak  *
7dc7d18ffStshiozak  * Redistribution and use in source and binary forms, with or without
8dc7d18ffStshiozak  * modification, are permitted provided that the following conditions
9dc7d18ffStshiozak  * are met:
10dc7d18ffStshiozak  * 1. Redistributions of source code must retain the above copyright
11dc7d18ffStshiozak  *    notice, this list of conditions and the following disclaimer.
12dc7d18ffStshiozak  * 2. Redistributions in binary form must reproduce the above copyright
13dc7d18ffStshiozak  *    notice, this list of conditions and the following disclaimer in the
14dc7d18ffStshiozak  *    documentation and/or other materials provided with the distribution.
15dc7d18ffStshiozak  *
16dc7d18ffStshiozak  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17dc7d18ffStshiozak  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18dc7d18ffStshiozak  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19dc7d18ffStshiozak  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20dc7d18ffStshiozak  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21dc7d18ffStshiozak  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22dc7d18ffStshiozak  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23dc7d18ffStshiozak  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24dc7d18ffStshiozak  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25dc7d18ffStshiozak  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26dc7d18ffStshiozak  * SUCH DAMAGE.
27dc7d18ffStshiozak  */
28dc7d18ffStshiozak 
29dc7d18ffStshiozak #include <sys/cdefs.h>
30dc7d18ffStshiozak #if defined(LIBC_SCCS) && !defined(lint)
31*2933c534Sjoerg __RCSID("$NetBSD: multibyte_c90.c,v 1.12 2013/08/18 20:03:48 joerg Exp $");
32dc7d18ffStshiozak #endif /* LIBC_SCCS and not lint */
33dc7d18ffStshiozak 
34326ed368Stshiozak #include <sys/types.h>
35dc7d18ffStshiozak #include <assert.h>
36dc7d18ffStshiozak #include <errno.h>
3752ed7b03Stnozaki #include <langinfo.h>
3852ed7b03Stnozaki #define __SETLOCALE_SOURCE__
3952ed7b03Stnozaki #include <locale.h>
4052ed7b03Stnozaki #include <stdlib.h>
41326ed368Stshiozak #include <wchar.h>
4252ed7b03Stnozaki 
4352ed7b03Stnozaki #include "setlocale_local.h"
4452ed7b03Stnozaki 
4552ed7b03Stnozaki #include "citrus_module.h"
4652ed7b03Stnozaki #include "citrus_ctype.h"
472a7af30cStnozaki #include "runetype_local.h"
4885a67e61Sjoerg #include "multibyte.h"
4985a67e61Sjoerg 
50dc7d18ffStshiozak int
mblen_l(const char * s,size_t n,locale_t loc)51ceb51ddcSjoerg mblen_l(const char *s, size_t n, locale_t loc)
52dc7d18ffStshiozak {
53dc7d18ffStshiozak 	int ret;
544112ebb3Syamt 	int err0;
55dc7d18ffStshiozak 
56ceb51ddcSjoerg 	err0 = _citrus_ctype_mblen(_CITRUS_CTYPE(loc), s, n, &ret);
57ceb51ddcSjoerg 	if (err0)
58ceb51ddcSjoerg 		errno = err0;
59ceb51ddcSjoerg 
60ceb51ddcSjoerg 	return ret;
61ceb51ddcSjoerg }
62ceb51ddcSjoerg 
63ceb51ddcSjoerg 
64ceb51ddcSjoerg int
mblen(const char * s,size_t n)65ceb51ddcSjoerg mblen(const char *s, size_t n)
66ceb51ddcSjoerg {
67e0ac190eSjoerg 	return mblen_l(s, n, _current_locale());
68ceb51ddcSjoerg }
69ceb51ddcSjoerg 
70ceb51ddcSjoerg size_t
mbstowcs_l(wchar_t * pwcs,const char * s,size_t n,locale_t loc)71ceb51ddcSjoerg mbstowcs_l(wchar_t *pwcs, const char *s, size_t n, locale_t loc)
72ceb51ddcSjoerg {
73ceb51ddcSjoerg 	size_t ret;
74ceb51ddcSjoerg 	int err0;
75ceb51ddcSjoerg 
76ceb51ddcSjoerg 	err0 = _citrus_ctype_mbstowcs(_CITRUS_CTYPE(loc), pwcs, s, n, &ret);
774112ebb3Syamt 	if (err0)
784112ebb3Syamt 		errno = err0;
79dc7d18ffStshiozak 
80dc7d18ffStshiozak 	return ret;
81dc7d18ffStshiozak }
82dc7d18ffStshiozak 
83dc7d18ffStshiozak size_t
mbstowcs(wchar_t * pwcs,const char * s,size_t n)84dc7d18ffStshiozak mbstowcs(wchar_t *pwcs, const char *s, size_t n)
85dc7d18ffStshiozak {
86e0ac190eSjoerg 	return mbstowcs_l(pwcs, s, n, _current_locale());
87ceb51ddcSjoerg }
88ceb51ddcSjoerg 
89ceb51ddcSjoerg int
mbtowc_l(wchar_t * pw,const char * s,size_t n,locale_t loc)90ceb51ddcSjoerg mbtowc_l(wchar_t *pw, const char *s, size_t n, locale_t loc)
91ceb51ddcSjoerg {
92ceb51ddcSjoerg 	int ret;
934112ebb3Syamt 	int err0;
94dc7d18ffStshiozak 
95ceb51ddcSjoerg 	err0 = _citrus_ctype_mbtowc(_CITRUS_CTYPE(loc), pw, s, n, &ret);
964112ebb3Syamt 	if (err0)
974112ebb3Syamt 		errno = err0;
98dc7d18ffStshiozak 
99dc7d18ffStshiozak 	return ret;
100dc7d18ffStshiozak }
101dc7d18ffStshiozak 
102dc7d18ffStshiozak int
mbtowc(wchar_t * pw,const char * s,size_t n)103dc7d18ffStshiozak mbtowc(wchar_t *pw, const char *s, size_t n)
104dc7d18ffStshiozak {
105e0ac190eSjoerg 	return mbtowc_l(pw, s, n, _current_locale());
106ceb51ddcSjoerg }
107ceb51ddcSjoerg 
108ceb51ddcSjoerg size_t
wcstombs_l(char * s,const wchar_t * wcs,size_t n,locale_t loc)109ceb51ddcSjoerg wcstombs_l(char *s, const wchar_t *wcs, size_t n, locale_t loc)
110ceb51ddcSjoerg {
111ceb51ddcSjoerg 	size_t ret;
1124112ebb3Syamt 	int err0;
113dc7d18ffStshiozak 
114ceb51ddcSjoerg 	err0 = _citrus_ctype_wcstombs(_CITRUS_CTYPE(loc), s, wcs, n, &ret);
1154112ebb3Syamt 	if (err0)
1164112ebb3Syamt 		errno = err0;
117dc7d18ffStshiozak 
118dc7d18ffStshiozak 	return ret;
119dc7d18ffStshiozak }
120dc7d18ffStshiozak 
121dc7d18ffStshiozak size_t
wcstombs(char * s,const wchar_t * wcs,size_t n)122dc7d18ffStshiozak wcstombs(char *s, const wchar_t *wcs, size_t n)
123dc7d18ffStshiozak {
124e0ac190eSjoerg 	return wcstombs_l(s, wcs, n, _current_locale());
125ceb51ddcSjoerg }
126ceb51ddcSjoerg 
12785a67e61Sjoerg size_t
wcsnrtombs_l(char * s,const wchar_t ** ppwcs,size_t in,size_t n,mbstate_t * ps,locale_t loc)12885a67e61Sjoerg wcsnrtombs_l(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t *ps,
12985a67e61Sjoerg     locale_t loc)
13085a67e61Sjoerg {
13185a67e61Sjoerg 	size_t ret;
13285a67e61Sjoerg 	int err0;
13385a67e61Sjoerg 
13485a67e61Sjoerg 	_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
13585a67e61Sjoerg 
136*2933c534Sjoerg 	err0 = _citrus_ctype_wcsnrtombs(_ps_to_ctype(ps, loc), s, ppwcs, in, n,
13785a67e61Sjoerg 					_ps_to_private(ps), &ret);
13885a67e61Sjoerg 	if (err0)
13985a67e61Sjoerg 		errno = err0;
14085a67e61Sjoerg 
14185a67e61Sjoerg 	return ret;
14285a67e61Sjoerg }
14385a67e61Sjoerg 
14485a67e61Sjoerg size_t
wcsnrtombs(char * s,const wchar_t ** ppwcs,size_t in,size_t n,mbstate_t * ps)14585a67e61Sjoerg wcsnrtombs(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t *ps)
14685a67e61Sjoerg {
14785a67e61Sjoerg 	return wcsnrtombs_l(s, ppwcs, in, n, ps, _current_locale());
14885a67e61Sjoerg }
14985a67e61Sjoerg 
150ceb51ddcSjoerg int
wctomb_l(char * s,wchar_t wc,locale_t loc)151ceb51ddcSjoerg wctomb_l(char *s, wchar_t wc, locale_t loc)
152ceb51ddcSjoerg {
153ceb51ddcSjoerg 	int ret;
1544112ebb3Syamt 	int err0;
155dc7d18ffStshiozak 
156ceb51ddcSjoerg 	err0 = _citrus_ctype_wctomb(_CITRUS_CTYPE(loc), s, wc, &ret);
1574112ebb3Syamt 	if (err0)
1584112ebb3Syamt 		errno = err0;
159dc7d18ffStshiozak 
160dc7d18ffStshiozak 	return ret;
161dc7d18ffStshiozak }
162dc7d18ffStshiozak 
163dc7d18ffStshiozak int
wctomb(char * s,wchar_t wc)164dc7d18ffStshiozak wctomb(char *s, wchar_t wc)
165dc7d18ffStshiozak {
166e0ac190eSjoerg 	return wctomb_l(s, wc, _current_locale());
167dc7d18ffStshiozak }
168