1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 /*
  28  * An application should not include this header directly.  Instead it
  29  * should be included only through the inclusion of other Sun headers.
  30  *
  31  * The contents of this header is limited to identifiers specified in the
  32  * C Standard.  Any new identifiers specified in future amendments to the
  33  * C Standard must be placed in this header.  If these new identifiers
  34  * are required to also be in the C++ Standard "std" namespace, then for
  35  * anything other than macro definitions, corresponding "using" directives
  36  * must also be added to <wchar.h>.
  37  */
  38 
  39 #ifndef _ISO_WCHAR_ISO_H
  40 #define _ISO_WCHAR_ISO_H
  41 
  42 #pragma ident   "%Z%%M% %I%     %E% SMI"
  43 
  44 #include <sys/feature_tests.h>
  45 #include <stdio_tag.h>
  46 #include <wchar_impl.h>
  47 #include <iso/time_iso.h>
  48 
  49 #if (defined(__cplusplus) && (__cplusplus - 0 < 54321L)) || \
  50         (!defined(__cplusplus) && !defined(_STRICT_STDC)) || \
  51         defined(__EXTENSIONS__)
  52 #include <stdio.h>
  53 #endif  /*  (defined(__cplusplus) && (__cplusplus - 0 < 54321L)) ... */
  54 
  55 #if !defined(_STRICT_STDC) || defined(__EXTENSIONS__)
  56 #include <ctype.h>
  57 #include <stddef.h>
  58 #endif /* !defined(_STRICT_STDC) || defined(__EXTENSIONS__) */
  59 
  60 #include <sys/va_list.h>
  61 
  62 #ifdef  __cplusplus
  63 extern "C" {
  64 #endif
  65 
  66 #if __cplusplus >= 199711L
  67 namespace std {
  68 #endif
  69 
  70 /*
  71  * wchar_t is a built-in type in standard C++ and as such is not
  72  * defined here when using standard C++. However, the GNU compiler
  73  * fixincludes utility nonetheless creates its own version of this
  74  * header for use by gcc and g++. In that version it adds a redundant
  75  * guard for __cplusplus. To avoid the creation of a gcc/g++ specific
  76  * header we need to include the following magic comment:
  77  *
  78  * we must use the C++ compiler's type
  79  *
  80  * The above comment should not be removed or changed until GNU
  81  * gcc/fixinc/inclhack.def is updated to bypass this header.
  82  */
  83 #if !defined(__cplusplus) || (__cplusplus < 199711L && !defined(__GNUG__))
  84 #ifndef _WCHAR_T
  85 #define _WCHAR_T
  86 #if defined(_LP64)
  87 typedef int     wchar_t;
  88 #else
  89 typedef long    wchar_t;
  90 #endif
  91 #endif  /* !_WCHAR_T */
  92 #endif  /* !defined(__cplusplus) ... */
  93 
  94 #if !defined(_WINT_T) || __cplusplus >= 199711L
  95 #define _WINT_T
  96 #if defined(_LP64)
  97 typedef int     wint_t;
  98 #else
  99 typedef long    wint_t;
 100 #endif
 101 #endif  /* !defined(_WINT_T) || __cplusplus >= 199711L */
 102 
 103 #if !defined(_SIZE_T) || __cplusplus >= 199711L
 104 #define _SIZE_T
 105 #if defined(_LP64) || defined(_I32LPx)
 106 typedef unsigned long   size_t;         /* size of something in bytes */
 107 #else
 108 typedef unsigned int    size_t;         /* (historical version) */
 109 #endif
 110 #endif  /* !defined(_SIZE_T) || __cplusplus >= 199711L */
 111 
 112 #ifndef NULL
 113 #if defined(_LP64)
 114 #define NULL    0L
 115 #else
 116 #define NULL    0
 117 #endif
 118 #endif /* !NULL */
 119 
 120 #ifndef WEOF
 121 #if __cplusplus >= 199711L
 122 #define WEOF    ((std::wint_t)(-1))
 123 #else
 124 #define WEOF    ((wint_t)(-1))
 125 #endif
 126 #endif /* WEOF */
 127 
 128 /* not XPG4 and not XPG4v2 */
 129 #if !defined(_XPG4) || defined(_XPG5)
 130 #ifndef WCHAR_MAX
 131 #define WCHAR_MAX       2147483647
 132 #endif
 133 #ifndef WCHAR_MIN
 134 #define WCHAR_MIN       (-2147483647-1)
 135 #endif
 136 #endif /* not XPG4 and not XPG4v2 */
 137 
 138 #if !defined(_MBSTATE_T) || __cplusplus >= 199711L
 139 #define _MBSTATE_T
 140 typedef __mbstate_t     mbstate_t;
 141 #endif  /* _MBSTATE_T */
 142 
 143 #if defined(_XPG4) && !defined(_FILEDEFED) || __cplusplus >= 199711L
 144 #define _FILEDEFED
 145 typedef __FILE FILE;
 146 #endif
 147 
 148 #if !defined(_LP64) && !defined(_LONGLONG_TYPE)
 149 
 150 #ifdef __PRAGMA_REDEFINE_EXTNAME
 151 #pragma redefine_extname fwprintf       _fwprintf_c89
 152 #pragma redefine_extname swprintf       _swprintf_c89
 153 #pragma redefine_extname vfwprintf      _vfwprintf_c89
 154 #pragma redefine_extname vswprintf      _vswprintf_c89
 155 #pragma redefine_extname vwprintf       _vwprintf_c89
 156 #pragma redefine_extname wprintf        _wprintf_c89
 157 #pragma redefine_extname fwscanf        _fwscanf_c89
 158 #pragma redefine_extname swscanf        _swscanf_c89
 159 #pragma redefine_extname wscanf         _wscanf_c89
 160 #else
 161 #define fwprintf        _fwprintf_c89
 162 #define swprintf        _swprintf_c89
 163 #define vfwprintf       _vfwprintf_c89
 164 #define vswprintf       _vswprintf_c89
 165 #define vwprintf        _vwprintf_c89
 166 #define wprintf         _wprintf_c89
 167 #define fwscanf         _fwscanf_c89
 168 #define swscanf         _swscanf_c89
 169 #define wscanf          _wscanf_c89
 170 #endif
 171 
 172 #endif /* !defined(_LP64) && !defined(_LONGLONG_TYPE) */
 173 
 174 #if (!defined(_MSE_INT_H))
 175 /* not XPG4 and not XPG4v2 */
 176 #if !defined(_XPG4) || defined(_XPG5)
 177 #ifdef __PRAGMA_REDEFINE_EXTNAME
 178 #pragma redefine_extname fgetwc __fgetwc_xpg5
 179 #pragma redefine_extname getwc  __getwc_xpg5
 180 #pragma redefine_extname getwchar       __getwchar_xpg5
 181 #pragma redefine_extname fputwc __fputwc_xpg5
 182 #pragma redefine_extname putwc  __putwc_xpg5
 183 #pragma redefine_extname putwchar       __putwchar_xpg5
 184 #pragma redefine_extname fgetws __fgetws_xpg5
 185 #pragma redefine_extname fputws __fputws_xpg5
 186 #pragma redefine_extname ungetwc        __ungetwc_xpg5
 187 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 188 #ifdef __STDC__
 189 extern wint_t __fgetwc_xpg5(__FILE *);
 190 extern wint_t __getwc_xpg5(__FILE *);
 191 extern wint_t __getwchar_xpg5(void);
 192 extern wint_t __fputwc_xpg5(wint_t, __FILE *);
 193 extern wint_t __putwc_xpg5(wint_t, __FILE *);
 194 extern wint_t __putwchar_xpg5(wint_t);
 195 extern wchar_t *__fgetws_xpg5(wchar_t *_RESTRICT_KYWD, int,
 196                         __FILE *_RESTRICT_KYWD);
 197 extern int __fputws_xpg5(const wchar_t *_RESTRICT_KYWD, __FILE *_RESTRICT_KYWD);
 198 extern wint_t __ungetwc_xpg5(wint_t, __FILE *);
 199 #else
 200 extern wint_t __fgetwc_xpg5();
 201 extern wint_t __getwc_xpg5();
 202 extern wint_t __getwchar_xpg5();
 203 extern wint_t __fputwc_xpg5();
 204 extern wint_t __putwc_xpg5();
 205 extern wint_t __putwchar_xpg5();
 206 extern wchar_t *__fgetws_xpg5();
 207 extern int __fputws_xpg5();
 208 extern wint_t __ungetwc_xpg5();
 209 #endif  /* __STDC__ */
 210 #define fgetwc  __fgetwc_xpg5
 211 #define getwc   __getwc_xpg5
 212 #define getwchar        __getwchar_xpg5
 213 #define fputwc  __fputwc_xpg5
 214 #define putwc   __putwc_xpg5
 215 #define putwchar        __putwchar_xpg5
 216 #define fgetws  __fgetws_xpg5
 217 #define fputws  __fputws_xpg5
 218 #define ungetwc __ungetwc_xpg5
 219 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
 220 #endif /* not XPG4 and not XPG4v2 */
 221 #endif /* defined(_MSE_INT_H) */
 222 
 223 #ifdef __STDC__
 224 
 225 extern wint_t fgetwc(__FILE *);
 226 extern wchar_t *fgetws(wchar_t *_RESTRICT_KYWD, int, __FILE *_RESTRICT_KYWD);
 227 extern wint_t fputwc(wint_t, __FILE *);
 228 extern int fputws(const wchar_t *_RESTRICT_KYWD, __FILE *_RESTRICT_KYWD);
 229 extern wint_t ungetwc(wint_t, __FILE *);
 230 extern wint_t getwc(__FILE *);
 231 extern wint_t getwchar(void);
 232 extern wint_t putwc(wint_t, __FILE *);
 233 extern wint_t putwchar(wint_t);
 234 extern double wcstod(const wchar_t *_RESTRICT_KYWD, wchar_t **_RESTRICT_KYWD);
 235 extern long wcstol(const wchar_t *_RESTRICT_KYWD, wchar_t **_RESTRICT_KYWD,
 236         int);
 237 extern unsigned long wcstoul(const wchar_t *_RESTRICT_KYWD,
 238         wchar_t **_RESTRICT_KYWD, int);
 239 extern wchar_t *wcscat(wchar_t *_RESTRICT_KYWD, const wchar_t *_RESTRICT_KYWD);
 240 extern int wcscmp(const wchar_t *, const wchar_t *);
 241 extern int wcscoll(const wchar_t *, const wchar_t *);
 242 extern wchar_t *wcscpy(wchar_t *_RESTRICT_KYWD, const wchar_t *_RESTRICT_KYWD);
 243 extern size_t wcscspn(const wchar_t *, const wchar_t *);
 244 extern size_t wcslen(const wchar_t *);
 245 extern wchar_t *wcsncat(wchar_t *_RESTRICT_KYWD, const wchar_t *_RESTRICT_KYWD,
 246         size_t);
 247 extern int wcsncmp(const wchar_t *, const wchar_t *, size_t);
 248 extern wchar_t *wcsncpy(wchar_t *_RESTRICT_KYWD, const wchar_t *_RESTRICT_KYWD,
 249         size_t);
 250 extern size_t wcsspn(const wchar_t *, const wchar_t *);
 251 extern size_t wcsxfrm(wchar_t *_RESTRICT_KYWD, const wchar_t *_RESTRICT_KYWD,
 252         size_t);
 253 #if __cplusplus >= 199711L
 254 extern const wchar_t *wcschr(const wchar_t *, wchar_t);
 255 extern "C++" {
 256         inline wchar_t *wcschr(wchar_t *__ws, wchar_t __wc) {
 257                 return (wchar_t *)wcschr((const wchar_t *)__ws, __wc);
 258         }
 259 }
 260 extern const wchar_t *wcspbrk(const wchar_t *, const wchar_t *);
 261 extern "C++" {
 262         inline wchar_t *wcspbrk(wchar_t *__ws1, const wchar_t *__ws2) {
 263                 return (wchar_t *)wcspbrk((const wchar_t *)__ws1, __ws2);
 264         }
 265 }
 266 extern const wchar_t *wcsrchr(const wchar_t *, wchar_t);
 267 extern "C++" {
 268         inline wchar_t *wcsrchr(wchar_t *__ws, wchar_t __wc) {
 269                 return (wchar_t *)wcsrchr((const wchar_t *)__ws, __wc);
 270         }
 271 }
 272 #else /* __cplusplus >= 199711L */
 273 extern wchar_t *wcschr(const wchar_t *, wchar_t);
 274 extern wchar_t *wcspbrk(const wchar_t *, const wchar_t *);
 275 extern wchar_t *wcsrchr(const wchar_t *, wchar_t);
 276 #endif /* __cplusplus >= 199711L */
 277 
 278 #if (!defined(_MSE_INT_H))
 279 #if defined(_XPG4) && !defined(_XPG5) /* XPG4 or XPG4v2 */
 280 extern wchar_t *wcstok(wchar_t *, const wchar_t *);
 281 extern size_t wcsftime(wchar_t *, size_t, const char *, const struct tm *);
 282 #else   /* XPG4 or XPG4v2 */
 283 #ifdef __PRAGMA_REDEFINE_EXTNAME
 284 #pragma redefine_extname wcstok __wcstok_xpg5
 285 #pragma redefine_extname wcsftime       __wcsftime_xpg5
 286 extern wchar_t *wcstok(wchar_t *_RESTRICT_KYWD, const wchar_t *_RESTRICT_KYWD,
 287         wchar_t **_RESTRICT_KYWD);
 288 extern size_t wcsftime(wchar_t *_RESTRICT_KYWD, size_t,
 289         const wchar_t *_RESTRICT_KYWD, const struct tm *_RESTRICT_KYWD);
 290 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 291 extern wchar_t *__wcstok_xpg5(wchar_t *_RESTRICT_KYWD,
 292         const wchar_t *_RESTRICT_KYWD, wchar_t **_RESTRICT_KYWD);
 293 extern size_t __wcsftime_xpg5(wchar_t *_RESTRICT_KYWD, size_t,
 294         const wchar_t *_RESTRICT_KYWD, const struct tm *_RESTRICT_KYWD);
 295 #define wcstok  __wcstok_xpg5
 296 #define wcsftime        __wcsftime_xpg5
 297 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
 298 #endif  /* XPG4 or XPG4v2 */
 299 #endif  /* !defined(_MSE_INT_H) */
 300 
 301 /* not XPG4 and not XPG4v2 */
 302 #if !defined(_XPG4) || defined(_XPG5)
 303 extern wint_t   btowc(int);
 304 extern int      fwprintf(__FILE *_RESTRICT_KYWD, const wchar_t *_RESTRICT_KYWD,
 305                         ...);
 306 extern int      fwscanf(__FILE *_RESTRICT_KYWD, const wchar_t *_RESTRICT_KYWD,
 307                         ...);
 308 extern int      fwide(__FILE *, int);
 309 extern int      mbsinit(const mbstate_t *);
 310 extern size_t   mbrlen(const char *_RESTRICT_KYWD, size_t,
 311                         mbstate_t *_RESTRICT_KYWD);
 312 extern size_t   mbrtowc(wchar_t *_RESTRICT_KYWD, const char *_RESTRICT_KYWD,
 313                         size_t, mbstate_t *_RESTRICT_KYWD);
 314 extern size_t   mbsrtowcs(wchar_t *_RESTRICT_KYWD, const char **_RESTRICT_KYWD,
 315                         size_t, mbstate_t *_RESTRICT_KYWD);
 316 extern int      swprintf(wchar_t *_RESTRICT_KYWD, size_t,
 317                         const wchar_t *_RESTRICT_KYWD, ...);
 318 extern int      swscanf(const wchar_t *_RESTRICT_KYWD,
 319                         const wchar_t *_RESTRICT_KYWD, ...);
 320 extern int      vfwprintf(__FILE *_RESTRICT_KYWD, const wchar_t *_RESTRICT_KYWD,
 321                         __va_list);
 322 extern int      vwprintf(const wchar_t *_RESTRICT_KYWD, __va_list);
 323 extern int      vswprintf(wchar_t *_RESTRICT_KYWD, size_t,
 324                         const wchar_t *_RESTRICT_KYWD, __va_list);
 325 extern size_t   wcrtomb(char *_RESTRICT_KYWD, wchar_t,
 326                         mbstate_t *_RESTRICT_KYWD);
 327 extern size_t   wcsrtombs(char *_RESTRICT_KYWD, const wchar_t **_RESTRICT_KYWD,
 328                         size_t, mbstate_t *_RESTRICT_KYWD);
 329 extern int      wctob(wint_t);
 330 extern int      wmemcmp(const wchar_t *, const wchar_t *, size_t);
 331 extern wchar_t  *wmemcpy(wchar_t *_RESTRICT_KYWD,
 332                         const wchar_t *_RESTRICT_KYWD, size_t);
 333 extern wchar_t  *wmemmove(wchar_t *, const wchar_t *, size_t);
 334 extern wchar_t  *wmemset(wchar_t *, wchar_t, size_t);
 335 extern int      wprintf(const wchar_t *_RESTRICT_KYWD, ...);
 336 extern int      wscanf(const wchar_t *_RESTRICT_KYWD, ...);
 337 #if __cplusplus >= 199711L
 338 extern const wchar_t *wcsstr(const wchar_t *, const wchar_t *);
 339 extern "C++" {
 340         inline wchar_t *wcsstr(wchar_t *__ws1, const wchar_t *__ws2) {
 341                 return (wchar_t *)wcsstr((const wchar_t *)__ws1, __ws2);
 342         }
 343 }
 344 extern const wchar_t *wmemchr(const wchar_t *, wchar_t, size_t);
 345 extern "C++" {
 346         inline wchar_t *wmemchr(wchar_t *__ws, wchar_t __wc, size_t __n) {
 347                 return (wchar_t *)wmemchr((const wchar_t *)__ws, __wc, __n);
 348         }
 349 }
 350 #else /* __cplusplus >= 199711L */
 351 extern wchar_t  *wcsstr(const wchar_t *_RESTRICT_KYWD,
 352         const wchar_t *_RESTRICT_KYWD);
 353 extern wchar_t  *wmemchr(const wchar_t *, wchar_t, size_t);
 354 #endif /* __cplusplus >= 199711L */
 355 #endif /* not XPG4 and not XPG4v2 */
 356 
 357 #else /* __STDC__ */
 358 
 359 extern  wint_t fgetwc();
 360 extern  wchar_t *fgetws();
 361 extern  wint_t fputwc();
 362 extern  int fputws();
 363 extern  wint_t  ungetwc();
 364 extern wint_t getwc();
 365 extern wint_t getwchar();
 366 extern wint_t putwc();
 367 extern wint_t putwchar();
 368 extern wint_t ungetwc();
 369 extern double wcstod();
 370 extern long wcstol();
 371 extern unsigned long wcstoul();
 372 extern wchar_t *wcscat();
 373 extern wchar_t *wcschr();
 374 extern int wcscmp();
 375 extern int wcscoll();
 376 extern wchar_t *wcscpy();
 377 extern size_t wcscspn();
 378 extern size_t wcslen();
 379 extern wchar_t *wcsncat();
 380 extern int wcsncmp();
 381 extern wchar_t *wcsncpy();
 382 extern wchar_t *wcspbrk();
 383 extern wchar_t *wcsrchr();
 384 extern size_t wcsspn();
 385 extern size_t wcsxfrm();
 386 
 387 #if (!defined(_MSE_INT_H))
 388 #if defined(_XPG4) && !defined(_XPG5) /* XPG4 or XPG4v2 */
 389 extern wchar_t *wcstok();
 390 extern size_t wcsftime();
 391 #else   /* XPG4 or XPG4v2 */
 392 #ifdef __PRAGMA_REDEFINE_EXTNAME
 393 #pragma redefine_extname wcstok __wcstok_xpg5
 394 #pragma redefine_extname wcsftime       __wcsftime_xpg5
 395 extern wchar_t *wcstok();
 396 extern size_t wcsftime();
 397 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 398 extern wchar_t *__wcstok_xpg5();
 399 extern size_t __wcsftime_xpg5();
 400 #define wcstok  __wcstok_xpg5
 401 #define wcsftime        __wcsftime_xpg5
 402 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
 403 #endif  /* XPG4 or XPG4v2 */
 404 #endif  /* defined(_MSE_INT_H) */
 405 
 406 /* not XPG4 and not XPG4v2 */
 407 #if (!defined(_XPG4) && !defined(_XPG4_2) || defined(_XPG5))
 408 extern wint_t   btowc();
 409 extern int      fwprintf();
 410 extern int      fwscanf();
 411 extern int      fwide();
 412 extern int      mbsinit();
 413 extern size_t   mbrlen();
 414 extern size_t   mbrtowc();
 415 extern size_t   mbsrtowcs();
 416 extern int      swprintf();
 417 extern int      swscanf();
 418 extern int      vfwprintf();
 419 extern int      vwprintf();
 420 extern int      vswprintf();
 421 extern size_t   wcrtomb();
 422 extern size_t   wcsrtombs();
 423 extern wchar_t  *wcsstr();
 424 extern int      wctob();
 425 extern wchar_t  *wmemchr();
 426 extern int      wmemcmp();
 427 extern wchar_t  *wmemcpy();
 428 extern wchar_t  *wmemmove();
 429 extern wchar_t  *wmemset();
 430 extern int      wprintf();
 431 extern int      wscanf();
 432 #endif /* not XPG4 and not XPG4v2 */
 433 
 434 #endif /* __STDC__ */
 435 
 436 #if __cplusplus >= 199711L
 437 }
 438 #endif /* end of namespace std */
 439 
 440 #ifdef  __cplusplus
 441 }
 442 #endif
 443 
 444 #endif  /* _ISO_WCHAR_ISO_H */