Prepare headers for use in ISO C++ compliant implementations.
[kopensolaris-gnu/glibc.git] / ctype / ctype.h
index c9129f0..47fba83 100644 (file)
@@ -1,32 +1,35 @@
-/* Copyright (C) 1991, 1992, 1993, 1995 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991,92,93,95,96,97,98,99,2001,02
+       Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
-The GNU C Library 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
-Library General Public License for more details.
+   The GNU C Library 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
+   Lesser General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the, 1992 Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
 /*
- *     ANSI Standard 4.3: CHARACTER HANDLING   <ctype.h>
+ *     ISO C99 Standard 7.4: Character handling        <ctype.h>
  */
 
 #ifndef        _CTYPE_H
-
 #define        _CTYPE_H        1
+
 #include <features.h>
+#include <bits/types.h>
 
 __BEGIN_DECLS
 
+#ifndef _ISbit
 /* These are all the characteristics of characters.
    If there get to be more than 16 distinct characteristics,
    many things must be changed that use `unsigned short int's.
@@ -35,12 +38,12 @@ __BEGIN_DECLS
    endian).  We define the bit value interpretations here dependent on the
    machine's byte order.  */
 
-#include <endian.h>
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define _ISbit(bit)    (1 << bit)
-#else /* __BYTE_ORDER == __LITTLE_ENDIAN */
-#define _ISbit(bit)    ((1 << bit) << (bit < 8 ? 8 : -8))
-#endif
+# include <endian.h>
+# if __BYTE_ORDER == __BIG_ENDIAN
+#  define _ISbit(bit)  (1 << (bit))
+# else /* __BYTE_ORDER == __LITTLE_ENDIAN */
+#  define _ISbit(bit)  ((bit) < 8 ? ((1 << (bit)) << 8) : ((1 << (bit)) >> 8))
+# endif
 
 enum
 {
@@ -55,37 +58,35 @@ enum
   _ISblank = _ISbit (8),       /* Blank (usually SPC and TAB).  */
   _IScntrl = _ISbit (9),       /* Control character.  */
   _ISpunct = _ISbit (10),      /* Punctuation.  */
-
-  /* The following are defined in POSIX.2 as being combinations of the
-     classes above.  */
-  _ISalnum = _ISalpha | _ISdigit       /* Alphanumeric.  */
+  _ISalnum = _ISbit (11)       /* Alphanumeric.  */
 };
+#endif /* ! _ISbit  */
 
 /* These are defined in ctype-info.c.
    The declarations here must match those in localeinfo.h.
 
    These point into arrays of 384, so they can be indexed by any `unsigned
    char' value [0,255]; by EOF (-1); or by any `signed char' value
-   [-128,-1).  ANSI requires that the ctype functions work for `unsigned
+   [-128,-1).  ISO C requires that the ctype functions work for `unsigned
    char' values and for EOF; we also support negative `signed char' values
    for broken old programs.  The case conversion arrays are of `int's
    rather than `unsigned char's because tolower (EOF) must be EOF, which
-   doesn't fit into an `unsigned char'.  */
+   doesn't fit into an `unsigned char'.  But today more important is that
+   the arrays are also used for multi-byte character sets.  */
 extern __const unsigned short int *__ctype_b;  /* Characteristics.  */
-extern __const int *__ctype_tolower; /* Case conversions.  */
-extern __const int *__ctype_toupper; /* Case conversions.  */
+extern __const __int32_t *__ctype_tolower; /* Case conversions.  */
+extern __const __int32_t *__ctype_toupper; /* Case conversions.  */
 
 #define        __isctype(c, type) \
   (__ctype_b[(int) (c)] & (unsigned short int) type)
 
-#define        __isascii(c)    (((c) & (1 << 7)) == 0) /* If high bit is set.  */
-#define        __toascii(c)    ((c) & 0x7f) /* Mask off high bit.  */
+#define        __isascii(c)    (((c) & ~0x7f) == 0)    /* If C is a 7 bit value.  */
+#define        __toascii(c)    ((c) & 0x7f)            /* Mask off high bits.  */
 
-#define        __tolower(c)    ((int) __ctype_tolower[(int) (c)])
-#define        __toupper(c)    ((int) __ctype_toupper[(int) (c)])
+#define        __exctype(name) extern int name (int) __THROW
 
-#define        __exctype(name) extern int name __P ((int))
 
+__BEGIN_NAMESPACE_STD
 /* The following names are all functions:
      int isCHARACTERISTIC(int c);
    which return nonzero iff C has CHARACTERISTIC.
@@ -102,63 +103,210 @@ __exctype (isspace);
 __exctype (isupper);
 __exctype (isxdigit);
 
-#ifdef __USE_GNU
-__exctype (isblank);
-#endif
-
 
 /* Return the lowercase version of C.  */
-extern int tolower __P ((int __c));
+extern int tolower (int __c) __THROW;
 
 /* Return the uppercase version of C.  */
-extern int toupper __P ((int __c));
+extern int toupper (int __c) __THROW;
+
+__END_NAMESPACE_STD
 
 
-#if defined(__USE_SVID) || defined(__USE_MISC)
+/* ISO C99 introduced one new function.  */
+#ifdef __USE_ISOC99
+__BEGIN_NAMESPACE_C99
+
+__exctype (isblank);
+
+__END_NAMESPACE_C99
+#endif
+
+#if defined __USE_SVID || defined __USE_MISC || defined __USE_XOPEN
 
 /* Return nonzero iff C is in the ASCII set
    (i.e., is no more than 7 bits wide).  */
-extern int isascii __P ((int __c));
+extern int isascii (int __c) __THROW;
 
 /* Return the part of C that is in the ASCII set
    (i.e., the low-order 7 bits of C).  */
-extern int toascii __P ((int __c));
-
-#endif /* Use SVID or use misc.  */
+extern int toascii (int __c) __THROW;
 
-#ifdef __USE_SVID
-/* These are the same as `toupper' and `tolower'.  */
+/* These are the same as `toupper' and `tolower' except that they do not
+   check the argument for being in the range of a `char'.  */
 __exctype (_toupper);
 __exctype (_tolower);
-#endif
+#endif /* Use SVID or use misc.  */
 
-#ifndef        __NO_CTYPE
-#define        isalnum(c)      __isctype((c), _ISalnum)
-#define        isalpha(c)      __isctype((c), _ISalpha)
-#define        iscntrl(c)      __isctype((c), _IScntrl)
-#define        isdigit(c)      __isctype((c), _ISdigit)
-#define        islower(c)      __isctype((c), _ISlower)
-#define        isgraph(c)      __isctype((c), _ISgraph)
-#define        isprint(c)      __isctype((c), _ISprint)
-#define        ispunct(c)      __isctype((c), _ISpunct)
-#define        isspace(c)      __isctype((c), _ISspace)
-#define        isupper(c)      __isctype((c), _ISupper)
-#define        isxdigit(c)     __isctype((c), _ISxdigit)
-
-#ifdef __USE_GNU
-#define        isblank(c)      __isctype((c), _ISblank)
-#endif
+/* This code is needed for the optimized mapping functions.  */
+#define __tobody(c, f, a, args) \
+  (__extension__                                                             \
+   ({ int __res;                                                             \
+      if (sizeof (c) > 1)                                                    \
+       {                                                                     \
+         if (__builtin_constant_p (c))                                       \
+           {                                                                 \
+             int __c = (c);                                                  \
+             __res = __c < -128 || __c > 255 ? __c : a[__c];                 \
+           }                                                                 \
+         else                                                                \
+           __res = f args;                                                   \
+       }                                                                     \
+      else                                                                   \
+       __res = a[(int) (c)];                                                 \
+      __res; }))
+
+#if !defined __NO_CTYPE && !defined __cplusplus
+# define isalnum(c)    __isctype((c), _ISalnum)
+# define isalpha(c)    __isctype((c), _ISalpha)
+# define iscntrl(c)    __isctype((c), _IScntrl)
+# define isdigit(c)    __isctype((c), _ISdigit)
+# define islower(c)    __isctype((c), _ISlower)
+# define isgraph(c)    __isctype((c), _ISgraph)
+# define isprint(c)    __isctype((c), _ISprint)
+# define ispunct(c)    __isctype((c), _ISpunct)
+# define isspace(c)    __isctype((c), _ISspace)
+# define isupper(c)    __isctype((c), _ISupper)
+# define isxdigit(c)   __isctype((c), _ISxdigit)
+
+# ifdef        __USE_ISOC99
+#  define isblank(c)   __isctype((c), _ISblank)
+# endif
+
+# ifdef __USE_EXTERN_INLINES
+extern __inline int
+tolower (int __c) __THROW
+{
+  return __c >= -128 && __c < 256 ? __ctype_tolower[__c] : __c;
+}
 
-#define        tolower(c)      __tolower(c)
-#define        toupper(c)      __toupper(c)
+extern __inline int
+toupper (int __c) __THROW
+{
+  return __c >= -128 && __c < 256 ? __ctype_toupper[__c] : __c;
+}
+# endif
 
-#if defined(__USE_SVID) || defined(__USE_MISC)
-#define        isascii(c)      __isascii(c)
-#define        toascii(c)      __toascii(c)
-#endif
+# if __GNUC__ >= 2 && defined __OPTIMIZE__ && !defined __cplusplus
+#  define tolower(c) __tobody (c, tolower, __ctype_tolower, (c))
+#  define toupper(c) __tobody (c, toupper, __ctype_toupper, (c))
+# endif        /* Optimizing gcc */
+
+# if defined __USE_SVID || defined __USE_MISC || defined __USE_XOPEN
+#  define isascii(c)   __isascii (c)
+#  define toascii(c)   __toascii (c)
+
+#  define _tolower(c)  ((int) __ctype_tolower[(int) (c)])
+#  define _toupper(c)  ((int) __ctype_toupper[(int) (c)])
+# endif
 
 #endif /* Not __NO_CTYPE.  */
 
+
+#ifdef __USE_GNU
+/* The concept of one static locale per category is not very well
+   thought out.  Many applications will need to process its data using
+   information from several different locales.  Another application is
+   the implementation of the internationalization handling in the
+   upcoming ISO C++ standard library.  To support this another set of
+   the functions using locale data exist which have an additional
+   argument.
+
+   Attention: all these functions are *not* standardized in any form.
+   This is a proof-of-concept implementation.  */
+
+/* Structure for reentrant locale using functions.  This is an
+   (almost) opaque type for the user level programs.  */
+# include <xlocale.h>
+
+/* These definitions are similar to the ones above but all functions
+   take as an argument a handle for the locale which shall be used.  */
+#  define __isctype_l(c, type, locale) \
+  ((locale)->__ctype_b[(int) (c)] & (unsigned short int) type)
+
+# define __exctype_l(name)                                                   \
+  extern int name (int, __locale_t) __THROW
+
+/* The following names are all functions:
+     int isCHARACTERISTIC(int c, locale_t *locale);
+   which return nonzero iff C has CHARACTERISTIC.
+   For the meaning of the characteristic names, see the `enum' above.  */
+__exctype_l (isalnum_l);
+__exctype_l (isalpha_l);
+__exctype_l (iscntrl_l);
+__exctype_l (isdigit_l);
+__exctype_l (islower_l);
+__exctype_l (isgraph_l);
+__exctype_l (isprint_l);
+__exctype_l (ispunct_l);
+__exctype_l (isspace_l);
+__exctype_l (isupper_l);
+__exctype_l (isxdigit_l);
+
+__exctype_l (isblank_l);
+
+
+/* Return the lowercase version of C in locale L.  */
+extern int __tolower_l (int __c, __locale_t __l) __THROW;
+extern int tolower_l (int __c, __locale_t __l) __THROW;
+
+/* Return the uppercase version of C.  */
+extern int __toupper_l (int __c, __locale_t __l) __THROW;
+extern int toupper_l (int __c, __locale_t __l) __THROW;
+
+# if __GNUC__ >= 2 && defined __OPTIMIZE__ && !defined __cplusplus
+#  define __tolower_l(c, locale) \
+  __tobody (c, __tolower_l, (locale)->__ctype_tolower, (c, locale))
+#  define __toupper_l(c, locale) \
+  __tobody (c, __toupper_l, (locale)->__ctype_toupper, (c, locale))
+#  define tolower_l(c, locale) __tolower_l ((c), (locale))
+#  define toupper_l(c, locale) __toupper_l ((c), (locale))
+# endif        /* Optimizing gcc */
+
+
+# ifndef __NO_CTYPE
+#  define __isalnum_l(c,l)     __isctype_l((c), _ISalnum, (l))
+#  define __isalpha_l(c,l)     __isctype_l((c), _ISalpha, (l))
+#  define __iscntrl_l(c,l)     __isctype_l((c), _IScntrl, (l))
+#  define __isdigit_l(c,l)     __isctype_l((c), _ISdigit, (l))
+#  define __islower_l(c,l)     __isctype_l((c), _ISlower, (l))
+#  define __isgraph_l(c,l)     __isctype_l((c), _ISgraph, (l))
+#  define __isprint_l(c,l)     __isctype_l((c), _ISprint, (l))
+#  define __ispunct_l(c,l)     __isctype_l((c), _ISpunct, (l))
+#  define __isspace_l(c,l)     __isctype_l((c), _ISspace, (l))
+#  define __isupper_l(c,l)     __isctype_l((c), _ISupper, (l))
+#  define __isxdigit_l(c,l)    __isctype_l((c), _ISxdigit, (l))
+
+#  define __isblank_l(c,l)     __isctype_l((c), _ISblank, (l))
+
+#  if defined __USE_SVID || defined __USE_MISC || defined __USE_XOPEN
+#   define __isascii_l(c,l)    ((l), __isascii (c))
+#   define __toascii_l(c,l)    ((l), __toascii (c))
+#  endif
+
+#  define isalnum_l(c,l)       __isalnum_l ((c), (l))
+#  define isalpha_l(c,l)       __isalpha_l ((c), (l))
+#  define iscntrl_l(c,l)       __iscntrl_l ((c), (l))
+#  define isdigit_l(c,l)       __isdigit_l ((c), (l))
+#  define islower_l(c,l)       __islower_l ((c), (l))
+#  define isgraph_l(c,l)       __isgraph_l ((c), (l))
+#  define isprint_l(c,l)       __isprint_l ((c), (l))
+#  define ispunct_l(c,l)       __ispunct_l ((c), (l))
+#  define isspace_l(c,l)       __isspace_l ((c), (l))
+#  define isupper_l(c,l)       __isupper_l ((c), (l))
+#  define isxdigit_l(c,l)      __isxdigit_l ((c), (l))
+
+#  define isblank_l(c,l)       __isblank_l ((c), (l))
+
+#  if defined __USE_SVID || defined __USE_MISC || defined __USE_XOPEN
+#   define isascii_l(c,l)      __isascii_l ((c), (l))
+#   define toascii_l(c,l)      __toascii_l ((c), (l))
+#  endif
+
+# endif /* Not __NO_CTYPE.  */
+
+#endif /* Use GNU.  */
+
 __END_DECLS
 
 #endif /* ctype.h  */