diff options
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | locale/programs/ld-collate.c | 27 |
2 files changed, 23 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog index 258530bb79..63088b293b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 1999-12-10 Ulrich Drepper <drepper@cygnus.com> + * locale/programs/ld-collate.c: Implement "copy" in LC_COLLATE. + * locale/programs/ld-collate.c (collate_read): Add handling of reorder-after. diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index 84472f30fb..982462f7b3 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -714,15 +714,19 @@ insert_value (struct linereader *ldfile, struct token *arg, static void collate_startup (struct linereader *ldfile, struct localedef_t *locale, - int ignore_content) + struct localedef_t *copy_locale, int ignore_content) { if (!ignore_content) { struct locale_collate_t *collate; - collate = locale->categories[LC_COLLATE].collate = - (struct locale_collate_t *) xcalloc (1, - sizeof (struct locale_collate_t)); + if (copy_locale == NULL) + collate = locale->categories[LC_COLLATE].collate = + (struct locale_collate_t *) xcalloc (1, + sizeof (struct locale_collate_t)); + else + collate = locale->categories[LC_COLLATE].collate = + copy_locale->categories[LC_COLLATE].collate; /* Init the various data structures. */ init_hash (&collate->elem_table, 100); @@ -763,6 +767,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, enum token_t nowtok; int state = 0; int was_ellipsis = 0; + struct localedef_t *copy_locale = NULL; /* Get the repertoire we have to use. */ if (repertoire_name != NULL) @@ -786,6 +791,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, { SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE"); + skip_category: do now = lr_token (ldfile, charmap, NULL); while (now->tok != tok_eof && now->tok != tok_end); @@ -805,7 +811,16 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, return; } - /* XXX Use the name */ + /* Get the locale definition. */ + copy_locale = find_locale (LC_COLLATE, now->val.str.startmb, + repertoire_name, charmap); + if ((copy_locale->avail & COLLATE_LOCALE) == 0) + { + /* Not yet loaded. So do it now. */ + if (locfile_read (copy_locale, charmap) != 0) + goto skip_category; + } + lr_ignore_rest (ldfile, 1); now = lr_token (ldfile, charmap, NULL); @@ -813,7 +828,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare the data structures. */ - collate_startup (ldfile, result, ignore_content); + collate_startup (ldfile, result, copy_locale, ignore_content); collate = result->categories[LC_COLLATE].collate; while (1) |