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 #include <errno.h>
33
34 /* stubs for wide-char functions */
btowc(int c)35 wint_t btowc(int c)
36 {
37 return (c == EOF) ? WEOF : c;
38 }
39
fwprintf(FILE * stream,const wchar_t * format,...)40 int fwprintf(FILE *stream, const wchar_t *format, ...)
41 {
42 va_list args;
43 int result;
44
45 va_start(args, format);
46 result = vfwprintf(stream, format, args);
47 va_end(args);
48 return result;
49 }
50
wprintf(const wchar_t * format,...)51 int wprintf(const wchar_t *format, ...)
52 {
53 va_list args;
54 int result;
55
56 va_start(args, format);
57 result = vwprintf(format, args);
58 va_end(args);
59 return result;
60 }
61
swprintf(wchar_t * s,size_t n,const wchar_t * format,...)62 int swprintf(wchar_t *s, size_t n, const wchar_t *format, ...)
63 {
64 va_list args;
65 int result;
66
67 va_start(args, format);
68 result = vswprintf(s, n, format, args);
69 va_end(args);
70 return result;
71 }
72
vwprintf(const wchar_t * format,va_list arg)73 int vwprintf(const wchar_t *format, va_list arg)
74 {
75 return vfwprintf(stdout, format, arg);
76 }
77
vfwprintf(FILE * stream,const wchar_t * format,va_list arg)78 int vfwprintf(FILE *stream, const wchar_t *format, va_list arg)
79 {
80 errno = ENOTSUP;
81 return -1;
82 }
83
vswprintf(wchar_t * s,size_t n,const wchar_t * format,va_list arg)84 int vswprintf(wchar_t *s, size_t n, const wchar_t *format, va_list arg)
85 {
86 errno = ENOTSUP;
87 return -1;
88 }
89
fwscanf(FILE * stream,const wchar_t * format,...)90 int fwscanf(FILE *stream, const wchar_t *format, ... )
91 {
92 errno = ENOTSUP;
93 return -1;
94 }
95
wscanf(const wchar_t * format,...)96 int wscanf(const wchar_t *format, ... )
97 {
98 va_list args;
99 int result;
100
101 va_start (args, format);
102 result = fwscanf(stdout, format, args );
103 va_end (args);
104 return result;
105 }
106
swscanf(const wchar_t * s,const wchar_t * format,...)107 int swscanf(const wchar_t *s, const wchar_t *format, ... )
108 {
109 errno = ENOTSUP;
110 return -1;
111 }
112
iswalnum(wint_t wc)113 int iswalnum(wint_t wc) { return isalnum(wc); }
iswalpha(wint_t wc)114 int iswalpha(wint_t wc) { return isalpha(wc); }
iswcntrl(wint_t wc)115 int iswcntrl(wint_t wc) { return iscntrl(wc); }
iswdigit(wint_t wc)116 int iswdigit(wint_t wc) { return isdigit(wc); }
iswgraph(wint_t wc)117 int iswgraph(wint_t wc) { return isgraph(wc); }
iswlower(wint_t wc)118 int iswlower(wint_t wc) { return islower(wc); }
iswprint(wint_t wc)119 int iswprint(wint_t wc) { return isprint(wc); }
iswpunct(wint_t wc)120 int iswpunct(wint_t wc) { return ispunct(wc); }
iswspace(wint_t wc)121 int iswspace(wint_t wc) { return isspace(wc); }
iswupper(wint_t wc)122 int iswupper(wint_t wc) { return isupper(wc); }
iswxdigit(wint_t wc)123 int iswxdigit(wint_t wc) { return isxdigit(wc); }
124
iswctype(wint_t wc,wctype_t charclass)125 int iswctype(wint_t wc, wctype_t charclass)
126 {
127 switch (charclass) {
128 case WC_TYPE_ALNUM: return isalnum(wc);
129 case WC_TYPE_ALPHA: return isalpha(wc);
130 case WC_TYPE_BLANK: return isblank(wc);
131 case WC_TYPE_CNTRL: return iscntrl(wc);
132 case WC_TYPE_DIGIT: return isdigit(wc);
133 case WC_TYPE_GRAPH: return isgraph(wc);
134 case WC_TYPE_LOWER: return islower(wc);
135 case WC_TYPE_PRINT: return isprint(wc);
136 case WC_TYPE_PUNCT: return ispunct(wc);
137 case WC_TYPE_SPACE: return isspace(wc);
138 case WC_TYPE_UPPER: return isupper(wc);
139 case WC_TYPE_XDIGIT: return isxdigit(wc);
140 default: return 0;
141 };
142 }
143
fgetwc(FILE * stream)144 wint_t fgetwc(FILE *stream)
145 {
146 return (wint_t)fgetc(stream);
147 }
148
fgetws(wchar_t * ws,int n,FILE * stream)149 wchar_t *fgetws(wchar_t *ws, int n, FILE *stream)
150 {
151 return (wchar_t*) fgets((char*)ws, n, stream);
152 }
153
fputwc(wchar_t wc,FILE * stream)154 wint_t fputwc(wchar_t wc, FILE *stream)
155 {
156 return (wint_t)fputc((char)wc, stream);
157 }
158
fputws(const wchar_t * str,FILE * stream)159 int fputws(const wchar_t *str, FILE *stream)
160 {
161 return fputs( (const char*)str, stream );
162 }
163
fwide(FILE * stream,int mode)164 int fwide(FILE *stream, int mode)
165 {
166 stream=stream;
167 return (mode);
168 }
169
getwc(FILE * stream)170 wint_t getwc(FILE *stream)
171 {
172 return getc(stream);
173 }
174
getwchar(void)175 wint_t getwchar(void)
176 {
177 return getchar();
178 }
179
mbsinit(const mbstate_t * ps)180 int mbsinit(const mbstate_t *ps)
181 {
182 ps=ps;
183 return 1;
184 }
185
mbrlen(const char * s,size_t n,mbstate_t * ps)186 size_t mbrlen(const char *s, size_t n, mbstate_t *ps)
187 {
188 return (n != 0);
189 }
190
mbrtowc(wchar_t * pwc,const char * s,size_t n,mbstate_t * ps)191 size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
192 {
193 if (s == NULL) {
194 s = "";
195 pwc = NULL;
196 }
197 if (n == 0) {
198 if (pwc)
199 *pwc = 0;
200 return 0;
201 }
202 if (pwc)
203 *pwc = *s;
204
205 return (*s != 0);
206 }
207
mbsrtowcs(wchar_t * dst,const char ** src,size_t len,mbstate_t * ps)208 size_t mbsrtowcs(wchar_t *dst, const char **src, size_t len, mbstate_t *ps)
209 {
210 const char* s = *src;
211 const char* s2 = memchr( s, 0, len );
212
213 if (s2 != NULL)
214 len = (size_t)(s2 - s) + 1U;
215
216 if (dst)
217 memcpy( (char*)dst, s, len );
218
219 *src = s + len;
220 return len;
221 }
222
mbstowcs(wchar_t * dst,const char * src,size_t len)223 size_t mbstowcs(wchar_t *dst, const char *src, size_t len)
224 {
225 return mbsrtowcs(dst, &src, len, NULL);
226 }
227
putwc(wchar_t wc,FILE * stream)228 wint_t putwc(wchar_t wc, FILE *stream)
229 {
230 return fputc((char)wc, stream);
231 }
232
putwchar(wchar_t wc)233 wint_t putwchar(wchar_t wc)
234 {
235 return putchar((char)wc);
236 }
237
towlower(wint_t wc)238 wint_t towlower(wint_t wc)
239 {
240 return tolower(wc);
241 }
242
towupper(wint_t wc)243 wint_t towupper(wint_t wc)
244 {
245 return toupper(wc);
246 }
247
ungetwc(wint_t wc,FILE * stream)248 wint_t ungetwc(wint_t wc, FILE *stream)
249 {
250 return ungetc((char)wc, stream);
251 }
252
wcrtomb(char * s,wchar_t wc,mbstate_t * ps)253 size_t wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
254 {
255 if (s != NULL)
256 *s = 1;
257 return 1;
258 }
259
wcsftime(wchar_t * wcs,size_t maxsize,const wchar_t * format,const struct tm * timptr)260 size_t wcsftime(wchar_t *wcs, size_t maxsize, const wchar_t *format, const struct tm *timptr)
261 {
262 return strftime( (char*)wcs, maxsize, (const char*)format, timptr );
263 }
264
wcsrtombs(char * dst,const wchar_t ** src,size_t len,mbstate_t * ps)265 size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps)
266 {
267 const char* s = (const char*)*src;
268 const char* s2 = memchr( s, 0, len );
269
270 if (s2 != NULL)
271 len = (s2 - s)+1;
272
273 if (dst != NULL)
274 memcpy( dst, s, len );
275
276 *src = (wchar_t*)(s + len);
277 return len;
278 }
279
wcstombs(char * dst,const wchar_t * src,size_t len)280 size_t wcstombs(char *dst, const wchar_t *src, size_t len)
281 {
282 return wcsrtombs(dst, &src, len, NULL);
283 }
284
wcstod(const wchar_t * nptr,wchar_t ** endptr)285 double wcstod(const wchar_t *nptr, wchar_t **endptr)
286 {
287 return strtod( (const char*)nptr, (char**)endptr );
288 }
289
wcstol(const wchar_t * nptr,wchar_t ** endptr,int base)290 long int wcstol(const wchar_t *nptr, wchar_t **endptr, int base)
291 {
292 return strtol( (const char*)nptr, (char**)endptr, base );
293 }
294
wcstoul(const wchar_t * nptr,wchar_t ** endptr,int base)295 unsigned long int wcstoul(const wchar_t *nptr, wchar_t **endptr, int base)
296 {
297 return strtoul( (const char*)nptr, (char**)endptr, base );
298 }
299
wcswcs(const wchar_t * ws1,const wchar_t * ws2)300 wchar_t *wcswcs(const wchar_t *ws1, const wchar_t *ws2)
301 {
302 return (wchar_t*) strstr( (const char*)ws1, (const char*)ws2 );
303 }
304
wctob(wint_t c)305 int wctob(wint_t c)
306 {
307 return c;
308 }
309
wctype(const char * property)310 wctype_t wctype(const char *property)
311 {
312 static const char* const properties[WC_TYPE_MAX] =
313 {
314 "<invalid>",
315 "alnum", "alpha", "blank", "cntrl", "digit", "graph",
316 "lower", "print", "punct", "space", "upper", "xdigit"
317 };
318 int nn;
319
320 for ( nn = 0; nn < WC_TYPE_MAX; nn++ )
321 if ( !strcmp( properties[nn], property ) )
322 return (wctype_t)(nn);
323
324 return 0;
325 }
326
wcwidth(wchar_t wc)327 int wcwidth(wchar_t wc)
328 {
329 return (wc > 0);
330 }
331