diff options
Diffstat (limited to 'locale')
-rw-r--r-- | locale/programs/charmap.c | 32 | ||||
-rw-r--r-- | locale/programs/ld-ctype.c | 69 | ||||
-rw-r--r-- | locale/programs/linereader.c | 26 | ||||
-rw-r--r-- | locale/programs/locfile-token.h | 4 |
4 files changed, 98 insertions, 33 deletions
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c index 37047a0407..3ccebcac48 100644 --- a/locale/programs/charmap.c +++ b/locale/programs/charmap.c @@ -53,7 +53,7 @@ static void new_width (struct linereader *cmfile, struct charmap_t *result, unsigned long int width); static void charmap_new_char (struct linereader *lr, struct charmap_t *cm, int nbytes, char *bytes, const char *from, - const char *to, int decimal_ellipsis); + const char *to, int decimal_ellipsis, int step); struct charmap_t * @@ -225,6 +225,7 @@ parse_charmap (struct linereader *cmfile) char *from_name = NULL; char *to_name = NULL; enum token_t ellipsis = 0; + int step = 1; /* We don't want symbolic names in string to be translated. */ cmfile->translate_strings = 0; @@ -461,7 +462,7 @@ character sets with locking states are not supported")); now->val.str.lenmb); else { - obstack_printf (&result->mem_pool, "<%08X>", + obstack_printf (&result->mem_pool, "U%08X", cmfile->token.val.ucs4); obstack_1grow (&result->mem_pool, '\0'); from_name = (char *) obstack_finish (&result->mem_pool); @@ -475,9 +476,20 @@ character sets with locking states are not supported")); /* We have two possibilities: We can see an ellipsis or an encoding value. */ if (nowtok == tok_ellipsis3 || nowtok == tok_ellipsis4 - || nowtok == tok_ellipsis2) + || nowtok == tok_ellipsis2 || nowtok == tok_ellipsis4_2 + || nowtok == tok_ellipsis2_2) { ellipsis = nowtok; + if (nowtok == tok_ellipsis4_2) + { + step = 2; + nowtok = tok_ellipsis4; + } + else if (nowtok == tok_ellipsis2_2) + { + step = 2; + nowtok = tok_ellipsis2; + } state = 4; continue; } @@ -502,13 +514,15 @@ character sets with locking states are not supported")); else charmap_new_char (cmfile, result, now->val.charcode.nbytes, now->val.charcode.bytes, from_name, to_name, - ellipsis != tok_ellipsis2); + ellipsis != tok_ellipsis2, step); /* Ignore trailing comment silently. */ lr_ignore_rest (cmfile, 0); from_name = NULL; to_name = NULL; + ellipsis = tok_none; + step = 1; state = 2; continue; @@ -531,7 +545,7 @@ character sets with locking states are not supported")); cmfile->token.val.str.lenmb); else { - obstack_printf (&result->mem_pool, "<%08X>", + obstack_printf (&result->mem_pool, "U%08X", cmfile->token.val.ucs4); obstack_1grow (&result->mem_pool, '\0'); to_name = (char *) obstack_finish (&result->mem_pool); @@ -814,7 +828,7 @@ charmap_find_value (const struct charmap_t *cm, const char *name, size_t len) static void charmap_new_char (struct linereader *lr, struct charmap_t *cm, int nbytes, char *bytes, const char *from, const char *to, - int decimal_ellipsis) + int decimal_ellipsis, int step) { hash_table *ht = &cm->char_table; hash_table *bt = &cm->byte_table; @@ -833,7 +847,7 @@ charmap_new_char (struct linereader *lr, struct charmap_t *cm, newp = (struct charseq *) obstack_alloc (ob, sizeof (*newp) + nbytes); newp->nbytes = nbytes; memcpy (newp->bytes, bytes, nbytes); - newp->name = obstack_copy (ob, from, len1 + 1); + newp->name = from; newp->ucs4 = UNINITIALIZED_CHAR_VALUE; if ((from[0] == 'U' || from[0] == 'P') && (len1 == 5 || len1 == 9)) @@ -852,7 +866,7 @@ charmap_new_char (struct linereader *lr, struct charmap_t *cm, char *endp; errno = 0; - newp->ucs4 = strtoul (from, &endp, 16); + newp->ucs4 = strtoul (from + 1, &endp, 16); if (endp - from != len1 || (newp->ucs4 == ULONG_MAX && errno == ERANGE) || newp->ucs4 >= 0x80000000) @@ -916,7 +930,7 @@ hexadecimal range format should use only capital characters")); return; } - for (cnt = from_nr; cnt <= to_nr; ++cnt) + for (cnt = from_nr; cnt <= to_nr; cnt += step) { char *name_end; obstack_printf (ob, decimal_ellipsis ? "%.*s%0*d" : "%.*s%0*X", diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index 23ca2368c8..9cf4d2c5f5 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -97,6 +97,7 @@ struct translit_ignore_t { uint32_t from; uint32_t to; + uint32_t step; const char *fname; size_t lineno; @@ -504,18 +505,13 @@ character '%s' in class `%s' must not be in class `%s'"), } /* ... and now test <SP> as a special case. */ - space_value = repertoire_find_value (ctype->repertoire, "SP", 2); - if (space_value == ILLEGAL_CHAR_VALUE) - { - if (!be_quiet) - error (0, 0, _("character <SP> not defined in character map")); - } - else if (((cnt = BITPOS (tok_space), - (ELEM (ctype, class_collection, , space_value) - & BITw (tok_space)) == 0) - || (cnt = BITPOS (tok_blank), - (ELEM (ctype, class_collection, , space_value) - & BITw (tok_blank)) == 0))) + space_value = 32; + if (((cnt = BITPOS (tok_space), + (ELEM (ctype, class_collection, , space_value) + & BITw (tok_space)) == 0) + || (cnt = BITPOS (tok_blank), + (ELEM (ctype, class_collection, , space_value) + & BITw (tok_blank)) == 0))) { if (!be_quiet) error (0, 0, _("<SP> character not in class `%s'"), @@ -1236,7 +1232,8 @@ get_character (struct token *now, struct charmap_t *charmap, } -/* Ellipsis like in `<foo123>..<foo12a>' or `<j1234>....<j1245>'. */ +/* Ellipsis like in `<foo123>..<foo12a>' or `<j1234>....<j1245>' and + the .(2). counterparts. */ static void charclass_symbolic_ellipsis (struct linereader *ldfile, struct locale_ctype_t *ctype, @@ -1246,7 +1243,7 @@ charclass_symbolic_ellipsis (struct linereader *ldfile, const char *last_str, unsigned long int class256_bit, unsigned long int class_bit, int base, - int ignore_content, int handle_digits) + int ignore_content, int handle_digits, int step) { const char *nowstr = now->val.str.startmb; char tmp[now->val.str.lenmb + 1]; @@ -1288,7 +1285,7 @@ charclass_symbolic_ellipsis (struct linereader *ldfile, if (!ignore_content) { now->val.str.startmb = tmp; - while (++from <= to) + while ((from += step) <= to) { struct charseq *seq; uint32_t wch; @@ -1346,7 +1343,7 @@ charclass_symbolic_ellipsis (struct linereader *ldfile, } -/* Ellipsis like in `<U1234>..<U2345>'. */ +/* Ellipsis like in `<U1234>..<U2345>' or `<U1234>..(2)..<U2345>'. */ static void charclass_ucs4_ellipsis (struct linereader *ldfile, struct locale_ctype_t *ctype, @@ -1355,7 +1352,7 @@ charclass_ucs4_ellipsis (struct linereader *ldfile, struct token *now, uint32_t last_wch, unsigned long int class256_bit, unsigned long int class_bit, int ignore_content, - int handle_digits) + int handle_digits, int step) { if (last_wch > now->val.ucs4) { @@ -1367,7 +1364,7 @@ to-value <U%0*X> of range is smaller than from-value <U%0*X>"), } if (!ignore_content) - while (++last_wch <= now->val.ucs4) + while ((last_wch += step) <= now->val.ucs4) { /* We have to find out whether there is a byte sequence corresponding to this UCS4 value. */ @@ -1376,6 +1373,11 @@ to-value <U%0*X> of range is smaller than from-value <U%0*X>"), snprintf (utmp, sizeof (utmp), "U%08X", last_wch); seq = charmap_find_value (charmap, utmp, 9); + if (seq == NULL) + { + snprintf (utmp, sizeof (utmp), "U%04X", last_wch); + seq = charmap_find_value (charmap, utmp, 5); + } if (seq == NULL) /* Try looking in the repertoire map. */ @@ -1779,6 +1781,7 @@ read_translit_ignore_entry (struct linereader *ldfile, obstack_alloc (&ctype->mempool, sizeof (struct translit_ignore_t)); newp->from = from; newp->to = from; + newp->step = 1; newp->next = ctype->translit_ignore; ctype->translit_ignore = newp; @@ -1788,11 +1791,12 @@ read_translit_ignore_entry (struct linereader *ldfile, line. */ now = lr_token (ldfile, charmap, repertoire); - if (now->tok == tok_ellipsis2) + if (now->tok == tok_ellipsis2 || now->tok == tok_ellipsis2_2) { /* XXX Should we bother implementing `....'? `...' certainly will not be implemented. */ uint32_t to; + int step = now->tok == tok_ellipsis2_2 ? 2 : 1; now = lr_token (ldfile, charmap, repertoire); @@ -1823,7 +1827,10 @@ read_translit_ignore_entry (struct linereader *ldfile, { /* Make sure the `to'-value is larger. */ if (to >= from) - newp->to = to; + { + newp->to = to; + newp->step = step; + } else lr_error (ldfile, _("\ to-value <U%0*X> of range is smaller than from-value <U%0*X>"), @@ -1866,6 +1873,7 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, uint32_t last_wch = 0; enum token_t last_token; enum token_t ellipsis_token; + int step; char last_charcode[16]; size_t last_charcode_len = 0; const char *last_str = NULL; @@ -2040,6 +2048,7 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, ctype->class_done |= class_bit; last_token = tok_none; ellipsis_token = tok_none; + step = 1; now = lr_token (ldfile, charmap, NULL); while (now->tok != tok_eol && now->tok != tok_eof) { @@ -2140,7 +2149,7 @@ the absolute ellipsis `...' must not be used")); == tok_ellipsis4 ? 10 : 16), ignore_content, - handle_digits); + handle_digits, step); } else if (last_token == tok_ucs4) { @@ -2151,7 +2160,8 @@ with UCS range values one must use the hexadecimal symbolic ellipsis `..'")); charclass_ucs4_ellipsis (ldfile, ctype, charmap, repertoire, now, last_wch, class256_bit, class_bit, - ignore_content, handle_digits); + ignore_content, handle_digits, + step); } else { @@ -2180,9 +2190,21 @@ with character code range values one must use the absolute ellipsis `...'")); break; if (last_token != tok_none - && now->tok >= tok_ellipsis2 && now->tok <= tok_ellipsis4) + && now->tok >= tok_ellipsis2 && now->tok <= tok_ellipsis4_2) { + if (now->tok == tok_ellipsis2_2) + { + now->tok = tok_ellipsis2; + step = 2; + } + else if (now->tok == tok_ellipsis4_2) + { + now->tok = tok_ellipsis4; + step = 2; + } + ellipsis_token = now->tok; + now = lr_token (ldfile, charmap, NULL); continue; } @@ -2194,6 +2216,7 @@ with character code range values one must use the absolute ellipsis `...'")); now = lr_token (ldfile, charmap, NULL); ellipsis_token = tok_none; + step = 1; } break; diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c index f6532a4792..36dd0cd2d0 100644 --- a/locale/programs/linereader.c +++ b/locale/programs/linereader.c @@ -185,6 +185,16 @@ lr_token (struct linereader *lr, const struct charmap_t *charmap, if (ch != lr->comment_char) break; + /* Is there an newline at the end of the buffer? */ + if (lr->buf[lr->bufact - 1] != '\n') + { + /* No. Some people want this to mean that only the line in + the file not the logical, concatenated line is ignored. + Let's try this. */ + lr->idx = lr->bufact; + continue; + } + /* Ignore rest of line. */ lr_ignore_rest (lr, 0); lr->token.tok = tok_eol; @@ -198,6 +208,14 @@ lr_token (struct linereader *lr, const struct charmap_t *charmap, /* Match ellipsis. */ if (ch == '.') { + if (strncmp (&lr->buf[lr->idx], "...(2)....", 10) == 0) + { + int cnt; + for (cnt = 0; cnt < 10; ++cnt) + lr_getc (lr); + lr->token.tok = tok_ellipsis4_2; + return &lr->token; + } if (strncmp (&lr->buf[lr->idx], "...", 3) == 0) { lr_getc (lr); @@ -213,6 +231,14 @@ lr_token (struct linereader *lr, const struct charmap_t *charmap, lr->token.tok = tok_ellipsis3; return &lr->token; } + if (strncmp (&lr->buf[lr->idx], ".(2)..", 6) == 0) + { + int cnt; + for (cnt = 0; cnt < 6; ++cnt) + lr_getc (lr); + lr->token.tok = tok_ellipsis2_2; + return &lr->token; + } if (lr->buf[lr->idx] == '.') { lr_getc (lr); diff --git a/locale/programs/locfile-token.h b/locale/programs/locfile-token.h index e1cd5f7a74..6eecc5618a 100644 --- a/locale/programs/locfile-token.h +++ b/locale/programs/locfile-token.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. @@ -31,6 +31,8 @@ enum token_t tok_ellipsis2, tok_ellipsis3, tok_ellipsis4, + tok_ellipsis2_2, + tok_ellipsis4_2, tok_semicolon, tok_comma, tok_open_brace, |