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