tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Alternative access for C locale
On Thu, May 09, 2013 at 10:27:15PM +0200, Joerg Sonnenberger wrote:
> The patch allows LC_GLOBAL_LOCALE for all locale functions, which is an
> extension over POSIX. LC_C_LOCALE can be easily implemented using
> newlocale() if necessary on platforms lacking it.
Cleaned up version that merges storage used by global default locale and
the C locale as much as possible.
Joerg
Index: common/lib/libc/stdlib/_strtol.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/common/lib/libc/stdlib/_strtol.h,v
retrieving revision 1.6
diff -u -p -r1.6 _strtol.h
--- common/lib/libc/stdlib/_strtol.h 26 Apr 2013 21:20:48 -0000 1.6
+++ common/lib/libc/stdlib/_strtol.h 7 May 2013 11:16:04 -0000
@@ -192,14 +192,14 @@ INT_FUNCNAME(_int_, _FUNCNAME, _l)(const
__INT
_FUNCNAME(const char *nptr, char **endptr, int base)
{
- return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
*_current_locale());
+ return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
+ LC_GLOBAL_LOCALE);
}
__INT
-INT_FUNCNAME(, _FUNCNAME, _l)(const char *nptr, char **endptr, int base,
locale_t loc)
+INT_FUNCNAME(, _FUNCNAME, _l)(const char *nptr, char **endptr, int base,
+ locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
}
#endif
Index: common/lib/libc/stdlib/_strtoul.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/common/lib/libc/stdlib/_strtoul.h,v
retrieving revision 1.6
diff -u -p -r1.6 _strtoul.h
--- common/lib/libc/stdlib/_strtoul.h 26 Apr 2013 21:20:48 -0000 1.6
+++ common/lib/libc/stdlib/_strtoul.h 7 May 2013 12:23:57 -0000
@@ -152,14 +152,14 @@ INT_FUNCNAME(_int_, _FUNCNAME, _l)(const
__UINT
_FUNCNAME(const char *nptr, char **endptr, int base)
{
- return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
*_current_locale());
+ return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
+ LC_GLOBAL_LOCALE);
}
__UINT
-INT_FUNCNAME(, _FUNCNAME, _l)(const char *nptr, char **endptr, int base,
locale_t loc)
+INT_FUNCNAME(, _FUNCNAME, _l)(const char *nptr, char **endptr, int base,
+ locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
}
#endif
Index: include/locale.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/include/locale.h,v
retrieving revision 1.21
diff -u -p -r1.21 locale.h
--- include/locale.h 30 Apr 2013 00:45:04 -0000 1.21
+++ include/locale.h 7 May 2013 12:53:38 -0000
@@ -85,10 +85,6 @@ typedef struct _locale *locale_t;
# endif
#endif
-#ifdef __SETLOCALE_SOURCE__
-#define _LC_GLOBAL_LOCALE ((locale_t)-1)
-#endif
-
__BEGIN_DECLS
struct lconv *localeconv(void);
char *setlocale(int, const char *) __RENAME(__setlocale50);
@@ -109,6 +105,16 @@ locale_t duplocale(locale_t);
void freelocale(locale_t);
struct lconv *localeconv_l(locale_t);
locale_t newlocale(int, const char *, locale_t);
+
+#ifndef _LIBC
+extern struct _locale _lc_global_locale;
+extern const struct _locale _lc_C_locale;
+#else
+extern __dso_protected struct _locale _lc_global_locale;
+extern __dso_protected const struct _locale _lc_C_locale;
+#endif
+#define LC_GLOBAL_LOCALE (&_lc_global_locale)
+#define LC_C_LOCALE ((locale_t)__UNCONST(&_lc_C_locale))
#endif
__END_DECLS
Index: lib/libc/gdtoa/strtod.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtod.c,v
retrieving revision 1.13
diff -u -p -r1.13 strtod.c
--- lib/libc/gdtoa/strtod.c 19 Apr 2013 10:41:53 -0000 1.13
+++ lib/libc/gdtoa/strtod.c 7 May 2013 11:13:01 -0000
@@ -1103,7 +1103,7 @@ _int_strtod_l(CONST char *s00, char **se
double
strtod(CONST char *s, char **sp)
{
- return _int_strtod_l(s, sp, *_current_locale());
+ return _int_strtod_l(s, sp, LC_GLOBAL_LOCALE);
}
#ifdef __weak_alias
@@ -1113,7 +1113,5 @@ __weak_alias(strtod_l, _strtod_l)
double
strtod_l(CONST char *s, char **sp, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return _int_strtod_l(s, sp, loc);
}
Index: lib/libc/gdtoa/strtof.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtof.c,v
retrieving revision 1.6
diff -u -p -r1.6 strtof.c
--- lib/libc/gdtoa/strtof.c 18 Apr 2013 21:54:11 -0000 1.6
+++ lib/libc/gdtoa/strtof.c 7 May 2013 11:13:03 -0000
@@ -96,13 +96,11 @@ _int_strtof_l(CONST char *s, char **sp,
float
strtof(CONST char *s, char **sp)
{
- return _int_strtof_l(s, sp, *_current_locale());
+ return _int_strtof_l(s, sp, LC_GLOBAL_LOCALE);
}
float
strtof_l(CONST char *s, char **sp, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return _int_strtof_l(s, sp, loc);
}
Index: lib/libc/gdtoa/strtof_vaxf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtof_vaxf.c,v
retrieving revision 1.7
diff -u -p -r1.7 strtof_vaxf.c
--- lib/libc/gdtoa/strtof_vaxf.c 18 Apr 2013 21:54:11 -0000 1.7
+++ lib/libc/gdtoa/strtof_vaxf.c 7 May 2013 11:13:05 -0000
@@ -83,13 +83,11 @@ _int_strtof_l(CONST char *s, char **sp,
float
strtof(CONST char *s, char **sp)
{
- return _int_strtof_l(s, sp, *_current_locale());
+ return _int_strtof_l(s, sp, LC_GLOBAL_LOCALE);
}
float
strtof_l(CONST char *s, char **sp, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return _int_strtof_l(s, sp, loc);
}
Index: lib/libc/gdtoa/strtold_subr.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gdtoa/strtold_subr.c,v
retrieving revision 1.2
diff -u -p -r1.2 strtold_subr.c
--- lib/libc/gdtoa/strtold_subr.c 18 Apr 2013 21:54:11 -0000 1.2
+++ lib/libc/gdtoa/strtold_subr.c 7 May 2013 11:13:07 -0000
@@ -53,13 +53,11 @@ _int_strtold_l(const char *nptr, char **
long double
strtold(CONST char *s, char **sp)
{
- return _int_strtold_l(s, sp, *_current_locale());
+ return _int_strtold_l(s, sp, LC_GLOBAL_LOCALE);
}
long double
strtold_l(CONST char *s, char **sp, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return _int_strtold_l(s, sp, loc);
}
Index: lib/libc/gen/isctype.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/gen/isctype.c,v
retrieving revision 1.23
diff -u -p -r1.23 isctype.c
--- lib/libc/gen/isctype.c 16 Apr 2013 11:29:13 -0000 1.23
+++ lib/libc/gen/isctype.c 7 May 2013 11:06:20 -0000
@@ -57,8 +57,6 @@ is##name(int c) \
int \
is##name ## _l(int c, locale_t loc) \
{ \
- if (loc == NULL) \
- loc = _C_locale; \
return (int)(((loc->cache->ctype_tab + 1)[c]) & (bit)); \
}
@@ -84,8 +82,6 @@ toupper(int c)
int
toupper_l(int c, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return (int)(((loc->cache->toupper_tab + 1)[c]));
}
@@ -98,8 +94,6 @@ tolower(int c)
int
tolower_l(int c, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return (int)(((loc->cache->tolower_tab + 1)[c]));
}
Index: lib/libc/locale/Makefile.inc
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/Makefile.inc,v
retrieving revision 1.62
diff -u -p -r1.62 Makefile.inc
--- lib/libc/locale/Makefile.inc 30 Apr 2013 00:45:05 -0000 1.62
+++ lib/libc/locale/Makefile.inc 10 May 2013 11:07:03 -0000
@@ -6,7 +6,7 @@
SRCS+= _def_messages.c _def_monetary.c _def_numeric.c _def_time.c \
setlocale.c __mb_cur_max.c \
- current_locale.c c_locale.c duplocale.c global_locale.c fix_grouping.c \
+ duplocale.c global_locale.c fix_grouping.c \
freelocale.c localeconv.c newlocale.c nl_langinfo.c \
generic_lc_all.c dummy_lc_collate.c \
wcstol.c wcstoll.c wcstoimax.c wcstoul.c wcstoull.c wcstoumax.c \
Index: lib/libc/locale/_wcstod.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/_wcstod.h,v
retrieving revision 1.3
diff -u -p -r1.3 _wcstod.h
--- lib/libc/locale/_wcstod.h 18 Apr 2013 22:23:17 -0000 1.3
+++ lib/libc/locale/_wcstod.h 7 May 2013 11:13:09 -0000
@@ -134,15 +134,13 @@ _RETURN_TYPE
INT_NAME(, _FUNCNAME, )(const wchar_t * __restrict nptr,
wchar_t ** __restrict endptr)
{
- return INT_NAME(_int_, _FUNCNAME, _l)(nptr, endptr, *_current_locale());
+ return INT_NAME(_int_, _FUNCNAME, _l)(nptr, endptr, LC_GLOBAL_LOCALE);
}
_RETURN_TYPE
INT_NAME(, _FUNCNAME, _l)(const wchar_t * __restrict nptr,
wchar_t ** __restrict endptr, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return INT_NAME(_int_, _FUNCNAME, _l)(nptr, endptr, loc);
}
#endif /*__WCSTOD_H_*/
Index: lib/libc/locale/_wcstol.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/_wcstol.h,v
retrieving revision 1.5
diff -u -p -r1.5 _wcstol.h
--- lib/libc/locale/_wcstol.h 16 Apr 2013 16:52:13 -0000 1.5
+++ lib/libc/locale/_wcstol.h 7 May 2013 11:13:11 -0000
@@ -150,14 +150,12 @@ __INT
_FUNCNAME(const wchar_t *nptr, wchar_t **endptr, int base)
{
return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
- *_current_locale());
+ LC_GLOBAL_LOCALE);
}
__INT
INT_FUNCNAME(, _FUNCNAME, _l)(const wchar_t *nptr, wchar_t **endptr,
int base, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
}
Index: lib/libc/locale/_wcstoul.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/_wcstoul.h,v
retrieving revision 1.5
diff -u -p -r1.5 _wcstoul.h
--- lib/libc/locale/_wcstoul.h 16 Apr 2013 16:52:13 -0000 1.5
+++ lib/libc/locale/_wcstoul.h 7 May 2013 11:13:17 -0000
@@ -126,14 +126,12 @@ __UINT
_FUNCNAME(const wchar_t *nptr, wchar_t **endptr, int base)
{
return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base,
- *_current_locale());
+ LC_GLOBAL_LOCALE);
}
__UINT
INT_FUNCNAME(, _FUNCNAME, _l)(const wchar_t *nptr, wchar_t **endptr,
int base, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, loc);
}
Index: lib/libc/locale/c_locale.c
===================================================================
RCS file: lib/libc/locale/c_locale.c
diff -N lib/libc/locale/c_locale.c
--- lib/libc/locale/c_locale.c 21 Apr 2013 17:45:46 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,176 +0,0 @@
-/* $NetBSD: c_locale.c,v 1.2 2013/04/21 17:45:46 joerg Exp $ */
-
-/*-
- * Copyright (c)2008 Citrus Project,
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: c_locale.c,v 1.2 2013/04/21 17:45:46 joerg Exp $");
-
-#include <sys/types.h>
-#include <sys/ctype_bits.h>
-#include <sys/localedef.h>
-#include <langinfo.h>
-#include <limits.h>
-#define __SETLOCALE_SOURCE__
-#include <locale.h>
-#include <stdlib.h>
-
-#include "runetype_local.h"
-#include "setlocale_local.h"
-
-#ifndef NBCHAR_MAX
-#define NBCHAR_MAX (char)CHAR_MAX
-#endif
-
-static const struct lconv _C_ldata = {
- .decimal_point = __UNCONST("."),
- .thousands_sep = __UNCONST(""),
- .grouping = __UNCONST(""),
- .int_curr_symbol = __UNCONST(""),
- .currency_symbol = __UNCONST(""),
- .mon_decimal_point = __UNCONST(""),
- .mon_thousands_sep = __UNCONST(""),
- .mon_grouping = __UNCONST(""),
- .positive_sign = __UNCONST(""),
- .negative_sign = __UNCONST(""),
- .int_frac_digits = NBCHAR_MAX,
- .frac_digits = NBCHAR_MAX,
- .p_cs_precedes = NBCHAR_MAX,
- .p_sep_by_space = NBCHAR_MAX,
- .n_cs_precedes = NBCHAR_MAX,
- .n_sep_by_space = NBCHAR_MAX,
- .p_sign_posn = NBCHAR_MAX,
- .n_sign_posn = NBCHAR_MAX,
- .int_p_cs_precedes = NBCHAR_MAX,
- .int_n_cs_precedes = NBCHAR_MAX,
- .int_p_sep_by_space = NBCHAR_MAX,
- .int_n_sep_by_space = NBCHAR_MAX,
- .int_p_sign_posn = NBCHAR_MAX,
- .int_n_sign_posn = NBCHAR_MAX,
-};
-
-static const char *_C_items[(size_t)ALT_DIGITS + 1] = {
- [(size_t)D_T_FMT ] = "%a %b %e %H:%M:%S %Y",
- [(size_t)D_FMT ] = "%m/%d/%y",
- [(size_t)T_FMT ] = "%H:%M:%S",
- [(size_t)T_FMT_AMPM ] = "%I:%M:%S %p",
- [(size_t)AM_STR ] = "AM",
- [(size_t)PM_STR ] = "PM",
- [(size_t)DAY_1 ] = "Sun",
- [(size_t)DAY_2 ] = "Mon",
- [(size_t)DAY_3 ] = "Tue",
- [(size_t)DAY_4 ] = "Wed",
- [(size_t)DAY_5 ] = "Thu",
- [(size_t)DAY_6 ] = "Fri",
- [(size_t)DAY_7 ] = "Sat",
- [(size_t)ABDAY_1 ] = "Sunday",
- [(size_t)ABDAY_2 ] = "Monday",
- [(size_t)ABDAY_3 ] = "Tuesday",
- [(size_t)ABDAY_4 ] = "Wednesday",
- [(size_t)ABDAY_5 ] = "Thursday",
- [(size_t)ABDAY_6 ] = "Friday",
- [(size_t)ABDAY_7 ] = "Saturday",
- [(size_t)MON_1 ] = "Jan",
- [(size_t)MON_2 ] = "Feb",
- [(size_t)MON_3 ] = "Mar",
- [(size_t)MON_4 ] = "Apr",
- [(size_t)MON_5 ] = "May",
- [(size_t)MON_6 ] = "Jun",
- [(size_t)MON_7 ] = "Jul",
- [(size_t)MON_8 ] = "Aug",
- [(size_t)MON_9 ] = "Sep",
- [(size_t)MON_10 ] = "Oct",
- [(size_t)MON_11 ] = "Nov",
- [(size_t)MON_12 ] = "Dec",
- [(size_t)ABMON_1 ] = "January",
- [(size_t)ABMON_2 ] = "February",
- [(size_t)ABMON_3 ] = "March",
- [(size_t)ABMON_4 ] = "April",
- [(size_t)ABMON_5 ] = "May",
- [(size_t)ABMON_6 ] = "June",
- [(size_t)ABMON_7 ] = "July",
- [(size_t)ABMON_8 ] = "August",
- [(size_t)ABMON_9 ] = "September",
- [(size_t)ABMON_10 ] = "October",
- [(size_t)ABMON_11 ] = "November",
- [(size_t)ABMON_12 ] = "December",
- [(size_t)RADIXCHAR ] = ".",
- [(size_t)THOUSEP ] = "",
- [(size_t)YESSTR ] = "yes",
- [(size_t)YESEXPR ] = "^[Yy]",
- [(size_t)NOSTR ] = "no",
- [(size_t)NOEXPR ] = "^[Nn]",
- [(size_t)CRNCYSTR ] = NULL,
- [(size_t)CODESET ] = "646",
- [(size_t)ERA ] = NULL,
- [(size_t)ERA_D_FMT ] = NULL,
- [(size_t)ERA_D_T_FMT] = NULL,
- [(size_t)ERA_T_FMT ] = NULL,
- [(size_t)ALT_DIGITS ] = NULL,
-};
-
-static const struct _locale_cache_t _C_cache = {
- .ctype_tab = (const unsigned short *)&_C_ctype_tab_[0],
- .tolower_tab = (const short *)&_C_tolower_tab_[0],
- .toupper_tab = (const short *)&_C_toupper_tab_[0],
- .mb_cur_max = (size_t)1,
- .ldata = __UNCONST(&_C_ldata),
- .items = __UNCONST(&_C_items[0]),
-
-#ifdef __BUILD_LEGACY
- .compat_bsdctype = (const unsigned char *)&_C_compat_bsdctype[0],
-#endif
-};
-
-static const struct _locale __C_locale = {
- .cache = __UNCONST(&_C_cache),
- .query = { _C_LOCALE },
- .part_name = {
- [(size_t)LC_ALL ] = _C_LOCALE,
- [(size_t)LC_COLLATE ] = _C_LOCALE,
- [(size_t)LC_CTYPE ] = _C_LOCALE,
- [(size_t)LC_MONETARY] = _C_LOCALE,
- [(size_t)LC_NUMERIC ] = _C_LOCALE,
- [(size_t)LC_TIME ] = _C_LOCALE,
- [(size_t)LC_MESSAGES] = _C_LOCALE,
- },
- .part_impl = {
- [(size_t)LC_ALL ] = (_locale_part_t)NULL,
- [(size_t)LC_COLLATE ] = (_locale_part_t)NULL,
- [(size_t)LC_CTYPE ] = (_locale_part_t)
- __UNCONST(&_DefaultRuneLocale),
- [(size_t)LC_MONETARY] = (_locale_part_t)
- __UNCONST(&_DefaultMonetaryLocale),
- [(size_t)LC_NUMERIC ] = (_locale_part_t)
- __UNCONST(&_DefaultNumericLocale),
- [(size_t)LC_MESSAGES] = (_locale_part_t)
- __UNCONST(&_DefaultMessagesLocale),
- [(size_t)LC_TIME] = (_locale_part_t)
- __UNCONST(&_DefaultTimeLocale),
- },
-};
-
-__dso_hidden struct _locale *_C_locale = __UNCONST(&__C_locale);
Index: lib/libc/locale/current_locale.c
===================================================================
RCS file: lib/libc/locale/current_locale.c
diff -N lib/libc/locale/current_locale.c
--- lib/libc/locale/current_locale.c 14 Apr 2013 23:30:16 -0000 1.4
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,49 +0,0 @@
-/* $NetBSD: current_locale.c,v 1.4 2013/04/14 23:30:16 joerg Exp $ */
-
-/*-
- * Copyright (c)2008 Citrus Project,
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: current_locale.c,v 1.4 2013/04/14 23:30:16 joerg Exp $");
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <langinfo.h>
-#define __SETLOCALE_SOURCE__
-#include <locale.h>
-#include <stdlib.h>
-
-#include "setlocale_local.h"
-
-static struct _locale *__current_locale = &_global_locale;
-
-struct _locale **
-_current_locale(void)
-{
- return &__current_locale;
-}
Index: lib/libc/locale/freelocale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/freelocale.c,v
retrieving revision 1.1
diff -u -p -r1.1 freelocale.c
--- lib/libc/locale/freelocale.c 30 Apr 2013 00:45:05 -0000 1.1
+++ lib/libc/locale/freelocale.c 7 May 2013 10:59:36 -0000
@@ -44,8 +44,8 @@ void
freelocale(locale_t locale)
{
- _DIAGASSERT(locale != _LC_GLOBAL_LOCALE);
+ _DIAGASSERT(locale != LC_GLOBAL_LOCALE);
+ _DIAGASSERT(locale != LC_C_LOCALE);
_DIAGASSERT(locale != NULL);
- _DIAGASSERT(locale != &_global_locale);
free(locale);
}
Index: lib/libc/locale/global_locale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/global_locale.c,v
retrieving revision 1.16
diff -u -p -r1.16 global_locale.c
--- lib/libc/locale/global_locale.c 21 Apr 2013 17:45:46 -0000 1.16
+++ lib/libc/locale/global_locale.c 10 May 2013 11:31:19 -0000
@@ -47,7 +47,7 @@ __RCSID("$NetBSD: global_locale.c,v 1.16
#define NBCHAR_MAX (char)CHAR_MAX
#endif
-static struct lconv _global_ldata = {
+static const struct lconv _C_ldata = {
.decimal_point = __UNCONST("."),
.thousands_sep = __UNCONST(""),
.grouping = __UNCONST(""),
@@ -74,7 +74,7 @@ static struct lconv _global_ldata = {
.int_n_sign_posn = NBCHAR_MAX,
};
-static const char *_global_items[(size_t)ALT_DIGITS + 1] = {
+static const char * const _C_items [(size_t)ALT_DIGITS + 1] = {
[(size_t)D_T_FMT ] = "%a %b %e %H:%M:%S %Y",
[(size_t)D_FMT ] = "%m/%d/%y",
[(size_t)T_FMT ] = "%H:%M:%S",
@@ -139,15 +139,15 @@ static struct _locale_cache_t _global_ca
.tolower_tab = (const short *)&_C_tolower_tab_[0],
.toupper_tab = (const short *)&_C_toupper_tab_[0],
.mb_cur_max = (size_t)1,
- .ldata = &_global_ldata,
- .items = &_global_items[0],
+ .ldata = __UNCONST(&_C_ldata),
+ .items = __UNCONST(&_C_items[0]),
#ifdef __BUILD_LEGACY
.compat_bsdctype = (const unsigned char *)&_C_compat_bsdctype[0],
#endif
};
-struct _locale _global_locale = {
+__dso_protected struct _locale _lc_global_locale = {
.cache = &_global_cache,
.query = { _C_LOCALE },
.part_name = {
@@ -174,3 +174,44 @@ struct _locale _global_locale = {
__UNCONST(&_DefaultTimeLocale),
},
};
+
+static const struct _locale_cache_t _C_cache = {
+ .ctype_tab = (const unsigned short *)&_C_ctype_tab_[0],
+ .tolower_tab = (const short *)&_C_tolower_tab_[0],
+ .toupper_tab = (const short *)&_C_toupper_tab_[0],
+ .mb_cur_max = (size_t)1,
+ .ldata = __UNCONST(&_C_ldata),
+ .items = __UNCONST(&_C_items[0]),
+
+#ifdef __BUILD_LEGACY
+ .compat_bsdctype = (const unsigned char *)&_C_compat_bsdctype[0],
+#endif
+};
+
+__dso_protected const struct _locale _lc_C_locale = {
+ .cache = __UNCONST(&_C_cache),
+ .query = { _C_LOCALE },
+ .part_name = {
+ [(size_t)LC_ALL ] = _C_LOCALE,
+ [(size_t)LC_COLLATE ] = _C_LOCALE,
+ [(size_t)LC_CTYPE ] = _C_LOCALE,
+ [(size_t)LC_MONETARY] = _C_LOCALE,
+ [(size_t)LC_NUMERIC ] = _C_LOCALE,
+ [(size_t)LC_TIME ] = _C_LOCALE,
+ [(size_t)LC_MESSAGES] = _C_LOCALE,
+ },
+ .part_impl = {
+ [(size_t)LC_ALL ] = (_locale_part_t)NULL,
+ [(size_t)LC_COLLATE ] = (_locale_part_t)NULL,
+ [(size_t)LC_CTYPE ] = (_locale_part_t)
+ __UNCONST(&_DefaultRuneLocale),
+ [(size_t)LC_MONETARY] = (_locale_part_t)
+ __UNCONST(&_DefaultMonetaryLocale),
+ [(size_t)LC_NUMERIC ] = (_locale_part_t)
+ __UNCONST(&_DefaultNumericLocale),
+ [(size_t)LC_MESSAGES] = (_locale_part_t)
+ __UNCONST(&_DefaultMessagesLocale),
+ [(size_t)LC_TIME] = (_locale_part_t)
+ __UNCONST(&_DefaultTimeLocale),
+ },
+};
Index: lib/libc/locale/iswctype_mb.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/iswctype_mb.c,v
retrieving revision 1.12
diff -u -p -r1.12 iswctype_mb.c
--- lib/libc/locale/iswctype_mb.c 16 Apr 2013 11:39:13 -0000 1.12
+++ lib/libc/locale/iswctype_mb.c 7 May 2013 11:13:23 -0000
@@ -57,9 +57,6 @@ isw##name##_l(wint_t wc, locale_t loc)
_RuneLocale const *rl; \
_WCTypeEntry const *te; \
\
- if (loc == NULL) \
- loc = _C_locale; \
- \
rl = _RUNE_LOCALE(loc); \
te = &rl->rl_wctype[index]; \
return _iswctype_priv(rl, wc, te); \
@@ -67,7 +64,7 @@ isw##name##_l(wint_t wc, locale_t loc)
int \
isw##name(wint_t wc) \
{ \
- return isw##name##_l(wc, *_current_locale()); \
+ return isw##name##_l(wc, LC_GLOBAL_LOCALE); \
}
_ISWCTYPE_FUNC(alnum, _WCTYPE_INDEX_ALNUM)
@@ -90,9 +87,6 @@ tow##name##_l(wint_t wc, locale_t loc)
_RuneLocale const *rl; \
_WCTransEntry const *te; \
\
- if (loc == NULL) \
- loc = _C_locale; \
- \
rl = _RUNE_LOCALE(loc); \
te = &rl->rl_wctrans[index]; \
return _towctrans_priv(wc, te); \
@@ -100,7 +94,7 @@ tow##name##_l(wint_t wc, locale_t loc)
wint_t \
tow##name(wint_t wc) \
{ \
- return tow##name##_l(wc, *_current_locale()); \
+ return tow##name##_l(wc, LC_GLOBAL_LOCALE); \
}
_TOWCTRANS_FUNC(upper, _WCTRANS_INDEX_UPPER)
_TOWCTRANS_FUNC(lower, _WCTRANS_INDEX_LOWER)
@@ -111,9 +105,6 @@ wctype_l(const char *charclass, locale_t
_RuneLocale const *rl;
size_t i;
- if (loc == NULL)
- loc = _C_locale;
-
rl = _RUNE_LOCALE(loc);
for (i = 0; i < _WCTYPE_NINDEXES; ++i) {
if (!strcmp(rl->rl_wctype[i].te_name, charclass))
@@ -125,7 +116,7 @@ wctype_l(const char *charclass, locale_t
wctype_t
wctype(const char *charclass)
{
- return wctype_l(charclass, *_current_locale());
+ return wctype_l(charclass, LC_GLOBAL_LOCALE);
}
wctrans_t
@@ -134,9 +125,6 @@ wctrans_l(const char *charmap, locale_t
_RuneLocale const *rl;
size_t i;
- if (loc == NULL)
- loc = _C_locale;
-
rl = _RUNE_LOCALE(loc);
for (i = 0; i < _WCTRANS_NINDEXES; ++i) {
_DIAGASSERT(rl->rl_wctrans[i].te_name != NULL);
@@ -149,7 +137,7 @@ wctrans_l(const char *charmap, locale_t
wctrans_t
wctrans(const char *charmap)
{
- return wctrans_l(charmap, *_current_locale());
+ return wctrans_l(charmap, LC_GLOBAL_LOCALE);
}
int
@@ -163,9 +151,6 @@ iswctype_l(wint_t wc, wctype_t charclass
return 0;
}
- if (loc == NULL)
- loc = _C_locale;
-
rl = _RUNE_LOCALE(loc);
te = (_WCTypeEntry const *)(void *)charclass;
return _iswctype_priv(rl, wc, te);
@@ -174,7 +159,7 @@ iswctype_l(wint_t wc, wctype_t charclass
int
iswctype(wint_t wc, wctype_t charclass)
{
- return iswctype_l(wc, charclass, *_current_locale());
+ return iswctype_l(wc, charclass, LC_GLOBAL_LOCALE);
}
wint_t
@@ -209,9 +194,6 @@ wcwidth_l(wchar_t wc, locale_t loc)
if (wc == L'\0')
return 0;
- if (loc == NULL)
- loc = _C_locale;
-
rl = _RUNE_LOCALE(loc);
x = _runetype_priv(rl, wc);
if (x & _RUNETYPE_R)
@@ -222,7 +204,7 @@ wcwidth_l(wchar_t wc, locale_t loc)
int
wcwidth(wchar_t wc)
{
- return wcwidth_l(wc, *_current_locale());
+ return wcwidth_l(wc, LC_GLOBAL_LOCALE);
}
int
@@ -234,9 +216,6 @@ wcswidth_l(const wchar_t * __restrict ws
_DIAGASSERT(ws != NULL);
- if (loc == NULL)
- loc = _C_locale;
-
rl = _RUNE_LOCALE(loc);
width = 0;
while (wn > 0 && *ws != L'\0') {
@@ -252,5 +231,5 @@ wcswidth_l(const wchar_t * __restrict ws
int
wcswidth(const wchar_t * __restrict ws, size_t wn)
{
- return wcswidth_l(ws, wn, *_current_locale());
+ return wcswidth_l(ws, wn, LC_GLOBAL_LOCALE);
}
Index: lib/libc/locale/localeconv.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/localeconv.c,v
retrieving revision 1.20
diff -u -p -r1.20 localeconv.c
--- lib/libc/locale/localeconv.c 17 Apr 2013 20:40:13 -0000 1.20
+++ lib/libc/locale/localeconv.c 7 May 2013 11:08:46 -0000
@@ -47,7 +47,5 @@ localeconv(void)
struct lconv *
localeconv_l(locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return loc->cache->ldata;
}
Index: lib/libc/locale/multibyte_amd1.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/multibyte_amd1.c,v
retrieving revision 1.11
diff -u -p -r1.11 multibyte_amd1.c
--- lib/libc/locale/multibyte_amd1.c 19 Apr 2013 14:35:33 -0000 1.11
+++ lib/libc/locale/multibyte_amd1.c 7 May 2013 11:14:07 -0000
@@ -59,9 +59,6 @@ mbrlen_l(const char *s, size_t n, mbstat
size_t ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
err0 = _citrus_ctype_mbrlen(_ps_to_ctype(ps), s, n,
@@ -75,7 +72,7 @@ mbrlen_l(const char *s, size_t n, mbstat
size_t
mbrlen(const char *s, size_t n, mbstate_t *ps)
{
- return mbrlen_l(s, n, ps, *_current_locale());
+ return mbrlen_l(s, n, ps, LC_GLOBAL_LOCALE);
}
int
@@ -88,9 +85,6 @@ mbsinit_l(const mbstate_t *ps, locale_t
if (ps == NULL)
return 1;
- if (loc == NULL)
- loc = _C_locale;
-
if (_ps_to_runelocale(ps) == NULL)
rl = _RUNE_LOCALE(loc);
else
@@ -108,7 +102,7 @@ mbsinit_l(const mbstate_t *ps, locale_t
int
mbsinit(const mbstate_t *ps)
{
- return mbsinit_l(ps, *_current_locale());
+ return mbsinit_l(ps, LC_GLOBAL_LOCALE);
}
size_t
@@ -117,9 +111,6 @@ mbrtowc_l(wchar_t *pwc, const char *s, s
size_t ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
err0 = _citrus_ctype_mbrtowc(_ps_to_ctype(ps), pwc, s, n,
@@ -133,7 +124,7 @@ mbrtowc_l(wchar_t *pwc, const char *s, s
size_t
mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
{
- return mbrtowc_l(pwc, s, n, ps, *_current_locale());
+ return mbrtowc_l(pwc, s, n, ps, LC_GLOBAL_LOCALE);
}
size_t
@@ -143,9 +134,6 @@ mbsrtowcs_l(wchar_t *pwcs, const char **
size_t ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
err0 = _citrus_ctype_mbsrtowcs(_ps_to_ctype(ps), pwcs, s, n,
@@ -159,17 +147,37 @@ mbsrtowcs_l(wchar_t *pwcs, const char **
size_t
mbsrtowcs(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps)
{
- return mbsrtowcs_l(pwcs, s, n, ps, *_current_locale());
+ return mbsrtowcs_l(pwcs, s, n, ps, LC_GLOBAL_LOCALE);
}
size_t
-wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc)
+mbsnrtowcs_l(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps,
+ locale_t loc)
{
size_t ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
+ _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
+
+ err0 = _citrus_ctype_mbsnrtowcs(_ps_to_ctype(ps), pwcs, s, in, n,
+ _ps_to_private(ps), &ret);
+ if (err0)
+ errno = err0;
+
+ return ret;
+}
+
+size_t
+mbsnrtowcs(wchar_t *pwcs, const char **s, size_t in, size_t n, mbstate_t *ps)
+{
+ return mbsnrtowcs_l(pwcs, s, in, n, ps, LC_GLOBAL_LOCALE);
+}
+
+size_t
+wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc)
+{
+ size_t ret;
+ int err0;
_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
@@ -184,7 +192,7 @@ wcrtomb_l(char *s, wchar_t wc, mbstate_t
size_t
wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
{
- return wcrtomb_l(s, wc, ps, *_current_locale());
+ return wcrtomb_l(s, wc, ps, LC_GLOBAL_LOCALE);
}
size_t
@@ -194,9 +202,6 @@ wcsrtombs_l(char *s, const wchar_t **ppw
size_t ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
_fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
err0 = _citrus_ctype_wcsrtombs(_ps_to_ctype(ps), s, ppwcs, n,
@@ -210,7 +215,30 @@ wcsrtombs_l(char *s, const wchar_t **ppw
size_t
wcsrtombs(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps)
{
- return wcsrtombs_l(s, ppwcs, n, ps, *_current_locale());
+ return wcsrtombs_l(s, ppwcs, n, ps, LC_GLOBAL_LOCALE);
+}
+
+size_t
+wcsnrtombs_l(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t
*ps,
+ locale_t loc)
+{
+ size_t ret;
+ int err0;
+
+ _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
+
+ err0 = _citrus_ctype_wcsnrtombs(_ps_to_ctype(ps), s, ppwcs, in, n,
+ _ps_to_private(ps), &ret);
+ if (err0)
+ errno = err0;
+
+ return ret;
+}
+
+size_t
+wcsnrtombs(char *s, const wchar_t **ppwcs, size_t in, size_t n, mbstate_t *ps)
+{
+ return wcsnrtombs_l(s, ppwcs, in, n, ps, LC_GLOBAL_LOCALE);
}
wint_t
@@ -219,9 +247,6 @@ btowc_l(int c, locale_t loc)
wint_t ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
err0 = _citrus_ctype_btowc(_CITRUS_CTYPE(loc), c, &ret);
if (err0)
errno = err0;
@@ -232,7 +257,7 @@ btowc_l(int c, locale_t loc)
wint_t
btowc(int c)
{
- return btowc_l(c, *_current_locale());
+ return btowc_l(c, LC_GLOBAL_LOCALE);
}
int
@@ -241,9 +266,6 @@ wctob_l(wint_t wc, locale_t loc)
int ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
err0 = _citrus_ctype_wctob(_CITRUS_CTYPE(loc), wc, &ret);
if (err0)
errno = err0;
@@ -254,14 +276,12 @@ wctob_l(wint_t wc, locale_t loc)
int
wctob(wint_t wc)
{
- return wctob_l(wc, *_current_locale());
+ return wctob_l(wc, LC_GLOBAL_LOCALE);
}
size_t
_mb_cur_max_l(locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
return _citrus_ctype_get_mb_cur_max(_CITRUS_CTYPE(loc));
}
Index: lib/libc/locale/multibyte_c90.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/multibyte_c90.c,v
retrieving revision 1.9
diff -u -p -r1.9 multibyte_c90.c
--- lib/libc/locale/multibyte_c90.c 18 Apr 2013 22:22:21 -0000 1.9
+++ lib/libc/locale/multibyte_c90.c 7 May 2013 11:13:29 -0000
@@ -55,9 +55,6 @@ mblen_l(const char *s, size_t n, locale_
int ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
err0 = _citrus_ctype_mblen(_CITRUS_CTYPE(loc), s, n, &ret);
if (err0)
errno = err0;
@@ -69,7 +66,7 @@ mblen_l(const char *s, size_t n, locale_
int
mblen(const char *s, size_t n)
{
- return mblen_l(s, n, *_current_locale());
+ return mblen_l(s, n, LC_GLOBAL_LOCALE);
}
size_t
@@ -78,9 +75,6 @@ mbstowcs_l(wchar_t *pwcs, const char *s,
size_t ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
err0 = _citrus_ctype_mbstowcs(_CITRUS_CTYPE(loc), pwcs, s, n, &ret);
if (err0)
errno = err0;
@@ -91,7 +85,7 @@ mbstowcs_l(wchar_t *pwcs, const char *s,
size_t
mbstowcs(wchar_t *pwcs, const char *s, size_t n)
{
- return mbstowcs_l(pwcs, s, n, *_current_locale());
+ return mbstowcs_l(pwcs, s, n, LC_GLOBAL_LOCALE);
}
int
@@ -100,9 +94,6 @@ mbtowc_l(wchar_t *pw, const char *s, siz
int ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
err0 = _citrus_ctype_mbtowc(_CITRUS_CTYPE(loc), pw, s, n, &ret);
if (err0)
errno = err0;
@@ -113,7 +104,7 @@ mbtowc_l(wchar_t *pw, const char *s, siz
int
mbtowc(wchar_t *pw, const char *s, size_t n)
{
- return mbtowc_l(pw, s, n, *_current_locale());
+ return mbtowc_l(pw, s, n, LC_GLOBAL_LOCALE);
}
size_t
@@ -122,9 +113,6 @@ wcstombs_l(char *s, const wchar_t *wcs,
size_t ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
err0 = _citrus_ctype_wcstombs(_CITRUS_CTYPE(loc), s, wcs, n, &ret);
if (err0)
errno = err0;
@@ -135,7 +123,7 @@ wcstombs_l(char *s, const wchar_t *wcs,
size_t
wcstombs(char *s, const wchar_t *wcs, size_t n)
{
- return wcstombs_l(s, wcs, n, *_current_locale());
+ return wcstombs_l(s, wcs, n, LC_GLOBAL_LOCALE);
}
int
@@ -144,9 +132,6 @@ wctomb_l(char *s, wchar_t wc, locale_t l
int ret;
int err0;
- if (loc == NULL)
- loc = _C_locale;
-
err0 = _citrus_ctype_wctomb(_CITRUS_CTYPE(loc), s, wc, &ret);
if (err0)
errno = err0;
@@ -157,5 +142,5 @@ wctomb_l(char *s, wchar_t wc, locale_t l
int
wctomb(char *s, wchar_t wc)
{
- return wctomb_l(s, wc, *_current_locale());
+ return wctomb_l(s, wc, LC_GLOBAL_LOCALE);
}
Index: lib/libc/locale/nb_lc_template.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/nb_lc_template.h,v
retrieving revision 1.5
diff -u -p -r1.5 nb_lc_template.h
--- lib/libc/locale/nb_lc_template.h 14 Apr 2013 23:30:16 -0000 1.5
+++ lib/libc/locale/nb_lc_template.h 7 May 2013 11:02:28 -0000
@@ -236,7 +236,7 @@ _PREFIX(setlocale)(const char * __restri
locale->part_impl[(size_t)_CATEGORY_ID]
= part->impl;
_PREFIX(build_cache)(locale->cache, part->impl);
- if (locale == &_global_locale)
+ if (locale == LC_GLOBAL_LOCALE)
_PREFIX(fixup)(part->impl);
}
}
Index: lib/libc/locale/newlocale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/newlocale.c,v
retrieving revision 1.1
diff -u -p -r1.1 newlocale.c
--- lib/libc/locale/newlocale.c 30 Apr 2013 00:45:05 -0000 1.1
+++ lib/libc/locale/newlocale.c 7 May 2013 11:14:14 -0000
@@ -55,7 +55,7 @@ newlocale(int mask, const char *name, lo
if (dst == NULL)
return (locale_t)NULL;
if (src == NULL)
- src = *_current_locale();
+ src = LC_GLOBAL_LOCALE;
memcpy(dst, src, sizeof(*src));
strlcpy(&head[0], name, sizeof(head));
tokens[0] = (const char *)&head[0];
Index: lib/libc/locale/setlocale.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/setlocale.c,v
retrieving revision 1.62
diff -u -p -r1.62 setlocale.c
--- lib/libc/locale/setlocale.c 30 Apr 2013 00:45:05 -0000 1.62
+++ lib/libc/locale/setlocale.c 7 May 2013 11:14:18 -0000
@@ -101,7 +101,7 @@ __setlocale(int category, const char *na
sl = _find_category(category);
if (sl == NULL)
return NULL;
- impl = *_current_locale();
+ impl = LC_GLOBAL_LOCALE;
return __UNCONST((*sl)(name, impl));
}
Index: lib/libc/locale/setlocale_local.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/setlocale_local.h,v
retrieving revision 1.11
diff -u -p -r1.11 setlocale_local.h
--- lib/libc/locale/setlocale_local.h 14 Apr 2013 23:44:54 -0000 1.11
+++ lib/libc/locale/setlocale_local.h 7 May 2013 14:00:12 -0000
@@ -66,7 +66,6 @@ typedef const char *(*_locale_set_t)(con
__BEGIN_DECLS
_locale_set_t _find_category(int);
const char *_get_locale_env(const char *);
-struct _locale **_current_locale(void);
char *__setlocale(int, const char *);
const char *_generic_LC_ALL_setlocale(
@@ -85,14 +84,16 @@ const char *_citrus_LC_MESSAGES_setlocal
const char * __restrict, struct _locale * __restrict);
__END_DECLS
+#ifdef _LIBC
+extern __dso_protected struct _locale _lc_global_locale;
+
static __inline struct _locale_cache_t *
_current_cache(void)
{
- return (*_current_locale())->cache;
+ return _lc_global_locale.cache;
}
+#endif
-extern struct _locale _global_locale;
-extern __dso_hidden struct _locale *_C_locale;
extern size_t __mb_len_max_runtime;
#endif /*_SETLOCALE_LOCAL_H_*/
Index: lib/libc/locale/wcscoll.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/wcscoll.c,v
retrieving revision 1.3
diff -u -p -r1.3 wcscoll.c
--- lib/libc/locale/wcscoll.c 18 Apr 2013 23:24:27 -0000 1.3
+++ lib/libc/locale/wcscoll.c 7 May 2013 11:14:00 -0000
@@ -44,8 +44,6 @@ __RCSID("$NetBSD: wcscoll.c,v 1.3 2013/0
int
wcscoll_l(const wchar_t *s1, const wchar_t *s2, locale_t loc)
{
- if (loc == NULL)
- loc = _C_locale;
/* XXX: LC_COLLATE should be implemented. */
/* LINTED */ (void)loc;
return (wcscmp(s1, s2));
@@ -54,5 +52,5 @@ wcscoll_l(const wchar_t *s1, const wchar
int
wcscoll(const wchar_t *s1, const wchar_t *s2)
{
- return wcscoll_l(s1, s2, *_current_locale());
+ return wcscoll_l(s1, s2, LC_GLOBAL_LOCALE);
}
Index: lib/libc/locale/wcsxfrm.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/locale/wcsxfrm.c,v
retrieving revision 1.4
diff -u -p -r1.4 wcsxfrm.c
--- lib/libc/locale/wcsxfrm.c 18 Apr 2013 23:24:27 -0000 1.4
+++ lib/libc/locale/wcsxfrm.c 7 May 2013 11:14:02 -0000
@@ -46,8 +46,6 @@ wcsxfrm_l(wchar_t *s1, const wchar_t *s2
{
size_t len;
- if (loc == NULL)
- loc = _C_locale;
/* XXX: LC_COLLATE should be implemented. */
/* LINTED */(void)loc;
@@ -69,5 +67,5 @@ wcsxfrm_l(wchar_t *s1, const wchar_t *s2
size_t
wcsxfrm(wchar_t *s1, const wchar_t *s2, size_t n)
{
- return wcsxfrm_l(s1, s2, n, *_current_locale());
+ return wcsxfrm_l(s1, s2, n, LC_GLOBAL_LOCALE);
}
Index: lib/libc/stdio/vasprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vasprintf.c,v
retrieving revision 1.15
diff -u -p -r1.15 vasprintf.c
--- lib/libc/stdio/vasprintf.c 19 Apr 2013 15:22:25 -0000 1.15
+++ lib/libc/stdio/vasprintf.c 7 May 2013 11:14:24 -0000
@@ -88,7 +88,7 @@ err:
int
vasprintf(char **str, const char *fmt, va_list ap)
{
- return vasprintf_l(str, *_current_locale(), fmt, ap);
+ return vasprintf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
}
int
Index: lib/libc/stdio/vdprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vdprintf.c,v
retrieving revision 1.3
diff -u -p -r1.3 vdprintf.c
--- lib/libc/stdio/vdprintf.c 19 Apr 2013 15:22:25 -0000 1.3
+++ lib/libc/stdio/vdprintf.c 7 May 2013 11:14:26 -0000
@@ -121,5 +121,5 @@ vdprintf_l(int fd, locale_t loc, const c
int
vdprintf(int fd, const char * __restrict fmt, va_list ap)
{
- return vdprintf_l(fd, *_current_locale(), fmt, ap);
+ return vdprintf_l(fd, LC_GLOBAL_LOCALE, fmt, ap);
}
Index: lib/libc/stdio/vfscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vfscanf.c,v
retrieving revision 1.44
diff -u -p -r1.44 vfscanf.c
--- lib/libc/stdio/vfscanf.c 19 Apr 2013 23:32:17 -0000 1.44
+++ lib/libc/stdio/vfscanf.c 7 May 2013 11:14:28 -0000
@@ -132,7 +132,7 @@ __collate_range_cmp(int c1, int c2, loca
int
__svfscanf(FILE *fp, char const *fmt0, va_list ap)
{
- return __svfscanf_l(fp, *_current_locale(), fmt0, ap);
+ return __svfscanf_l(fp, LC_GLOBAL_LOCALE, fmt0, ap);
}
int
Index: lib/libc/stdio/vfwprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vfwprintf.c,v
retrieving revision 1.31
diff -u -p -r1.31 vfwprintf.c
--- lib/libc/stdio/vfwprintf.c 19 Apr 2013 15:22:25 -0000 1.31
+++ lib/libc/stdio/vfwprintf.c 7 May 2013 11:14:55 -0000
@@ -552,7 +552,7 @@ WDECL(vf,printf)(FILE * __restrict fp, c
int ret;
FLOCKFILE(fp);
- ret = WDECL(__vf,printf_unlocked_l)(fp, *_current_locale(), fmt0, ap);
+ ret = WDECL(__vf,printf_unlocked_l)(fp, LC_GLOBAL_LOCALE, fmt0, ap);
FUNLOCKFILE(fp);
return ret;
}
@@ -705,9 +705,6 @@ WDECL(__vf,printf_unlocked_l)(FILE *fp,
static const char xdigs_lower[16] = "0123456789abcdef";
static const char xdigs_upper[16] = "0123456789ABCDEF";
- if (loc == NULL)
- loc = _C_locale;
-
/*
* BEWARE, these `goto error' on error, PRINT uses `n2' and
* PAD uses `n'.
Index: lib/libc/stdio/vfwscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vfwscanf.c,v
retrieving revision 1.9
diff -u -p -r1.9 vfwscanf.c
--- lib/libc/stdio/vfwscanf.c 19 Apr 2013 23:32:17 -0000 1.9
+++ lib/libc/stdio/vfwscanf.c 7 May 2013 11:14:54 -0000
@@ -114,7 +114,7 @@ static int parsefloat(FILE *, wchar_t *,
int
vfwscanf(FILE * __restrict fp, const wchar_t * __restrict fmt, va_list ap)
{
- return vfwscanf_l(fp, *_current_locale(), fmt, ap);
+ return vfwscanf_l(fp, LC_GLOBAL_LOCALE, fmt, ap);
}
int
@@ -171,9 +171,6 @@ __vfwscanf_unlocked_l(FILE * __restrict
static short basefix[17] =
{ 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
- if (loc == NULL)
- loc = _C_locale;
-
nassigned = 0;
nconversions = 0;
nread = 0;
Index: lib/libc/stdio/vsnprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vsnprintf.c,v
retrieving revision 1.26
diff -u -p -r1.26 vsnprintf.c
--- lib/libc/stdio/vsnprintf.c 19 Apr 2013 15:22:25 -0000 1.26
+++ lib/libc/stdio/vsnprintf.c 7 May 2013 11:14:52 -0000
@@ -100,7 +100,7 @@ vsnprintf_l(char *str, size_t n, locale_
int
vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
{
- return vsnprintf_l(str, n, *_current_locale(), fmt, ap);
+ return vsnprintf_l(str, n, LC_GLOBAL_LOCALE, fmt, ap);
}
int
Index: lib/libc/stdio/vsprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vsprintf.c,v
retrieving revision 1.18
diff -u -p -r1.18 vsprintf.c
--- lib/libc/stdio/vsprintf.c 19 Apr 2013 15:22:25 -0000 1.18
+++ lib/libc/stdio/vsprintf.c 7 May 2013 11:14:51 -0000
@@ -83,7 +83,7 @@ vsprintf_l(char *str, locale_t loc, cons
int
vsprintf(char *str, const char *fmt, va_list ap)
{
- return vsprintf_l(str, *_current_locale(), fmt, ap);
+ return vsprintf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
}
int
Index: lib/libc/stdio/vsscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vsscanf.c,v
retrieving revision 1.20
diff -u -p -r1.20 vsscanf.c
--- lib/libc/stdio/vsscanf.c 19 Apr 2013 23:32:17 -0000 1.20
+++ lib/libc/stdio/vsscanf.c 7 May 2013 11:14:49 -0000
@@ -85,5 +85,5 @@ vsscanf_l(const char *str, locale_t loc,
int
vsscanf(const char *str, const char *fmt, va_list ap)
{
- return vsscanf_l(str, *_current_locale(), fmt, ap);
+ return vsscanf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
}
Index: lib/libc/stdio/vswprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vswprintf.c,v
retrieving revision 1.4
diff -u -p -r1.4 vswprintf.c
--- lib/libc/stdio/vswprintf.c 19 Apr 2013 15:22:25 -0000 1.4
+++ lib/libc/stdio/vswprintf.c 7 May 2013 11:14:48 -0000
@@ -109,5 +109,5 @@ int
vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt,
va_list ap)
{
- return vswprintf_l(s, n, *_current_locale(), fmt, ap);
+ return vswprintf_l(s, n, LC_GLOBAL_LOCALE, fmt, ap);
}
Index: lib/libc/stdio/vswscanf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/stdio/vswscanf.c,v
retrieving revision 1.11
diff -u -p -r1.11 vswscanf.c
--- lib/libc/stdio/vswscanf.c 22 Apr 2013 19:33:53 -0000 1.11
+++ lib/libc/stdio/vswscanf.c 7 May 2013 11:14:46 -0000
@@ -115,5 +115,5 @@ int
vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt,
va_list ap)
{
- return vswscanf_l(str, *_current_locale(), fmt, ap);
+ return vswscanf_l(str, LC_GLOBAL_LOCALE, fmt, ap);
}
Index: lib/libc/string/strcoll.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/strcoll.c,v
retrieving revision 1.11
diff -u -p -r1.11 strcoll.c
--- lib/libc/string/strcoll.c 19 Apr 2013 23:28:47 -0000 1.11
+++ lib/libc/string/strcoll.c 7 May 2013 11:14:44 -0000
@@ -57,7 +57,7 @@ int
strcoll(const char *s1, const char *s2)
{
- return strcoll_l(s1, s2, *_current_locale());
+ return strcoll_l(s1, s2, LC_GLOBAL_LOCALE);
}
int
@@ -66,9 +66,6 @@ strcoll_l(const char *s1, const char *s2
_DIAGASSERT(s1 != NULL);
_DIAGASSERT(s2 != NULL);
- if (loc == NULL)
- loc = _C_locale;
-
/* LC_COLLATE is unimplemented, hence always "C" */
/* LINTED */ (void)loc;
return (strcmp(s1, s2));
Index: lib/libc/string/strxfrm.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/strxfrm.c,v
retrieving revision 1.13
diff -u -p -r1.13 strxfrm.c
--- lib/libc/string/strxfrm.c 19 Apr 2013 23:28:47 -0000 1.13
+++ lib/libc/string/strxfrm.c 7 May 2013 11:14:42 -0000
@@ -62,8 +62,6 @@ strxfrm_l(char *dst, const char *src, si
_DIAGASSERT(src != NULL);
- if (loc == NULL)
- loc = _C_locale;
/* XXX: LC_COLLATE should be implemented. */
/* LINTED */(void)loc;
@@ -83,5 +81,5 @@ strxfrm_l(char *dst, const char *src, si
size_t
strxfrm(char *dst, const char *src, size_t n)
{
- return strxfrm_l(dst, src, n, *_current_locale());
+ return strxfrm_l(dst, src, n, LC_GLOBAL_LOCALE);
}
Index: lib/libc/string/wcscasecmp.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/wcscasecmp.c,v
retrieving revision 1.3
diff -u -p -r1.3 wcscasecmp.c
--- lib/libc/string/wcscasecmp.c 18 Apr 2013 23:24:27 -0000 1.3
+++ lib/libc/string/wcscasecmp.c 7 May 2013 11:14:40 -0000
@@ -33,9 +33,6 @@ wcscasecmp_l(const wchar_t *s1, const wc
int lc2 = 0;
int diff = 0;
- if (loc == NULL)
- loc = _C_locale;
-
_DIAGASSERT(s1);
_DIAGASSERT(s2);
@@ -58,5 +55,5 @@ wcscasecmp_l(const wchar_t *s1, const wc
int
wcscasecmp(const wchar_t *s1, const wchar_t *s2)
{
- return wcscasecmp_l(s1, s2, *_current_locale());
+ return wcscasecmp_l(s1, s2, LC_GLOBAL_LOCALE);
}
Index: lib/libc/string/wcsncasecmp.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/string/wcsncasecmp.c,v
retrieving revision 1.3
diff -u -p -r1.3 wcsncasecmp.c
--- lib/libc/string/wcsncasecmp.c 18 Apr 2013 23:24:27 -0000 1.3
+++ lib/libc/string/wcsncasecmp.c 7 May 2013 11:14:39 -0000
@@ -36,9 +36,6 @@ wcsncasecmp_l(const wchar_t *s1, const w
_DIAGASSERT(s1);
_DIAGASSERT(s2);
- if (loc == NULL)
- loc = _C_locale;
-
while (n--) {
lc1 = towlower_l(*s1, loc);
lc2 = towlower_l(*s2, loc);
@@ -60,5 +57,5 @@ wcsncasecmp_l(const wchar_t *s1, const w
int
wcsncasecmp(const wchar_t *s1, const wchar_t *s2, size_t n)
{
- return wcsncasecmp_l(s1, s2, n, *_current_locale());
+ return wcsncasecmp_l(s1, s2, n, LC_GLOBAL_LOCALE);
}
Index: lib/libc/time/strftime.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/time/strftime.c,v
retrieving revision 1.25
diff -u -p -r1.25 strftime.c
--- lib/libc/time/strftime.c 21 Apr 2013 17:45:46 -0000 1.25
+++ lib/libc/time/strftime.c 7 May 2013 11:14:32 -0000
@@ -111,7 +111,7 @@ size_t
strftime_z(const timezone_t sp, char * __restrict s, size_t maxsize,
const char * __restrict format, const struct tm * __restrict t)
{
- return strftime_lz(sp, s, maxsize, format, t, *_current_locale());
+ return strftime_lz(sp, s, maxsize, format, t, LC_GLOBAL_LOCALE);
}
size_t
@@ -121,9 +121,6 @@ strftime_lz(const timezone_t sp, char *c
char * p;
int warn;
- if (loc == NULL)
- loc = _C_locale;
-
warn = IN_NONE;
p = _fmt(sp, ((format == NULL) ? "%c" : format), t, s, s + maxsize,
&warn, loc);
Index: lib/libc/time/strptime.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/lib/libc/time/strptime.c,v
retrieving revision 1.37
diff -u -p -r1.37 strptime.c
--- lib/libc/time/strptime.c 21 Apr 2013 17:45:47 -0000 1.37
+++ lib/libc/time/strptime.c 7 May 2013 11:14:34 -0000
@@ -77,7 +77,7 @@ static const u_char *find_string(const u
char *
strptime(const char *buf, const char *fmt, struct tm *tm)
{
- return strptime_l(buf, fmt, tm, *_current_locale());
+ return strptime_l(buf, fmt, tm, LC_GLOBAL_LOCALE);
}
char *
@@ -88,9 +88,6 @@ strptime_l(const char *buf, const char *
int alt_format, i, split_year = 0, neg = 0, offs;
const char *new_fmt;
- if (loc == NULL)
- loc = _C_locale;
-
bp = (const u_char *)buf;
while (bp != NULL && (c = *fmt++) != '\0') {
Home |
Main Index |
Thread Index |
Old Index