From 8fb81470d9466b7e3d60cbfd6fc2d04fd1aae78a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 2 Aug 2000 00:09:25 +0000 Subject: Update. * gnulib/Makefile (tests): Add tst-gcc. * gnulib/tst-gcc.c: New file. * assert/Makefile (routines): Add __assert. * assert/Versions: Export __assert for glibc 2.2. * assert/__assert.c: New file. * assert/assert.h: Declare __assert. 2000-07-27 Bruno Haible * locale/localeinfo.h (_ISCTYPE): New macro. * posix/fnmatch_loop.c (internal_fnmatch): Use it, support new LC_CTYPE locale format. * locale/programs/ld-ctype.c (locale_ctype_t): New field class_b. (ctype_output): Output class_b[nr] right before class_3level[nr]. (allocate_arrays): Fill class_b, similarly to class_3level. 2000-08-01 Ulrich Drepper --- locale/localeinfo.h | 8 ++++++++ locale/programs/ld-ctype.c | 29 +++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) (limited to 'locale') diff --git a/locale/localeinfo.h b/locale/localeinfo.h index 412ac27a06..f986282392 100644 --- a/locale/localeinfo.h +++ b/locale/localeinfo.h @@ -130,6 +130,14 @@ enum }; +/* LC_CTYPE specific: + Access a wide character class with a single character index. + _ISCTYPE (c, desc) = iswctype (btowc (c), desc). + c must be an `unsigned char'. desc must be a nonzero wctype_t. */ +#define _ISCTYPE(c, desc) \ + (((((const uint32_t *) (desc)) - 8)[(c) >> 5] >> ((c) & 0x1f)) & 1) + + /* For each category declare the variable for the current locale data. */ #define DEFINE_CATEGORY(category, category_name, items, a) \ extern struct locale_data *_nl_current_##category; diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index f3edd6cbc0..0460d10084 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -170,6 +170,7 @@ struct locale_ctype_t uint32_t *names; uint32_t **map; uint32_t **map32; + uint32_t **class_b; struct iovec *class_3level; struct iovec *map_3level; uint32_t *class_name_ptr; @@ -842,7 +843,7 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap, + (oldstyle_tables ? (ctype->map_collection_nr - 2) : (ctype->nr_charclass + ctype->map_collection_nr))); - struct iovec iov[2 + nelems + ctype->nr_charclass + struct iovec iov[2 + nelems + 2 * ctype->nr_charclass + ctype->map_collection_nr + 2]; struct locale_file data; uint32_t idx[nelems + 1]; @@ -1169,6 +1170,12 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap, size_t nr = elem - _NL_ITEM_INDEX (_NL_CTYPE_EXTRA_MAP_1); if (nr < ctype->nr_charclass) { + iov[2 + elem + offset].iov_base = ctype->class_b[nr]; + iov[2 + elem + offset].iov_len = 256 / 32 + * sizeof (uint32_t); + idx[elem] += iov[2 + elem + offset].iov_len; + ++offset; + iov[2 + elem + offset] = ctype->class_3level[nr]; } else @@ -1182,7 +1189,7 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap, } } - assert (2 + elem + offset == (nelems + ctype->nr_charclass + assert (2 + elem + offset == (nelems + 2 * ctype->nr_charclass + ctype->map_collection_nr + 2 + 2)); write_locale_data (output_path, "LC_CTYPE", 2 + elem + offset, iov); @@ -4083,8 +4090,12 @@ Computing table size for character classes might take a while..."), xcalloc ((oldstyle_tables ? ctype->plane_size * ctype->plane_cnt : 256), sizeof (char_class32_t)); if (!oldstyle_tables) - ctype->class_3level = (struct iovec *) - xmalloc (ctype->nr_charclass * sizeof (struct iovec)); + { + ctype->class_b = (uint32_t **) + xmalloc (ctype->nr_charclass * sizeof (uint32_t *)); + ctype->class_3level = (struct iovec *) + xmalloc (ctype->nr_charclass * sizeof (struct iovec)); + } /* This is the array accessed using the multibyte string elements. */ for (idx = 0; idx < 256; ++idx) @@ -4113,6 +4124,16 @@ Computing table size for character classes might take a while..."), { size_t nr; + for (nr = 0; nr < ctype->nr_charclass; nr++) + { + ctype->class_b[nr] = (uint32_t *) + xcalloc (256 / 32, sizeof (uint32_t)); + + for (idx = 0; idx < 256; ++idx) + if (ctype->class256_collection[idx] & _ISbit (nr)) + ctype->class_b[nr][idx >> 5] |= (uint32_t)1 << (idx & 0x1f); + } + for (nr = 0; nr < ctype->nr_charclass; nr++) { struct wctype_table t; -- cgit 1.4.1