diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-08-31 07:04:41 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-08-31 07:04:41 +0000 |
commit | 4b10dd6c1959577f57850ca427a94fe22b9f3299 (patch) | |
tree | b385d9b27e5a40d5baf7cd7e27c7cc5ef7129b5b /locale/loadlocale.c | |
parent | 1d1740d6b12894ed6a430e2e98bf73c5243b2925 (diff) | |
download | glibc-4b10dd6c1959577f57850ca427a94fe22b9f3299.tar.gz glibc-4b10dd6c1959577f57850ca427a94fe22b9f3299.tar.xz glibc-4b10dd6c1959577f57850ca427a94fe22b9f3299.zip |
Update.
* locale/Makefile (distribute): Add iso-639.def and iso-3166.def. Change charset.h to charmap.h. (categories): Add new categories. Leave out collate for now. Update build rules. * locale/categories.def: Add definitions for new categories. * locale/langinfo.h: Likewise. * locale/locale.h: Likewise. * locale/C-address.c: New file. * locale/C-identification.c: New file. * locale/C-measurement.c: New file. * locale/C-name.c: New file. * locale/C-paper.c: New file. * locale/C-telephone.c: New file. * locale/lc-address.c: Likewise. * locale/lc-identification.c: Likewise. * locale/lc-measurement.c: Likewise. * locale/lc-name.c: Likewise. * locale/lc-paper.c: Likewise. * locale/lc-telephone.c: Likewise. * locale/C-ctype.c: Update for locale rewrite. * locale/C-messages.c: Likewise. * locale/C-monetary.c: Likewise. * locale/C-time.c: Likewise. * locale/lc-collate.c: Likewise. * locale/lc-ctype.c: Likewise. * locale/lc-monetary.c: Likewise. * locale/lc-time.c: Likewise. * locale/localeinfo.h: Likewise. * locale/newlocale.c: Likewise. * locale/setlocale.c: Likewise. * locale/weight.h: Likewise. * locale/findlocale.c: Unconditionally use mmap. Handle new categories. * locale/loadlocale.c: Likewise. * locale/iso-3166.def: New file. * locale/iso-639.def: New file. * locale/programs/charmap-kw.gperf: Add new keywords. * locale/programs/locfile-kw.gperf: Likewise. * locale/programs/locfile-token.h: Define new tokens. * locale/programs/charmap.c: Rewrite to handle multibyte charsets. * locale/programs/charmap.h: New file. * locale/programs/charset.h: Removed. * locale/programs/config.h: Add __LC_LAST. * locale/programs/lc-address.c: New file. * locale/programs/lc-identification.c: New file. * locale/programs/lc-measurement.c: New file. * locale/programs/lc-name.c: New file. * locale/programs/lc-paper.c: New file. * locale/programs/lc-telephone.c: New file. * locale/programs/lc-collate.c: Update for locale rewrite. * locale/programs/lc-ctype.c: Likewise. * locale/programs/lc-messages.c: Likewise. * locale/programs/lc-monetary.c: Likewise. * locale/programs/lc-numeric.c: Likewise. * locale/programs/lc-time.c: Likewise. * locale/programs/locale.c: Likewise. * locale/programs/localedef.c: Likewise. * locale/programs/locfile.c: Likewise. * locale/programs/repertoire.c: Likewise. * locale/programs/repertoire.h: Likewise. * locale/programs/locfile.c: Update prototypes. Update handle_copy definition. * locale/programs/linereader.c: Add handling of wide char strings and new definition file syntax. * locale/programs/linereader.h (struct token): Add elements for wide character strings. * locale/programs/locale-spec.c: Disable handling of collation elements for now. * locale/programs/simple-hash.h: Cleanup. * locale/programs/stringtrans.h: Handle quite of end of line. * string/strcoll.c: Fall back on strcmp for now. * string/strxfrm.c: Fall back on strncpy/strlen for now. * time/strftime.c: Use new wide character data for wcsftime. * time/strptime.c: Remove _nl_C_LC_TIME declaration. * wctype/cname-lookup.h: Update for new LC_CTYPE data.
Diffstat (limited to 'locale/loadlocale.c')
-rw-r--r-- | locale/loadlocale.c | 77 |
1 files changed, 27 insertions, 50 deletions
diff --git a/locale/loadlocale.c b/locale/loadlocale.c index 24d0c3a67d..121798782e 100644 --- a/locale/loadlocale.c +++ b/locale/loadlocale.c @@ -1,7 +1,7 @@ /* Functions to read locale data files. Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -18,14 +18,13 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <byteswap.h> #include <errno.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <unistd.h> -#ifdef _POSIX_MAPPED_FILES -# include <sys/mman.h> -#endif +#include <sys/mman.h> #include <sys/stat.h> #include "localeinfo.h" @@ -33,7 +32,7 @@ static const size_t _nl_category_num_items[] = { -#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ +#define DEFINE_CATEGORY(category, category_name, items, a) \ [category] = _NL_ITEM_INDEX (_NL_NUM_##category), #include "categories.def" #undef DEFINE_CATEGORY @@ -42,7 +41,7 @@ static const size_t _nl_category_num_items[] = #define NO_PAREN(arg, rest...) arg, ##rest -#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ +#define DEFINE_CATEGORY(category, category_name, items, a) \ static const enum value_type _nl_value_type_##category[] = { NO_PAREN items }; #define DEFINE_ELEMENT(element, element_name, optstd, type, rest...) \ [_NL_ITEM_INDEX (element)] = type, @@ -51,7 +50,7 @@ static const enum value_type _nl_value_type_##category[] = { NO_PAREN items }; static const enum value_type *_nl_value_types[] = { -#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ +#define DEFINE_CATEGORY(category, category_name, items, a) \ [category] = _nl_value_type_##category, #include "categories.def" #undef DEFINE_CATEGORY @@ -76,10 +75,9 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) size_t cnt; inline unsigned int SWAP (const unsigned int *inw) { - const unsigned char *inc = (const unsigned char *) inw; if (!swap) return *inw; - return (inc[3] << 24) | (inc[2] << 16) | (inc[1] << 8) | inc[0]; + return bswap_32 (*inw); } file->decided = 1; @@ -97,17 +95,13 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) /* LOCALE/LC_foo is a directory; open LOCALE/LC_foo/SYS_LC_foo instead. */ char *newp; - size_t filenamelen; __close (fd); - filenamelen = strlen (file->filename); - newp = (char *) alloca (filenamelen + newp = (char *) alloca (strlen (file->filename) + 5 + _nl_category_name_sizes[category] + 1); - __mempcpy (__mempcpy (__mempcpy (newp, file->filename, filenamelen), - "/SYS_", 5), - _nl_category_names[category], - _nl_category_name_sizes[category] + 1); + __stpcpy (__stpcpy (__stpcpy (newp, file->filename), "/SYS_"), + _nl_category_names[category]); fd = __open (newp, O_RDONLY); if (fd < 0) @@ -119,32 +113,24 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) /* Map in the file's data. */ save_err = errno; -#ifdef _POSIX_MAPPED_FILES -# ifndef MAP_COPY +#ifndef MAP_COPY /* Linux seems to lack read-only copy-on-write. */ -# define MAP_COPY MAP_PRIVATE -# endif -# ifndef MAP_FILE +#define MAP_COPY MAP_PRIVATE +#endif +#ifndef MAP_FILE /* Some systems do not have this flag; it is superfluous. */ -# define MAP_FILE 0 -# endif -# ifndef MAP_INHERIT +#define MAP_FILE 0 +#endif +#ifndef MAP_INHERIT /* Some systems might lack this; they lose. */ -# define MAP_INHERIT 0 -# endif +#define MAP_INHERIT 0 +#endif filedata = (void *) __mmap ((caddr_t) 0, st.st_size, PROT_READ, MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0); - if ((void *) filedata != MAP_FAILED) - { - if (st.st_size < sizeof (*filedata)) - /* This cannot be a locale data file since it's too small. */ - goto puntfd; - } - else + if ((void *) filedata == MAP_FAILED) { if (errno == ENOSYS) { -#endif /* _POSIX_MAPPED_FILES */ /* No mmap; allocate a buffer and read from the file. */ mmaped = 0; filedata = malloc (st.st_size); @@ -170,12 +156,13 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) else goto puntfd; __set_errno (save_err); -#ifdef _POSIX_MAPPED_FILES } else goto puntfd; } -#endif /* _POSIX_MAPPED_FILES */ + else if (st.st_size < sizeof (*filedata)) + /* This cannot be a locale data file since it's too small. */ + goto puntfd; if (filedata->magic == LIMAGIC (category)) /* Good data file in our byte order. */ @@ -188,12 +175,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) /* Bad data file in either byte order. */ { puntmap: -#ifdef _POSIX_MAPPED_FILES - if (mmaped) - __munmap ((caddr_t) filedata, st.st_size); - else -#endif /* _POSIX_MAPPED_FILES */ - free (filedata); + __munmap ((caddr_t) filedata, st.st_size); puntfd: __close (fd); return; @@ -211,9 +193,9 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) goto puntmap; } - newdata = malloc (sizeof *newdata + - (_nl_category_num_items[category] - * sizeof (union locale_data_value))); + newdata = malloc (sizeof *newdata + + (_nl_category_num_items[category] + * sizeof (union locale_data_value))); if (! newdata) goto puntmap; @@ -246,14 +228,9 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) void _nl_unload_locale (struct locale_data *locale) { - if (locale->name != NULL) - free ((void *) locale->name); - -#ifdef _POSIX_MAPPED_FILES if (locale->mmaped) __munmap ((caddr_t) locale->filedata, locale->filesize); else -#endif free ((void *) locale->filedata); free (locale); |