aboutsummaryrefslogtreecommitdiff
path: root/locale/programs/ld-ctype.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-11-18 07:22:53 +0000
committerUlrich Drepper <drepper@redhat.com>1999-11-18 07:22:53 +0000
commit5491da0dfa50a969aca174742c64e114fe068af4 (patch)
tree06cf1a3e5b8b58cfbd76f575e6a2e0363c0ab61e /locale/programs/ld-ctype.c
parent35946fb706d6333c5c11663fd0b46c1e9116ae0f (diff)
downloadglibc-5491da0dfa50a969aca174742c64e114fe068af4.tar
glibc-5491da0dfa50a969aca174742c64e114fe068af4.tar.gz
glibc-5491da0dfa50a969aca174742c64e114fe068af4.tar.bz2
glibc-5491da0dfa50a969aca174742c64e114fe068af4.zip
Update.
* locale/programs/ld-ctype.c (ctype_output): Correct computation of nelems. Correctly compute index for additional character classes. (ctype_read): Handle charclass and charconv definitions. Also recognize arbitrary strings as mapping names. * locale/programs/ld-time.c (time_finish): Correctly skip over wide character era strings. * locale/lc-time.c (_nl_get_era_entry): Correctly skip era name and format for wide characters. * time/strftime.c: Correctly determine era information for wide wcsftime. * wctrans.c: Fix after removal of second endianess table. * wctype/wctype.h (_ISwbit): Correctly handle bits > 16. Patches by Shinya Hanataka <hanataka@abyss.rim.or.jp>. * wcsmbs/wcwidth.h (internal_wcwidth): Reject non-printable characters.
Diffstat (limited to 'locale/programs/ld-ctype.c')
-rw-r--r--locale/programs/ld-ctype.c43
1 files changed, 41 insertions, 2 deletions
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
index 5d88fd0509..90a4492118 100644
--- a/locale/programs/ld-ctype.c
+++ b/locale/programs/ld-ctype.c
@@ -729,7 +729,7 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap,
{
struct locale_ctype_t *ctype = locale->categories[LC_CTYPE].ctype;
const size_t nelems = (_NL_ITEM_INDEX (_NL_NUM_LC_CTYPE)
- + 2 * (ctype->map_collection_nr - 2));
+ + (ctype->map_collection_nr - 2));
struct iovec iov[2 + nelems + ctype->nr_charclass
+ ctype->map_collection_nr];
struct locale_file data;
@@ -951,7 +951,7 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap,
else
{
/* Handle extra maps. */
- size_t nr = (elem - _NL_ITEM_INDEX (_NL_NUM_LC_CTYPE)) >> 1;
+ size_t nr = (elem - _NL_ITEM_INDEX (_NL_NUM_LC_CTYPE)) + 2;
iov[2 + elem + offset].iov_base = ctype->map[nr];
iov[2 + elem + offset].iov_len = ((ctype->plane_size
@@ -1712,6 +1712,36 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result,
switch (nowtok)
{
+ case tok_charclass:
+ now = lr_token (ldfile, charmap, NULL);
+ while (now->tok == tok_ident || now->tok == tok_string)
+ {
+ ctype_class_new (ldfile, ctype, now->val.str.startmb);
+ now = lr_token (ldfile, charmap, NULL);
+ if (now->tok != tok_semicolon)
+ break;
+ now = lr_token (ldfile, charmap, NULL);
+ }
+ if (now->tok != tok_eol)
+ SYNTAX_ERROR (_("\
+%s: syntax error in definition of new character class"), "LC_CTYPE");
+ break;
+
+ case tok_charconv:
+ now = lr_token (ldfile, charmap, NULL);
+ while (now->tok == tok_ident || now->tok == tok_string)
+ {
+ ctype_map_new (ldfile, ctype, now->val.str.startmb, charmap);
+ now = lr_token (ldfile, charmap, NULL);
+ if (now->tok != tok_semicolon)
+ break;
+ now = lr_token (ldfile, charmap, NULL);
+ }
+ if (now->tok != tok_eol)
+ SYNTAX_ERROR (_("\
+%s: syntax error in definition of new character map"), "LC_CTYPE");
+ break;
+
case tok_class:
/* Ignore the rest of the line if we don't need the input of
this line. */
@@ -2219,6 +2249,15 @@ with character code range values one must use the absolute ellipsis `...'"));
free (now->val.str.startmb);
goto read_charclass;
}
+ for (cnt = 0; cnt < ctype->map_collection_nr; ++cnt)
+ if (strcmp (now->val.str.startmb, ctype->mapnames[cnt]) == 0)
+ break;
+ if (cnt < ctype->map_collection_nr)
+ {
+ mapidx = cnt;
+ free (now->val.str.startmb);
+ goto read_mapping;
+ }
if (strcmp (now->val.str.startmb, "special1") == 0)
{
class_bit = _ISwspecial1;