diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-12-11 05:15:37 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-12-11 05:15:37 +0000 |
commit | 6bfd66472166f6806971759294ddbdf70d2c1274 (patch) | |
tree | 379d5b4dbedaf2190b4fa49ac73c8aee84e9ab90 /locale/programs/ld-collate.c | |
parent | 6e398b028702e9deadff4d3855774c9b758b85cf (diff) | |
download | glibc-6bfd66472166f6806971759294ddbdf70d2c1274.tar.gz glibc-6bfd66472166f6806971759294ddbdf70d2c1274.tar.xz glibc-6bfd66472166f6806971759294ddbdf70d2c1274.zip |
Update.
* locale/programs/ld-collate.c (collate_read): Add handling of reorder-after.
Diffstat (limited to 'locale/programs/ld-collate.c')
-rw-r--r-- | locale/programs/ld-collate.c | 81 |
1 files changed, 76 insertions, 5 deletions
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index ae689e9122..84472f30fb 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -733,7 +733,7 @@ collate_startup (struct linereader *ldfile, struct localedef_t *locale, collate->col_weight_max = -1; } - ldfile->translate_strings = 1; + ldfile->translate_strings = 0; ldfile->return_widestr = 0; } @@ -759,7 +759,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, struct repertoire_t *repertoire = NULL; struct locale_collate_t *collate; struct token *now; - struct token *arg; + struct token *arg = NULL; enum token_t nowtok; int state = 0; int was_ellipsis = 0; @@ -783,7 +783,28 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, state = 2; now = lr_token (ldfile, charmap, NULL); if (now->tok != tok_string) - goto err_label; + { + SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE"); + + do + now = lr_token (ldfile, charmap, NULL); + while (now->tok != tok_eof && now->tok != tok_end); + + if (now->tok != tok_eof + || (now = lr_token (ldfile, charmap, NULL), now->tok == tok_eof)) + lr_error (ldfile, _("%s: premature end of file"), "LC_COLLATE"); + else if (now->tok != tok_lc_collate) + { + lr_error (ldfile, _("\ +%1$s: definition does not end with `END %1$s'"), "LC_COLLATE"); + lr_ignore_rest (ldfile, 0); + } + else + lr_ignore_rest (ldfile, 1); + + return; + } + /* XXX Use the name */ lr_ignore_rest (ldfile, 1); @@ -1222,7 +1243,36 @@ error while adding equivalent collating symbol")); if (state != 2 && state != 3) goto err_label; state = 3; - /* XXX get symbol */ + + arg = lr_token (ldfile, charmap, repertoire); + if (arg->tok == tok_bsymbol) + { + /* Find this symbol in the sequence table. */ + struct element_t *insp; + int no_error = 1; + + if (find_entry (&collate->seq_table, arg->val.str.startmb, + arg->val.str.lenmb, (void **) &insp) == 0) + /* Yes, the symbol exists. Simply point the cursor + to it. */ + collate->cursor = insp; + else + { + /* This is bad. The symbol after which we have to + insert does not exist. */ + lr_error (ldfile, _("\ +%s: cannot reorder after %.*s: symbol not known"), + "LC_COLLATE", arg->val.str.lenmb, + arg->val.str.startmb); + collate->cursor = NULL; + no_error = 0; + } + + lr_ignore_rest (ldfile, no_error); + } + else + /* This must not happen. */ + goto err_label; break; case tok_reorder_end: @@ -1255,6 +1305,14 @@ error while adding equivalent collating symbol")); In this case we move the entry. */ struct element_t *seqp; + /* If the symbol after which we have to insert was not found + ignore all entries. */ + if (collate->cursor == NULL) + { + lr_ignore_rest (ldfile, 0); + break; + } + if (find_entry (&collate->seq_table, arg->val.str.startmb, arg->val.str.lenmb, (void **) &seqp) == 0) { @@ -1279,8 +1337,21 @@ error while adding equivalent collating symbol")); else if (seqp->section->last == seqp) seqp->section->last = seqp->last; - seqp->last = seqp->next = NULL; + /* Now insert it in the new place. */ + seqp->next = collate->cursor->next; + seqp->last = collate->cursor; + collate->cursor->next = seqp; + if (seqp->next != NULL) + seqp->next->last = seqp; + + seqp->section = collate->cursor->section; + if (seqp->section->last == collate->cursor) + seqp->section->last = seqp; + + break; } + + /* Otherwise we just add a new entry. */ } /* Now insert in the new place. */ |