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