aboutsummaryrefslogtreecommitdiff
path: root/locale
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-08-02 00:09:25 +0000
committerUlrich Drepper <drepper@redhat.com>2000-08-02 00:09:25 +0000
commit8fb81470d9466b7e3d60cbfd6fc2d04fd1aae78a (patch)
treef8046bf51bce4125faaa2bfe115d8e0d026e57b8 /locale
parent925e31d9c22c5cdf1d80d9a5683523efc729cfd1 (diff)
downloadglibc-8fb81470d9466b7e3d60cbfd6fc2d04fd1aae78a.tar
glibc-8fb81470d9466b7e3d60cbfd6fc2d04fd1aae78a.tar.gz
glibc-8fb81470d9466b7e3d60cbfd6fc2d04fd1aae78a.tar.bz2
glibc-8fb81470d9466b7e3d60cbfd6fc2d04fd1aae78a.zip
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 <haible@clisp.cons.org> * 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 <drepper@redhat.com>
Diffstat (limited to 'locale')
-rw-r--r--locale/localeinfo.h8
-rw-r--r--locale/programs/ld-ctype.c29
2 files changed, 33 insertions, 4 deletions
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)
@@ -4115,6 +4126,16 @@ Computing table size for character classes might take a while..."),
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;
t.p = 4; /* or: 5 */