aboutsummaryrefslogtreecommitdiff
path: root/locale
diff options
context:
space:
mode:
Diffstat (limited to 'locale')
-rw-r--r--locale/Makefile3
-rw-r--r--locale/newlocale.c6
-rw-r--r--locale/xlocale.c55
3 files changed, 61 insertions, 3 deletions
diff --git a/locale/Makefile b/locale/Makefile
index aba8bcd94a..03ed1b66fa 100644
--- a/locale/Makefile
+++ b/locale/Makefile
@@ -40,7 +40,8 @@ routines = setlocale findlocale loadlocale localeconv nl_langinfo \
tests = tst-C-locale
categories = ctype messages monetary numeric time paper name \
address telephone measurement identification collate
-aux = $(categories:%=lc-%) $(categories:%=C-%) SYS_libc C_name
+aux = $(categories:%=lc-%) $(categories:%=C-%) SYS_libc C_name \
+ xlocale
others = localedef locale
#others-static = localedef locale
install-bin = localedef locale
diff --git a/locale/newlocale.c b/locale/newlocale.c
index 19e65e29f2..4a785d0c0f 100644
--- a/locale/newlocale.c
+++ b/locale/newlocale.c
@@ -163,10 +163,12 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
if (result_ptr == NULL)
return NULL;
- *result_ptr = result;
}
else
- *(result_ptr = base) = result;
+ /* We modify the base structure. */
+ result_ptr = base;
+
+ *result_ptr = result;
/* Update the special members. */
update:
diff --git a/locale/xlocale.c b/locale/xlocale.c
new file mode 100644
index 0000000000..dd1dbbf508
--- /dev/null
+++ b/locale/xlocale.c
@@ -0,0 +1,55 @@
+/* C locale object.
+ Copyright (C) 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; 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"
+
+#define DEFINE_CATEGORY(category, category_name, items, a) \
+extern struct locale_data _nl_C_##category;
+#include "categories.def"
+#undef DEFINE_CATEGORY
+
+/* Defined in locale/C-ctype.c. */
+extern const char _nl_C_LC_CTYPE_class[];
+extern const char _nl_C_LC_CTYPE_toupper[];
+extern const char _nl_C_LC_CTYPE_tolower[];
+
+
+struct __locale_struct _nl_C_locobj =
+ {
+ .__locales =
+ {
+ [LC_CTYPE] = &_nl_C_LC_CTYPE,
+ [LC_NUMERIC] = &_nl_C_LC_NUMERIC,
+ [LC_TIME] = &_nl_C_LC_TIME,
+ [LC_COLLATE] = &_nl_C_LC_COLLATE,
+ [LC_MONETARY] = &_nl_C_LC_MONETARY,
+ [LC_MESSAGES] = &_nl_C_LC_MESSAGES,
+ [LC_PAPER] = &_nl_C_LC_PAPER,
+ [LC_NAME] = &_nl_C_LC_NAME,
+ [LC_ADDRESS] = &_nl_C_LC_ADDRESS,
+ [LC_TELEPHONE] = &_nl_C_LC_TELEPHONE,
+ [LC_MEASUREMENT] = &_nl_C_LC_MEASUREMENT,
+ [LC_IDENTIFICATION] = &_nl_C_LC_IDENTIFICATION
+ },
+ .__ctype_b = (const unsigned short int *) _nl_C_LC_CTYPE_class + 128,
+ .__ctype_tolower = (const int *) _nl_C_LC_CTYPE_tolower + 128,
+ .__ctype_toupper = (const int *) _nl_C_LC_CTYPE_toupper + 128
+ };