aboutsummaryrefslogtreecommitdiff
path: root/locale/lc-ctype.c
diff options
context:
space:
mode:
Diffstat (limited to 'locale/lc-ctype.c')
-rw-r--r--locale/lc-ctype.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c
index 59ff7019aa..69414020b8 100644
--- a/locale/lc-ctype.c
+++ b/locale/lc-ctype.c
@@ -34,7 +34,8 @@ _NL_CURRENT_DEFINE (LC_CTYPE);
void
_nl_postload_ctype (void)
{
- const struct locale_data *data = _NL_CURRENT_DATA (LC_CTYPE);
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
#define paste(a,b) paste1(a,b)
#define paste1(a,b) a##b
@@ -42,29 +43,30 @@ _nl_postload_ctype (void)
#define current(type,x,offset) \
((const type *) _NL_CURRENT (LC_CTYPE, paste(_NL_CTYPE_,x)) + offset)
- extern const uint32_t *__ctype32_b;
- extern const uint32_t *__ctype32_toupper;
- extern const uint32_t *__ctype32_tolower;
- extern const char *__ctype32_wctype[12] attribute_hidden;
- extern const char *__ctype32_wctrans[2] attribute_hidden;
- extern const char *__ctype32_width attribute_hidden;
-
- size_t offset, cnt;
-
- __ctype_b = current (uint16_t, CLASS, 128);
- __ctype_toupper = current (uint32_t, TOUPPER, 128);
- __ctype_tolower = current (uint32_t, TOLOWER, 128);
- __ctype32_b = current (uint32_t, CLASS32, 0);
- __ctype32_toupper = current (uint32_t, TOUPPER32, 0);
- __ctype32_tolower = current (uint32_t, TOLOWER32, 0);
-
- offset = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_CLASS_OFFSET);
- for (cnt = 0; cnt < 12; cnt++)
- __ctype32_wctype[cnt] = data->values[offset + cnt].string;
-
- offset = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_OFFSET);
- for (cnt = 0; cnt < 2; cnt++)
- __ctype32_wctrans[cnt] = data->values[offset + cnt].string;
-
- __ctype32_width = current (char, WIDTH, 0);
+/* 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). 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'. But today more important is that
+ the arrays are also used for multi-byte character sets. */
+ extern __const unsigned short int *__ctype_old_b; /* Characteristics. */
+ extern __const __int32_t *__ctype_old_tolower; /* Case conversions. */
+ extern __const __int32_t *__ctype_old_toupper; /* Case conversions. */
+
+ extern const uint32_t *__ctype32_old_b;
+ extern const uint32_t *__ctype32_old_toupper;
+ extern const uint32_t *__ctype32_old_tolower;
+
+ __ctype_old_b = current (uint16_t, CLASS, 128);
+ __ctype_old_toupper = current (uint32_t, TOUPPER, 128);
+ __ctype_old_tolower = current (uint32_t, TOLOWER, 128);
+ __ctype32_old_b = current (uint32_t, CLASS32, 0);
+ __ctype32_old_toupper = current (uint32_t, TOUPPER32, 0);
+ __ctype32_old_tolower = current (uint32_t, TOLOWER32, 0);
+#endif
}