diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-04-16 23:59:09 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2007-04-16 23:59:09 +0000 |
commit | e220c524c93b053a1dea504a2d18288ff8f32b9a (patch) | |
tree | 4193293c838a7db46f2cc0c2b50cb8601dcddb8d /locale/programs/locarchive.c | |
parent | a891c7b0e014df5df027249f59cb444b87afdf30 (diff) |
Updated to fedora-glibc-20070416T2350cvs/fedora-glibc-2_5_90-21
Diffstat (limited to 'locale/programs/locarchive.c')
-rw-r--r-- | locale/programs/locarchive.c | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c index 201700dcb0..c1242db164 100644 --- a/locale/programs/locarchive.c +++ b/locale/programs/locarchive.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -64,9 +64,9 @@ static const char *locnames[] = /* Size of the initial archive header. */ -#define INITIAL_NUM_NAMES 450 -#define INITIAL_SIZE_STRINGS 3500 -#define INITIAL_NUM_LOCREC 350 +#define INITIAL_NUM_NAMES 900 +#define INITIAL_SIZE_STRINGS 7500 +#define INITIAL_NUM_LOCREC 420 #define INITIAL_NUM_SUMS 2000 @@ -88,6 +88,7 @@ create_archive (const char *archivefname, struct locarhandle *ah) /* Create the initial content of the archive. */ head.magic = AR_MAGIC; + head.serial = 0; head.namehash_offset = sizeof (struct locarhead); head.namehash_used = 0; head.namehash_size = next_prime (INITIAL_NUM_NAMES); @@ -217,9 +218,12 @@ oldlocrecentcmp (const void *a, const void *b) } -/* forward decl for below */ +/* forward decls for below */ static uint32_t add_locale (struct locarhandle *ah, const char *name, locale_data_t data, bool replace); +void add_alias (struct locarhandle *ah, const char *alias, + bool replace, const char *oldname, + uint32_t *locrec_offset_p); static void enlarge_archive (struct locarhandle *ah, const struct locarhead *head) @@ -350,6 +354,7 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head) qsort (oldlocrecarray, loccnt, sizeof (struct oldlocrecent), oldlocrecentcmp); + uint32_t last_locrec_offset = 0; for (cnt = 0; cnt < loccnt; ++cnt) { /* Insert this entry in the new hash table. */ @@ -368,10 +373,25 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head) old_data[idx].sum); } - if (add_locale (&new_ah, - ((char *) ah->addr - + oldnamehashtab[oldlocrecarray[cnt].cnt].name_offset), - old_data, 0) == 0) + if (cnt > 0 && oldlocrecarray[cnt - 1].locrec == oldlocrec) + { + const char *oldname + = ((char *) ah->addr + + oldnamehashtab[oldlocrecarray[cnt - 1].cnt].name_offset); + + add_alias (&new_ah, + ((char *) ah->addr + + oldnamehashtab[oldlocrecarray[cnt].cnt].name_offset), + 0, oldname, &last_locrec_offset); + continue; + } + + last_locrec_offset = + add_locale (&new_ah, + ((char *) ah->addr + + oldnamehashtab[oldlocrecarray[cnt].cnt].name_offset), + old_data, 0); + if (last_locrec_offset == 0) error (EXIT_FAILURE, 0, _("cannot extend locale archive file")); } @@ -1428,7 +1448,7 @@ show_archive_content (int verbose) int sumused; files = (struct dataent *) xmalloc (head->sumhash_used - * sizeof (struct sumhashent)); + * sizeof (struct dataent)); sumhashtab = (struct sumhashent *) ((char *) ah.addr + head->sumhash_offset); |