_ctype_ is used in ctype.h header in order to define inline functions
for determining character class: isalnum(3), isalpha(3), ...

The character class comes from lc_ctype.

Switch _ctype_ from global variable to function in order to retrieve the
current locale state (global or per-thread).

-- 
Sebastien Marie

Index: b/include/ctype.h
===================================================================
--- a/include/ctype.h   2015-07-05 06:50:41.963279015 +0200
+++ b/include/ctype.h   2015-07-05 06:52:28.894297063 +0200
@@ -53,7 +53,7 @@
 
 __BEGIN_DECLS
 
-extern const char      *_ctype_;
+extern const char      *_ctype_(void);
 extern const short     *_tolower_tab_;
 extern const short     *_toupper_tab_;
 
@@ -90,57 +90,68 @@
 
 __only_inline int isalnum(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & (_U|_L|_N)));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & (_U|_L|_N)));
 }
 
 __only_inline int isalpha(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & (_U|_L)));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & (_U|_L)));
 }
 
 __only_inline int iscntrl(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _C));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & _C));
 }
 
 __only_inline int isdigit(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _N));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & _N));
 }
 
 __only_inline int isgraph(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & 
(_P|_U|_L|_N)));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & (_P|_U|_L|_N)));
 }
 
 __only_inline int islower(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _L));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & _L));
 }
 
 __only_inline int isprint(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & 
(_P|_U|_L|_N|_B)));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & (_P|_U|_L|_N|_B)));
 }
 
 __only_inline int ispunct(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _P));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & _P));
 }
 
 __only_inline int isspace(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _S));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & _S));
 }
 
 __only_inline int isupper(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _U));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & _U));
 }
 
 __only_inline int isxdigit(int _c)
 {
-       return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & (_N|_X)));
+       return (_c == -1 ?
+               0 : ((_ctype_() + 1)[(unsigned char)_c] & (_N|_X)));
 }
 
 __only_inline int tolower(int _c)
Index: b/lib/libc/gen/ctype_.c
===================================================================
--- a/lib/libc/gen/ctype_.c     2015-07-05 06:50:41.963279015 +0200
+++ b/lib/libc/gen/ctype_.c     2015-07-05 06:52:28.894297063 +0200
@@ -72,5 +72,3 @@
         0,      0,      0,      0,      0,      0,      0,      0, /* F0 */
         0,      0,      0,      0,      0,      0,      0,      0  /* F8 */
 };
-
-const char *_ctype_ = _C_ctype_;
Index: b/lib/libc/gen/isctype.c
===================================================================
--- a/lib/libc/gen/isctype.c    2015-07-05 06:50:41.963279015 +0200
+++ b/lib/libc/gen/isctype.c    2015-07-05 06:52:28.934295987 +0200
@@ -41,14 +41,16 @@
 int
 isalnum(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & (_U|_L|_N)));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & (_U|_L|_N)));
 }
 
 #undef isalpha
 int
 isalpha(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & (_U|_L)));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & (_U|_L)));
 }
 
 #undef isblank
@@ -62,63 +64,72 @@
 int
 iscntrl(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _C));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & _C));
 }
 
 #undef isdigit
 int
 isdigit(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _N));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & _N));
 }
 
 #undef isgraph
 int
 isgraph(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & 
(_P|_U|_L|_N)));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & (_P|_U|_L|_N)));
 }
 
 #undef islower
 int
 islower(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _L));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & _L));
 }
 
 #undef isprint
 int
 isprint(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & 
(_P|_U|_L|_N|_B)));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & (_P|_U|_L|_N|_B)));
 }
 
 #undef ispunct
 int
 ispunct(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _P));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & _P));
 }
 
 #undef isspace
 int
 isspace(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _S));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & _S));
 }
 
 #undef isupper
 int
 isupper(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & _U));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & _U));
 }
 
 #undef isxdigit
 int
 isxdigit(int c)
 {
-       return (c == EOF ? 0 : ((_ctype_ + 1)[(unsigned char)c] & (_N|_X)));
+       return (c == EOF ?
+               0 : ((_ctype_() + 1)[(unsigned char)c] & (_N|_X)));
 }
 
 #undef isascii
Index: b/lib/libc/locale/runeglue.c
===================================================================
--- a/lib/libc/locale/runeglue.c        2015-07-05 06:52:21.704209858 +0200
+++ b/lib/libc/locale/runeglue.c        2015-07-05 06:52:28.934295987 +0200
@@ -119,16 +119,12 @@
 {
        if (locale->lc_ctype->rl_tabs != NULL) {
                /* LINTED const cast */
-               _ctype_ = (const unsigned char *)
-                   &(locale->lc_ctype->rl_tabs->ctype_tab);
-               /* LINTED const cast */
                _toupper_tab_ = (const short *)
                    &(locale->lc_ctype->rl_tabs->toupper_tab);
                /* LINTED const cast */
                _tolower_tab_ = (const short *)
                    &(locale->lc_ctype->rl_tabs->tolower_tab);
        } else {
-               _ctype_ = _C_ctype_;
                _toupper_tab_ = _C_toupper_;
                _tolower_tab_ = _C_tolower_;
        }
Index: b/lib/libc/locale/xlocale.c
===================================================================
--- a/lib/libc/locale/xlocale.c 2015-07-05 06:52:21.694210301 +0200
+++ b/lib/libc/locale/xlocale.c 2015-07-05 06:52:28.944296242 +0200
@@ -73,3 +73,16 @@
        } else
                return (NULL);
 }
+
+
+/* exported via ctype.h */
+const char *
+_ctype_(void)
+{
+       locale_t loc = _current_locale();
+
+       if (loc->lc_ctype->rl_tabs != NULL)
+               return (loc->lc_ctype->rl_tabs->ctype_tab);
+       else
+               return (_C_ctype_);
+}

Reply via email to