aboutsummaryrefslogtreecommitdiff
path: root/locale
diff options
context:
space:
mode:
Diffstat (limited to 'locale')
-rw-r--r--locale/C-collate.c5
-rw-r--r--locale/C-ctype.c7
-rw-r--r--locale/C-messages.c33
-rw-r--r--locale/C-monetary.c5
-rw-r--r--locale/C-numeric.c5
-rw-r--r--locale/C-time.c3
-rw-r--r--locale/Makefile7
-rw-r--r--locale/categories.def32
-rw-r--r--locale/codeset_name.c30
-rw-r--r--locale/duplocale.c55
-rw-r--r--locale/findlocale.c76
-rw-r--r--locale/freelocale.c50
-rw-r--r--locale/lc-collate.c34
-rw-r--r--locale/lc-ctype.c34
-rw-r--r--locale/lc-messages.c28
-rw-r--r--locale/lc-monetary.c28
-rw-r--r--locale/lc-numeric.c28
-rw-r--r--locale/lc-time.c34
-rw-r--r--locale/loadlocale.c34
-rw-r--r--locale/locale.h19
-rw-r--r--locale/localeconv.c34
-rw-r--r--locale/localeinfo.h29
-rw-r--r--locale/newlocale.c192
-rw-r--r--locale/nl_langinfo.c32
-rw-r--r--locale/programs/charmap-kw.gperf30
-rw-r--r--locale/programs/charmap-kw.h38
-rw-r--r--locale/programs/charmap.c6
-rw-r--r--locale/programs/charset.c36
-rw-r--r--locale/programs/charset.h7
-rw-r--r--locale/programs/ld-collate.c13
-rw-r--r--locale/programs/ld-ctype.c107
-rw-r--r--locale/programs/ld-messages.c38
-rw-r--r--locale/programs/ld-monetary.c45
-rw-r--r--locale/programs/ld-numeric.c10
-rw-r--r--locale/programs/ld-time.c60
-rw-r--r--locale/programs/linereader.h36
-rw-r--r--locale/programs/locale-spec.c36
-rw-r--r--locale/programs/localedef.c12
-rw-r--r--locale/programs/locales.h36
-rw-r--r--locale/programs/locfile-kw.gperf30
-rw-r--r--locale/programs/locfile-kw.h30
-rw-r--r--locale/programs/locfile-token.h37
-rw-r--r--locale/programs/locfile.c8
-rw-r--r--locale/programs/locfile.h6
-rw-r--r--locale/programs/simple-hash.h34
-rw-r--r--locale/programs/stringtrans.c36
-rw-r--r--locale/programs/stringtrans.h36
-rw-r--r--locale/setlocale.c73
-rw-r--r--locale/strlen-hash.h36
-rw-r--r--locale/weight.h47
-rw-r--r--locale/xlocale.h38
51 files changed, 1110 insertions, 645 deletions
diff --git a/locale/C-collate.c b/locale/C-collate.c
index 5388237045..5c049e1f59 100644
--- a/locale/C-collate.c
+++ b/locale/C-collate.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
@@ -146,7 +146,8 @@ const u_int32_t _nl_C_LC_COLLATE_symbol_classes[256] =
const struct locale_data _nl_C_LC_COLLATE =
{
_nl_C_name,
- NULL, 0, /* no file mapped */
+ NULL, 0, 0, /* no file mapped */
+ MAX_USAGE_COUNT,
21,
{
{ word: 0 },
diff --git a/locale/C-ctype.c b/locale/C-ctype.c
index d45c32c34b..6a1c3fc7be 100644
--- a/locale/C-ctype.c
+++ b/locale/C-ctype.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
@@ -341,7 +341,8 @@ const char _nl_C_LC_CTYPE_width[256] =
const struct locale_data _nl_C_LC_CTYPE =
{
_nl_C_name,
- NULL, 0, /* no file mapped */
+ NULL, 0, 0, /* no file mapped */
+ MAX_USAGE_COUNT,
15,
{
{ string: _nl_C_LC_CTYPE_class },
@@ -367,6 +368,6 @@ const struct locale_data _nl_C_LC_CTYPE =
{ string: "tolower\0" "toupper\0" },
{ string: _nl_C_LC_CTYPE_width },
{ word: 2 },
- { string: "ISO_646.IRV:1983" }
+ { string: "ISO_646.IRV" }
}
};
diff --git a/locale/C-messages.c b/locale/C-messages.c
index 566fedce91..70eeb8cc80 100644
--- a/locale/C-messages.c
+++ b/locale/C-messages.c
@@ -1,21 +1,21 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include "localeinfo.h"
@@ -27,7 +27,8 @@ Boston, MA 02111-1307, USA. */
const struct locale_data _nl_C_LC_MESSAGES =
{
_nl_C_name,
- NULL, 0, /* no file mapped */
+ NULL, 0, 0, /* no file mapped */
+ MAX_USAGE_COUNT,
4,
{
{ string: "^[yY]" },
diff --git a/locale/C-monetary.c b/locale/C-monetary.c
index bc10f00095..8dd361a2e0 100644
--- a/locale/C-monetary.c
+++ b/locale/C-monetary.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
@@ -30,7 +30,8 @@ static const char not_available[] = "\177";
const struct locale_data _nl_C_LC_MONETARY =
{
_nl_C_name,
- NULL, 0, /* no file mapped */
+ NULL, 0, 0, /* no file mapped */
+ MAX_USAGE_COUNT,
15,
{
{ string: "" },
diff --git a/locale/C-numeric.c b/locale/C-numeric.c
index d3fbd91917..a456214213 100644
--- a/locale/C-numeric.c
+++ b/locale/C-numeric.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
@@ -30,7 +30,8 @@ static const char not_available[] = "\177";
const struct locale_data _nl_C_LC_NUMERIC =
{
_nl_C_name,
- NULL, 0, /* no file mapped */
+ NULL, 0, 0, /* no file mapped */
+ MAX_USAGE_COUNT,
3,
{
{ string: "." },
diff --git a/locale/C-time.c b/locale/C-time.c
index a71ea93517..70ee89a192 100644
--- a/locale/C-time.c
+++ b/locale/C-time.c
@@ -25,7 +25,8 @@
const struct locale_data _nl_C_LC_TIME =
{
_nl_C_name,
- NULL, 0, /* no file mapped */
+ NULL, 0, 0, /* no file mapped */
+ MAX_USAGE_COUNT,
53,
{
{ string: "Sun" },
diff --git a/locale/Makefile b/locale/Makefile
index b5eccf35c1..dcf469f689 100644
--- a/locale/Makefile
+++ b/locale/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc.
+# Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -21,7 +21,7 @@
#
subdir := locale
-headers = locale.h langinfo.h
+headers = locale.h langinfo.h xlocale.h
distribute = localeinfo.h categories.def iso-4217.def weight.h \
strlen-hash.h \
$(addprefix programs/, \
@@ -32,7 +32,8 @@ distribute = localeinfo.h categories.def iso-4217.def weight.h \
locfile-kw.gperf locfile-kw.h linereader.h \
locales.h locfile.h stringtrans.h charset.h)
routines = setlocale findlocale loadlocale localeconv nl_langinfo \
- mb_cur_max codeset_name
+ mb_cur_max codeset_name \
+ newlocale duplocale freelocale
categories = ctype messages monetary numeric time collate
aux = $(categories:%=lc-%) $(categories:%=C-%) SYS_libc C_name
others = localedef locale
diff --git a/locale/categories.def b/locale/categories.def
index 664fc901c4..b04ca20cc2 100644
--- a/locale/categories.def
+++ b/locale/categories.def
@@ -1,20 +1,20 @@
/* Definition of all available locale categories and their items. -*- C -*-
-Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
/* These definitions are used by the locale-related files in the C library
and the programs `localedef' and `locale'.
diff --git a/locale/codeset_name.c b/locale/codeset_name.c
index c7fd818e70..3b327b7157 100644
--- a/locale/codeset_name.c
+++ b/locale/codeset_name.c
@@ -1,22 +1,22 @@
/* Internal function to return the name of the current codeset.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ 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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <langinfo.h>
#include <locale.h>
diff --git a/locale/duplocale.c b/locale/duplocale.c
new file mode 100644
index 0000000000..494c2ec829
--- /dev/null
+++ b/locale/duplocale.c
@@ -0,0 +1,55 @@
+/* Duplicate handle for selection of locales.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <locale.h>
+#include <libc-lock.h>
+#include <stdlib.h>
+
+#include <localeinfo.h>
+
+
+/* Lock for protecting global data. */
+__libc_lock_define (extern , __libc_setlocale_lock)
+
+
+__locale_t
+__duplocale (__locale_t dataset)
+{
+ __locale_t result;
+
+ /* We modify global data. */
+ __libc_lock_lock (__libc_setlocale_lock);
+
+ /* Get memory. */
+ result = (__locale_t) malloc (sizeof (struct __locale_t));
+ if (result != NULL)
+ {
+ int cnt;
+ for (cnt = 0; cnt < LC_ALL; ++cnt)
+ {
+ result->__locales[cnt] = dataset->__locales[cnt];
+ if (result->__locales[cnt]->usage_count != MAX_USAGE_COUNT)
+ ++result->__locales[cnt]->usage_count;
+ }
+ }
+
+ /* It's done. */
+ __libc_lock_unlock (__libc_setlocale_lock);
+}
diff --git a/locale/findlocale.c b/locale/findlocale.c
index d73ba4a395..308aa2b60f 100644
--- a/locale/findlocale.c
+++ b/locale/findlocale.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
@@ -20,23 +20,13 @@
#include <locale.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/mman.h>
#include "localeinfo.h"
/* Constant data defined in setlocale.c. */
-extern const struct locale_data *const _nl_C[];
-
-
-static inline char *
-copy (const char *string)
-{
- size_t len;
- char *new;
- len = strlen (string) + 1;
- new = (char *) malloc (len);
- return new != NULL ? memcpy (new, string, len) : NULL;
-}
+extern struct locale_data *const _nl_C[];
/* For each category we keep a list of records for the locale files
@@ -44,9 +34,9 @@ copy (const char *string)
static struct loaded_l10nfile *locale_file_list[LC_ALL];
-const struct locale_data *
+struct locale_data *
_nl_find_locale (const char *locale_path, size_t locale_path_len,
- int category, char **name)
+ int category, const char **name)
{
int mask;
/* Name of the locale for this category. */
@@ -88,10 +78,10 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
loc_name = (char *) _nl_expand_alias (*name);
if (loc_name == NULL)
/* It is no alias. */
- loc_name = *name;
+ loc_name = (char *) *name;
/* Make a writable copy of the locale name. */
- loc_name = copy (loc_name);
+ loc_name = __strdup (loc_name);
/* LOCALE can consist of up to four recognized parts for the XPG syntax:
@@ -141,9 +131,9 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
return NULL;
}
else
- /* If the addressed locale is already available it should be freed.
- If we would not do this switching back and force between two
- locales would slowly eat up all memory.*/
+ /* If the addressed locale is already available it should be
+ freed. If we would not do this switching back and force
+ between two locales would slowly eat up all memory. */
free ((void *) loc_name);
if (locale_file->decided == 0)
@@ -184,5 +174,51 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
}
*name = (char *) ((struct locale_data *) locale_file->data)->name;
+ /* Increment the usage count. */
+ if (((struct locale_data *) locale_file->data)->usage_count
+ != MAX_USAGE_COUNT)
+ ++((struct locale_data *) locale_file->data)->usage_count;
+
return (struct locale_data *) locale_file->data;
}
+
+
+/* Calling this function assumes the lock for handling global locale data
+ is acquired. */
+void
+_nl_remove_locale (int locale, struct locale_data *data)
+{
+ if (--data->usage_count == 0)
+ {
+ /* First search the entry in the list of loaded files. */
+ struct loaded_l10nfile *ptr = locale_file_list[locale];
+
+ /* Search for the entry. It must be in the list. Otherwise it
+ is a bug and we crash badly. */
+ while ((struct locale_data *) ptr->data != data)
+ ptr = ptr->next;
+
+ /* Mark the data as not available anymore. So when the data has
+ to be used again it is reloaded. */
+ ptr->decided = 0;
+ ptr->data = NULL;
+
+ /* Really delete the data. First delete the real data. */
+ if (data->mmaped)
+ {
+ /* Try to unmap the area. If this fails we mark the area as
+ permanent. */
+ if (__munmap ((caddr_t) data->filedata, data->filesize) != 0)
+ {
+ data->usage_count = MAX_USAGE_COUNT;
+ return;
+ }
+ }
+ else
+ /* The memory was malloced. */
+ free ((void *) data->filedata);
+
+ /* Now free the structure itself. */
+ free (data);
+ }
+}
diff --git a/locale/freelocale.c b/locale/freelocale.c
new file mode 100644
index 0000000000..26860aa15a
--- /dev/null
+++ b/locale/freelocale.c
@@ -0,0 +1,50 @@
+/* Free data allocated by a call to setlocale_r
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <libc-lock.h>
+
+#include "localeinfo.h"
+
+
+/* Lock for protecting global data. */
+__libc_lock_define (extern , __libc_setlocale_lock)
+
+
+void
+__freelocale (__locale_t dataset)
+{
+ int cnt;
+
+ /* We modify global data. */
+ __libc_lock_lock (__libc_setlocale_lock);
+
+ for (cnt = 0; cnt < LC_ALL; ++cnt)
+ if (dataset->__locales[cnt]->usage_count != MAX_USAGE_COUNT)
+ /* We can remove the data. */
+ _nl_remove_locale (cnt, dataset->__locales[cnt]);
+
+ /* Free the locale_t handle itself. */
+ free (dataset);
+
+ /* It's done. */
+ __libc_lock_unlock (__libc_setlocale_lock);
+}
diff --git a/locale/lc-collate.c b/locale/lc-collate.c
index aefdaa8b0e..7052db3062 100644
--- a/locale/lc-collate.c
+++ b/locale/lc-collate.c
@@ -1,21 +1,21 @@
/* Define current locale data for LC_COLLATE category.
-Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include "localeinfo.h"
#include <endian.h>
diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c
index 2eeedf8466..d2139aeb31 100644
--- a/locale/lc-ctype.c
+++ b/locale/lc-ctype.c
@@ -1,21 +1,21 @@
/* Define current locale data for LC_CTYPE category.
-Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include "localeinfo.h"
#include <ctype.h>
diff --git a/locale/lc-messages.c b/locale/lc-messages.c
index b7e9bbfd3a..e78f9bf235 100644
--- a/locale/lc-messages.c
+++ b/locale/lc-messages.c
@@ -1,21 +1,21 @@
/* Define current locale data for LC_MESSAGES category.
-Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include "localeinfo.h"
diff --git a/locale/lc-monetary.c b/locale/lc-monetary.c
index f29f29a4b6..b041006259 100644
--- a/locale/lc-monetary.c
+++ b/locale/lc-monetary.c
@@ -1,21 +1,21 @@
/* Define current locale data for LC_MONETARY category.
-Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include "localeinfo.h"
diff --git a/locale/lc-numeric.c b/locale/lc-numeric.c
index 19e9d966bc..41845589b8 100644
--- a/locale/lc-numeric.c
+++ b/locale/lc-numeric.c
@@ -1,21 +1,21 @@
/* Define current locale data for LC_NUMERIC category.
-Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include "localeinfo.h"
diff --git a/locale/lc-time.c b/locale/lc-time.c
index f4fe561cb9..7bed6aea13 100644
--- a/locale/lc-time.c
+++ b/locale/lc-time.c
@@ -1,21 +1,21 @@
/* Define current locale data for LC_TIME category.
-Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <libc-lock.h>
#include <stdlib.h>
diff --git a/locale/loadlocale.c b/locale/loadlocale.c
index 474a73cf6e..544c09ad88 100644
--- a/locale/loadlocale.c
+++ b/locale/loadlocale.c
@@ -1,22 +1,22 @@
/* Functions to read locale data files.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <fcntl.h>
@@ -70,6 +70,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
struct locale_data *newdata;
int save_err;
int swap = 0;
+ int mmaped = 1;
size_t cnt;
inline unsigned int SWAP (const unsigned int *inw)
{
@@ -131,6 +132,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
if (errno == ENOSYS)
{
/* No mmap; allocate a buffer and read from the file. */
+ mmaped = 0;
filedata = malloc (st.st_size);
if (filedata != NULL)
{
@@ -197,6 +199,8 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
newdata->name = NULL; /* This will be filled if necessary in findlocale.c. */
newdata->filedata = (void *) filedata;
newdata->filesize = st.st_size;
+ newdata->mmaped = mmaped;
+ newdata->usage_count = 0;
newdata->nstrings = _nl_category_num_items[category];
for (cnt = 0; cnt < newdata->nstrings; ++cnt)
{
diff --git a/locale/locale.h b/locale/locale.h
index 37f5434de1..c16d83bb7b 100644
--- a/locale/locale.h
+++ b/locale/locale.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -105,9 +105,8 @@ extern struct lconv *localeconv __P ((void));
Attention: all these functions are *not* standardized in any form.
This is a proof-of-concept implementation. */
-/* Structure for reentrant locale using functions. This is an opaque
- type for the user level programs. */
-typedef struct locale_data *locale_t[LC_ALL];
+/* Get locale datatype definition. */
+# include <xlocale.h>
/* Return a reference to a data structure representing a set of locale
datasets. Unlike for the CATEGORY parameter for `setlocale' the
@@ -115,13 +114,17 @@ typedef struct locale_data *locale_t[LC_ALL];
I.e., 1 << LC_CTYPE means to load data for this category. If
BASE is non-null the appropriate category information in the BASE
record is replaced. */
-extern __const locale_t *__newlocale __P ((int __category_mask,
- __const char *__locale,
- __const locale_t *__base));
+extern __locale_t __newlocale __P ((int __category_mask,
+ __const char *__locale,
+ __locale_t __base));
+
+/* Return a duplicate of the set of locale in DATASET. All usage
+ counters are increased if necessary. */
+extern __locale_t __duplocale __P ((__locale_t __dataset));
/* Free the data associated with a locale dataset previously returned
by a call to `setlocale_r'. */
-extern void __freelocale __P ((__const locale_t *__dataset));
+extern void __freelocale __P ((__locale_t __dataset));
#endif
__END_DECLS
diff --git a/locale/localeconv.c b/locale/localeconv.c
index d846210b7b..06f12dbfaf 100644
--- a/locale/localeconv.c
+++ b/locale/localeconv.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+/* Copyright (C) 1991, 1992, 1995, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <locale.h>
#include "localeinfo.h"
diff --git a/locale/localeinfo.h b/locale/localeinfo.h
index 018220f6df..c029f63480 100644
--- a/locale/localeinfo.h
+++ b/locale/localeinfo.h
@@ -22,6 +22,7 @@
#include <stddef.h>
#include <langinfo.h>
+#include <limits.h>
#include <time.h>
#include <sys/types.h>
@@ -35,12 +36,19 @@
#define ELLIPSIS_CHAR ((wchar_t) 0xfffffffe)
#define IGNORE_CHAR ((wchar_t) 0xffffffff)
+/* We use a special value for the usage counter in `locale_data' to
+ signal that this data must never be removed anymore. */
+#define MAX_USAGE_COUNT UINT_MAX
+
/* Structure describing locale data in core for a category. */
struct locale_data
{
const char *name;
const char *filedata; /* Region mapping the file data. */
off_t filesize; /* Size of the file (and the region). */
+ int mmaped; /* If nonzero the data is mmaped. */
+
+ unsigned int usage_count; /* Counter for users. */
unsigned int nstrings; /* Number of strings below. */
union locale_data_value
@@ -90,13 +98,13 @@ struct era_entry
/* For each category declare the variable for the current locale data. */
#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
-extern const struct locale_data *_nl_current_##category;
+extern struct locale_data *_nl_current_##category;
#include "categories.def"
#undef DEFINE_CATEGORY
extern const char *const _nl_category_names[LC_ALL + 1];
extern const size_t _nl_category_name_sizes[LC_ALL + 1];
-extern const struct locale_data * *const _nl_current[LC_ALL];
+extern struct locale_data * *const _nl_current[LC_ALL];
/* Name of the standard locale. */
extern const char _nl_C_name[];
@@ -111,26 +119,29 @@ extern const char _nl_C_name[];
/* This is used in lc-CATEGORY.c to define _nl_current_CATEGORY. */
#define _NL_CURRENT_DEFINE(category) \
- extern const struct locale_data _nl_C_##category; \
- const struct locale_data *_nl_current_##category = &_nl_C_##category
+ extern struct locale_data _nl_C_##category; \
+ struct locale_data *_nl_current_##category = &_nl_C_##category
/* Load the locale data for CATEGORY from the file specified by *NAME.
If *NAME is "", use environment variables as specified by POSIX,
and fill in *NAME with the actual name used. The directories
listed in LOCALE_PATH are searched for the locale files. */
-extern const struct locale_data *_nl_find_locale (const char *locale_path,
- size_t locale_path_len,
- int category, char **name);
+extern struct locale_data *_nl_find_locale (const char *locale_path,
+ size_t locale_path_len,
+ int category, const char **name);
/* Try to load the file described by FILE. */
extern void _nl_load_locale (struct loaded_l10nfile *file, int category);
+/* Free the locale and give back all memory if the usage count is one. */
+extern void _nl_remove_locale (int locale, struct locale_data *data);
+
/* Return `era' entry which corresponds to TP. Used in strftime. */
-struct era_entry *_nl_get_era_entry (const struct tm *tp);
+extern struct era_entry *_nl_get_era_entry (const struct tm *tp);
/* Return `alt_digit' which corresponds to NUMBER. Used in strftime. */
-const char *_nl_get_alt_digit (unsigned int number);
+extern const char *_nl_get_alt_digit (unsigned int number);
/* Global variables for LC_COLLATE category data. */
diff --git a/locale/newlocale.c b/locale/newlocale.c
new file mode 100644
index 0000000000..d4e184b921
--- /dev/null
+++ b/locale/newlocale.c
@@ -0,0 +1,192 @@
+/* Return a reference to locale information record.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <argz.h>
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+
+#include "localeinfo.h"
+
+
+/* Constant data defined in setlocale.c. */
+extern struct locale_data *const _nl_C[];
+
+/* Use this when we come along an error. */
+#define ERROR_RETURN \
+ do { \
+ __set_errno (EINVAL); \
+ return NULL; \
+ } while (0)
+
+
+__locale_t
+__newlocale (int category_mask, const char *locale, __locale_t base)
+{
+ /* Intermediate memory for result. */
+ const char *newnames[LC_ALL];
+ struct __locale_t result;
+ __locale_t result_ptr;
+ char *locale_path;
+ size_t locale_path_len;
+ const char *locpath_var;
+ int cnt;
+
+ /* We treat LC_ALL in the same way as if all bits were set. */
+ if (category_mask == LC_ALL)
+ category_mask = (1 << LC_ALL) - 1;
+
+ /* Sanity check for CATEGORY argument. */
+ if ((category_mask & ~(1 << LC_ALL) - 1) != 0)
+ ERROR_RETURN;
+
+ /* `newlocale' does not support asking for the locale name. */
+ if (locale == NULL)
+ ERROR_RETURN;
+
+ /* Allocate memory for the result. */
+ if (base != NULL)
+ {
+ if (base != NULL)
+ return base;
+
+ result = *base;
+ }
+ else
+ {
+ /* Fill with pointers to C locale data to . */
+ for (cnt = 0; cnt < LC_ALL; ++cnt)
+ result.__locales[cnt] = _nl_C[cnt];
+
+ /* If no category is to be set we return BASE if available or a
+ dataset using the C locale data. */
+ if (category_mask == 0)
+ {
+ result_ptr = (__locale_t) malloc (sizeof (struct __locale_t));
+ *result_ptr = result;
+
+ goto update;
+ }
+ }
+
+ /* We perhaps really have to load some data. So we determine the
+ path in which to look for the data now. The environment variable
+ `LOCPATH' must only be used when the binary has no SUID or SGID
+ bit set. */
+ locale_path = NULL;
+ locale_path_len = 0;
+
+ locpath_var = __secure_getenv ("LOCPATH");
+ if (locpath_var != NULL && locpath_var[0] != '\0')
+ if (__argz_create_sep (locpath_var, ':',
+ &locale_path, &locale_path_len) != 0)
+ return NULL;
+
+ if (__argz_append (&locale_path, &locale_path_len,
+ LOCALE_PATH, sizeof (LOCALE_PATH)) != 0)
+ return NULL;
+
+ /* Get the names for the locales we are interested in. We either
+ allow a composite name or a single name. */
+ for (cnt = 0; cnt < LC_ALL; ++cnt)
+ newnames[cnt] = locale;
+ if (strchr (locale, ';') != NULL)
+ {
+ /* This is a composite name. Make a copy and split it up. */
+ char *np = strdupa (locale);
+ char *cp;
+
+ while ((cp = strchr (np, '=')) != NULL)
+ {
+ for (cnt = 0; cnt < LC_ALL; ++cnt)
+ if ((size_t) (cp - np) == _nl_category_name_sizes[cnt]
+ && memcmp (np, _nl_category_names[cnt], cp - np) == 0)
+ break;
+
+ if (cnt == LC_ALL)
+ /* Bogus category name. */
+ ERROR_RETURN;
+
+ /* Found the category this clause sets. */
+ newnames[cnt] = ++cp;
+ cp = strchr (cp, ';');
+ if (cp != NULL)
+ {
+ /* Examine the next clause. */
+ *cp = '\0';
+ np = cp + 1;
+ }
+ else
+ /* This was the last clause. We are done. */
+ break;
+ }
+
+ for (cnt = 0; cnt < LC_ALL; ++cnt)
+ if ((category_mask & 1 << cnt) != 0 && newnames[cnt] == locale)
+ /* The composite name did not specify the category we need. */
+ ERROR_RETURN;
+ }
+
+ /* Now process all categories we are interested in. */
+ for (cnt = 0; cnt < LC_ALL; ++cnt)
+ if ((category_mask & 1 << cnt) != 0)
+ {
+ result.__locales[cnt] = _nl_find_locale (locale_path, locale_path_len,
+ cnt, &newnames[cnt]);
+ if (result.__locales[cnt] == NULL)
+ return NULL;
+ }
+
+ /* We successfully loaded all required data. */
+ if (base == NULL)
+ {
+ /* Allocate new structure. */
+ result_ptr = (__locale_t) malloc (sizeof (struct __locale_t));
+ if (result_ptr == NULL)
+ return NULL;
+
+ *result_ptr = result;
+ }
+ else
+ *(result_ptr = base) = result;
+
+ /* Update the special members. */
+ update:
+ {
+ union locale_data_value *ctypes = result_ptr->__locales[LC_CTYPE]->values;
+ result_ptr->__ctype_b = (const unsigned short int *)
+ (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_CLASS)] .string);
+#if BYTE_ORDER == BIG_ENDIAN
+ result_ptr->__ctype_tolower = (const int *)
+ (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER_EB)].string);
+ result_ptr->__ctype_toupper = (const int *)
+ (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER_EB)].string);
+#elif BYTE_ORDER == LITTLE_ENDIAN
+ result_ptr->__ctype_tolower = (const int *)
+ (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER_EL)].string);
+ result_ptr->__ctype_toupper = (const int *)
+ (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER_EL)].string);
+#else
+#error bizarre byte order
+#endif
+ }
+
+ return result_ptr;
+}
diff --git a/locale/nl_langinfo.c b/locale/nl_langinfo.c
index 1c42e14a4a..df2b3e9fb9 100644
--- a/locale/nl_langinfo.c
+++ b/locale/nl_langinfo.c
@@ -1,21 +1,21 @@
-/* nl_langinfo -- User interface for extracting locale-dependent parameters.
-Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* User interface for extracting locale-dependent parameters.
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <langinfo.h>
#include <errno.h>
@@ -26,7 +26,7 @@ Cambridge, MA 02139, USA. */
the references here are not weak references, this guarantees that the
data for all the categories will be linked in. */
-static const struct locale_data * *const nldata[] =
+static struct locale_data * *const nldata[] =
{
#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
[category] = &_nl_current_##category,
diff --git a/locale/programs/charmap-kw.gperf b/locale/programs/charmap-kw.gperf
index 8e00103882..1fb9c38b04 100644
--- a/locale/programs/charmap-kw.gperf
+++ b/locale/programs/charmap-kw.gperf
@@ -1,22 +1,22 @@
%{
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <string.h>
diff --git a/locale/programs/charmap-kw.h b/locale/programs/charmap-kw.h
index 93326d0382..3bfcd14612 100644
--- a/locale/programs/charmap-kw.h
+++ b/locale/programs/charmap-kw.h
@@ -1,23 +1,23 @@
/* C code produced by gperf version 2.5 (GNU C++ version) */
/* Command-line: gperf -acCgopt -k1,2,5,$ -N charmap_hash programs/charmap-kw.gperf */
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <string.h>
@@ -59,16 +59,16 @@ hash (register const char *str, register int len)
{
default:
case 5:
- hval += asso_values[(int) str[4]];
+ hval += asso_values[str[4]];
case 4:
case 3:
case 2:
- hval += asso_values[(int) str[1]];
+ hval += asso_values[str[1]];
case 1:
- hval += asso_values[(int) str[0]];
+ hval += asso_values[str[0]];
break;
}
- return hval + asso_values[(int) str[len - 1]];
+ return hval + asso_values[str[len - 1]];
}
#ifdef __GNUC__
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
index 6b4ebb4a60..37b6cdef96 100644
--- a/locale/programs/charmap.c
+++ b/locale/programs/charmap.c
@@ -72,7 +72,7 @@ charmap_read (const char *filename)
result = parse_charmap (pathnfile);
- if (result == NULL)
+ if (result == NULL && !be_quiet)
error (0, errno, _("character map file `%s' not found"), filename);
}
@@ -171,7 +171,7 @@ parse_charmap (const char *filename)
result->mb_cur_max = 1;
if (result->mb_cur_min == 0)
result->mb_cur_min = result->mb_cur_max;
- if (result->mb_cur_min > result->mb_cur_max)
+ if (result->mb_cur_min > result->mb_cur_max && !be_quiet)
{
error (0, 0, _("\
%s: <mb_cur_max> must be greater than <mb_cur_min>\n"),
@@ -596,7 +596,7 @@ only WIDTH definitions are allowed to follow the CHARMAP definition"));
break;
}
- if (state != 91)
+ if (state != 91 && !be_quiet)
error (0, 0, _("%s: premature end of file"), cmfile->fname);
lr_close (cmfile);
diff --git a/locale/programs/charset.c b/locale/programs/charset.c
index a7f988d3a5..00233abf8f 100644
--- a/locale/programs/charset.c
+++ b/locale/programs/charset.c
@@ -1,21 +1,21 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
diff --git a/locale/programs/charset.h b/locale/programs/charset.h
index eccce9102f..82c4ef0c57 100644
--- a/locale/programs/charset.h
+++ b/locale/programs/charset.h
@@ -1,6 +1,6 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
@@ -56,6 +56,9 @@ struct charset_t
#define ILLEGAL_CHAR_VALUE ((wchar_t) 0xffffffffu)
+/* Declared in localedef.c. */
+extern int be_quiet;
+
/* Prototypes for charmap handling functions. */
struct charset_t *charmap_read (const char *filename);
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
index d4b0f2b903..3a8c17a303 100644
--- a/locale/programs/ld-collate.c
+++ b/locale/programs/ld-collate.c
@@ -239,7 +239,7 @@ collate_finish (struct localedef_t *locale, struct charset_t *charset)
else
value = 0;
- if (value == 0)
+ if (value == 0 && !be_quiet)
error_at_line (0, 0, patch->fname, patch->lineno,
_("no weight defined for symbol `%s'"), patch->token);
else
@@ -256,7 +256,8 @@ collate_finish (struct localedef_t *locale, struct charset_t *charset)
\**************************************************************/
u_int32_t weight;
- error (0, 0, _("no definition of `UNDEFINED'"));
+ if (!be_quiet)
+ error (0, 0, _("no definition of `UNDEFINED'"));
collate->undefined.ordering_len = collate->nrules;
weight = ++collate->order_cnt;
@@ -324,9 +325,10 @@ collate_output (struct localedef_t *locale, struct charset_t *charset,
level_best = 0xffff;
/* Compute table size. */
- fputs (_("\
+ if (!be_quiet)
+ fputs (_("\
Computing table size for collation information might take a while..."),
- stderr);
+ stderr);
for (table_size = 256; table_size < sum_best; ++table_size)
{
size_t hits[table_size];
@@ -357,7 +359,8 @@ Computing table size for collation information might take a while..."),
}
}
assert (table_best != 0xffff || level_best != 0xffff);
- fputs (_(" done\n"), stderr);
+ if (!be_quiet)
+ fputs (_(" done\n"), stderr);
obstack_init (&non_simple);
obstack_init (&string_pool);
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
index fb352e53ed..5f1bc48f89 100644
--- a/locale/programs/ld-ctype.c
+++ b/locale/programs/ld-ctype.c
@@ -1,21 +1,21 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -262,10 +262,11 @@ ctype_finish (struct localedef_t *locale, struct charset_t *charset)
cp += sprintf (cp, "\\%o", (value >> 8) & 0xff);
sprintf (cp, "\\%o", value & 0xff);
- error (0, 0, _("\
+ if (!be_quiet)
+ error (0, 0, _("\
character %s'%s' in class `%s' must be in class `%s'"), value > 256 ? "L" : "",
- cp, valid_table[cls1].name,
- valid_table[cls2].name);
+ cp, valid_table[cls1].name,
+ valid_table[cls2].name);
}
break;
@@ -286,10 +287,12 @@ character %s'%s' in class `%s' must be in class `%s'"), value > 256 ? "L" : "",
cp += sprintf (cp, "\\%o", (value >> 8) & 0xff);
sprintf (cp, "\\%o", value & 0xff);
- error (0, 0, _("\
+ if (!be_quiet)
+ error (0, 0, _("\
character %s'%s' in class `%s' must not be in class `%s'"),
- value > 256 ? "L" : "", cp,
- valid_table[cls1].name, valid_table[cls2].name);
+ value > 256 ? "L" : "", cp,
+ valid_table[cls1].name,
+ valid_table[cls2].name);
}
break;
@@ -306,23 +309,25 @@ character %s'%s' in class `%s' must not be in class `%s'"),
/* ... and now test <SP> as a special case. */
space_value = charset_find_value (charset, "SP", 2);
- if ((wchar_t) space_value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) space_value == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("character <SP> not defined in character map"));
- else if ((cnt = BITPOS (tok_space),
- (ELEM (ctype, class_collection, , space_value)
- & BIT (tok_space)) == 0)
- || (cnt = BITPOS (tok_blank),
- (ELEM (ctype, class_collection, , space_value)
- & BIT (tok_blank)) == 0))
+ else if (((cnt = BITPOS (tok_space),
+ (ELEM (ctype, class_collection, , space_value)
+ & BIT (tok_space)) == 0)
+ || (cnt = BITPOS (tok_blank),
+ (ELEM (ctype, class_collection, , space_value)
+ & BIT (tok_blank)) == 0))
+ && !be_quiet)
error (0, 0, _("<SP> character not in class `%s'"),
valid_table[cnt].name);
- else if ((cnt = BITPOS (tok_punct),
- (ELEM (ctype, class_collection, , space_value)
- & BIT (tok_punct)) != 0)
- || (cnt = BITPOS (tok_graph),
- (ELEM (ctype, class_collection, , space_value)
- & BIT (tok_graph))
- != 0))
+ else if (((cnt = BITPOS (tok_punct),
+ (ELEM (ctype, class_collection, , space_value)
+ & BIT (tok_punct)) != 0)
+ || (cnt = BITPOS (tok_graph),
+ (ELEM (ctype, class_collection, , space_value)
+ & BIT (tok_graph))
+ != 0))
+ && !be_quiet)
error (0, 0, _("<SP> character must not be in class `%s'"),
valid_table[cnt].name);
else
@@ -934,7 +939,7 @@ set_class_defaults (struct locale_ctype_t *ctype, struct charset_t *charset)
tmp[0] = ch;
value = charset_find_value (charset, tmp, 1);
- if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
{
error (0, 0, _("\
character `%s' not defined while needed as default value"),
@@ -998,7 +1003,7 @@ character `%s' not defined while needed as default value"),
unsigned int value;
value = charset_find_value (charset, "space", 5);
- if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("\
character `%s' not defined while needed as default value"),
"<space>");
@@ -1006,7 +1011,7 @@ character `%s' not defined while needed as default value"),
ELEM (ctype, class_collection, , value) |= BIT (tok_space);
value = charset_find_value (charset, "form-feed", 9);
- if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("\
character `%s' not defined while needed as default value"),
"<form-feed>");
@@ -1014,7 +1019,7 @@ character `%s' not defined while needed as default value"),
ELEM (ctype, class_collection, , value) |= BIT (tok_space);
value = charset_find_value (charset, "newline", 7);
- if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("\
character `%s' not defined while needed as default value"),
"<newline>");
@@ -1022,7 +1027,7 @@ character `%s' not defined while needed as default value"),
ELEM (ctype, class_collection, , value) |= BIT (tok_space);
value = charset_find_value (charset, "carriage-return", 15);
- if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("\
character `%s' not defined while needed as default value"),
"<carriage-return>");
@@ -1030,7 +1035,7 @@ character `%s' not defined while needed as default value"),
ELEM (ctype, class_collection, , value) |= BIT (tok_space);
value = charset_find_value (charset, "tab", 3);
- if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("\
character `%s' not defined while needed as default value"),
"<tab>");
@@ -1038,7 +1043,7 @@ character `%s' not defined while needed as default value"),
ELEM (ctype, class_collection, , value) |= BIT (tok_space);
value = charset_find_value (charset, "vertical-tab", 12);
- if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("\
character `%s' not defined while needed as default value"),
"<vertical-tab>");
@@ -1064,7 +1069,7 @@ character `%s' not defined while needed as default value"),
unsigned int value;
value = charset_find_value (charset, "space", 5);
- if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("\
character `%s' not defined while needed as default value"),
"<space>");
@@ -1072,7 +1077,7 @@ character `%s' not defined while needed as default value"),
ELEM (ctype, class_collection, , value) |= BIT (tok_blank);
value = charset_find_value (charset, "tab", 3);
- if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("\
character `%s' not defined while needed as default value"),
"<tab>");
@@ -1110,7 +1115,7 @@ character `%s' not defined while needed as default value"),
ctype->class_collection[cnt] |= BIT (tok_print);
space = charset_find_value (charset, "space", 5);
- if (space == ILLEGAL_CHAR_VALUE)
+ if (space == ILLEGAL_CHAR_VALUE && !be_quiet)
error (0, 0, _("\
character `%s' not defined while needed as default value"),
"<space>");
@@ -1136,7 +1141,7 @@ character `%s' not defined while needed as default value"),
tmp[1] = (char) ch;
value_from = charset_find_value (charset, &tmp[1], 1);
- if ((wchar_t) value_from == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value_from == ILLEGAL_CHAR_VALUE && !be_quiet)
{
error (0, 0, _("\
character `%s' not defined while needed as default value"),
@@ -1147,7 +1152,7 @@ character `%s' not defined while needed as default value"),
/* This conversion is implementation defined. */
tmp[1] = (char) (ch + ('A' - 'a'));
value_to = charset_find_value (charset, &tmp[1], 1);
- if ((wchar_t) value_to == ILLEGAL_CHAR_VALUE)
+ if ((wchar_t) value_to == ILLEGAL_CHAR_VALUE && !be_quiet)
{
error (0, 0, _("\
character `%s' not defined while needed as default value"),
@@ -1195,9 +1200,10 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charset_t *charset)
size_t min_total = UINT_MAX;
size_t act_size = 256;
- fputs (_("\
+ if (!be_quiet)
+ fputs (_("\
Computing table size for character classes might take a while..."),
- stderr);
+ stderr);
while (act_size < min_total)
{
@@ -1232,7 +1238,8 @@ Computing table size for character classes might take a while..."),
++act_size;
}
- fprintf (stderr, _(" done\n"));
+ if (!be_quiet)
+ fputs (_(" done\n"), stderr);
#if __BYTE_ORDER == __LITTLE_ENDIAN
diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c
index ede616768d..31edb47a60 100644
--- a/locale/programs/ld-messages.c
+++ b/locale/programs/ld-messages.c
@@ -1,21 +1,21 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -77,7 +77,7 @@ messages_finish (struct localedef_t *locale)
= locale->categories[LC_MESSAGES].messages;
/* The fields YESSTR and NOSTR are optional. */
- if (messages->yesexpr == NULL)
+ if (messages->yesexpr == NULL && !be_quiet)
error (0, 0, _("field `%s' in category `%s' undefined"),
"yesexpr", "LC_MESSAGES");
else
@@ -87,7 +87,7 @@ messages_finish (struct localedef_t *locale)
/* Test whether it are correct regular expressions. */
result = regcomp (&re, messages->yesexpr, REG_EXTENDED);
- if (result != 0)
+ if (result != 0 && !be_quiet)
{
char errbuf[BUFSIZ];
@@ -98,7 +98,7 @@ no correct regular expression for field `%s' in category `%s': %s"),
}
}
- if (messages->noexpr == NULL)
+ if (messages->noexpr == NULL && !be_quiet)
error (0, 0, _("field `%s' in category `%s' undefined"),
"noexpr", "LC_MESSAGES");
else
@@ -108,7 +108,7 @@ no correct regular expression for field `%s' in category `%s': %s"),
/* Test whether it are correct regular expressions. */
result = regcomp (&re, messages->noexpr, REG_EXTENDED);
- if (result != 0)
+ if (result != 0 && !be_quiet)
{
char errbuf[BUFSIZ];
diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c
index 5efa969baa..ce83b18dba 100644
--- a/locale/programs/ld-monetary.c
+++ b/locale/programs/ld-monetary.c
@@ -1,21 +1,21 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -115,7 +115,7 @@ monetary_finish (struct localedef_t *locale)
= locale->categories[LC_MONETARY].monetary;
#define TEST_ELEM(cat) \
- if (monetary->cat == NULL) \
+ if (monetary->cat == NULL && !be_quiet) \
error (0, 0, _("field `%s' in category `%s' not defined"), \
#cat, "LC_MONETARY")
@@ -129,12 +129,13 @@ monetary_finish (struct localedef_t *locale)
/* The international currency symbol must come from ISO 4217. */
if (monetary->int_curr_symbol != NULL)
{
- if (strlen (monetary->int_curr_symbol) != 4)
+ if (strlen (monetary->int_curr_symbol) != 4 && !be_quiet)
error (0, 0, _("\
value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length"));
else if (bsearch (monetary->int_curr_symbol, valid_int_curr,
NR_VALID_INT_CURR, sizeof (const char *),
- (comparison_fn_t) curr_strcmp) == NULL)
+ (comparison_fn_t) curr_strcmp) == NULL
+ && !be_quiet)
error (0, 0, _("\
value of field `int_curr_symbol' in category `LC_MONETARY' does \
not correspond to a valid name in ISO 4217"));
@@ -143,23 +144,23 @@ not correspond to a valid name in ISO 4217"));
/* The decimal point must not be empty. This is not said explicitly
in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be
!= "". */
- if (monetary->mon_decimal_point[0] == '\0')
+ if (monetary->mon_decimal_point[0] == '\0' && !be_quiet)
{
error (0, 0, _("\
value for field `%s' in category `%s' must not be the empty string"),
"mon_decimal_point", "LC_MONETARY");
}
- if (monetary->mon_grouping_act == 0)
+ if (monetary->mon_grouping_act == 0 && !be_quiet)
error (0, 0, _("field `%s' in category `%s' not defined"),
"mon_grouping", "LC_MONETARY");
#undef TEST_ELEM
#define TEST_ELEM(cat, min, max) \
- if (monetary->cat == -2) \
+ if (monetary->cat == -2 && !be_quiet) \
error (0, 0, _("field `%s' in category `%s' not defined"), \
#cat, "LC_MONETARY"); \
- else if (monetary->cat < min || monetary->cat > max) \
+ else if ((monetary->cat < min || monetary->cat > max) && !be_quiet) \
error (0, 0, _("\
value for field `%s' in category `%s' must be in range %d...%d"), \
#cat, "LC_MONETARY", min, max)
diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c
index 69ea7e0b3e..375635aafc 100644
--- a/locale/programs/ld-numeric.c
+++ b/locale/programs/ld-numeric.c
@@ -1,6 +1,6 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
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
@@ -74,7 +74,7 @@ numeric_finish (struct localedef_t *locale)
struct locale_numeric_t *numeric = locale->categories[LC_NUMERIC].numeric;
#define TEST_ELEM(cat) \
- if (numeric->cat == NULL) \
+ if (numeric->cat == NULL && !be_quiet) \
error (0, 0, _("field `%s' in category `%s' not defined"), \
#cat, "LC_NUMERIC")
@@ -84,14 +84,14 @@ numeric_finish (struct localedef_t *locale)
/* The decimal point must not be empty. This is not said explicitly
in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be
!= "". */
- if (numeric->decimal_point[0] == '\0')
+ if (numeric->decimal_point[0] == '\0' && !be_quiet)
{
error (0, 0, _("\
value for field `%s' in category `%s' must not be the empty string"),
"decimal_point", "LC_NUMERIC");
}
- if (numeric->grouping_act == 0)
+ if (numeric->grouping_act == 0 && !be_quiet)
error (0, 0, _("field `%s' in category `%s' not defined"),
"grouping", "LC_NUMERIC");
}
diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c
index cc571b8a04..b977763433 100644
--- a/locale/programs/ld-time.c
+++ b/locale/programs/ld-time.c
@@ -106,10 +106,10 @@ time_finish (struct localedef_t *locale)
struct locale_time_t *time = locale->categories[LC_TIME].time;
#define TESTARR_ELEM(cat, max) \
- if (time->cur_num_##cat == 0) \
+ if (time->cur_num_##cat == 0 && !be_quiet) \
error (0, 0, _("field `%s' in category `%s' not defined"), \
#cat, "LC_TIME"); \
- else if (time->cur_num_##cat != max) \
+ else if (time->cur_num_##cat != max && !be_quiet) \
error (0, 0, _("field `%s' in category `%s' has not enough values"), \
#cat, "LC_TIME")
@@ -120,7 +120,7 @@ time_finish (struct localedef_t *locale)
TESTARR_ELEM (am_pm, 2);
#define TEST_ELEM(cat) \
- if (time->cat == NULL) \
+ if (time->cat == NULL && !be_quiet) \
error (0, 0, _("field `%s' in category `%s' not defined"), \
#cat, "LC_TIME")
@@ -149,7 +149,7 @@ time_finish (struct localedef_t *locale)
memcpy (str, time->era[idx], era_len + 1);
/* First character must be + or - for the direction. */
- if (*str != '+' && *str != '-')
+ if (*str != '+' && *str != '-' && !be_quiet)
{
error (0, 0, _("direction flag in string %d in `era' field"
" in category `%s' is not '+' nor '-'"),
@@ -159,7 +159,7 @@ time_finish (struct localedef_t *locale)
}
else
time->era_entries[idx].direction = *str;
- if (*++str != ':')
+ if (*++str != ':' && !be_quiet)
{
error (0, 0, _("direction flag in string %d in `era' field"
" in category `%s' is not a single character"),
@@ -171,14 +171,14 @@ time_finish (struct localedef_t *locale)
/* Now the offset year. */
time->era_entries[idx].offset = strtol (str, &endp, 10);
- if (endp == str)
+ if (endp == str && !be_quiet)
{
error (0, 0, _("illegal number for offset in string %d in"
" `era' field in category `%s'"),
idx + 1, "LC_TIME");
(void) strsep (&str, ":");
}
- else if (*endp != ':')
+ else if (*endp != ':' && !be_quiet)
{
error (0, 0, _("garbage at end of offset value in string %d in"
" `era' field in category `%s'"),
@@ -224,7 +224,7 @@ time_finish (struct localedef_t *locale)
time->era_entries[idx].start_date[1] -= 1;
time->era_entries[idx].start_date[2] = strtol (str, &endp, 10);
- if (endp == str)
+ if (endp == str && !be_quiet)
{
invalid_start_date:
error (0, 0, _("illegal starting date in string %d in"
@@ -232,7 +232,7 @@ time_finish (struct localedef_t *locale)
idx + 1, "LC_TIME");
(void) strsep (&str, ":");
}
- else if (*endp != ':')
+ else if (*endp != ':' && !be_quiet)
{
garbage_start_date:
error (0, 0, _("garbage at end of starting date in string %d"
@@ -245,14 +245,15 @@ time_finish (struct localedef_t *locale)
str = endp + 1;
/* Check for valid value. */
- if (time->era_entries[idx].start_date[1] < 0
- || time->era_entries[idx].start_date[1] >= 12
- || time->era_entries[idx].start_date[2] < 0
- || (time->era_entries[idx].start_date[2]
- > days_per_month[time->era_entries[idx].start_date[1]])
- || (time->era_entries[idx].start_date[1] == 2
- && time->era_entries[idx].start_date[2] == 29
- && !__isleap (time->era_entries[idx].start_date[0])))
+ if ((time->era_entries[idx].start_date[1] < 0
+ || time->era_entries[idx].start_date[1] >= 12
+ || time->era_entries[idx].start_date[2] < 0
+ || (time->era_entries[idx].start_date[2]
+ > days_per_month[time->era_entries[idx].start_date[1]])
+ || (time->era_entries[idx].start_date[1] == 2
+ && time->era_entries[idx].start_date[2] == 29
+ && !__isleap (time->era_entries[idx].start_date[0])))
+ && !be_quiet)
error (0, 0, _("starting date is illegal in"
" string %d in `era' field in"
" category `%s'"),
@@ -296,7 +297,7 @@ time_finish (struct localedef_t *locale)
time->era_entries[idx].stop_date[1] -= 1;
time->era_entries[idx].stop_date[2] = strtol (str, &endp, 10);
- if (endp == str)
+ if (endp == str && !be_quiet)
{
invalid_stop_date:
error (0, 0, _("illegal stopping date in string %d in"
@@ -304,7 +305,7 @@ time_finish (struct localedef_t *locale)
idx + 1, "LC_TIME");
(void) strsep (&str, ":");
}
- else if (*endp != ':')
+ else if (*endp != ':' && !be_quiet)
{
garbage_stop_date:
error (0, 0, _("garbage at end of stopping date in string %d"
@@ -317,14 +318,15 @@ time_finish (struct localedef_t *locale)
str = endp + 1;
/* Check for valid value. */
- if (time->era_entries[idx].stop_date[1] < 0
- || time->era_entries[idx].stop_date[1] >= 12
- || time->era_entries[idx].stop_date[2] < 0
- || (time->era_entries[idx].stop_date[2]
- > days_per_month[time->era_entries[idx].stop_date[1]])
- || (time->era_entries[idx].stop_date[1] == 2
- && time->era_entries[idx].stop_date[2] == 29
- && !__isleap (time->era_entries[idx].stop_date[0])))
+ if ((time->era_entries[idx].stop_date[1] < 0
+ || time->era_entries[idx].stop_date[1] >= 12
+ || time->era_entries[idx].stop_date[2] < 0
+ || (time->era_entries[idx].stop_date[2]
+ > days_per_month[time->era_entries[idx].stop_date[1]])
+ || (time->era_entries[idx].stop_date[1] == 2
+ && time->era_entries[idx].stop_date[2] == 29
+ && !__isleap (time->era_entries[idx].stop_date[0])))
+ && !be_quiet)
error (0, 0, _("stopping date is illegal in"
" string %d in `era' field in"
" category `%s'"),
@@ -332,7 +334,7 @@ time_finish (struct localedef_t *locale)
}
}
- if (str == NULL || *str == '\0')
+ if ((str == NULL || *str == '\0') && !be_quiet)
{
error (0, 0, _("missing era name in string %d in `era' field"
" in category `%s'"), idx + 1, "LC_TIME");
@@ -343,7 +345,7 @@ time_finish (struct localedef_t *locale)
{
time->era_entries[idx].name = strsep (&str, ":");
- if (str == NULL || *str == '\0')
+ if ((str == NULL || *str == '\0') && !be_quiet)
{
error (0, 0, _("missing era format in string %d in `era'"
" field in category `%s'"),
diff --git a/locale/programs/linereader.h b/locale/programs/linereader.h
index bf5f1bccc9..6f81b81597 100644
--- a/locale/programs/linereader.h
+++ b/locale/programs/linereader.h
@@ -1,21 +1,21 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifndef _LINEREADER_H
#define _LINEREADER_H 1
diff --git a/locale/programs/locale-spec.c b/locale/programs/locale-spec.c
index c595524bbb..9c432e3ead 100644
--- a/locale/programs/locale-spec.c
+++ b/locale/programs/locale-spec.c
@@ -1,22 +1,22 @@
/* Handle special requests.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c
index 580816b37e..da01d4c974 100644
--- a/locale/programs/localedef.c
+++ b/locale/programs/localedef.c
@@ -70,6 +70,8 @@ int posix_conformance;
/* If not zero give a lot more messages. */
int verbose;
+/* If not zero suppress warnings and information messages. */
+int be_quiet;
/* Long options. */
@@ -81,6 +83,7 @@ static const struct option long_options[] =
{ "force", no_argument, NULL, 'c' },
{ "inputfile", required_argument, NULL, 'i' },
{ "posix", no_argument, &posix_conformance, 1 },
+ { "quiet", no_argument, NULL, 'q' },
{ "verbose", no_argument, &verbose, 1},
{ "version", no_argument, NULL, 'V' },
{ NULL, 0, NULL, 0 }
@@ -149,12 +152,18 @@ main (int argc, char *argv[])
input_file = optarg;
break;
+ case 'q':
+ be_quiet = 1;
+ verbose = 0;
+ break;
+
case 'u':
ucs_csn = optarg;
break;
- case 'v':
+ case 'v':
verbose = 1;
+ be_quiet = 0;
break;
case 'V':
@@ -397,6 +406,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
-h, --help display this help and exit\n\
-f, --charmap=FILE symbolic character names defined in FILE\n\
-i, --inputfile=FILE source definitions are found in FILE\n\
+ --quiet Suppress warnings and information messages\n\
-u, --code-set-name=NAME specify code set for mapping ISO 10646 elements\n\
-v, --verbose print more messages\n\
-V, --version output version information and exit\n\
diff --git a/locale/programs/locales.h b/locale/programs/locales.h
index 95e166e3ef..eab909e7c8 100644
--- a/locale/programs/locales.h
+++ b/locale/programs/locales.h
@@ -1,21 +1,21 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifndef _LOCALES_H
#define _LOCALES_H
diff --git a/locale/programs/locfile-kw.gperf b/locale/programs/locfile-kw.gperf
index 8af977116e..38150ad46b 100644
--- a/locale/programs/locfile-kw.gperf
+++ b/locale/programs/locfile-kw.gperf
@@ -1,22 +1,22 @@
%{
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <string.h>
diff --git a/locale/programs/locfile-kw.h b/locale/programs/locfile-kw.h
index fd3c834845..0fb0b5ca5f 100644
--- a/locale/programs/locfile-kw.h
+++ b/locale/programs/locfile-kw.h
@@ -1,23 +1,23 @@
/* C code produced by gperf version 2.5 (GNU C++ version) */
/* Command-line: gperf -acCgopt -k1,2,5,$ -N locfile_hash programs/locfile-kw.gperf */
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <string.h>
diff --git a/locale/programs/locfile-token.h b/locale/programs/locfile-token.h
index b07356aebd..6d1543c320 100644
--- a/locale/programs/locfile-token.h
+++ b/locale/programs/locfile-token.h
@@ -1,22 +1,21 @@
-
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifndef _TOKEN_H
#define _TOKEN_H
diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c
index 4717fe22bd..4ab04253b9 100644
--- a/locale/programs/locfile.c
+++ b/locale/programs/locfile.c
@@ -1,6 +1,6 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
@@ -981,7 +981,7 @@ write_locale_data (const char *output_path, const char *category,
save_err = errno;
}
- if (fd == -1)
+ if (fd == -1 && !be_quiet)
{
error (0, save_err, _("\
cannot open output file `%s' for category `%s'"),
@@ -1005,7 +1005,7 @@ cannot open output file `%s' for category `%s'"),
if (maxiov > 0)
step = MIN (maxiov, step);
- if (writev (fd, &vec[cnt], step) < 0)
+ if (writev (fd, &vec[cnt], step) < 0 && !be_quiet)
{
error (0, errno, _("failure while writing data for category `%s'"),
category);
diff --git a/locale/programs/locfile.h b/locale/programs/locfile.h
index 003082ca61..604e726e20 100644
--- a/locale/programs/locfile.h
+++ b/locale/programs/locfile.h
@@ -1,6 +1,6 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
@@ -53,6 +53,8 @@ struct localedef_t
size_t len[6];
};
+/* Declared in localedef.c. */
+extern int be_quiet;
/* Found in localedef.c. */
void def_to_process (const char *name, int category);
diff --git a/locale/programs/simple-hash.h b/locale/programs/simple-hash.h
index 3409c57cec..f26790b21b 100644
--- a/locale/programs/simple-hash.h
+++ b/locale/programs/simple-hash.h
@@ -1,19 +1,21 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifndef _SIMPLE_HASH_H
#define _SIMPLE_HASH_H
diff --git a/locale/programs/stringtrans.c b/locale/programs/stringtrans.c
index 4351eea397..34b107e295 100644
--- a/locale/programs/stringtrans.c
+++ b/locale/programs/stringtrans.c
@@ -1,21 +1,21 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
diff --git a/locale/programs/stringtrans.h b/locale/programs/stringtrans.h
index 3576ce445c..2237032f89 100644
--- a/locale/programs/stringtrans.h
+++ b/locale/programs/stringtrans.h
@@ -1,21 +1,21 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
-
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#ifndef _TRANSLATE_H
#define _TRANSLATE_H 1
diff --git a/locale/setlocale.c b/locale/setlocale.c
index 094664216e..368027f743 100644
--- a/locale/setlocale.c
+++ b/locale/setlocale.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <alloca.h>
#include <argz.h>
@@ -35,15 +35,15 @@ Boston, MA 02111-1307, USA. */
Both are weak references; if &_nl_current_CATEGORY is zero,
then nothing is using the locale data. */
#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
-extern const struct locale_data *_nl_current_##category; \
-extern const struct locale_data _nl_C_##category; \
+extern struct locale_data *_nl_current_##category; \
+extern struct locale_data _nl_C_##category; \
weak_extern (_nl_current_##category) weak_extern (_nl_C_##category)
#include "categories.def"
#undef DEFINE_CATEGORY
/* Array indexed by category of pointers to _nl_current_CATEGORY slots.
Elements are zero for categories whose data is never used. */
-static const struct locale_data * *const _nl_current[] =
+static struct locale_data * *const _nl_current[] =
{
#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
[category] = &_nl_current_##category,
@@ -53,7 +53,7 @@ static const struct locale_data * *const _nl_current[] =
/* Array indexed by category of pointers to _nl_C_CATEGORY slots.
Elements are zero for categories whose data is never used. */
-const struct locale_data *const _nl_C[] =
+struct locale_data *const _nl_C[] =
{
#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
[category] = &_nl_C_##category,
@@ -147,7 +147,7 @@ clever_copy (const char *string)
/* Construct a new composite name. */
static inline char *
-new_composite_name (int category, char *newnames[LC_ALL])
+new_composite_name (int category, const char *newnames[LC_ALL])
{
size_t last_len;
size_t cumlen = 0;
@@ -157,9 +157,9 @@ new_composite_name (int category, char *newnames[LC_ALL])
for (i = 0; i < LC_ALL; ++i)
{
- char *name = (category == LC_ALL ? newnames[i] :
- category == i ? newnames[0] :
- (char *) _nl_current_names[i]);
+ const char *name = (category == LC_ALL ? newnames[i] :
+ category == i ? newnames[0] :
+ _nl_current_names[i]);
last_len = strlen (name);
cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1;
if (i > 0 && same && strcmp (name, newnames[0]) != 0)
@@ -184,9 +184,9 @@ new_composite_name (int category, char *newnames[LC_ALL])
for (i = 0; i < LC_ALL; ++i)
{
/* Add "CATEGORY=NAME;" to the string. */
- char *name = (category == LC_ALL ? newnames[i] :
- category == i ? newnames[0] :
- (char *) _nl_current_names[i]);
+ const char *name = (category == LC_ALL ? newnames[i] :
+ category == i ? newnames[0] :
+ _nl_current_names[i]);
p = __stpcpy (p, _nl_category_names[i]);
*p++ = '=';
p = __stpcpy (p, name);
@@ -211,7 +211,7 @@ setname (int category, const char *name)
/* Put DATA in *_nl_current[CATEGORY]. */
static inline void
-setdata (int category, const struct locale_data *data)
+setdata (int category, struct locale_data *data)
{
if (_nl_current[category] != NULL)
{
@@ -264,8 +264,8 @@ setlocale (int category, const char *locale)
for the individual categories can be selected by using a
composite locale name. This is a semi-colon separated list
of entries of the form `CATEGORY=VALUE'. */
- char *newnames[LC_ALL];
- const struct locale_data *newdata[LC_ALL];
+ const char *newnames[LC_ALL];
+ struct locale_data *newdata[LC_ALL];
/* Set all name pointers to the argument name. */
for (category = 0; category < LC_ALL; ++category)
@@ -323,6 +323,11 @@ setlocale (int category, const char *locale)
if (newdata[category] == NULL)
break;
+
+ /* We must not simply free a global locale since we have
+ no control over the usage. So we mark it as
+ un-deletable. */
+ newdata[category]->usage_count = MAX_USAGE_COUNT;
}
else
{
@@ -356,8 +361,8 @@ setlocale (int category, const char *locale)
}
else
{
- const struct locale_data *newdata = NULL;
- char *newname = (char *) locale;
+ struct locale_data *newdata = NULL;
+ const char *newname = locale;
/* Protect global data. */
__libc_lock_lock (__libc_setlocale_lock);
@@ -366,9 +371,13 @@ setlocale (int category, const char *locale)
{
/* Only actually load the data if anything will use it. */
newdata = _nl_find_locale (locale_path, locale_path_len, category,
- (char **) &newname);
+ &newname);
if (newdata == NULL)
goto abort_single;
+
+ /* We must not simply free a global locale since we have no
+ control over the usage. So we mark it as un-deletable. */
+ newdata->usage_count = MAX_USAGE_COUNT;
}
/* Create new composite name. */
@@ -391,6 +400,6 @@ setlocale (int category, const char *locale)
/* Critical section left. */
__libc_lock_unlock (__libc_setlocale_lock);
- return newname;
+ return (char *) newname;
}
}
diff --git a/locale/strlen-hash.h b/locale/strlen-hash.h
index dba56dff21..2daeb03547 100644
--- a/locale/strlen-hash.h
+++ b/locale/strlen-hash.h
@@ -1,21 +1,21 @@
-/* strlen-hash - Implements hashing function for string with known length.
-Copyright (C) 1996 Free Software Foundation, Inc.
-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
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+/* Implements hashing function for string with known length.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <sys/types.h>
diff --git a/locale/weight.h b/locale/weight.h
index 424e493209..76e6537762 100644
--- a/locale/weight.h
+++ b/locale/weight.h
@@ -43,21 +43,42 @@ typedef struct weight_t
/* The following five macros grant access to the values in the
collate locale file that do not depend on byte order. */
-#define collate_nrules \
+#ifndef USE_IN_EXTENDED_LOCALE_MODEL
+# define collate_nrules \
(_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES))
-#define collate_hash_size \
+# define collate_hash_size \
(_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_HASH_SIZE))
-#define collate_hash_layers \
+# define collate_hash_layers \
(_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_HASH_LAYERS))
-#define collate_undefined \
+# define collate_undefined \
(_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_UNDEFINED))
-#define collate_rules \
+# define collate_rules \
((u_int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_RULES))
-
static __inline int get_weight (const STRING_TYPE **str, weight_t *result);
static __inline int
get_weight (const STRING_TYPE **str, weight_t *result)
+#else
+# define collate_nrules \
+ current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].word
+# define collate_hash_size \
+ current->values[_NL_ITEM_INDEX (_NL_COLLATE_HASH_SIZE)].word
+# define collate_hash_layers \
+ current->values[_NL_ITEM_INDEX (_NL_COLLATE_HASH_LAYERS)].word
+# define collate_undefined \
+ current->values[_NL_ITEM_INDEX (_NL_COLLATE_UNDEFINED)].word
+# define collate_rules \
+ ((u_int32_t *) current->values[_NL_ITEM_INDEX (_NL_COLLATE_RULES)].string)
+
+static __inline int get_weight (const STRING_TYPE **str, weight_t *result,
+ struct locale_data *current,
+ const u_int32_t *__collate_table,
+ const u_int32_t *__collate_extra);
+static __inline int
+get_weight (const STRING_TYPE **str, weight_t *result,
+ struct locale_data *current, const u_int32_t *__collate_table,
+ const u_int32_t *__collate_extra)
+#endif
{
unsigned int ch = *((USTRING_TYPE *) (*str))++;
size_t slot;
@@ -150,7 +171,17 @@ get_weight (const STRING_TYPE **str, weight_t *result)
the string at once. The following macro constructs a double linked
list of this information. It is a macro because we use `alloca'
and we use a double linked list because of the backward collation
- order. */
+ order.
+
+ We have this strange extra macro since the functions which use the
+ given locale (not the global one) canot use the global tables. */
+#ifndef USE_IN_EXTENDED_LOCALE_MODEL
+# define call_get_weight(strp, newp) get_weight ((strp), (newp))
+#else
+# define call_get_weight(strp, newp) \
+ get_weight ((strp), (newp), current, collate_table, collate_extra)
+#endif
+
#define get_string(str, forw, backw) \
do \
{ \
@@ -169,6 +200,6 @@ get_weight (const STRING_TYPE **str, weight_t *result)
newp->next = NULL; \
backw = newp; \
} \
- while (get_weight (&str, newp) == 0); \
+ while (call_get_weight (&str, newp) == 0); \
} \
while (0)
diff --git a/locale/xlocale.h b/locale/xlocale.h
new file mode 100644
index 0000000000..62b15953a6
--- /dev/null
+++ b/locale/xlocale.h
@@ -0,0 +1,38 @@
+/* Definition of locale datatype.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ 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
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef _XLOCALE_H
+#define _XLOCALE_H 1
+
+/* Structure for reentrant locale using functions. This is an
+ (almost) opaque type for the user level programs. The file and
+ this data structure is not standardized. Don't rely on it. It can
+ go away without warning. */
+typedef struct __locale_t
+{
+ struct locale_data *__locales[6]; /* XXX LC_ALL should be used here */
+
+ /* To increase the speed of this solution we add some special members. */
+ const unsigned short int *__ctype_b;
+ const int *__ctype_tolower;
+ const int *__ctype_toupper;
+} *__locale_t;
+
+#endif /* xlocale.h */