1 /*
2  * Copyright (c) 1999
3  * Boris Fomitchev
4  *
5  * This material is provided "as is", with absolutely no warranty expressed
6  * or implied. Any use is at your own risk.
7  *
8  * Permission to use or copy this software for any purpose is hereby granted
9  * without fee, provided the above notices are retained on all copies.
10  * Permission to modify the code and to distribute modified code is granted,
11  * provided the above notices are retained, and a notice that the code was
12  * modified is included with the above copyright notice.
13  *
14  */
15 
16 #ifndef _STLP_INTERNAL_CWCHAR
17 #define _STLP_INTERNAL_CWCHAR
18 
19 #if defined (_STLP_WCE_EVC3)
20 #  ifndef _STLP_INTERNAL_MBSTATE_T
21 #    include <stl/_mbstate_t.h>
22 #  endif
23 #else
24 #  if defined (__GNUC__)
25 #    if defined (_STLP_HAS_INCLUDE_NEXT)
26 #      include_next <cstddef>
27 #    else
28 #      include _STLP_NATIVE_CPP_C_HEADER(cstddef)
29 #    endif
30 #  endif
31 
32 #  if !defined (_STLP_NO_CWCHAR) && defined (_STLP_USE_NEW_C_HEADERS)
33 #    if defined (_STLP_HAS_INCLUDE_NEXT)
34 #      include_next <cwchar>
35 #    else
36 #      include _STLP_NATIVE_CPP_C_HEADER(cwchar)
37 #    endif
38 #    if defined (__OpenBSD__)
39 typedef _BSD_WINT_T_ wint_t;
40 #    endif /* __OpenBSD__ */
41 
42 #    if defined (__DMC__)
43 #      define __STDC_LIMIT_MACROS
44 #      include <stdint.h> // WCHAR_MIN, WCHAR_MAX
45 #    endif
46 #  elif defined (_STLP_NO_WCHAR_T) || \
47        (defined (__BORLANDC__) && (__BORLANDC__ < 0x570)) || \
48         defined (__OpenBSD__) || defined (__FreeBSD__) || \
49        (defined (__GNUC__) && (defined (__APPLE__) || defined ( __Lynx__ )))
50 #    if defined (_STLP_HAS_INCLUDE_NEXT)
51 #      include_next <stddef.h>
52 #    else
53 #      include _STLP_NATIVE_C_HEADER(stddef.h)
54 #    endif
55 #    if defined (__Lynx__)
56 #      ifndef _WINT_T
57 typedef long int wint_t;
58 #        define _WINT_T
59 #      endif /* _WINT_T */
60 #    endif
61 #    if defined(__OpenBSD__)
62 typedef _BSD_WINT_T_ wint_t;
63 #    endif /* __OpenBSD__ */
64 #  else
65 #    if defined (_STLP_HAS_INCLUDE_NEXT)
66 #      include_next <wchar.h>
67 #    else
68 #      include _STLP_NATIVE_C_HEADER(wchar.h)
69 #    endif
70 
71 #    if defined (__sun) && (defined (_XOPEN_SOURCE) || (_XOPEN_VERSION - 0 == 4))
72 extern wint_t   btowc();
73 extern int      fwprintf();
74 extern int      fwscanf();
75 extern int      fwide();
76 extern int      mbsinit();
77 extern size_t   mbrlen();
78 extern size_t   mbrtowc();
79 extern size_t   mbsrtowcs();
80 extern int      swprintf();
81 extern int      swscanf();
82 extern int      vfwprintf();
83 extern int      vwprintf();
84 extern int      vswprintf();
85 extern size_t   wcrtomb();
86 extern size_t   wcsrtombs();
87 extern wchar_t  *wcsstr();
88 extern int      wctob();
89 extern wchar_t  *wmemchr();
90 extern int      wmemcmp();
91 extern wchar_t  *wmemcpy();
92 extern wchar_t  *wmemmove();
93 extern wchar_t  *wmemset();
94 extern int      wprintf();
95 extern int      wscanf();
96 #    endif
97 #  endif
98 
99 #  if defined (__MSL__) && (__MSL__ <= 0x51FF)  /* dwa 2/28/99 - not yet implemented by MSL  */
100 #    define _STLP_WCHAR_MSL_EXCLUDE 1
101 namespace std {
102   extern "C" size_t wcsftime(wchar_t * str, size_t max_size, const wchar_t * format_str, const struct tm * timeptr);
103 }
104 #    define _STLP_NO_NATIVE_MBSTATE_T 1
105 #  elif defined (__BORLANDC__)
106 #    if !defined (_STLP_USE_NO_IOSTREAMS)
107 #      define _STLP_NO_NATIVE_MBSTATE_T
108 #    endif
109 #    define _STLP_WCHAR_BORLAND_EXCLUDE 1
110 #  endif
111 
112 #  ifndef _STLP_INTERNAL_MBSTATE_T
113 #    include <stl/_mbstate_t.h>
114 #  endif
115 
116 #  if !defined (_STLP_NO_WCHAR_T)
117 #    ifndef WCHAR_MIN
118 #      define WCHAR_MIN 0
119 /* SUNpro has some bugs with casts. wchar_t is size of int there anyway. */
120 #      if defined (__SUNPRO_CC) || defined (__DJGPP)
121 #        define WCHAR_MAX (~0)
122 #      else
123 #        define WCHAR_MAX ((wchar_t)~0)
124 #      endif
125 #    endif
126 #    if defined (__DMC__) || (defined (_STLP_MSVC_LIB) && (_STLP_MSVC_LIB < 1400)) || defined(_WIN32_WCE)
127 /* Compilers that do not define WCHAR_MIN and WCHAR_MAX to be testable at
128  * preprocessing time. */
129 #      undef WCHAR_MIN
130 #      define WCHAR_MIN 0
131 #      undef WCHAR_MAX
132 #      define WCHAR_MAX 0xffff
133 #    endif
134 #    if defined (__GNUC__) && defined (__alpha__)
135 /* Definition of WCHAR_MIN and MAX are wrong for alpha platform
136  * as gcc consider wchar_t as an unsigned type but WCHAR_MIN is defined as
137  * a negative value. Static assertion is here to check that a future alpha
138  * SDK or a future gcc won't change the situation making this workaround
139  * useless.
140  */
141 /* Check that gcc still consider wchar_t as unsigned */
142 _STLP_STATIC_ASSERT(((wchar_t)-1 > 0))
143 /* Check that WCHAR_MIN value hasn't been fixed */
144 _STLP_STATIC_ASSERT((WCHAR_MIN < 0))
145 #      undef WCHAR_MIN
146 #      define WCHAR_MIN 0
147 #      undef WCHAR_MAX
148 #      define WCHAR_MAX 0xffffffff
149 #    endif
150 #    if defined(__HP_aCC) && (__HP_aCC >= 60000)
151 /* Starting with B.11.31, HP-UX/ia64 provides C99-compliant definitions
152  * of WCHAR_MIN/MAX macros without having to define
153  * _INCLUDE_STDC__SOURCE_199901 macro (which aCC compiler does not
154  * predefine). Let STLport provide B.11.31 definitions on any version of
155  * HP-UX/ia64.
156  */
157 #      undef WCHAR_MIN
158 #      define WCHAR_MIN 0
159 #      undef WCHAR_MAX
160 #      define WCHAR_MAX UINT_MAX
161 #    endif
162 #  endif
163 
164 #  if defined (_STLP_IMPORT_VENDOR_CSTD)
165 
166 #    if defined (__SUNPRO_CC) && !defined (_STLP_HAS_NO_NEW_C_HEADERS)
167 using _STLP_VENDOR_CSTD::wint_t;
168 #    endif
169 
170 _STLP_BEGIN_NAMESPACE
171 #    if defined (_STLP_NO_WCHAR_T)
172 typedef int wint_t;
173 #    else
174 // gcc 3.0 has a glitch : wint_t only sucked into the global namespace if _GLIBCPP_USE_WCHAR_T is defined
175 // __MWERKS__ has definition in wchar_t.h (MSL C++), but ones differ from definition
176 // in stdio.h; I prefer settings from last file.
177 #      if (defined (__GNUC__) && ! defined (_GLIBCPP_USE_WCHAR_T))
178 using ::wint_t;
179 #      else
180 using _STLP_VENDOR_CSTD::wint_t;
181 #      endif
182 #    endif
183 
184 using _STLP_VENDOR_CSTD::size_t;
185 
186 #    if !defined (_STLP_NO_NATIVE_MBSTATE_T) && !defined (_STLP_USE_OWN_MBSTATE_T)
187 using _STLP_VENDOR_MB_NAMESPACE::mbstate_t;
188 
189 #      if !defined (_STLP_NO_CSTD_FUNCTION_IMPORTS) && !defined(_STLP_WCHAR_BORLAND_EXCLUDE) && \
190          (!defined(__MSL__) || __MSL__ > 0x6001)
191 #        if defined (__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 3) || ((__MINGW32_MAJOR_VERSION == 3) && (__MINGW32_MINOR_VERSION >= 8))) || \
192           !(defined (__KCC) || defined (__GNUC__)) && !defined(_STLP_WCE_NET)
193 using _STLP_VENDOR_MB_NAMESPACE::btowc;
194 #          if (!defined(__MSL__) || __MSL__ > 0x7001)
195 using _STLP_VENDOR_MB_NAMESPACE::mbsinit;
196 #          endif
197 #        endif
198 #        if defined (__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 3) || ((__MINGW32_MAJOR_VERSION == 3) && (__MINGW32_MINOR_VERSION >= 8))) || \
199            !defined (__GNUC__) && !defined(_STLP_WCE_NET)
200 using _STLP_VENDOR_MB_NAMESPACE::mbrlen;
201 using _STLP_VENDOR_MB_NAMESPACE::mbrtowc;
202 using _STLP_VENDOR_MB_NAMESPACE::mbsrtowcs;
203 using _STLP_VENDOR_MB_NAMESPACE::wcrtomb;
204 using _STLP_VENDOR_MB_NAMESPACE::wcsrtombs;
205 #        endif
206 #      endif /* BORLAND && !__MSL__ || __MSL__ > 0x6001 */
207 
208 #    endif /* _STLP_NO_NATIVE_MBSTATE_T */
209 
210 #    if !defined (_STLP_NO_NATIVE_WIDE_FUNCTIONS) && ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
211 
212 #      if !defined (_STLP_WCHAR_BORLAND_EXCLUDE) && ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
213 using _STLP_VENDOR_CSTD::fgetwc;
214 using _STLP_VENDOR_CSTD::fgetws;
215 using _STLP_VENDOR_CSTD::fputwc;
216 using _STLP_VENDOR_CSTD::fputws;
217 #      endif
218 
219 #      if !(defined (_STLP_WCHAR_SUNPRO_EXCLUDE) || defined (_STLP_WCHAR_BORLAND_EXCLUDE) || \
220             defined(_STLP_WCHAR_HPACC_EXCLUDE) )
221 #        if !defined (__DECCXX)
222 using _STLP_VENDOR_CSTD::fwide;
223 #        endif
224 using _STLP_VENDOR_CSTD::fwprintf;
225 using _STLP_VENDOR_CSTD::fwscanf;
226 using _STLP_VENDOR_CSTD::getwchar;
227 #      endif
228 
229 #      if !defined(_STLP_WCHAR_BORLAND_EXCLUDE)
230 #        ifndef _STLP_WCE_NET
231 using _STLP_VENDOR_CSTD::getwc;
232 #        endif
233 using _STLP_VENDOR_CSTD::ungetwc;
234 #        ifndef _STLP_WCE_NET
235 using _STLP_VENDOR_CSTD::putwc;
236 #        endif
237 using _STLP_VENDOR_CSTD::putwchar;
238 #      endif
239 
240 #      if !(defined (_STLP_WCHAR_SUNPRO_EXCLUDE) || defined (_STLP_WCHAR_BORLAND_EXCLUDE) || \
241             defined (_STLP_WCHAR_HPACC_EXCLUDE) )
242 #        if defined (_STLP_MSVC_LIB) && (_STLP_MSVC_LIB <= 1300) || \
243             defined (__MINGW32__)
244 #          undef swprintf
245 #          define swprintf _snwprintf
246 #          undef vswprintf
247 #          define vswprintf _vsnwprintf
248 using ::swprintf;
249 using ::vswprintf;
250 #        else
251 using _STLP_VENDOR_CSTD::swprintf;
252 using _STLP_VENDOR_CSTD::vswprintf;
253 #        endif
254 using _STLP_VENDOR_CSTD::swscanf;
255 using _STLP_VENDOR_CSTD::vfwprintf;
256 using _STLP_VENDOR_CSTD::vwprintf;
257 
258 #        if (!defined(__MSL__) || __MSL__ > 0x7001 ) && !defined(_STLP_WCE_NET) && \
259              !defined(_STLP_USE_UCLIBC) /* at least in uClibc 0.9.26 */
260 
261 using _STLP_VENDOR_CSTD::wcsftime;
262 #        endif
263 using _STLP_VENDOR_CSTD::wcstok;
264 
265 #      endif
266 
267 #      if !defined (_STLP_WCE_NET)
268 using _STLP_VENDOR_CSTD::wcscoll;
269 using _STLP_VENDOR_CSTD::wcsxfrm;
270 #      endif
271 using _STLP_VENDOR_CSTD::wcscat;
272 using _STLP_VENDOR_CSTD::wcsrchr;
273 using _STLP_VENDOR_CSTD::wcscmp;
274 
275 using _STLP_VENDOR_CSTD::wcscpy;
276 using _STLP_VENDOR_CSTD::wcscspn;
277 
278 using _STLP_VENDOR_CSTD::wcslen;
279 using _STLP_VENDOR_CSTD::wcsncat;
280 using _STLP_VENDOR_CSTD::wcsncmp;
281 using _STLP_VENDOR_CSTD::wcsncpy;
282 using _STLP_VENDOR_CSTD::wcspbrk;
283 using _STLP_VENDOR_CSTD::wcschr;
284 
285 using _STLP_VENDOR_CSTD::wcsspn;
286 
287 #      if !defined (_STLP_WCHAR_BORLAND_EXCLUDE)
288 using _STLP_VENDOR_CSTD::wcstod;
289 using _STLP_VENDOR_CSTD::wcstol;
290 #      endif
291 
292 #      if !(defined (_STLP_WCHAR_SUNPRO_EXCLUDE) || defined (_STLP_WCHAR_HPACC_EXCLUDE) )
293 using _STLP_VENDOR_CSTD::wcsstr;
294 using _STLP_VENDOR_CSTD::wmemchr;
295 
296 #        if !defined (_STLP_WCHAR_BORLAND_EXCLUDE)
297 #            if !defined (_STLP_WCE_NET)
298 using _STLP_VENDOR_CSTD::wctob;
299 #            endif
300 #          if !defined (__DMC__)
301 using _STLP_VENDOR_CSTD::wmemcmp;
302 using _STLP_VENDOR_CSTD::wmemmove;
303 #          endif
304 using _STLP_VENDOR_CSTD::wprintf;
305 using _STLP_VENDOR_CSTD::wscanf;
306 #        endif
307 
308 #        if defined (__BORLANDC__) && !defined (__linux__)
_STLP_wmemcpy(wchar_t * __wdst,const wchar_t * __wsrc,size_t __n)309 inline wchar_t* _STLP_wmemcpy(wchar_t* __wdst, const wchar_t* __wsrc, size_t __n)
310 { return __STATIC_CAST(wchar_t*, _STLP_VENDOR_CSTD::wmemcpy(__wdst, __wsrc, __n)); }
_STLP_wmemset(wchar_t * __wdst,wchar_t __wc,size_t __n)311 inline wchar_t* _STLP_wmemset(wchar_t* __wdst, wchar_t __wc, size_t __n)
312 { return __STATIC_CAST(wchar_t*, _STLP_VENDOR_CSTD::memset(__wdst, __wc, __n)); }
313 #          undef wmemcpy
314 #          undef wmemset
wmemcpy(wchar_t * __wdst,const wchar_t * __wsrc,size_t __n)315 inline wchar_t* wmemcpy(wchar_t* __wdst, const wchar_t* __wsrc, size_t __n)
316 { return _STLP_wmemcpy(__wdst, __wsrc, __n); }
wmemset(wchar_t * __wdst,wchar_t __wc,size_t __n)317 inline wchar_t* wmemset(wchar_t* __wdst, wchar_t __wc, size_t __n)
318 { return _STLP_wmemset(__wdst, __wc, __n); }
319 #        elif defined (__DMC__)
wmemcpy(wchar_t * __RESTRICT __wdst,const wchar_t * __RESTRICT __wsrc,size_t __n)320 inline wchar_t* wmemcpy(wchar_t* __RESTRICT __wdst, const wchar_t* __RESTRICT __wsrc, size_t __n)
321 { return __STATIC_CAST(wchar_t*, memcpy(__wdst, __wsrc, __n * sizeof(wchar_t))); }
wmemmove(wchar_t * __RESTRICT __wdst,const wchar_t * __RESTRICT __wc,size_t __n)322 inline wchar_t* wmemmove(wchar_t* __RESTRICT __wdst, const wchar_t * __RESTRICT __wc, size_t __n)
323 { return __STATIC_CAST(wchar_t*, memmove(__wdst, __wc, __n * sizeof(wchar_t))); }
wmemset(wchar_t * __wdst,wchar_t __wc,size_t __n)324 inline wchar_t* wmemset(wchar_t* __wdst, wchar_t __wc, size_t __n)
325 { for (size_t i = 0; i < __n; i++) __wdst[i] = __wc; return __wdst; }
326 #        else
327 using _STLP_VENDOR_CSTD::wmemcpy;
328 using _STLP_VENDOR_CSTD::wmemset;
329 #        endif
330 #      endif
331 
332 #    endif /* _STLP_NO_NATIVE_WIDE_FUNCTIONS */
333 _STLP_END_NAMESPACE
334 
335 #  endif /* _STLP_IMPORT_VENDOR_CSTD */
336 
337 #  undef _STLP_WCHAR_SUNPRO_EXCLUDE
338 #  undef _STLP_WCHAR_MSL_EXCLUDE
339 
340 #  endif /* !defined(_STLP_WCE_EVC3) */
341 
342 #endif /* _STLP_INTERNAL_CWCHAR */
343