multibyte.c revision 1.9 1 /* $NetBSD: multibyte.c,v 1.9 2019/08/01 12:28:53 martin Exp $ */
2
3 /*
4 * Ignore all multibyte sequences, removes all the citrus code.
5 * Probably only used by vfprintf() when parsing the format string.
6 * And possibly from libcurses if compiled with HAVE_WCHAR.
7 */
8
9 #include <stdlib.h>
10 #include <string.h>
11 #include <wchar.h>
12 #include <wctype.h>
13 #include <ctype.h>
14
15 size_t
16 mbrtowc(wchar_t *wc, const char *str, size_t max_sz, mbstate_t *ps)
17 {
18 if (str == NULL)
19 return 0;
20
21 if (wc != NULL)
22 *wc = (unsigned char)*str;
23
24 return *str == '\0' ? 0 : 1;
25 }
26
27 size_t
28 mbrtowc_l(wchar_t *wc, const char *str, size_t max_sz, mbstate_t *ps, locale_t loc)
29 {
30 return mbrtowc(wc, str, max_sz, ps);
31 }
32
33 size_t
34 wcrtomb(char *str, wchar_t wc, mbstate_t *ps)
35 {
36 *str = wc & 0xFF;
37 return 1;
38 }
39
40
41 size_t
42 wcrtomb_l(char *str, wchar_t wc, mbstate_t *ps, locale_t loc)
43 {
44 return wcrtomb(str, wc, ps);
45 }
46
47 int
48 wctob(wint_t x)
49 {
50 return x;
51 }
52
53 int
54 wctob_l(wint_t x, locale_t loc)
55 {
56 return x;
57 }
58
59 wint_t
60 btowc(int x)
61 {
62 return x;
63 }
64
65 wint_t
66 btowc_l(int x, locale_t loc)
67 {
68 return x;
69 }
70
71 size_t
72 mbrlen(const char * __restrict p, size_t l, mbstate_t * __restrict v)
73 {
74 size_t i;
75 for (i = 0; i < l; i++)
76 if (p[i] == '\0')
77 return i;
78 return l;
79 }
80
81
82 size_t
83 mbrlen_l(const char * __restrict p, size_t l, mbstate_t * __restrict v,
84 locale_t loc)
85 {
86 return mbrlen(p, l, v);
87 }
88
89 int
90 mbsinit(const mbstate_t *s)
91 {
92 return 0;
93 }
94
95 size_t
96 mbsrtowcs(wchar_t * __restrict pwcs, const char ** __restrict s, size_t n,
97 mbstate_t * __restrict ps)
98 {
99 const char *p;
100 wchar_t *d;
101 size_t count;
102
103 for (p = *s, d = pwcs, count = 0;
104 count <= n;
105 count++, d++, p++)
106 {
107 if (mbrtowc(d, p, 1, ps) == 0)
108 break;
109 }
110 return count;
111 }
112
113
114 size_t
115 mbsrtowcs_l(wchar_t * __restrict pwcs, const char ** __restrict s, size_t n,
116 mbstate_t * __restrict ps, locale_t loc)
117 {
118 return mbsrtowcs(pwcs, s, n, ps);
119 }
120
121 size_t
122 wcsrtombs(char * __restrict s, const wchar_t ** __restrict pwcs, size_t n,
123 mbstate_t * __restrict ps)
124 {
125 char *d;
126 const wchar_t *p;
127 size_t count;
128
129 for (p = *pwcs, d = s, count = 0;
130 count <= n && *p != 0;
131 count++, d++, p++)
132 {
133 wcrtomb(d, *p, ps);
134 }
135 *d = 0;
136 return count;
137 }
138
139 size_t
140 wcsrtombs_l(char * __restrict s, const wchar_t ** __restrict pwcs, size_t n,
141 mbstate_t * __restrict ps, locale_t loc)
142 {
143 return wcsrtombs(s, pwcs, n, ps);
144 }
145
146 size_t
147 _mb_cur_max_l(locale_t loc)
148 {
149 return MB_CUR_MAX;
150 }
151
152 wint_t
153 fgetwc(FILE *stream)
154 {
155 return fgetc(stream);
156 }
157
158 wint_t
159 fputwc(wchar_t wc, FILE *stream)
160 {
161 return fputc(wc & 0xFF, stream);
162 }
163
164 wint_t __fputwc_unlock(wchar_t wc, FILE *stream);
165 wint_t
166 __fputwc_unlock(wchar_t wc, FILE *stream)
167 {
168 return __sputc(wc & 0xFF, stream);
169 }
170
171 #define MAPSINGLE(CT) \
172 int \
173 isw##CT(wint_t wc) \
174 { \
175 return is##CT(wc & 0xFF); \
176 }
177
178 MAPSINGLE(alnum)
179 MAPSINGLE(alpha)
180 MAPSINGLE(blank)
181 MAPSINGLE(cntrl)
182 MAPSINGLE(digit)
183 MAPSINGLE(graph)
184 MAPSINGLE(lower)
185 MAPSINGLE(print)
186 MAPSINGLE(punct)
187 MAPSINGLE(space)
188 MAPSINGLE(upper)
189 MAPSINGLE(xdigit)
190
191 int
192 iswspace_l(wint_t wc, locale_t loc)
193 {
194 return iswspace(wc);
195 }
196
197 struct wct_entry_hack {
198 const char *name;
199 int (*predicate)(wint_t);
200 };
201
202 #define WCTENTRY(T) { .name= #T , .predicate= isw##T },
203 static const struct wct_entry_hack my_wcts[] = {
204 { .name = NULL },
205 WCTENTRY(alnum)
206 WCTENTRY(alpha)
207 WCTENTRY(blank)
208 WCTENTRY(cntrl)
209 WCTENTRY(digit)
210 WCTENTRY(graph)
211 WCTENTRY(lower)
212 WCTENTRY(print)
213 WCTENTRY(punct)
214 WCTENTRY(space)
215 WCTENTRY(upper)
216 WCTENTRY(xdigit)
217 };
218
219 wctype_t
220 wctype(const char *charclass)
221 {
222
223 for (size_t i = 1; i < __arraycount(my_wcts); i++)
224 if (strcmp(charclass, my_wcts[i].name) == 0)
225 return (wctype_t)i;
226
227 return (wctype_t)0;
228 }
229
230 int
231 iswctype(wint_t wc, wctype_t charclass)
232 {
233 size_t ndx = (size_t)charclass;
234
235 if (ndx < 1 || ndx >= __arraycount(my_wcts))
236 return 0;
237
238 return my_wcts[ndx].predicate(wc);
239 }
240
241 size_t
242 wcslen(const wchar_t *s)
243 {
244 size_t l;
245
246 if (s == NULL)
247 return 0;
248
249 for (l = 0; *s; l++)
250 s++;
251
252 return l;
253 }
254
255 int
256 wcswidth(const wchar_t *pwcs, size_t n)
257 {
258 int cols;
259
260 if (pwcs == NULL)
261 return 0;
262
263 if (*pwcs == 0)
264 return 0;
265
266 for (cols = 0; *pwcs && n > 0; cols++)
267 if (!isprint(*pwcs & 0xFF))
268 return -1;
269 return cols;
270 }
271
272 int
273 wcwidth(wchar_t wc)
274 {
275 if (wc == 0)
276 return 0;
277 if (!isprint(wc & 0xFF))
278 return -1;
279 return 1;
280 }
281
282 wchar_t *
283 wmemchr(const wchar_t *s, wchar_t c, size_t n)
284 {
285
286 if (s == NULL)
287 return NULL;
288 while (*s != 0 && *s != c)
289 s++;
290 if (*s != 0)
291 return __UNCONST(s);
292 return NULL;
293 }
294
295 wchar_t *
296 wmemcpy(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n)
297 {
298 wchar_t *p;
299
300 for (p = s1; n > 0; n--)
301 *p++ = *s2++;
302
303 return s1;
304 }
305
306 wint_t
307 towlower(wint_t wc)
308 {
309 return tolower(wc & 0xFF);
310 }
311
312 wint_t
313 towupper(wint_t wc)
314 {
315 return toupper(wc & 0xFF);
316 }
317
318
319