/* 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
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"
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
#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,
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
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;
/* 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)
/* 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);
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. */
/* 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;
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;
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);