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__) 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)); } 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 315 inline wchar_t* wmemcpy(wchar_t* __wdst, const wchar_t* __wsrc, size_t __n) 316 { return _STLP_wmemcpy(__wdst, __wsrc, __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__) 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))); } 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))); } 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