]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - include/ctype.h
INSTALL, install.texi: minor updates, regenerate
[thirdparty/glibc.git] / include / ctype.h
index 3100853ab48b3ed0a94dc5bee7a93e7e4805c8b1..493a6f80ce8e8b8edc75578a0d33ba34551a7ace 100644 (file)
@@ -1,45 +1,70 @@
 #ifndef _CTYPE_H
 
-# include <ctype/ctype.h>
+#include <ctype/ctype.h>
 
-# ifndef NOT_IN_libc
+#ifndef _ISOMAC
+/* Initialize ctype locale data.  */
+extern void __ctype_init (void);
+libc_hidden_proto (__ctype_init)
 
-/* The optimized macros are not defined for users because they can't see
-   the thread-local locale state.  For inside libc, define them using the
-   _NL_CURRENT accessors.  We don't use _NL_CURRENT_LOCALE->__ctype_b here
-   because we want to cause a link-time ref to _nl_current_LC_CTYPE under
+/* ctype/ctype.h defined this as a macro and we don't want to #undef it.
+   So defeat macro expansion with parens for this declaration.  */
+extern int (__isctype) (int __c, int __mask);
+
+libc_hidden_proto (tolower)
+libc_hidden_proto (toupper)
+
+# if IS_IN (libc)
+
+/* These accessors are used by the optimized macros to find the
+   thread-local cache of ctype information from the current thread's
+   locale.  For inside libc, define them as inlines using the _NL_CURRENT
+   accessors.  We don't use _NL_CURRENT_LOCALE->__ctype_b here because we
+   want to cause a link-time ref to _nl_current_LC_CTYPE under
    NL_CURRENT_INDIRECT.  */
 
 #  include "../locale/localeinfo.h"
-#  define __isctype(c, type) \
-     (((uint16_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_CLASS) + 128) \
-      [(int) (c)] & (uint16_t) type)
+#  include <libc-tsd.h>
+
+#  ifndef CTYPE_EXTERN_INLINE  /* Used by ctype/ctype-info.c, which see.  */
+#   define CTYPE_EXTERN_INLINE extern inline
+#  endif
+
+__libc_tsd_define (extern, const uint16_t *, CTYPE_B)
+__libc_tsd_define (extern, const int32_t *, CTYPE_TOUPPER)
+__libc_tsd_define (extern, const int32_t *, CTYPE_TOLOWER)
+
+
+CTYPE_EXTERN_INLINE const uint16_t ** __attribute__ ((const))
+__ctype_b_loc (void)
+{
+  return __libc_tsd_address (const uint16_t *, CTYPE_B);
+}
+
+CTYPE_EXTERN_INLINE const int32_t ** __attribute__ ((const))
+__ctype_toupper_loc (void)
+{
+  return __libc_tsd_address (const int32_t *, CTYPE_TOUPPER);
+}
+
+CTYPE_EXTERN_INLINE const int32_t ** __attribute__ ((const))
+__ctype_tolower_loc (void)
+{
+  return __libc_tsd_address (const int32_t *, CTYPE_TOLOWER);
+}
+
 #  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)
-#   define isblank(c)  __isctype((c), _ISblank)
-
-#   define tolower(c) \
-      __tobody (c, tolower, \
-               (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOLOWER) + 128, \
-               (c))
-#   define _tolower(c) tolower (c)
-#   define toupper(c) \
-      __tobody (c, toupper, \
-               (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOUPPER) + 128, \
-               (c))
-#   define _toupper(c) toupper (c)
-
-#  endif /* Not __NO_CTYPE.  */
-# endif        /* _LIBC_REENTRANT.  */
+/* The spec says that isdigit must only match the decimal digits.  We
+   can check this without a memory access.  */
+#   undef isdigit
+#   define isdigit(c) ({ int __c = (c); __c >= '0' && __c <= '9'; })
+#   undef isdigit_l
+#   define isdigit_l(c, l) ({ int __c = (c); __c >= '0' && __c <= '9'; })
+#   undef __isdigit_l
+#   define __isdigit_l(c, l) ({ int __c = (c); __c >= '0' && __c <= '9'; })
+#  endif  /* Not __NO_CTYPE.  */
+
+# endif        /* IS_IN (libc).  */
+#endif  /* Not _ISOMAC.  */
 
 #endif /* ctype.h */