summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-libs/glibc/files/2.3.1/glibc-2.3.1-locale.patch')
-rw-r--r--sys-libs/glibc/files/2.3.1/glibc-2.3.1-locale.patch323
1 files changed, 323 insertions, 0 deletions
diff --git a/sys-libs/glibc/files/2.3.1/glibc-2.3.1-locale.patch b/sys-libs/glibc/files/2.3.1/glibc-2.3.1-locale.patch
new file mode 100644
index 000000000000..545ba7fbb83f
--- /dev/null
+++ b/sys-libs/glibc/files/2.3.1/glibc-2.3.1-locale.patch
@@ -0,0 +1,323 @@
+--- glibc-2.3.1/locale/programs/locale.c.jj 2003-01-11 18:13:57.000000000 +0000
++++ glibc-2.3.1/locale/programs/locale.c 2003-01-11 18:13:59.000000000 +0000
+@@ -43,10 +43,12 @@
+
+ #include "localeinfo.h"
+ #include "charmap-dir.h"
++#include "../locarchive.h"
+
+ extern void *xmalloc (size_t __n);
+ extern char *xstrdup (const char *__str);
+
++#define ARCHIVE_NAME LOCALEDIR "/locale-archive"
+
+ /* If set print the name of the category. */
+ static int show_category_name;
+@@ -168,7 +170,11 @@
+ int show_keyword_name);
+
+ /* Prototypes for local functions. */
++static void print_LC_IDENTIFICATION (void *mapped, size_t size);
++static void print_LC_CTYPE (void *mapped, size_t size);
+ static void write_locales (void);
++static int nameentcmp (const void *a, const void *b);
++static int write_archive_locales (void **all_datap, char *linebuf);
+ static void write_charmaps (void);
+ static void show_locale_vars (void);
+ static void show_info (const char *name);
+@@ -327,6 +333,74 @@
+ }
+
+
++static void
++print_LC_IDENTIFICATION (void *mapped, size_t size)
++{
++ /* Read the information from the file. */
++ struct
++ {
++ unsigned int magic;
++ unsigned int nstrings;
++ unsigned int strindex[0];
++ } *filedata = mapped;
++
++ if (filedata->magic == LIMAGIC (LC_IDENTIFICATION)
++ && (sizeof *filedata
++ + (filedata->nstrings
++ * sizeof (unsigned int))
++ <= size))
++ {
++ const char *str;
++
++#define HANDLE(idx, name) \
++ str = ((char *) mapped \
++ + filedata->strindex[_NL_ITEM_INDEX (_NL_IDENTIFICATION_##idx)]); \
++ if (*str != '\0') \
++ printf ("%9s | %s\n", name, str)
++ HANDLE (TITLE, "title");
++ HANDLE (SOURCE, "source");
++ HANDLE (ADDRESS, "address");
++ HANDLE (CONTACT, "contact");
++ HANDLE (EMAIL, "email");
++ HANDLE (TEL, "telephone");
++ HANDLE (FAX, "fax");
++ HANDLE (LANGUAGE, "language");
++ HANDLE (TERRITORY, "territory");
++ HANDLE (AUDIENCE, "audience");
++ HANDLE (APPLICATION, "application");
++ HANDLE (ABBREVIATION, "abbreviation");
++ HANDLE (REVISION, "revision");
++ HANDLE (DATE, "date");
++ }
++}
++
++
++static void
++print_LC_CTYPE (void *mapped, size_t size)
++{
++ struct
++ {
++ unsigned int magic;
++ unsigned int nstrings;
++ unsigned int strindex[0];
++ } *filedata = mapped;
++
++ if (filedata->magic == LIMAGIC (LC_CTYPE)
++ && (sizeof *filedata
++ + (filedata->nstrings
++ * sizeof (unsigned int))
++ <= size))
++ {
++ const char *str;
++
++ str = ((char *) mapped
++ + filedata->strindex[_NL_ITEM_INDEX (_NL_CTYPE_CODESET_NAME)]);
++ if (*str != '\0')
++ printf (" codeset | %s\n", str);
++ }
++}
++
++
+ /* Write the names of all available locales to stdout. We have some
+ sources of the information: the contents of the locale directory
+ and the locale.alias file. To avoid duplicates and print the
+@@ -358,6 +432,10 @@
+ memset (linebuf, '-', sizeof (linebuf) - 1);
+ linebuf[sizeof (linebuf) - 1] = '\0';
+
++ /* First scan the locale archive. */
++ if (write_archive_locales (&all_data, linebuf))
++ first_locale = 0;
++
+ /* Now we can look for all files in the directory. */
+ ndirents = scandir (LOCALEDIR, &dirents, select_dirs, alphasort);
+ for (cnt = 0; cnt < ndirents; ++cnt)
+@@ -375,7 +453,7 @@
+
+ if (stat64 (buf, &st) == 0 && S_ISREG (st.st_mode))
+ {
+- if (verbose)
++ if (verbose && GET (dirents[cnt]->d_name) == NULL)
+ {
+ /* Provide some nice output of all kinds of
+ information. */
+@@ -396,42 +474,7 @@
+ MAP_SHARED, fd, 0);
+ if (mapped != MAP_FAILED)
+ {
+- /* Read the information from the file. */
+- struct
+- {
+- unsigned int magic;
+- unsigned int nstrings;
+- unsigned int strindex[0];
+- } *filedata = mapped;
+-
+- if (filedata->magic == LIMAGIC (LC_IDENTIFICATION)
+- && (sizeof *filedata
+- + (filedata->nstrings
+- * sizeof (unsigned int))
+- <= (size_t) st.st_size))
+- {
+- const char *str;
+-
+-#define HANDLE(idx, name) \
+- str = ((char *) mapped \
+- + filedata->strindex[_NL_ITEM_INDEX (_NL_IDENTIFICATION_##idx)]); \
+- if (*str != '\0') \
+- printf ("%9s | %s\n", name, str)
+- HANDLE (TITLE, "title");
+- HANDLE (SOURCE, "source");
+- HANDLE (ADDRESS, "address");
+- HANDLE (CONTACT, "contact");
+- HANDLE (EMAIL, "email");
+- HANDLE (TEL, "telephone");
+- HANDLE (FAX, "fax");
+- HANDLE (LANGUAGE, "language");
+- HANDLE (TERRITORY, "territory");
+- HANDLE (AUDIENCE, "audience");
+- HANDLE (APPLICATION, "application");
+- HANDLE (ABBREVIATION, "abbreviation");
+- HANDLE (REVISION, "revision");
+- HANDLE (DATE, "date");
+- }
++ print_LC_IDENTIFICATION (mapped, st.st_size);
+
+ munmap (mapped, st.st_size);
+ }
+@@ -446,26 +489,7 @@
+ MAP_SHARED, fd, 0))
+ != MAP_FAILED))
+ {
+- struct
+- {
+- unsigned int magic;
+- unsigned int nstrings;
+- unsigned int strindex[0];
+- } *filedata = mapped;
+-
+- if (filedata->magic == LIMAGIC (LC_CTYPE)
+- && (sizeof *filedata
+- + (filedata->nstrings
+- * sizeof (unsigned int))
+- <= (size_t) st.st_size))
+- {
+- const char *str;
+-
+- str = ((char *) mapped
+- + filedata->strindex[_NL_ITEM_INDEX (_NL_CTYPE_CODESET_NAME)]);
+- if (*str != '\0')
+- printf (" codeset | %s\n", str);
+- }
++ print_LC_CTYPE (mapped, st.st_size);
+
+ munmap (mapped, st.st_size);
+ }
+@@ -474,10 +498,10 @@
+ close (fd);
+ }
+ }
+- else
+- /* If the verbose format is not selected we simply
+- collect the names. */
+- PUT (xstrdup (dirents[cnt]->d_name));
++
++ /* If the verbose format is not selected we simply
++ collect the names. */
++ PUT (xstrdup (dirents[cnt]->d_name));
+ }
+ }
+ if (ndirents > 0)
+@@ -584,6 +608,113 @@
+ }
+
+
++struct nameent
++{
++ char *name;
++ uint32_t locrec_offset;
++};
++
++
++static int
++nameentcmp (const void *a, const void *b)
++{
++ return strcoll (((const struct nameent *) a)->name,
++ ((const struct nameent *) b)->name);
++}
++
++
++static int
++write_archive_locales (void **all_datap, char *linebuf)
++{
++ struct stat64 st;
++ void *all_data = *all_datap;
++ size_t len = 0;
++ struct locarhead *head;
++ struct namehashent *namehashtab;
++ char *addr = MAP_FAILED;
++ int fd, ret = 0;
++ uint32_t cnt;
++
++ fd = open64 (ARCHIVE_NAME, O_RDONLY);
++ if (fd < 0)
++ return 0;
++
++ if (fstat64 (fd, &st) < 0 || st.st_size < sizeof (*head))
++ goto error_out;
++
++ len = st.st_size;
++ addr = mmap64 (NULL, len, PROT_READ, MAP_SHARED, fd, 0);
++ if (addr == MAP_FAILED)
++ goto error_out;
++
++ head = (struct locarhead *) addr;
++ if (head->namehash_offset + head->namehash_size > len
++ || head->string_offset + head->string_size > len
++ || head->locrectab_offset + head->locrectab_size > len
++ || head->sumhash_offset + head->sumhash_size > len)
++ goto error_out;
++
++ namehashtab = (struct namehashent *) (addr + head->namehash_offset);
++ if (! verbose)
++ {
++ for (cnt = 0; cnt < head->namehash_size; ++cnt)
++ if (namehashtab[cnt].locrec_offset != 0)
++ {
++ PUT (xstrdup (addr + namehashtab[cnt].name_offset));
++ ++ret;
++ }
++ }
++ else
++ {
++ struct nameent *names;
++ uint32_t used;
++
++ names = (struct nameent *) xmalloc (head->namehash_used
++ * sizeof (struct nameent));
++ for (cnt = used = 0; cnt < head->namehash_size; ++cnt)
++ if (namehashtab[cnt].locrec_offset != 0)
++ {
++ names[used].name = addr + namehashtab[cnt].name_offset;
++ names[used++].locrec_offset = namehashtab[cnt].locrec_offset;
++ }
++
++ /* Sort the names. */
++ qsort (names, used, sizeof (struct nameent), nameentcmp);
++
++ for (cnt = 0; cnt < used; ++cnt)
++ {
++ struct locrecent *locrec;
++
++ PUT (xstrdup (names[cnt].name));
++
++ if (cnt)
++ putchar_unlocked ('\n');
++
++ printf ("locale: %-15.15s archive: " ARCHIVE_NAME "\n%s\n",
++ names[cnt].name, linebuf);
++
++ locrec = (struct locrecent *) (addr + names[cnt].locrec_offset);
++
++ print_LC_IDENTIFICATION (addr
++ + locrec->record[LC_IDENTIFICATION].offset,
++ locrec->record[LC_IDENTIFICATION].len);
++
++ print_LC_CTYPE (addr + locrec->record[LC_CTYPE].offset,
++ locrec->record[LC_CTYPE].len);
++ }
++
++ ret = used;
++ }
++
++error_out:
++ if (addr != MAP_FAILED)
++ munmap (addr, len);
++ close (fd);
++ *all_datap = all_data;
++ return ret;
++}
++
++
+ /* Write the names of all available character maps to stdout. */
+ static void
+ write_charmaps (void)