1 /* $NetBSD: multibyte_sb.c,v 1.5 2004/07/21 20:27:46 tshiozak Exp $ */
2
3 /*
4 * Copyright (c) 1991 The Regents of the University of California.
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 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31 #include <LibConfig.h>
32 #include <sys/EfiCdefs.h>
33 #if defined(LIBC_SCCS) && !defined(lint)
34 #if 0
35 static char *sccsid = "from: @(#)multibyte.c 5.1 (Berkeley) 2/18/91";
36 #else
37 __RCSID("$NetBSD: multibyte_sb.c,v 1.5 2004/07/21 20:27:46 tshiozak Exp $");
38 #endif
39 #endif /* LIBC_SCCS and not lint */
40
41 #include <assert.h>
42 #include <errno.h>
43 #include <stdlib.h>
44 #include <wchar.h>
45
46 /*
47 * Stub multibyte character functions.
48 * This cheezy implementation is fixed to the native single-byte
49 * character set.
50 */
51
52 /*ARGSUSED*/
53 int
mbsinit(const mbstate_t * ps)54 mbsinit(const mbstate_t *ps)
55 {
56
57 return 1;
58 }
59
60 /*ARGSUSED*/
61 size_t
mbrlen(const char * s,size_t n,mbstate_t * ps)62 mbrlen(
63 const char *s,
64 size_t n,
65 mbstate_t *ps
66 )
67 {
68
69 /* ps appears to be unused */
70
71 if (s == NULL || *s == '\0')
72 return 0;
73 if (n == 0)
74 return (size_t)-1;
75 return 1;
76 }
77
78 int
mblen(const char * s,size_t n)79 mblen(
80 const char *s,
81 size_t n
82 )
83 {
84
85 /* s may be NULL */
86
87 return (int)mbrlen(s, n, NULL);
88 }
89
90 /*ARGSUSED*/
91 size_t
mbrtowc(wchar_t * pwc,const char * s,size_t n,mbstate_t * ps)92 mbrtowc(
93 wchar_t *pwc,
94 const char *s,
95 size_t n,
96 mbstate_t *ps
97 )
98 {
99
100 /* pwc may be NULL */
101 /* s may be NULL */
102 /* ps appears to be unused */
103
104 if (s == NULL)
105 return 0;
106 if (n == 0)
107 return (size_t)-1;
108 if (pwc)
109 *pwc = (wchar_t) *s;
110 return (*s != '\0');
111 }
112
113 int
mbtowc(wchar_t * pwc,const char * s,size_t n)114 mbtowc(
115 wchar_t *pwc,
116 const char *s,
117 size_t n
118 )
119 {
120
121 /* pwc may be NULL */
122 /* s may be NULL */
123
124 return (int)mbrtowc(pwc, s, n, NULL);
125 }
126
127 /*ARGSUSED*/
128 size_t
wcrtomb(char * s,wchar_t wchar,mbstate_t * ps)129 wcrtomb(
130 char *s,
131 wchar_t wchar,
132 mbstate_t *ps
133 )
134 {
135
136 /* s may be NULL */
137 /* ps appears to be unused */
138
139 if (s == NULL)
140 return 1; /* Spec. says this should be 1. */
141
142 *s = (char) wchar;
143 return 1;
144 }
145
146 int
wctomb(char * s,wchar_t wchar)147 wctomb(
148 char *s,
149 wchar_t wchar
150 )
151 {
152
153 /*
154 If s is NULL just return if MB Characters have state
155 dependent encodings.
156 */
157 if (s == NULL)
158 return 0;
159
160 return (int)wcrtomb(s, wchar, NULL);
161 }
162
163 /*ARGSUSED*/
164 size_t
mbsrtowcs(wchar_t * pwcs,const char ** s,size_t n,mbstate_t * ps)165 mbsrtowcs(
166 wchar_t *pwcs,
167 const char **s,
168 size_t n,
169 mbstate_t *ps
170 )
171 {
172 int count = 0;
173
174 /* pwcs may be NULL */
175 /* s may be NULL */
176 /* ps appears to be unused */
177
178 if (!s || !*s)
179 return 0;
180
181 if (n != 0) {
182 if (pwcs != NULL) {
183 do {
184 if ((*pwcs++ = (wchar_t) *(*s)++) == 0) {
185 *s = NULL;
186 break;
187 }
188 count++;
189 } while (--n != 0);
190 } else {
191 do {
192 if (((wchar_t)*(*s)++) == 0)
193 break;
194 count++;
195 } while (--n != 0);
196 }
197 }
198
199 return count;
200 }
201
202 size_t
mbstowcs(wchar_t * pwcs,const char * s,size_t n)203 mbstowcs(
204 wchar_t *pwcs,
205 const char *s,
206 size_t n
207 )
208 {
209
210 /* pwcs may be NULL */
211 /* s may be NULL */
212
213 return mbsrtowcs(pwcs, &s, n, NULL);
214 }
215
216 /*ARGSUSED*/
217 size_t
wcsrtombs(char * s,const wchar_t ** pwcs,size_t n,mbstate_t * ps)218 wcsrtombs(
219 char *s,
220 const wchar_t **pwcs,
221 size_t n,
222 mbstate_t *ps
223 )
224 {
225 int count = 0;
226
227 /* s may be NULL */
228 /* pwcs may be NULL */
229 /* ps appears to be unused */
230
231 if (pwcs == NULL || *pwcs == NULL)
232 return (0);
233
234 if (s == NULL) {
235 while (*(*pwcs)++ != 0)
236 count++;
237 return(count);
238 }
239
240 if (n != 0) {
241 do {
242 if ((*s++ = (char) *(*pwcs)++) == 0) {
243 *pwcs = NULL;
244 break;
245 }
246 count++;
247 } while (--n != 0);
248 }
249
250 return count;
251 }
252
253 size_t
wcstombs(char * s,const wchar_t * pwcs,size_t n)254 wcstombs(
255 char *s,
256 const wchar_t *pwcs,
257 size_t n
258 )
259 {
260
261 /* s may be NULL */
262 /* pwcs may be NULL */
263
264 return wcsrtombs(s, &pwcs, n, NULL);
265 }
266
267 wint_t
btowc(int c)268 btowc(int c)
269 {
270 if (c == EOF || c & ~0xFF)
271 return WEOF;
272 return (wint_t)c;
273 }
274
275 int
wctob(wint_t c)276 wctob(wint_t c)
277 {
278 /* wctob needs to be consistent with wcrtomb.
279 if wcrtomb says that a character is representable in 1 byte,
280 which this implementation always says, then wctob needs to
281 also represent the character as 1 byte.
282 */
283 if (c == WEOF) {
284 return EOF;
285 }
286 return (int)(c & 0xFF);
287 }
288