1/* Copyright (C) 1991-2024 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
17
18/*
19 * ISO C99 Standard: 7.11 Localization <locale.h>
20 */
21
22#ifndef _LOCALE_H
23#define _LOCALE_H 1
24
25#include <features.h>
26
27#define __need_NULL
28#include <stddef.h>
29#include <bits/locale.h>
30
31__BEGIN_DECLS
32
33/* These are the possibilities for the first argument to setlocale.
34 The code assumes that the lowest LC_* symbol has the value zero. */
35#define LC_CTYPE __LC_CTYPE
36#define LC_NUMERIC __LC_NUMERIC
37#define LC_TIME __LC_TIME
38#define LC_COLLATE __LC_COLLATE
39#define LC_MONETARY __LC_MONETARY
40#define LC_MESSAGES __LC_MESSAGES
41#define LC_ALL __LC_ALL
42#define LC_PAPER __LC_PAPER
43#define LC_NAME __LC_NAME
44#define LC_ADDRESS __LC_ADDRESS
45#define LC_TELEPHONE __LC_TELEPHONE
46#define LC_MEASUREMENT __LC_MEASUREMENT
47#define LC_IDENTIFICATION __LC_IDENTIFICATION
48
49
50/* Structure giving information about numeric and monetary notation. */
51struct lconv
52{
53 /* Numeric (non-monetary) information. */
54
55 char *decimal_point; /* Decimal point character. */
56 char *thousands_sep; /* Thousands separator. */
57 /* Each element is the number of digits in each group;
58 elements with higher indices are farther left.
59 An element with value CHAR_MAX means that no further grouping is done.
60 An element with value 0 means that the previous element is used
61 for all groups farther left. */
62 char *grouping;
63
64 /* Monetary information. */
65
66 /* First three chars are a currency symbol from ISO 4217.
67 Fourth char is the separator. Fifth char is '\0'. */
68 char *int_curr_symbol;
69 char *currency_symbol; /* Local currency symbol. */
70 char *mon_decimal_point; /* Decimal point character. */
71 char *mon_thousands_sep; /* Thousands separator. */
72 char *mon_grouping; /* Like `grouping' element (above). */
73 char *positive_sign; /* Sign for positive values. */
74 char *negative_sign; /* Sign for negative values. */
75 char int_frac_digits; /* Int'l fractional digits. */
76 char frac_digits; /* Local fractional digits. */
77 /* 1 if currency_symbol precedes a positive value, 0 if succeeds. */
78 char p_cs_precedes;
79 /* 1 iff a space separates currency_symbol from a positive value. */
80 char p_sep_by_space;
81 /* 1 if currency_symbol precedes a negative value, 0 if succeeds. */
82 char n_cs_precedes;
83 /* 1 iff a space separates currency_symbol from a negative value. */
84 char n_sep_by_space;
85 /* Positive and negative sign positions:
86 0 Parentheses surround the quantity and currency_symbol.
87 1 The sign string precedes the quantity and currency_symbol.
88 2 The sign string follows the quantity and currency_symbol.
89 3 The sign string immediately precedes the currency_symbol.
90 4 The sign string immediately follows the currency_symbol. */
91 char p_sign_posn;
92 char n_sign_posn;
93#ifdef __USE_ISOC99
94 /* 1 if int_curr_symbol precedes a positive value, 0 if succeeds. */
95 char int_p_cs_precedes;
96 /* 1 iff a space separates int_curr_symbol from a positive value. */
97 char int_p_sep_by_space;
98 /* 1 if int_curr_symbol precedes a negative value, 0 if succeeds. */
99 char int_n_cs_precedes;
100 /* 1 iff a space separates int_curr_symbol from a negative value. */
101 char int_n_sep_by_space;
102 /* Positive and negative sign positions:
103 0 Parentheses surround the quantity and int_curr_symbol.
104 1 The sign string precedes the quantity and int_curr_symbol.
105 2 The sign string follows the quantity and int_curr_symbol.
106 3 The sign string immediately precedes the int_curr_symbol.
107 4 The sign string immediately follows the int_curr_symbol. */
108 char int_p_sign_posn;
109 char int_n_sign_posn;
110#else
111 char __int_p_cs_precedes;
112 char __int_p_sep_by_space;
113 char __int_n_cs_precedes;
114 char __int_n_sep_by_space;
115 char __int_p_sign_posn;
116 char __int_n_sign_posn;
117#endif
118};
119
120
121/* Set and/or return the current locale. */
122extern char *setlocale (int __category, const char *__locale) __THROW;
123
124/* Return the numeric/monetary information for the current locale. */
125extern struct lconv *localeconv (void) __THROW;
126
127
128#ifdef __USE_XOPEN2K8
129/* POSIX.1-2008 extends the locale interface with functions for
130 explicit creation and manipulation of 'locale_t' objects
131 representing locale contexts, and a set of parallel
132 locale-sensitive text processing functions that take a locale_t
133 argument. This enables applications to work with data from
134 multiple locales simultaneously and thread-safely. */
135# include <bits/types/locale_t.h>
136
137/* Return a reference to a data structure representing a set of locale
138 datasets. Unlike for the CATEGORY parameter for `setlocale' the
139 CATEGORY_MASK parameter here uses a single bit for each category,
140 made by OR'ing together LC_*_MASK bits above. */
141extern locale_t newlocale (int __category_mask, const char *__locale,
142 locale_t __base) __THROW;
143
144/* These are the bits that can be set in the CATEGORY_MASK argument to
145 `newlocale'. In the GNU implementation, LC_FOO_MASK has the value
146 of (1 << LC_FOO), but this is not a part of the interface that
147 callers can assume will be true. */
148# define LC_CTYPE_MASK (1 << __LC_CTYPE)
149# define LC_NUMERIC_MASK (1 << __LC_NUMERIC)
150# define LC_TIME_MASK (1 << __LC_TIME)
151# define LC_COLLATE_MASK (1 << __LC_COLLATE)
152# define LC_MONETARY_MASK (1 << __LC_MONETARY)
153# define LC_MESSAGES_MASK (1 << __LC_MESSAGES)
154# define LC_PAPER_MASK (1 << __LC_PAPER)
155# define LC_NAME_MASK (1 << __LC_NAME)
156# define LC_ADDRESS_MASK (1 << __LC_ADDRESS)
157# define LC_TELEPHONE_MASK (1 << __LC_TELEPHONE)
158# define LC_MEASUREMENT_MASK (1 << __LC_MEASUREMENT)
159# define LC_IDENTIFICATION_MASK (1 << __LC_IDENTIFICATION)
160# define LC_ALL_MASK (LC_CTYPE_MASK \
161 | LC_NUMERIC_MASK \
162 | LC_TIME_MASK \
163 | LC_COLLATE_MASK \
164 | LC_MONETARY_MASK \
165 | LC_MESSAGES_MASK \
166 | LC_PAPER_MASK \
167 | LC_NAME_MASK \
168 | LC_ADDRESS_MASK \
169 | LC_TELEPHONE_MASK \
170 | LC_MEASUREMENT_MASK \
171 | LC_IDENTIFICATION_MASK \
172 )
173
174/* Return a duplicate of the set of locale in DATASET. All usage
175 counters are increased if necessary. */
176extern locale_t duplocale (locale_t __dataset) __THROW;
177
178/* Free the data associated with a locale dataset previously returned
179 by a call to `setlocale_r'. */
180extern void freelocale (locale_t __dataset) __THROW;
181
182/* Switch the current thread's locale to DATASET.
183 If DATASET is null, instead just return the current setting.
184 The special value LC_GLOBAL_LOCALE is the initial setting
185 for all threads and can also be installed any time, meaning
186 the thread uses the global settings controlled by `setlocale'. */
187extern locale_t uselocale (locale_t __dataset) __THROW;
188
189/* This value can be passed to `uselocale' and may be returned by it.
190 Passing this value to any other function has undefined behavior. */
191# define LC_GLOBAL_LOCALE ((locale_t) -1L)
192
193#endif
194
195__END_DECLS
196
197#endif /* locale.h */
198