OSDN Git Service

Add back in table-less ctype funcs for those interested in minimizing
[uclinux-h8/uclibc-ng.git] / libc / sysdeps / linux / common / bits / uClibc_ctype.h
index 294997b..f682d97 100644 (file)
@@ -33,7 +33,7 @@
 #ifndef _BITS_CTYPE_H
 #define _BITS_CTYPE_H
 
-#warning uClibc_ctype.h is deprecated
+#ifdef __UCLIBC_GEN_LOCALE
 
 /* Taking advantage of the C99 mutual-exclusion guarantees for the various
  * (w)ctype classes, including the descriptions of printing and control
@@ -80,72 +80,9 @@ enum {
 /*  #define __CTYPE_isxdigit(D) -- isxdigit is untestable this way. 
  *  But that's ok as isxdigit() (and isdigit() too) are locale-invariant. */
 
-/* The values for wctype_t. */
-enum {
-       _CTYPE_unclassified = 0,
-       _CTYPE_isalnum,
-       _CTYPE_isalpha,
-       _CTYPE_isblank,
-       _CTYPE_iscntrl,
-       _CTYPE_isdigit,
-       _CTYPE_isgraph,
-       _CTYPE_islower,
-       _CTYPE_isprint,
-       _CTYPE_ispunct,
-       _CTYPE_isspace,
-       _CTYPE_isupper,
-       _CTYPE_isxdigit                         /* _MUST_ be last of the standard classes! */
-};
-
-
-/* The following is used to implement wctype(), but it is defined
- * here because the ordering must agree with that of the enumeration
- * above (ignoring unclassified). */
-#define __CTYPE_TYPESTRING \
-       "\6alnum\0\6alpha\0\6blank\0\6cntrl\0\6digit\0\6graph\0\6lower\0" \
-       "\6print\0\6punct\0\6space\0\6upper\0\7xdigit\0\0"
-
-/* Used in implementing iswctype(), but defined here as it must agree
- * in ordering with the string above. */
-#define __CTYPE_RANGES \
-       0, -1,                                                          /* unclassified */ \
-       1, __CTYPE_digit - 1,                           /* alnum */ \
-       1, __CTYPE_alpha_upper - 1,                     /* alpha */ \
-       __CTYPE_print_space_blank, 5,           /* blank -- also must be odd! */ \
-       __CTYPE_cntrl_space_nonblank, 2,        /* cntrl */ \
-       __CTYPE_digit, 0,                                       /* digit */ \
-       1, __CTYPE_graph - 1,                           /* graph */ \
-       __CTYPE_alpha_lower, 1,                         /* lower */ \
-       1, __CTYPE_print_space_blank - 1,       /* print */ \
-       __CTYPE_punct, 0,                                       /* punct */ \
-       __CTYPE_print_space_nonblank, 5,        /* space */ \
-       __CTYPE_alpha_upper_lower, 1,           /* upper */ \
-       /* No entry for xdigit as it is handled specially. */
-
-#define _CTYPE_iswalnum                _CTYPE_isalnum
-#define _CTYPE_iswalpha                _CTYPE_isalpha
-#define _CTYPE_iswblank                _CTYPE_isblank
-#define _CTYPE_iswcntrl                _CTYPE_iscntrl
-#define _CTYPE_iswdigit                _CTYPE_isdigit
-#define _CTYPE_iswgraph                _CTYPE_isgraph
-#define _CTYPE_iswlower                _CTYPE_islower
-#define _CTYPE_iswprint                _CTYPE_isprint
-#define _CTYPE_iswpunct                _CTYPE_ispunct
-#define _CTYPE_iswspace                _CTYPE_isspace
-#define _CTYPE_iswupper                _CTYPE_isupper
-#define _CTYPE_iswxdigit       _CTYPE_isxdigit
-
-/* The following is used to implement wctrans(). */
-
-enum {
-       _CTYPE_tolower = 1,
-       _CTYPE_toupper,
-       _CTYPE_totitle
-};
+#else  /* __UCLIBC_GEN_LOCALE *****************************************/
 
-#define __CTYPE_TRANSTRING     "\10tolower\0\10toupper\0\10totitle\0\0"
-
-/* Now define some ctype macros valid for the C/POSIX locale. */
+/* Define some ctype macros valid for the C/POSIX locale. */
 
 /* ASCII ords of \t, \f, \n, \r, and \v are 9, 12, 10, 13, 11 respectively. */
 #define __C_isspace(c) \
@@ -207,46 +144,173 @@ enum {
                 ? (((unsigned char)(((c)) - 'A')) < 6) \
                 : (((unsigned int)(((c)) - 'A')) < 6)))
 
-/* TODO: Replace the above with expressions like the following? */
-/*  #define __C_isdigit(c) ((sizeof(c) == sizeof(char)) \ */
-/*                                             ? (((unsigned char)((c) - '0')) < 10) \ */
-/*                                             : (((unsigned int)((c) - '0')) < 10)) */
-
-/* Similarly, define some wctype macros valid for the C/POSIX locale. */
-
-/* First, we need some way to make sure the arg is in range. */
-#define __C_classed(c) \
-       ((sizeof(c) <= sizeof(int)) || (c == ((unsigned char)c)))
-
-#define __C_iswspace(c)                (__C_classed(c) && __C_isspace(c))
-#define __C_iswblank(c)                (__C_classed(c) && __C_isblank(c))
-#define __C_iswdigit(c)                (__C_classed(c) && __C_isdigit(c))
-#define __C_iswxdigit(c)       (__C_classed(c) && __C_isxdigit(c))
-#define __C_iswcntrl(c)                (__C_classed(c) && __C_iscntrl(c))
-#define __C_iswalpha(c)                (__C_classed(c) && __C_isalpha(c))
-#define __C_iswalnum(c)                (__C_classed(c) && __C_isalnum(c))
-#define __C_iswprint(c)                (__C_classed(c) && __C_isprint(c))
-#define __C_iswlower(c)                (__C_classed(c) && __C_islower(c))
-#define __C_iswupper(c)                (__C_classed(c) && __C_isupper(c))
-#define __C_iswpunct(c)                (__C_classed(c) && __C_ispunct(c))
-#define __C_iswgraph(c)                (__C_classed(c) && __C_isgraph(c))
-#define __C_towlower(c) \
-       ((__C_classed(c) && __C_isupper(c)) ? ((c) | 0x20) : (c))
-#define __C_towupper(c) \
-       ((__C_classed(c) && __C_islower(c)) ? ((c) ^ 0x20) : (c))
-
-/* Now define some macros to aviod the extra wrapper-function call. */
-#define __iswalnum(c)          iswctype(c, _CTYPE_iswalnum)
-#define __iswalpha(c)          iswctype(c, _CTYPE_iswalpha)
-#define __iswblank(c)          iswctype(c, _CTYPE_iswblank)
-#define __iswcntrl(c)          iswctype(c, _CTYPE_iswcntrl)
-#define __iswgraph(c)          iswctype(c, _CTYPE_iswgraph)
-#define __iswlower(c)          iswctype(c, _CTYPE_iswlower)
-#define __iswprint(c)          iswctype(c, _CTYPE_iswprint)
-#define __iswpunct(c)          iswctype(c, _CTYPE_iswpunct)
-#define __iswspace(c)          iswctype(c, _CTYPE_iswspace)
-#define __iswupper(c)          iswctype(c, _CTYPE_iswupper)
-#define __iswdigit(c)          __C_iswdigit(c)
-#define __iswxdigit(c)         __C_iswxdigit(c)
+/**********************************************************************/
+__BEGIN_DECLS
+
+extern int isalnum(int c) __THROW;
+extern int isalpha(int c) __THROW;
+#ifdef __USE_ISOC99
+extern int isblank(int c) __THROW;
+#endif
+extern int iscntrl(int c) __THROW;
+extern int isdigit(int c) __THROW;
+extern int isgraph(int c) __THROW;
+extern int islower(int c) __THROW;
+extern int isprint(int c) __THROW;
+extern int ispunct(int c) __THROW;
+extern int isspace(int c) __THROW;
+extern int isupper(int c) __THROW;
+extern int isxdigit(int c) __THROW;
+
+extern int tolower(int c) __THROW;
+extern int toupper(int c) __THROW;
+
+#if defined __USE_SVID || defined __USE_MISC || defined __USE_XOPEN
+extern int isascii(int c) __THROW;
+extern int toascii(int c) __THROW;
+#endif
+
+/* The following are included for compatibility with older versions of
+ * uClibc; but now they're only visible if MISC funcctionality is requested.
+ * However, as they are locale-independent, the hidden macro versions are
+ * always present. */
+#ifdef __USE_MISC
+extern int isxlower(int c) __THROW;    /* uClibc-specific. */
+extern int isxupper(int c) __THROW;    /* uClibc-specific. */
+
+/* isdigit() is really locale-invariant, so provide some small fast macros.
+ * These are uClibc-specific. */
+#define __isdigit_char(C)    (((unsigned char)((C) - '0')) <= 9)
+#define __isdigit_int(C)     (((unsigned int)((C) - '0')) <= 9)
+#endif
+
+/* Next, some ctype macros which are valid for all supported locales. */
+/* WARNING: isspace and isblank need to be reverified if more 8-bit codesets
+ * are added!!!  But isdigit and isxdigit are always valid. */
+
+/* #define __isspace(c)        __C_isspace(c) */
+/* #define __isblank(c)        __C_isblank(c) */
+
+/* #define __isdigit(c)        __C_isdigit(c) */
+/* #define __isxdigit(c)       __C_isxdigit(c) */
+
+/* Now some non-ansi/iso c99 macros. */
+
+#define __isascii(c) (((c) & ~0x7f) == 0)
+#define __toascii(c) ((c) & 0x7f)
+#define _toupper(c) ((c) ^ 0x20)
+#define _tolower(c) ((c) | 0x20)
+
+
+/* For compatibility with older versions of uClibc.  Are these ever used? */
+#if 0
+#define __isxlower(c)  __C_isxlower(c) /* uClibc-specific. */
+#define __isxupper(c)  __C_isxupper(c) /* uClibc-specific. */
+#endif
+
+/* Apparently, glibc implements things as macros if __NO_CTYPE isn't defined.
+ * If we don't have locale support, we'll do the same.  Otherwise, we'll
+ * only use macros for the supported-locale-invariant cases. */
+#ifndef __UCLIBC_HAS_LOCALE__
+
+#endif /*  __UCLIBC_HAS_LOCALE__ */
+
+__END_DECLS
+
+/**********************************************************************/
+#ifdef __GNUC__
+
+#define __isbody_C_macro(f,args)  __C_ ## f args
+
+#define __isbody(f,c) \
+       (__extension__ ({ \
+               int __res; \
+               if (sizeof(c) > sizeof(char)) { \
+                       int __c = (c); \
+                       __res = __isbody_C_macro(f,(__c)); \
+               } else { \
+                       unsigned char __c = (c); \
+                       __res = __isbody_C_macro(f,(__c)); \
+               } \
+               __res; \
+       }))
+
+#define __body_C_macro(f,args)  __C_ ## f args
+
+#define __body(f,c) \
+       (__extension__ ({ \
+               int __res; \
+               if (sizeof(c) > sizeof(char)) { \
+                       int __c = (c); \
+                       __res = __body_C_macro(f,(__c)); \
+               } else { \
+                       unsigned char __c = (c); \
+                       __res = __body_C_macro(f,(__c)); \
+               } \
+               __res; \
+       }))
+
+#define __isspace(c)           __body(isspace,c)
+#define __isblank(c)           __body(isblank,c)
+#define __isdigit(c)           __body(isdigit,c)
+#define __isxdigit(c)          __body(isxdigit,c)
+#define __iscntrl(c)           __body(iscntrl,c)
+#define __isalpha(c)           __body(isalpha,c)
+#define __isalnum(c)           __body(isalnum,c)
+#define __isprint(c)           __body(isprint,c)
+#define __islower(c)           __body(islower,c)
+#define __isupper(c)           __body(isupper,c)
+#define __ispunct(c)           __body(ispunct,c)
+#define __isgraph(c)           __body(isgraph,c)
+
+#define __isxlower(c)          __body(isxlower,c)
+#define __isxupper(c)          __body(isxupper,c)
+
+#define __tolower(c)           __body(tolower,c)
+#define __toupper(c)           __body(toupper,c)
+
+#if !defined __NO_CTYPE && !defined __cplusplus
+
+#define isspace(c)                     __isspace(c)
+#define isblank(c)                     __isblank(c)
+#define isdigit(c)                     __isdigit(c)
+#define isxdigit(c)                    __isxdigit(c)
+#define iscntrl(c)                     __iscntrl(c)
+#define isalpha(c)                     __isalpha(c)
+#define isalnum(c)                     __isalnum(c)
+#define isprint(c)                     __isprint(c)
+#define islower(c)                     __islower(c)
+#define isupper(c)                     __isupper(c)
+#define ispunct(c)                     __ispunct(c)
+#define isgraph(c)                     __isgraph(c)
+
+#define isxlower(c)                    __isxlower(c)
+#define isxupper(c)                    __isxupper(c)
+
+#define tolower(c)                     __tolower(c)
+#define toupper(c)                     __toupper(c)
+
+
+#endif
+
+#else  /* _GNUC__   ***************************************************/
+
+#if !defined __NO_CTYPE && !defined __cplusplus
+
+/* These macros should be safe from side effects. */
+
+#define isdigit(c)                     __C_isdigit(c)
+#define isalpha(c)                     __C_isalpha(c)
+#define isprint(c)                     __C_isprint(c)
+#define islower(c)                     __C_islower(c)
+#define isupper(c)                     __C_isupper(c)
+#define isgraph(c)                     __C_isgraph(c)
+
+#endif
+
+#endif /* __GNUC__ */
+/**********************************************************************/
+
+#endif  /* __UCLIBC_GEN_LOCALE */
 
 #endif /* _BITS_CTYPE_H */