xref: /netbsd-src/lib/libc/locale/global_locale.c (revision d1f43e70cb5544bfeaa3cb4776119ec76b02d3f5)
1*d1f43e70Sjoerg /* $NetBSD: global_locale.c,v 1.29 2024/06/08 21:35:18 joerg Exp $ */
252ed7b03Stnozaki 
352ed7b03Stnozaki /*-
452ed7b03Stnozaki  * Copyright (c)2008 Citrus Project,
552ed7b03Stnozaki  * All rights reserved.
652ed7b03Stnozaki  *
752ed7b03Stnozaki  * Redistribution and use in source and binary forms, with or without
852ed7b03Stnozaki  * modification, are permitted provided that the following conditions
952ed7b03Stnozaki  * are met:
1052ed7b03Stnozaki  * 1. Redistributions of source code must retain the above copyright
1152ed7b03Stnozaki  *    notice, this list of conditions and the following disclaimer.
1252ed7b03Stnozaki  * 2. Redistributions in binary form must reproduce the above copyright
1352ed7b03Stnozaki  *    notice, this list of conditions and the following disclaimer in the
1452ed7b03Stnozaki  *    documentation and/or other materials provided with the distribution.
1552ed7b03Stnozaki  *
1652ed7b03Stnozaki  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1752ed7b03Stnozaki  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1852ed7b03Stnozaki  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1952ed7b03Stnozaki  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2052ed7b03Stnozaki  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2152ed7b03Stnozaki  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2252ed7b03Stnozaki  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2352ed7b03Stnozaki  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2452ed7b03Stnozaki  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2552ed7b03Stnozaki  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2652ed7b03Stnozaki  * SUCH DAMAGE.
2752ed7b03Stnozaki  */
2852ed7b03Stnozaki 
2952ed7b03Stnozaki #include <sys/cdefs.h>
3052ed7b03Stnozaki #if defined(LIBC_SCCS) && !defined(lint)
31*d1f43e70Sjoerg __RCSID("$NetBSD: global_locale.c,v 1.29 2024/06/08 21:35:18 joerg Exp $");
3252ed7b03Stnozaki #endif /* LIBC_SCCS and not lint */
3352ed7b03Stnozaki 
34*d1f43e70Sjoerg #include "namespace.h"
35*d1f43e70Sjoerg 
3652ed7b03Stnozaki #include <sys/types.h>
379a35d797Stnozaki #include <sys/ctype_bits.h>
3852ed7b03Stnozaki #include <sys/localedef.h>
39*d1f43e70Sjoerg #include <errno.h>
4052ed7b03Stnozaki #include <langinfo.h>
4152ed7b03Stnozaki #include <limits.h>
4252ed7b03Stnozaki #define __SETLOCALE_SOURCE__
4352ed7b03Stnozaki #include <locale.h>
4452ed7b03Stnozaki #include <stdlib.h>
4552ed7b03Stnozaki 
460f5f511fSjoerg #include "runetype_local.h"
4752ed7b03Stnozaki #include "setlocale_local.h"
4852ed7b03Stnozaki 
492933c534Sjoerg static const _MessagesLocale _DefaultMessagesLocale = {
502933c534Sjoerg 	"^[Yy]",
512933c534Sjoerg 	"^[Nn]",
522933c534Sjoerg 	"yes",
532933c534Sjoerg 	"no"
542933c534Sjoerg };
552933c534Sjoerg 
562933c534Sjoerg static const _MonetaryLocale _DefaultMonetaryLocale = {
572933c534Sjoerg 	"",
582933c534Sjoerg 	"",
592933c534Sjoerg 	"",
602933c534Sjoerg 	"",
612933c534Sjoerg 	"",
622933c534Sjoerg 	"",
632933c534Sjoerg 	"",
6475f9c6b1Sriastradh 	CHAR_MAX,
6575f9c6b1Sriastradh 	CHAR_MAX,
6675f9c6b1Sriastradh 	CHAR_MAX,
6775f9c6b1Sriastradh 	CHAR_MAX,
6875f9c6b1Sriastradh 	CHAR_MAX,
6975f9c6b1Sriastradh 	CHAR_MAX,
7075f9c6b1Sriastradh 	CHAR_MAX,
7175f9c6b1Sriastradh 	CHAR_MAX,
7275f9c6b1Sriastradh 	CHAR_MAX,
7375f9c6b1Sriastradh 	CHAR_MAX,
7475f9c6b1Sriastradh 	CHAR_MAX,
7575f9c6b1Sriastradh 	CHAR_MAX,
7675f9c6b1Sriastradh 	CHAR_MAX,
7775f9c6b1Sriastradh 	CHAR_MAX
782933c534Sjoerg };
792933c534Sjoerg 
802933c534Sjoerg static const _NumericLocale _DefaultNumericLocale = {
812933c534Sjoerg 	".",
822933c534Sjoerg 	"",
832933c534Sjoerg 	""
842933c534Sjoerg };
852933c534Sjoerg 
862933c534Sjoerg static const _TimeLocale _DefaultTimeLocale =
872933c534Sjoerg {
882933c534Sjoerg 	{
892933c534Sjoerg 		"Sun","Mon","Tue","Wed","Thu","Fri","Sat",
902933c534Sjoerg 	},
912933c534Sjoerg 	{
922933c534Sjoerg 		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
932933c534Sjoerg 		"Friday", "Saturday"
942933c534Sjoerg 	},
952933c534Sjoerg 	{
962933c534Sjoerg 		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
972933c534Sjoerg 		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
982933c534Sjoerg 	},
992933c534Sjoerg 	{
1002933c534Sjoerg 		"January", "February", "March", "April", "May", "June", "July",
1012933c534Sjoerg 		"August", "September", "October", "November", "December"
1022933c534Sjoerg 	},
1032933c534Sjoerg 	{
1042933c534Sjoerg 		"AM", "PM"
1052933c534Sjoerg 	},
1062933c534Sjoerg 	"%a %b %e %H:%M:%S %Y",
1072933c534Sjoerg 	"%m/%d/%y",
1082933c534Sjoerg 	"%H:%M:%S",
1092933c534Sjoerg 	"%I:%M:%S %p"
1102933c534Sjoerg };
1112933c534Sjoerg 
112bdfde3daSjoerg static const char _lc_C_locale_name[] = _C_LOCALE;
113bdfde3daSjoerg 
114bdfde3daSjoerg __dso_hidden const struct _locale_cache_t _C_cache = {
115bdfde3daSjoerg     .ldata = {
11652ed7b03Stnozaki 	.decimal_point		= __UNCONST("."),
11752ed7b03Stnozaki 	.thousands_sep		= __UNCONST(""),
11852ed7b03Stnozaki 	.grouping		= __UNCONST(""),
11952ed7b03Stnozaki 	.int_curr_symbol	= __UNCONST(""),
12052ed7b03Stnozaki 	.currency_symbol	= __UNCONST(""),
12152ed7b03Stnozaki 	.mon_decimal_point	= __UNCONST(""),
12252ed7b03Stnozaki 	.mon_thousands_sep	= __UNCONST(""),
12352ed7b03Stnozaki 	.mon_grouping		= __UNCONST(""),
12452ed7b03Stnozaki 	.positive_sign		= __UNCONST(""),
12552ed7b03Stnozaki 	.negative_sign		= __UNCONST(""),
126191f1cb8Sriastradh 	.int_frac_digits	= CHAR_MAX,
127191f1cb8Sriastradh 	.frac_digits		= CHAR_MAX,
128191f1cb8Sriastradh 	.p_cs_precedes		= CHAR_MAX,
129191f1cb8Sriastradh 	.p_sep_by_space		= CHAR_MAX,
130191f1cb8Sriastradh 	.n_cs_precedes		= CHAR_MAX,
131191f1cb8Sriastradh 	.n_sep_by_space		= CHAR_MAX,
132191f1cb8Sriastradh 	.p_sign_posn		= CHAR_MAX,
133191f1cb8Sriastradh 	.n_sign_posn		= CHAR_MAX,
134191f1cb8Sriastradh 	.int_p_cs_precedes	= CHAR_MAX,
135191f1cb8Sriastradh 	.int_n_cs_precedes	= CHAR_MAX,
136191f1cb8Sriastradh 	.int_p_sep_by_space	= CHAR_MAX,
137191f1cb8Sriastradh 	.int_n_sep_by_space	= CHAR_MAX,
138191f1cb8Sriastradh 	.int_p_sign_posn	= CHAR_MAX,
139191f1cb8Sriastradh 	.int_n_sign_posn	= CHAR_MAX,
140bdfde3daSjoerg     },
141bdfde3daSjoerg     .monetary_name = _lc_C_locale_name,
142bdfde3daSjoerg     .numeric_name = _lc_C_locale_name,
143*d1f43e70Sjoerg     .message_name = _lc_C_locale_name,
144*d1f43e70Sjoerg     .errlistp = &sys_errlist,
145*d1f43e70Sjoerg     .errlist_prefix = "Unknown error: %d",
146bbed57c2Stnozaki };
147bbed57c2Stnozaki 
1483ae9c710Schristos struct _locale _lc_global_locale = {
149bdfde3daSjoerg     .cache = &_C_cache,
150db741099Stnozaki     .query = { _C_LOCALE },
15152ed7b03Stnozaki     .part_name = {
152e5717105Sriastradh 	[LC_ALL     ] = _lc_C_locale_name,
153e5717105Sriastradh 	[LC_COLLATE ] = _lc_C_locale_name,
154e5717105Sriastradh 	[LC_CTYPE   ] = _lc_C_locale_name,
155e5717105Sriastradh 	[LC_MONETARY] = _lc_C_locale_name,
156e5717105Sriastradh 	[LC_NUMERIC ] = _lc_C_locale_name,
157e5717105Sriastradh 	[LC_TIME    ] = _lc_C_locale_name,
158e5717105Sriastradh 	[LC_MESSAGES] = _lc_C_locale_name,
15952ed7b03Stnozaki     },
16052ed7b03Stnozaki     .part_impl = {
161e5717105Sriastradh 	[LC_ALL     ] = (_locale_part_t)NULL,
162e5717105Sriastradh 	[LC_COLLATE ] = (_locale_part_t)NULL,
163e5717105Sriastradh 	[LC_CTYPE   ] = (_locale_part_t)
16452ed7b03Stnozaki 	    __UNCONST(&_DefaultRuneLocale),
165e5717105Sriastradh 	[LC_MONETARY] = (_locale_part_t)
16652ed7b03Stnozaki 	    __UNCONST(&_DefaultMonetaryLocale),
167e5717105Sriastradh 	[LC_NUMERIC ] = (_locale_part_t)
16852ed7b03Stnozaki 	    __UNCONST(&_DefaultNumericLocale),
169e5717105Sriastradh 	[LC_MESSAGES] = (_locale_part_t)
17052ed7b03Stnozaki 	    __UNCONST(&_DefaultMessagesLocale),
171e5717105Sriastradh 	[LC_TIME] = (_locale_part_t)
17299fac95bSjoerg 	    __UNCONST(&_DefaultTimeLocale),
17352ed7b03Stnozaki     },
17452ed7b03Stnozaki };
175e0ac190eSjoerg 
1763ae9c710Schristos const struct _locale _lc_C_locale = {
177bdfde3daSjoerg     .cache = &_C_cache,
178e0ac190eSjoerg     .query = { _C_LOCALE },
179e0ac190eSjoerg     .part_name = {
180e5717105Sriastradh 	[LC_ALL     ] = _lc_C_locale_name,
181e5717105Sriastradh 	[LC_COLLATE ] = _lc_C_locale_name,
182e5717105Sriastradh 	[LC_CTYPE   ] = _lc_C_locale_name,
183e5717105Sriastradh 	[LC_MONETARY] = _lc_C_locale_name,
184e5717105Sriastradh 	[LC_NUMERIC ] = _lc_C_locale_name,
185e5717105Sriastradh 	[LC_TIME    ] = _lc_C_locale_name,
186e5717105Sriastradh 	[LC_MESSAGES] = _lc_C_locale_name,
187e0ac190eSjoerg     },
188e0ac190eSjoerg     .part_impl = {
189e5717105Sriastradh 	[LC_ALL     ] = (_locale_part_t)NULL,
190e5717105Sriastradh 	[LC_COLLATE ] = (_locale_part_t)NULL,
191e5717105Sriastradh 	[LC_CTYPE   ] = (_locale_part_t)
192e0ac190eSjoerg 	    __UNCONST(&_DefaultRuneLocale),
193e5717105Sriastradh 	[LC_MONETARY] = (_locale_part_t)
194e0ac190eSjoerg 	    __UNCONST(&_DefaultMonetaryLocale),
195e5717105Sriastradh 	[LC_NUMERIC ] = (_locale_part_t)
196e0ac190eSjoerg 	    __UNCONST(&_DefaultNumericLocale),
197e5717105Sriastradh 	[LC_MESSAGES] = (_locale_part_t)
198e0ac190eSjoerg 	    __UNCONST(&_DefaultMessagesLocale),
199e5717105Sriastradh 	[LC_TIME] = (_locale_part_t)
200e0ac190eSjoerg 	    __UNCONST(&_DefaultTimeLocale),
201e0ac190eSjoerg     },
202e0ac190eSjoerg };
203