diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-07-20 20:04:42 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-07-20 20:04:42 -0700 |
commit | 8a4494506d9175a2c205ff8d39dc58abd83682eb (patch) | |
tree | f8a40477eef8ff0f54ceaab5a2f358b3d6f47b9a /locale/programs | |
parent | c3db953c165baa444d01ee6c04ef0c51eba42522 (diff) | |
download | glibc-8a4494506d9175a2c205ff8d39dc58abd83682eb.zip glibc-8a4494506d9175a2c205ff8d39dc58abd83682eb.tar.gz glibc-8a4494506d9175a2c205ff8d39dc58abd83682eb.tar.bz2 |
Check generated locale for non-ASCII 8-bit characters with case conversion.
If a locale does not have 8-bit characters with case conversion which
are different from the ASCII conversion (±0x20) then we can perform
some optimizations. These will follow later.
Diffstat (limited to 'locale/programs')
-rw-r--r-- | locale/programs/ld-ctype.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index d4474bf..376a02c 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1995-2006, 2007, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -181,6 +181,7 @@ struct locale_ctype_t size_t default_missing_lineno; uint32_t to_nonascii; + uint32_t nonascii_case; /* The arrays for the binary representation. */ char_class_t *ctype_b; @@ -625,6 +626,27 @@ character <SP> not defined in character map"))); else ctype->class256_collection[space_seq->bytes[0]] |= BIT (tok_print); + /* Check whether all single-byte characters make to their upper/lowercase + equivalent according to the ASCII rules. */ + for (cnt = 'A'; cnt <= 'Z'; ++cnt) + { + uint32_t uppval = ctype->map256_collection[0][cnt]; + uint32_t lowval = ctype->map256_collection[1][cnt]; + uint32_t lowuppval = ctype->map256_collection[0][lowval]; + uint32_t lowlowval = ctype->map256_collection[1][lowval]; + + if (uppval != cnt + || lowval != cnt + 0x20 + || lowuppval != cnt + || lowlowval != cnt + 0x20) + ctype->nonascii_case = 1; + } + for (cnt = 0; cnt < 256; ++cnt) + if (cnt < 'A' || (cnt > 'Z' && cnt < 'a') || cnt > 'z') + if (ctype->map256_collection[0][cnt] != cnt + || ctype->map256_collection[1][cnt] != cnt) + ctype->nonascii_case = 1; + /* Now that the tests are done make sure the name array contains all characters which are handled in the WIDTH section of the character set definition file. */ @@ -1045,6 +1067,9 @@ ctype_output (struct localedef_t *locale, const struct charmap_t *charmap, CTYPE_DATA (_NL_CTYPE_MAP_TO_NONASCII, &ctype->to_nonascii, sizeof (uint32_t)); + CTYPE_DATA (_NL_CTYPE_NONASCII_CASE, + &ctype->nonascii_case, sizeof (uint32_t)); + case _NL_ITEM_INDEX (_NL_CTYPE_INDIGITS_MB_LEN): iov[2 + elem + offset].iov_base = alloca (sizeof (uint32_t)); iov[2 + elem + offset].iov_len = sizeof (uint32_t); |