aboutsummaryrefslogtreecommitdiff
path: root/locale/loadlocale.c
diff options
context:
space:
mode:
Diffstat (limited to 'locale/loadlocale.c')
-rw-r--r--locale/loadlocale.c77
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);