wctype.in.h 12.8 KB
Newer Older
1 2
/* A substitute for ISO C99 <wctype.h>, for platforms that lack it.

3
   Copyright (C) 2006-2013 Free Software Foundation, Inc.
4 5 6 7 8 9 10 11 12 13 14 15

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
16
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
17 18 19 20 21 22 23 24 25 26 27

/* Written by Bruno Haible and Paul Eggert.  */

/*
 * ISO C 99 <wctype.h> for platforms that lack it.
 * <http://www.opengroup.org/susv3xbd/wctype.h.html>
 *
 * iswctype, towctrans, towlower, towupper, wctrans, wctype,
 * wctrans_t, and wctype_t are not yet implemented.
 */

28
#ifndef _@GUARD_PREFIX@_WCTYPE_H
29 30 31 32

#if __GNUC__ >= 3
@PRAGMA_SYSTEM_HEADER@
#endif
33
@PRAGMA_COLUMNS@
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

#if @HAVE_WINT_T@
/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
   Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
# include <stddef.h>
# include <stdio.h>
# include <time.h>
# include <wchar.h>
#endif

/* Include the original <wctype.h> if it exists.
   BeOS 5 has the functions but no <wctype.h>.  */
/* The include_next requires a split double-inclusion guard.  */
#if @HAVE_WCTYPE_H@
# @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
#endif

54 55 56 57 58 59 60
#ifndef _@GUARD_PREFIX@_WCTYPE_H
#define _@GUARD_PREFIX@_WCTYPE_H

_GL_INLINE_HEADER_BEGIN
#ifndef _GL_WCTYPE_INLINE
# define _GL_WCTYPE_INLINE _GL_INLINE
#endif
61 62 63 64 65

/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */

/* The definition of _GL_WARN_ON_USE is copied here.  */

66 67 68 69 70 71 72 73 74 75 76 77 78
/* Solaris 2.6 <wctype.h> includes <widec.h> which includes <euc.h> which
   #defines a number of identifiers in the application namespace.  Revert
   these #defines.  */
#ifdef __sun
# undef multibyte
# undef eucw1
# undef eucw2
# undef eucw3
# undef scrw1
# undef scrw2
# undef scrw3
#endif

79 80 81 82 83 84 85
/* Define wint_t and WEOF.  (Also done in wchar.in.h.)  */
#if !@HAVE_WINT_T@ && !defined wint_t
# define wint_t int
# ifndef WEOF
#  define WEOF -1
# endif
#else
86 87 88 89 90 91 92 93 94 95 96 97
/* MSVC defines wint_t as 'unsigned short' in <crtdefs.h>.
   This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be
   "unchanged by default argument promotions".  Override it.  */
# if defined _MSC_VER
#  if !GNULIB_defined_wint_t
#   include <crtdefs.h>
typedef unsigned int rpl_wint_t;
#   undef wint_t
#   define wint_t rpl_wint_t
#   define GNULIB_defined_wint_t 1
#  endif
# endif
98 99 100 101 102 103
# ifndef WEOF
#  define WEOF ((wint_t) -1)
# endif
#endif


104 105
#if !GNULIB_defined_wctype_functions

106 107 108 109
/* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
   Linux libc5 has <wctype.h> and the functions but they are broken.
   Assume all 11 functions (all isw* except iswblank) are implemented the
   same way, or not at all.  */
110
# if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
111 112 113 114 115 116

/* IRIX 5.3 has macros but no functions, its isw* macros refer to an
   undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
   refer to system functions like _iswctype that are not in the
   standard C library.  Rather than try to get ancient buggy
   implementations like this to work, just disable them.  */
117 118 119 120 121 122 123 124 125 126 127 128 129 130
#  undef iswalnum
#  undef iswalpha
#  undef iswblank
#  undef iswcntrl
#  undef iswdigit
#  undef iswgraph
#  undef iswlower
#  undef iswprint
#  undef iswpunct
#  undef iswspace
#  undef iswupper
#  undef iswxdigit
#  undef towlower
#  undef towupper
131 132

/* Linux libc5 has <wctype.h> and the functions but they are broken.  */
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
#  if @REPLACE_ISWCNTRL@
#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
#    define iswalnum rpl_iswalnum
#    define iswalpha rpl_iswalpha
#    define iswblank rpl_iswblank
#    define iswcntrl rpl_iswcntrl
#    define iswdigit rpl_iswdigit
#    define iswgraph rpl_iswgraph
#    define iswlower rpl_iswlower
#    define iswprint rpl_iswprint
#    define iswpunct rpl_iswpunct
#    define iswspace rpl_iswspace
#    define iswupper rpl_iswupper
#    define iswxdigit rpl_iswxdigit
#   endif
#  endif
#  if @REPLACE_TOWLOWER@
#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
#    define towlower rpl_towlower
#    define towupper rpl_towupper
#   endif
154 155
#  endif

156 157
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
158
rpl_iswalnum
159
#  else
160
iswalnum
161
#  endif
162 163 164 165 166 167
         (wint_t wc)
{
  return ((wc >= '0' && wc <= '9')
          || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
}

168 169
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
170
rpl_iswalpha
171
#  else
172
iswalpha
173
#  endif
174 175 176 177 178
         (wint_t wc)
{
  return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
}

179 180
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
181
rpl_iswblank
182
#  else
183
iswblank
184
#  endif
185 186 187 188 189
         (wint_t wc)
{
  return wc == ' ' || wc == '\t';
}

190 191
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
192
rpl_iswcntrl
193
#  else
194
iswcntrl
195
#  endif
196 197 198 199 200
        (wint_t wc)
{
  return (wc & ~0x1f) == 0 || wc == 0x7f;
}

201 202
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
203
rpl_iswdigit
204
#  else
205
iswdigit
206
#  endif
207 208 209 210 211
         (wint_t wc)
{
  return wc >= '0' && wc <= '9';
}

212 213
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
214
rpl_iswgraph
215
#  else
216
iswgraph
217
#  endif
218 219 220 221 222
         (wint_t wc)
{
  return wc >= '!' && wc <= '~';
}

223 224
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
225
rpl_iswlower
226
#  else
227
iswlower
228
#  endif
229 230 231 232 233
         (wint_t wc)
{
  return wc >= 'a' && wc <= 'z';
}

234 235
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
236
rpl_iswprint
237
#  else
238
iswprint
239
#  endif
240 241 242 243 244
         (wint_t wc)
{
  return wc >= ' ' && wc <= '~';
}

245 246
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
247
rpl_iswpunct
248
#  else
249
iswpunct
250
#  endif
251 252 253 254 255 256 257
         (wint_t wc)
{
  return (wc >= '!' && wc <= '~'
          && !((wc >= '0' && wc <= '9')
               || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
}

258 259
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
260
rpl_iswspace
261
#  else
262
iswspace
263
#  endif
264 265 266 267 268 269
         (wint_t wc)
{
  return (wc == ' ' || wc == '\t'
          || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
}

270 271
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
272
rpl_iswupper
273
#  else
274
iswupper
275
#  endif
276 277 278 279 280
         (wint_t wc)
{
  return wc >= 'A' && wc <= 'Z';
}

281 282
_GL_WCTYPE_INLINE int
#  if @REPLACE_ISWCNTRL@
283
rpl_iswxdigit
284
#  else
285
iswxdigit
286
#  endif
287 288 289 290 291 292
          (wint_t wc)
{
  return ((wc >= '0' && wc <= '9')
          || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
}

293 294
_GL_WCTYPE_INLINE wint_t
#  if @REPLACE_TOWLOWER@
295
rpl_towlower
296
#  else
297
towlower
298
#  endif
299 300 301 302 303
         (wint_t wc)
{
  return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
}

304 305
_GL_WCTYPE_INLINE wint_t
#  if @REPLACE_TOWLOWER@
306
rpl_towupper
307
#  else
308
towupper
309
#  endif
310 311 312 313 314
         (wint_t wc)
{
  return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
}

315
# elif @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
316 317
/* Only the iswblank function is missing.  */

318 319 320 321 322 323 324
#  if @REPLACE_ISWBLANK@
#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
#    define iswblank rpl_iswblank
#   endif
_GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
#  else
_GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
325 326 327 328
#  endif

# endif

329
# if defined __MINGW32__
330 331 332 333 334 335 336 337 338 339 340 341 342 343

/* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
   The functions towlower and towupper are implemented in the MSVCRT library
   to take a wchar_t argument and return a wchar_t result.  mingw declares
   these functions to take a wint_t argument and return a wint_t result.
   This means that:
   1. When the user passes an argument outside the range 0x0000..0xFFFF, the
      function will look only at the lower 16 bits.  This is allowed according
      to POSIX.
   2. The return value is returned in the lower 16 bits of the result register.
      The upper 16 bits are random: whatever happened to be in that part of the
      result register.  We need to fix this by adding a zero-extend from
      wchar_t to wint_t after the call.  */

344
_GL_WCTYPE_INLINE wint_t
345 346 347 348
rpl_towlower (wint_t wc)
{
  return (wint_t) (wchar_t) towlower (wc);
}
349 350 351
#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
#   define towlower rpl_towlower
#  endif
352

353
_GL_WCTYPE_INLINE wint_t
354 355 356 357
rpl_towupper (wint_t wc)
{
  return (wint_t) (wchar_t) towupper (wc);
}
358 359 360
#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
#   define towupper rpl_towupper
#  endif
361

362 363 364 365
# endif /* __MINGW32__ */

# define GNULIB_defined_wctype_functions 1
#endif
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403

#if @REPLACE_ISWCNTRL@
_GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
#else
_GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
_GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
#endif
_GL_CXXALIASWARN (iswalnum);
_GL_CXXALIASWARN (iswalpha);
_GL_CXXALIASWARN (iswcntrl);
_GL_CXXALIASWARN (iswdigit);
_GL_CXXALIASWARN (iswgraph);
_GL_CXXALIASWARN (iswlower);
_GL_CXXALIASWARN (iswprint);
_GL_CXXALIASWARN (iswpunct);
_GL_CXXALIASWARN (iswspace);
_GL_CXXALIASWARN (iswupper);
_GL_CXXALIASWARN (iswxdigit);

404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
#if @GNULIB_ISWBLANK@
# if @REPLACE_ISWCNTRL@ || @REPLACE_ISWBLANK@
_GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
# else
_GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
# endif
_GL_CXXALIASWARN (iswblank);
#endif

#if !@HAVE_WCTYPE_T@
# if !GNULIB_defined_wctype_t
typedef void * wctype_t;
#  define GNULIB_defined_wctype_t 1
# endif
#endif

/* Get a descriptor for a wide character property.  */
#if @GNULIB_WCTYPE@
# if !@HAVE_WCTYPE_T@
_GL_FUNCDECL_SYS (wctype, wctype_t, (const char *name));
# endif
_GL_CXXALIAS_SYS (wctype, wctype_t, (const char *name));
_GL_CXXALIASWARN (wctype);
#elif defined GNULIB_POSIXCHECK
# undef wctype
# if HAVE_RAW_DECL_WCTYPE
_GL_WARN_ON_USE (wctype, "wctype is unportable - "
                 "use gnulib module wctype for portability");
# endif
#endif

/* Test whether a wide character has a given property.
   The argument WC must be either a wchar_t value or WEOF.
   The argument DESC must have been returned by the wctype() function.  */
#if @GNULIB_ISWCTYPE@
# if !@HAVE_WCTYPE_T@
_GL_FUNCDECL_SYS (iswctype, int, (wint_t wc, wctype_t desc));
# endif
_GL_CXXALIAS_SYS (iswctype, int, (wint_t wc, wctype_t desc));
_GL_CXXALIASWARN (iswctype);
#elif defined GNULIB_POSIXCHECK
# undef iswctype
# if HAVE_RAW_DECL_ISWCTYPE
_GL_WARN_ON_USE (iswctype, "iswctype is unportable - "
                 "use gnulib module iswctype for portability");
# endif
#endif

#if @REPLACE_TOWLOWER@ || defined __MINGW32__
453 454 455 456 457 458 459 460 461
_GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
_GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
#else
_GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
_GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
#endif
_GL_CXXALIASWARN (towlower);
_GL_CXXALIASWARN (towupper);

462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
#if !@HAVE_WCTRANS_T@
# if !GNULIB_defined_wctrans_t
typedef void * wctrans_t;
#  define GNULIB_defined_wctrans_t 1
# endif
#endif

/* Get a descriptor for a wide character case conversion.  */
#if @GNULIB_WCTRANS@
# if !@HAVE_WCTRANS_T@
_GL_FUNCDECL_SYS (wctrans, wctrans_t, (const char *name));
# endif
_GL_CXXALIAS_SYS (wctrans, wctrans_t, (const char *name));
_GL_CXXALIASWARN (wctrans);
#elif defined GNULIB_POSIXCHECK
# undef wctrans
# if HAVE_RAW_DECL_WCTRANS
_GL_WARN_ON_USE (wctrans, "wctrans is unportable - "
                 "use gnulib module wctrans for portability");
# endif
#endif

/* Perform a given case conversion on a wide character.
   The argument WC must be either a wchar_t value or WEOF.
   The argument DESC must have been returned by the wctrans() function.  */
#if @GNULIB_TOWCTRANS@
# if !@HAVE_WCTRANS_T@
_GL_FUNCDECL_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
# endif
_GL_CXXALIAS_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
_GL_CXXALIASWARN (towctrans);
#elif defined GNULIB_POSIXCHECK
# undef towctrans
# if HAVE_RAW_DECL_TOWCTRANS
_GL_WARN_ON_USE (towctrans, "towctrans is unportable - "
                 "use gnulib module towctrans for portability");
# endif
#endif

_GL_INLINE_HEADER_END
502

503 504
#endif /* _@GUARD_PREFIX@_WCTYPE_H */
#endif /* _@GUARD_PREFIX@_WCTYPE_H */