• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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