multibyte_amd1.c revision 1.9.12.1 1 /* $NetBSD: multibyte_amd1.c,v 1.9.12.1 2013/06/23 06:21:05 tls Exp $ */
2
3 /*-
4 * Copyright (c)2002, 2008 Citrus Project,
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29 #include <sys/cdefs.h>
30 #if defined(LIBC_SCCS) && !defined(lint)
31 __RCSID("$NetBSD: multibyte_amd1.c,v 1.9.12.1 2013/06/23 06:21:05 tls Exp $");
32 #endif /* LIBC_SCCS and not lint */
33
34 #include <sys/types.h>
35 #include <assert.h>
36 #include <errno.h>
37 #include <langinfo.h>
38 #include <stdlib.h>
39 #define __SETLOCALE_SOURCE__
40 #include <locale.h>
41 #include <wchar.h>
42
43 #include "setlocale_local.h"
44
45 #include "citrus_module.h"
46 #include "citrus_ctype.h"
47 #include "runetype_local.h"
48 #include "multibyte.h"
49
50 #define _RUNE_LOCALE(loc) \
51 ((_RuneLocale *)((loc)->part_impl[(size_t)LC_CTYPE]))
52
53 #define _CITRUS_CTYPE(loc) \
54 (_RUNE_LOCALE(loc)->rl_citrus_ctype)
55
56 size_t
57 mbrlen_l(const char *s, size_t n, mbstate_t *ps, locale_t loc)
58 {
59 size_t ret;
60 int err0;
61
62 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
63
64 err0 = _citrus_ctype_mbrlen(_ps_to_ctype(ps), s, n,
65 _ps_to_private(ps), &ret);
66 if (err0)
67 errno = err0;
68
69 return ret;
70 }
71
72 size_t
73 mbrlen(const char *s, size_t n, mbstate_t *ps)
74 {
75 return mbrlen_l(s, n, ps, _current_locale());
76 }
77
78 int
79 mbsinit_l(const mbstate_t *ps, locale_t loc)
80 {
81 int ret;
82 int err0;
83 _RuneLocale *rl;
84
85 if (ps == NULL)
86 return 1;
87
88 if (_ps_to_runelocale(ps) == NULL)
89 rl = _RUNE_LOCALE(loc);
90 else
91 rl = _ps_to_runelocale(ps);
92
93 /* mbsinit should cause no error... */
94 err0 = _citrus_ctype_mbsinit(rl->rl_citrus_ctype,
95 _ps_to_private_const(ps), &ret);
96 if (err0)
97 errno = err0;
98
99 return ret;
100 }
101
102 int
103 mbsinit(const mbstate_t *ps)
104 {
105 return mbsinit_l(ps, _current_locale());
106 }
107
108 size_t
109 mbrtowc_l(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps, locale_t loc)
110 {
111 size_t ret;
112 int err0;
113
114 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
115
116 err0 = _citrus_ctype_mbrtowc(_ps_to_ctype(ps), pwc, s, n,
117 _ps_to_private(ps), &ret);
118 if (err0)
119 errno = err0;
120
121 return ret;
122 }
123
124 size_t
125 mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
126 {
127 return mbrtowc_l(pwc, s, n, ps, _current_locale());
128 }
129
130 size_t
131 mbsrtowcs_l(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps,
132 locale_t loc)
133 {
134 size_t ret;
135 int err0;
136
137 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
138
139 err0 = _citrus_ctype_mbsrtowcs(_ps_to_ctype(ps), pwcs, s, n,
140 _ps_to_private(ps), &ret);
141 if (err0)
142 errno = err0;
143
144 return ret;
145 }
146
147 size_t
148 mbsrtowcs(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps)
149 {
150 return mbsrtowcs_l(pwcs, s, n, ps, _current_locale());
151 }
152
153 size_t
154 mbsnrtowcs_l(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps,
155 locale_t loc)
156 {
157 size_t ret;
158 int err0;
159
160 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
161
162 err0 = _citrus_ctype_mbsnrtowcs(_ps_to_ctype(ps), pwcs, s, in, n,
163 _ps_to_private(ps), &ret);
164 if (err0)
165 errno = err0;
166
167 return ret;
168 }
169
170 size_t
171 mbsnrtowcs(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps)
172 {
173 return mbsnrtowcs_l(pwcs, s, in, n, ps, _current_locale());
174 }
175
176 size_t
177 wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc)
178 {
179 size_t ret;
180 int err0;
181
182 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
183
184 err0 = _citrus_ctype_wcrtomb(_ps_to_ctype(ps), s, wc,
185 _ps_to_private(ps), &ret);
186 if (err0)
187 errno = err0;
188
189 return ret;
190 }
191
192 size_t
193 wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
194 {
195 return wcrtomb_l(s, wc, ps, _current_locale());
196 }
197
198 size_t
199 wcsrtombs_l(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps,
200 locale_t loc)
201 {
202 size_t ret;
203 int err0;
204
205 _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
206
207 err0 = _citrus_ctype_wcsrtombs(_ps_to_ctype(ps), s, ppwcs, n,
208 _ps_to_private(ps), &ret);
209 if (err0)
210 errno = err0;
211
212 return ret;
213 }
214
215 size_t
216 wcsrtombs(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps)
217 {
218 return wcsrtombs_l(s, ppwcs, n, ps, _current_locale());
219 }
220
221 wint_t
222 btowc_l(int c, locale_t loc)
223 {
224 wint_t ret;
225 int err0;
226
227 err0 = _citrus_ctype_btowc(_CITRUS_CTYPE(loc), c, &ret);
228 if (err0)
229 errno = err0;
230
231 return ret;
232 }
233
234 wint_t
235 btowc(int c)
236 {
237 return btowc_l(c, _current_locale());
238 }
239
240 int
241 wctob_l(wint_t wc, locale_t loc)
242 {
243 int ret;
244 int err0;
245
246 err0 = _citrus_ctype_wctob(_CITRUS_CTYPE(loc), wc, &ret);
247 if (err0)
248 errno = err0;
249
250 return ret;
251 }
252
253 int
254 wctob(wint_t wc)
255 {
256 return wctob_l(wc, _current_locale());
257 }
258
259 size_t
260 _mb_cur_max_l(locale_t loc)
261 {
262
263 return _citrus_ctype_get_mb_cur_max(_CITRUS_CTYPE(loc));
264 }
265