diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-12-10 01:37:56 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-12-10 01:37:56 +0000 |
commit | 47e8b4439dda245845e85dfbb054693a9b132635 (patch) | |
tree | ef27110e00f1a9f726c74c2f8473499ccf3dd0de /locale/programs/linereader.c | |
parent | a352ab4ca56142647227c3d2943adfa455679ada (diff) | |
download | glibc-47e8b4439dda245845e85dfbb054693a9b132635.tar glibc-47e8b4439dda245845e85dfbb054693a9b132635.tar.gz glibc-47e8b4439dda245845e85dfbb054693a9b132635.tar.bz2 glibc-47e8b4439dda245845e85dfbb054693a9b132635.zip |
Update.
2001-12-09 Ulrich Drepper <drepper@redhat.com>
Implement transliteration of characters in strings of the locale
definitions.
* locale/programs/linereader.c: Adjust for additional parameter to
lr_token.
(get_string): If character <Uxxxx> is not found try to transliterate
it.
* locale/programs/ld-ctype.c: Adjust for additional parameter to
lr_token. Add const to charmap parameter of all functions.
(find_translit, find_translit2): New functions.
* locale/programs/charmap.c: Adjust for additional parameter to
lr_token.
* locale/programs/repertoire.c: Likewise.
* locale/programs/linereader.h: Likewise.
* locale/programs/ld-address.c: Likewise. Add const to charmap
parameter of all functions.
* locale/programs/ld-collate.c: Likewise.
* locale/programs/ld-identification.c: Likewise.
* locale/programs/ld-measurement.c: Likewise.
* locale/programs/ld-messages.c: Likewise.
* locale/programs/ld-monetary.c: Likewise.
* locale/programs/ld-name.c: Likewise.
* locale/programs/ld-numeric.c: Likewise.
* locale/programs/ld-paper.c: Likewise.
* locale/programs/ld-paper.c: Likewise.
* locale/programs/ld-telephone.c: Likewise.
* locale/programs/ld-time.c: Likewise.
* locale/programs/locfile.c: Likewise.
* locale/programs/localedef.c: Likewise.
* locale/programs/localedef.h: Likewise.
* locale/programs/locfile.h: Likewise. Add declaration for
find_translit.
* locale/programs/simple-hash.c: Add const to first parameter of
find_entry, iterate_table, and lookup.
* locale/programs/simple-hash.h: Likewise.
* locale/localeinfo.h: Don't define __LC_LAST here. Include <locale.h>
instead.
* include/locale.h: Define __LC_LAST.
* iconv/Makefile (CFLAGS-linereader.c): Define to -DNO_TRANSLITERATION.
Diffstat (limited to 'locale/programs/linereader.c')
-rw-r--r-- | locale/programs/linereader.c | 83 |
1 files changed, 66 insertions, 17 deletions
diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c index ac843bcd2f..9f5191226b 100644 --- a/locale/programs/linereader.c +++ b/locale/programs/linereader.c @@ -21,6 +21,7 @@ # include <config.h> #endif +#include <assert.h> #include <ctype.h> #include <errno.h> #include <libintl.h> @@ -31,6 +32,8 @@ #include "charmap.h" #include "error.h" #include "linereader.h" +#include "localedef.h" +#include "locfile.h" /* Prototypes for a few program-wide used functions. */ extern void *xmalloc (size_t __n); @@ -44,6 +47,7 @@ static struct token *get_symname (struct linereader *lr); static struct token *get_ident (struct linereader *lr); static struct token *get_string (struct linereader *lr, const struct charmap_t *charmap, + struct localedef_t *locale, const struct repertoire_t *repertoire, int verbose); @@ -163,7 +167,8 @@ extern char *program_name; struct token * lr_token (struct linereader *lr, const struct charmap_t *charmap, - const struct repertoire_t *repertoire, int verbose) + struct localedef_t *locale, const struct repertoire_t *repertoire, + int verbose) { int ch; @@ -295,7 +300,7 @@ lr_token (struct linereader *lr, const struct charmap_t *charmap, return &lr->token; case '"': - return get_string (lr, charmap, repertoire, verbose); + return get_string (lr, charmap, locale, repertoire, verbose); case '-': ch = lr_getc (lr); @@ -568,7 +573,8 @@ get_ident (struct linereader *lr) static struct token * get_string (struct linereader *lr, const struct charmap_t *charmap, - const struct repertoire_t *repertoire, int verbose) + struct localedef_t *locale, const struct repertoire_t *repertoire, + int verbose) { int return_widestr = lr->return_widestr; char *buf; @@ -690,7 +696,6 @@ non-symbolic character value should not be used")); if (cp == &buf[bufact]) { char utmp[10]; - const char *symbol = NULL; /* Yes, it is. */ ADDC ('\0'); @@ -712,21 +717,65 @@ non-symbolic character value should not be used")); the repertoire the name of the character and find it in the charmap. */ if (repertoire != NULL) - symbol = repertoire_find_symbol (repertoire, wch); - - if (symbol == NULL) - /* We cannot generate a string since we - cannot map from the Unicode number to the - character symbol. */ - illegal_string = 1; - else { - seq = charmap_find_value (charmap, symbol, - strlen (symbol)); + const char *symbol; - if (seq == NULL) - /* Not a known name. */ - illegal_string = 1; + symbol = repertoire_find_symbol (repertoire, wch); + + if (symbol != NULL) + seq = charmap_find_value (charmap, symbol, + strlen (symbol)); + } + + if (seq == NULL) + { +#ifndef NO_TRANSLITERATION + /* Transliterate if possible. */ + if (locale != NULL) + { + uint32_t *translit; + + if ((locale->avail & CTYPE_LOCALE) == 0) + { + /* Load the CTYPE data now. */ + int old_needed = locale->needed; + + locale->needed = 0; + locale = load_locale (CTYPE_LOCALE, + locale->name, + locale->repertoire_name, + charmap, locale); + locale->needed = old_needed; + } + + if ((locale->avail & CTYPE_LOCALE) != 0 + && ((translit = find_translit (locale, + charmap, wch)) + != NULL)) + /* The CTYPE data contains a matching + transliteration. */ + { + int i; + + for (i = 0; translit[i] != 0; ++i) + { + char utmp[10]; + + snprintf (utmp, sizeof (utmp), "U%08X", + translit[i]); + seq = charmap_find_value (charmap, utmp, + 9); + assert (seq != NULL); + ADDS (seq->bytes, seq->nbytes); + } + + continue; + } + } +#endif /* NO_TRANSLITERATION */ + + /* Not a known name. */ + illegal_string = 1; } } |