diff options
Diffstat (limited to 'locale')
-rw-r--r-- | locale/Makefile | 3 | ||||
-rw-r--r-- | locale/newlocale.c | 6 | ||||
-rw-r--r-- | locale/xlocale.c | 55 |
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 + }; |