1 /*
2 * Copyright (C) 2008 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28 #include <wchar.h>
29 #include <ctype.h>
30 #include <string.h>
31 #include <stdlib.h>
32
33 /* stubs for wide-char functions */
btowc(int c)34 wint_t btowc(int c)
35 {
36 return (c == EOF) ? WEOF : c;
37 }
38
fwprintf(FILE * stream,const wchar_t * format,...)39 int fwprintf(FILE *stream, const wchar_t *format, ...)
40 {
41 va_list args;
42 int result;
43
44 va_start(args, format);
45 result = vfwprintf(stream, format, args);
46 va_end(args);
47 return result;
48 }
49
wprintf(const wchar_t * format,...)50 int wprintf(const wchar_t *format, ...)
51 {
52 va_list args;
53 int result;
54
55 va_start(args, format);
56 result = vwprintf(format, args);
57 va_end(args);
58 return result;
59 }
60
swprintf(wchar_t * s,size_t n,const wchar_t * format,...)61 int swprintf(wchar_t *s, size_t n, const wchar_t *format, ...)
62 {
63 va_list args;
64 int result;
65
66 va_start(args, format);
67 result = vswprintf(s, n, format, args);
68 va_end(args);
69 return result;
70 }
71
vwprintf(const wchar_t * format,va_list arg)72 int vwprintf(const wchar_t *format, va_list arg)
73 {
74 return vprintf((const char*)format, arg);
75 }
76
vfwprintf(FILE * stream,const wchar_t * format,va_list arg)77 int vfwprintf(FILE *stream, const wchar_t *format, va_list arg)
78 {
79 return vfprintf(stream, (const char*)format, arg);
80 }
81
vswprintf(wchar_t * s,size_t n,const wchar_t * format,va_list arg)82 int vswprintf(wchar_t *s, size_t n, const wchar_t *format, va_list arg)
83 {
84 return vsnprintf( (char*)s, n, (const char*)format, arg );
85 }
86
fwscanf(FILE * stream,const wchar_t * format,...)87 int fwscanf(FILE *stream, const wchar_t *format, ... )
88 {
89 va_list args;
90 int result;
91
92 va_start (args, format);
93 result = vfscanf( stream, (const char*)format, args );
94 va_end (args);
95 return result;
96 }
97
wscanf(const wchar_t * format,...)98 int wscanf(const wchar_t *format, ... )
99 {
100 va_list args;
101 int result;
102
103 va_start (args, format);
104 result = vscanf( (const char*)format, args );
105 va_end (args);
106 return result;
107 }
108
swscanf(const wchar_t * s,const wchar_t * format,...)109 int swscanf(const wchar_t *s, const wchar_t *format, ... )
110 {
111 va_list args;
112 int result;
113
114 va_start (args, format);
115 result = vscanf( (const char*)format, args );
116 va_end (args);
117 return result;
118 }
119
iswalnum(wint_t wc)120 int iswalnum(wint_t wc) { return isalnum(wc); }
iswalpha(wint_t wc)121 int iswalpha(wint_t wc) { return isalpha(wc); }
iswcntrl(wint_t wc)122 int iswcntrl(wint_t wc) { return iscntrl(wc); }
iswdigit(wint_t wc)123 int iswdigit(wint_t wc) { return isdigit(wc); }
iswgraph(wint_t wc)124 int iswgraph(wint_t wc) { return isgraph(wc); }
iswlower(wint_t wc)125 int iswlower(wint_t wc) { return islower(wc); }
iswprint(wint_t wc)126 int iswprint(wint_t wc) { return isprint(wc); }
iswpunct(wint_t wc)127 int iswpunct(wint_t wc) { return ispunct(wc); }
iswspace(wint_t wc)128 int iswspace(wint_t wc) { return isspace(wc); }
iswupper(wint_t wc)129 int iswupper(wint_t wc) { return isupper(wc); }
iswxdigit(wint_t wc)130 int iswxdigit(wint_t wc) { return isxdigit(wc); }
131
iswctype(wint_t wc,wctype_t charclass)132 int iswctype(wint_t wc, wctype_t charclass)
133 {
134 switch (charclass) {
135 case WC_TYPE_ALNUM: return isalnum(wc);
136 case WC_TYPE_ALPHA: return isalpha(wc);
137 case WC_TYPE_BLANK: return isblank(wc);
138 case WC_TYPE_CNTRL: return iscntrl(wc);
139 case WC_TYPE_DIGIT: return isdigit(wc);
140 case WC_TYPE_GRAPH: return isgraph(wc);
141 case WC_TYPE_LOWER: return islower(wc);
142 case WC_TYPE_PRINT: return isprint(wc);
143 case WC_TYPE_PUNCT: return ispunct(wc);
144 case WC_TYPE_SPACE: return isspace(wc);
145 case WC_TYPE_UPPER: return isupper(wc);
146 case WC_TYPE_XDIGIT: return isxdigit(wc);
147 default: return 0;
148 };
149 }
150
fgetwc(FILE * stream)151 wint_t fgetwc(FILE *stream)
152 {
153 return fgetc(stream);
154 }
155
fgetws(wchar_t * ws,int n,FILE * stream)156 wchar_t *fgetws(wchar_t *ws, int n, FILE *stream)
157 {
158 return (wchar_t*) fgets((char*)ws, n, stream);
159 }
160
fputwc(wchar_t wc,FILE * stream)161 wint_t fputwc(wchar_t wc, FILE *stream)
162 {
163 return (wint_t)fputc((char)wc, stream);
164 }
165
fputws(const wchar_t * str,FILE * stream)166 int fputws(const wchar_t *str, FILE *stream)
167 {
168 return fputs( (const char*)str, stream );
169 }
170
fwide(FILE * stream,int mode)171 int fwide(FILE *stream, int mode)
172 {
173 stream=stream;
174 return (mode);
175 }
176
getwc(FILE * stream)177 wint_t getwc(FILE *stream)
178 {
179 return getc(stream);
180 }
181
getwchar(void)182 wint_t getwchar(void)
183 {
184 return getchar();
185 }
186
mbsinit(const mbstate_t * ps)187 int mbsinit(const mbstate_t *ps)
188 {
189 ps=ps;
190 return 1;
191 }
192
mbrlen(const char * s,size_t n,mbstate_t * ps)193 size_t mbrlen(const char *s, size_t n, mbstate_t *ps)
194 {
195 return (n != 0);
196 }
197
mbrtowc(wchar_t * pwc,const char * s,size_t n,mbstate_t * ps)198 size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
199 {
200 if (s == NULL) {
201 s = "";
202 pwc = NULL;
203 }
204 if (n == 0) {
205 if (pwc)
206 *pwc = 0;
207 return 0;
208 }
209 if (pwc)
210 *pwc = *s;
211
212 return (*s != 0);
213 }
214
mbsrtowcs(wchar_t * dst,const char ** src,size_t len,mbstate_t * ps)215 size_t mbsrtowcs(wchar_t *dst, const char **src, size_t len, mbstate_t *ps)
216 {
217 const char* s = *src;
218 const char* s2 = memchr( s, 0, len );
219
220 if (s2 != NULL)
221 len = (size_t)(s2 - s) + 1U;
222
223 if (dst)
224 memcpy( (char*)dst, s, len );
225
226 *src = s + len;
227 return len;
228 }
229
putwc(wchar_t wc,FILE * stream)230 wint_t putwc(wchar_t wc, FILE *stream)
231 {
232 return fputc((char)wc, stream);
233 }
234
putwchar(wchar_t wc)235 wint_t putwchar(wchar_t wc)
236 {
237 return putchar((char)wc);
238 }
239
towlower(wint_t wc)240 wint_t towlower(wint_t wc)
241 {
242 return tolower(wc);
243 }
244
towupper(wint_t wc)245 wint_t towupper(wint_t wc)
246 {
247 return toupper(wc);
248 }
249
ungetwc(wint_t wc,FILE * stream)250 wint_t ungetwc(wint_t wc, FILE *stream)
251 {
252 return ungetc((char)wc, stream);
253 }
254
wcrtomb(char * s,wchar_t wc,mbstate_t * ps)255 size_t wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
256 {
257 if (s != NULL)
258 *s = 1;
259 return 1;
260 }
261
wcscat(wchar_t * ws1,const wchar_t * ws2)262 wchar_t *wcscat(wchar_t *ws1, const wchar_t *ws2)
263 {
264 return (wchar_t*) strcat((char*)ws1, (const char*)ws2);
265 }
266
wcschr(const wchar_t * ws,wchar_t wc)267 wchar_t *wcschr(const wchar_t *ws, wchar_t wc)
268 {
269 return (wchar_t*)strchr( (const char*)ws, (char)wc );
270 }
271
wcscmp(const wchar_t * ws1,const wchar_t * ws2)272 int wcscmp(const wchar_t *ws1, const wchar_t *ws2)
273 {
274 return strcmp( (const char*)ws1, (const char*)ws2 );
275 }
276
wcscoll(const wchar_t * ws1,const wchar_t * ws2)277 int wcscoll(const wchar_t *ws1, const wchar_t *ws2)
278 {
279 return strcmp( (const char*)ws1, (const char*)ws2 );
280 }
281
wcscpy(wchar_t * ws1,const wchar_t * ws2)282 wchar_t *wcscpy(wchar_t *ws1, const wchar_t *ws2)
283 {
284 return (wchar_t*) strcpy( (char*)ws1, (const char*)ws2 );
285 }
286
wcscspn(const wchar_t * ws1,const wchar_t * ws2)287 size_t wcscspn(const wchar_t *ws1, const wchar_t *ws2)
288 {
289 return strspn( (const char*)ws1, (const char*)ws2 );
290 }
291
wcslen(const wchar_t * ws)292 size_t wcslen(const wchar_t *ws)
293 {
294 return (size_t)strlen( (const char*)ws );
295 }
296
wcsftime(wchar_t * wcs,size_t maxsize,const wchar_t * format,const struct tm * timptr)297 size_t wcsftime(wchar_t *wcs, size_t maxsize, const wchar_t *format, const struct tm *timptr)
298 {
299 return strftime( (char*)wcs, maxsize, (const char*)format, timptr );
300 }
301
wcsncat(wchar_t * ws1,const wchar_t * ws2,size_t n)302 wchar_t *wcsncat(wchar_t *ws1, const wchar_t *ws2, size_t n)
303 {
304 return (wchar_t*) strncat( (char*)ws1, (const char*)ws2, n );
305 }
306
wcsncmp(const wchar_t * ws1,const wchar_t * ws2,size_t n)307 int wcsncmp(const wchar_t *ws1, const wchar_t *ws2, size_t n)
308 {
309 return strncmp( (const char*)ws1, (const char*)ws2, n );
310 }
311
wcsncpy(wchar_t * ws1,const wchar_t * ws2,size_t n)312 wchar_t *wcsncpy(wchar_t *ws1, const wchar_t *ws2, size_t n)
313 {
314 return (wchar_t*) strncpy( (char*)ws1, (const char*)ws2, n );
315 }
316
wcspbrk(const wchar_t * ws1,const wchar_t * ws2)317 wchar_t *wcspbrk(const wchar_t *ws1, const wchar_t *ws2)
318 {
319 return (wchar_t*) strpbrk( (const char*)ws1, (const char*)ws2 );
320 }
321
wcsrchr(const wchar_t * ws,wchar_t wc)322 wchar_t *wcsrchr(const wchar_t *ws, wchar_t wc)
323 {
324 return (wchar_t*) strrchr( (const char*)ws, (int)wc );
325 }
326
wcsrtombs(char * dst,const wchar_t ** src,size_t len,mbstate_t * ps)327 size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps)
328 {
329 const char* s = (const char*)*src;
330 const char* s2 = memchr( s, 0, len );
331
332 if (s2 != NULL)
333 len = (s2 - s)+1;
334
335 if (dst != NULL)
336 memcpy( dst, s, len );
337
338 *src = (wchar_t*)(s + len);
339 return len;
340 }
341
wcsspn(const wchar_t * ws1,const wchar_t * ws2)342 size_t wcsspn(const wchar_t *ws1, const wchar_t *ws2)
343 {
344 return strspn( (const char*)ws1, (const char*)ws2 );
345 }
346
wcsstr(const wchar_t * ws1,const wchar_t * ws2)347 wchar_t *wcsstr(const wchar_t *ws1, const wchar_t *ws2)
348 {
349 return (wchar_t*) strstr( (const char*)ws1, (const char*)ws2 );
350 }
351
wcstod(const wchar_t * nptr,wchar_t ** endptr)352 double wcstod(const wchar_t *nptr, wchar_t **endptr)
353 {
354 return strtod( (const char*)nptr, (char**)endptr );
355 }
356
wcstok(wchar_t * ws1,const wchar_t * ws2,wchar_t ** ptr)357 wchar_t *wcstok(wchar_t *ws1, const wchar_t *ws2, wchar_t **ptr)
358 {
359 return (wchar_t*) strtok_r( (char*)ws1, (const char*)ws2, (char**)ptr );
360 }
361
wcstol(const wchar_t * nptr,wchar_t ** endptr,int base)362 long int wcstol(const wchar_t *nptr, wchar_t **endptr, int base)
363 {
364 return strtol( (const char*)nptr, (char**)endptr, base );
365 }
366
wcstoul(const wchar_t * nptr,wchar_t ** endptr,int base)367 unsigned long int wcstoul(const wchar_t *nptr, wchar_t **endptr, int base)
368 {
369 return strtoul( (const char*)nptr, (char**)endptr, base );
370 }
371
wcswcs(const wchar_t * ws1,const wchar_t * ws2)372 wchar_t *wcswcs(const wchar_t *ws1, const wchar_t *ws2)
373 {
374 return (wchar_t*) strstr( (const char*)ws1, (const char*)ws2 );
375 }
376
wcswidth(const wchar_t * pwcs,size_t n)377 int wcswidth(const wchar_t *pwcs, size_t n)
378 {
379 return strnlen( (const char*)pwcs, n );
380 }
381
wcsxfrm(wchar_t * ws1,const wchar_t * ws2,size_t n)382 size_t wcsxfrm(wchar_t *ws1, const wchar_t *ws2, size_t n)
383 {
384 memcpy( (char*)ws1, (const char*)ws2, n );
385 return n;
386 }
387
wctob(wint_t c)388 int wctob(wint_t c)
389 {
390 return c;
391 }
392
wctype(const char * property)393 wctype_t wctype(const char *property)
394 {
395 static const char* const properties[WC_TYPE_MAX] =
396 {
397 "<invalid>",
398 "alnum", "alpha", "blank", "cntrl", "digit", "graph",
399 "lower", "print", "punct", "space", "upper", "xdigit"
400 };
401 int nn;
402
403 for ( nn = 0; nn < WC_TYPE_MAX; nn++ )
404 if ( !strcmp( properties[nn], property ) )
405 return (wctype_t)(nn);
406
407 return 0;
408 }
409
wcwidth(wchar_t wc)410 int wcwidth(wchar_t wc)
411 {
412 return (wc > 0);
413 }
414
wmemchr(const wchar_t * ws,wchar_t wc,size_t n)415 wchar_t *wmemchr(const wchar_t *ws, wchar_t wc, size_t n)
416 {
417 return (wchar_t*) memchr( (const char*)ws, (int)wc, n );
418 }
419
wmemcmp(const wchar_t * ws1,const wchar_t * ws2,size_t n)420 int wmemcmp(const wchar_t *ws1, const wchar_t *ws2, size_t n)
421 {
422 return memcmp( (const char*)ws1, (const char*)ws2, n );
423 }
424
wmemcpy(wchar_t * ws1,const wchar_t * ws2,size_t n)425 wchar_t *wmemcpy(wchar_t *ws1, const wchar_t *ws2, size_t n)
426 {
427 return (wchar_t*) memcpy( (char*)ws1, (const char*)ws2, n );
428 }
429
wmemmove(wchar_t * ws1,const wchar_t * ws2,size_t n)430 wchar_t *wmemmove(wchar_t *ws1, const wchar_t *ws2, size_t n)
431 {
432 return (wchar_t*)memmove( (char*)ws1, (const char*)ws2, n );
433 }
434
wmemset(wchar_t * ws,wchar_t wc,size_t n)435 wchar_t *wmemset(wchar_t *ws, wchar_t wc, size_t n)
436 {
437 return (wchar_t*) memset( (char*)ws, (int)wc, n );
438 }
439