1 /* A POSIX <locale.h>.
2    Copyright (C) 2007-2021 Free Software Foundation, Inc.
3 
4    This file is free software: you can redistribute it and/or modify
5    it under the terms of the GNU Lesser General Public License as
6    published by the Free Software Foundation; either version 2.1 of the
7    License, or (at your option) any later version.
8 
9    This file 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
12    GNU Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public License
15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
16 
17 #if __GNUC__ >= 3
18 @PRAGMA_SYSTEM_HEADER@
19 #endif
20 @PRAGMA_COLUMNS@
21 
22 #if (defined _WIN32 && !defined __CYGWIN__ && defined __need_locale_t) \
23     || defined _GL_ALREADY_INCLUDING_LOCALE_H
24 
25 /* Special invocation convention:
26    - Inside mingw header files,
27    - To handle Solaris header files (through Solaris 10) when combined
28      with gettext's libintl.h.  */
29 
30 #@INCLUDE_NEXT@ @NEXT_LOCALE_H@
31 
32 #else
33 /* Normal invocation convention.  */
34 
35 #ifndef _@GUARD_PREFIX@_LOCALE_H
36 
37 #define _GL_ALREADY_INCLUDING_LOCALE_H
38 
39 /* The include_next requires a split double-inclusion guard.  */
40 #@INCLUDE_NEXT@ @NEXT_LOCALE_H@
41 
42 #undef _GL_ALREADY_INCLUDING_LOCALE_H
43 
44 #ifndef _@GUARD_PREFIX@_LOCALE_H
45 #define _@GUARD_PREFIX@_LOCALE_H
46 
47 /* NetBSD 5.0 mis-defines NULL.  */
48 #include <stddef.h>
49 
50 /* Mac OS X 10.5 defines the locale_t type in <xlocale.h>.  */
51 #if @HAVE_XLOCALE_H@
52 # include <xlocale.h>
53 #endif
54 
55 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
56 
57 /* The definition of _GL_ARG_NONNULL is copied here.  */
58 
59 /* The definition of _GL_WARN_ON_USE is copied here.  */
60 
61 /* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C.
62    On systems that don't define it, use the same value as GNU libintl.  */
63 #if !defined LC_MESSAGES
64 # define LC_MESSAGES 1729
65 #endif
66 
67 /* On native Windows with MSVC, 'struct lconv' lacks the members int_p_* and
68    int_n_*.  Instead of overriding 'struct lconv', merely define these member
69    names as macros.  This avoids trouble in C++ mode.  */
70 #if defined _MSC_VER
71 # define int_p_cs_precedes   p_cs_precedes
72 # define int_p_sign_posn     p_sign_posn
73 # define int_p_sep_by_space  p_sep_by_space
74 # define int_n_cs_precedes   n_cs_precedes
75 # define int_n_sign_posn     n_sign_posn
76 # define int_n_sep_by_space  n_sep_by_space
77 #endif
78 
79 /* Bionic libc's 'struct lconv' is just a dummy.  */
80 #if @REPLACE_STRUCT_LCONV@
81 # define lconv rpl_lconv
82 struct lconv
83 {
84   /* All 'char *' are actually 'const char *'.  */
85 
86   /* Members that depend on the LC_NUMERIC category of the locale.  See
87      <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_04> */
88 
89   /* Symbol used as decimal point.  */
90   char *decimal_point;
91   /* Symbol used to separate groups of digits to the left of the decimal
92      point.  */
93   char *thousands_sep;
94   /* Definition of the size of groups of digits to the left of the decimal
95      point.  */
96   char *grouping;
97 
98   /* Members that depend on the LC_MONETARY category of the locale.  See
99      <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_03> */
100 
101   /* Symbol used as decimal point.  */
102   char *mon_decimal_point;
103   /* Symbol used to separate groups of digits to the left of the decimal
104      point.  */
105   char *mon_thousands_sep;
106   /* Definition of the size of groups of digits to the left of the decimal
107      point.  */
108   char *mon_grouping;
109   /* Sign used to indicate a value >= 0.  */
110   char *positive_sign;
111   /* Sign used to indicate a value < 0.  */
112   char *negative_sign;
113 
114   /* For formatting local currency.  */
115   /* Currency symbol (3 characters) followed by separator (1 character).  */
116   char *currency_symbol;
117   /* Number of digits after the decimal point.  */
118   char frac_digits;
119   /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
120      comes after the number.  */
121   char p_cs_precedes;
122   /* For values >= 0: Position of the sign.  */
123   char p_sign_posn;
124   /* For values >= 0: Placement of spaces between currency symbol, sign, and
125      number.  */
126   char p_sep_by_space;
127   /* For values < 0: 1 if the currency symbol precedes the number, 0 if it
128      comes after the number.  */
129   char n_cs_precedes;
130   /* For values < 0: Position of the sign.  */
131   char n_sign_posn;
132   /* For values < 0: Placement of spaces between currency symbol, sign, and
133      number.  */
134   char n_sep_by_space;
135 
136   /* For formatting international currency.  */
137   /* Currency symbol (3 characters) followed by separator (1 character).  */
138   char *int_curr_symbol;
139   /* Number of digits after the decimal point.  */
140   char int_frac_digits;
141   /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
142      comes after the number.  */
143   char int_p_cs_precedes;
144   /* For values >= 0: Position of the sign.  */
145   char int_p_sign_posn;
146   /* For values >= 0: Placement of spaces between currency symbol, sign, and
147      number.  */
148   char int_p_sep_by_space;
149   /* For values < 0: 1 if the currency symbol precedes the number, 0 if it
150      comes after the number.  */
151   char int_n_cs_precedes;
152   /* For values < 0: Position of the sign.  */
153   char int_n_sign_posn;
154   /* For values < 0: Placement of spaces between currency symbol, sign, and
155      number.  */
156   char int_n_sep_by_space;
157 };
158 #endif
159 
160 #if @GNULIB_LOCALECONV@
161 # if @REPLACE_LOCALECONV@
162 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
163 #   undef localeconv
164 #   define localeconv rpl_localeconv
165 #  endif
166 _GL_FUNCDECL_RPL (localeconv, struct lconv *, (void));
167 _GL_CXXALIAS_RPL (localeconv, struct lconv *, (void));
168 # else
169 _GL_CXXALIAS_SYS (localeconv, struct lconv *, (void));
170 # endif
171 # if __GLIBC__ >= 2
172 _GL_CXXALIASWARN (localeconv);
173 # endif
174 #elif @REPLACE_STRUCT_LCONV@
175 # undef localeconv
176 # define localeconv localeconv_used_without_requesting_gnulib_module_localeconv
177 #elif defined GNULIB_POSIXCHECK
178 # undef localeconv
179 # if HAVE_RAW_DECL_LOCALECONV
180 _GL_WARN_ON_USE (localeconv,
181                  "localeconv returns too few information on some platforms - "
182                  "use gnulib module localeconv for portability");
183 # endif
184 #endif
185 
186 #if @GNULIB_SETLOCALE@
187 # if @REPLACE_SETLOCALE@
188 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
189 #   undef setlocale
190 #   define setlocale rpl_setlocale
191 #   define GNULIB_defined_setlocale 1
192 #  endif
193 _GL_FUNCDECL_RPL (setlocale, char *, (int category, const char *locale));
194 _GL_CXXALIAS_RPL (setlocale, char *, (int category, const char *locale));
195 # else
196 _GL_CXXALIAS_SYS (setlocale, char *, (int category, const char *locale));
197 # endif
198 # if __GLIBC__ >= 2
199 _GL_CXXALIASWARN (setlocale);
200 # endif
201 #elif defined GNULIB_POSIXCHECK
202 # undef setlocale
203 # if HAVE_RAW_DECL_SETLOCALE
204 _GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - "
205                  "use gnulib module setlocale for portability");
206 # endif
207 #endif
208 
209 #if @GNULIB_SETLOCALE_NULL@
210 /* Included here for convenience.  */
211 # include "setlocale_null.h"
212 #endif
213 
214 #if /*@GNULIB_NEWLOCALE@ ||*/ (@GNULIB_LOCALENAME@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_NEWLOCALE@)
215 # if @REPLACE_NEWLOCALE@
216 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
217 #   undef newlocale
218 #   define newlocale rpl_newlocale
219 #   define GNULIB_defined_newlocale 1
220 #  endif
221 _GL_FUNCDECL_RPL (newlocale, locale_t,
222                   (int category_mask, const char *name, locale_t base)
223                   _GL_ARG_NONNULL ((2)));
224 _GL_CXXALIAS_RPL (newlocale, locale_t,
225                   (int category_mask, const char *name, locale_t base));
226 # else
227 #  if @HAVE_NEWLOCALE@
228 _GL_CXXALIAS_SYS (newlocale, locale_t,
229                   (int category_mask, const char *name, locale_t base));
230 #  endif
231 # endif
232 # if @HAVE_NEWLOCALE@
233 _GL_CXXALIASWARN (newlocale);
234 # endif
235 # if @HAVE_NEWLOCALE@ || @REPLACE_NEWLOCALE@
236 #  ifndef HAVE_WORKING_NEWLOCALE
237 #   define HAVE_WORKING_NEWLOCALE 1
238 #  endif
239 # endif
240 #elif defined GNULIB_POSIXCHECK
241 # undef newlocale
242 # if HAVE_RAW_DECL_NEWLOCALE
243 _GL_WARN_ON_USE (newlocale, "newlocale is not portable");
244 # endif
245 #endif
246 
247 #if @GNULIB_DUPLOCALE@ || (@GNULIB_LOCALENAME@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_DUPLOCALE@)
248 # if @REPLACE_DUPLOCALE@
249 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
250 #   undef duplocale
251 #   define duplocale rpl_duplocale
252 #   define GNULIB_defined_duplocale 1
253 #  endif
254 _GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1)));
255 _GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale));
256 # else
257 #  if @HAVE_DUPLOCALE@
258 _GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale));
259 #  endif
260 # endif
261 # if @HAVE_DUPLOCALE@
262 _GL_CXXALIASWARN (duplocale);
263 # endif
264 # if @HAVE_DUPLOCALE@ || @REPLACE_DUPLOCALE@
265 #  ifndef HAVE_WORKING_DUPLOCALE
266 #   define HAVE_WORKING_DUPLOCALE 1
267 #  endif
268 # endif
269 #elif defined GNULIB_POSIXCHECK
270 # undef duplocale
271 # if HAVE_RAW_DECL_DUPLOCALE
272 _GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - "
273                  "use gnulib module duplocale for portability");
274 # endif
275 #endif
276 
277 #if /*@GNULIB_FREELOCALE@ ||*/ (@GNULIB_LOCALENAME@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_FREELOCALE@)
278 # if @REPLACE_FREELOCALE@
279 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
280 #   undef freelocale
281 #   define freelocale rpl_freelocale
282 #   define GNULIB_defined_freelocale 1
283 #  endif
284 _GL_FUNCDECL_RPL (freelocale, void, (locale_t locale) _GL_ARG_NONNULL ((1)));
285 _GL_CXXALIAS_RPL (freelocale, void, (locale_t locale));
286 # else
287 #  if @HAVE_FREELOCALE@
288 /* Need to cast, because on FreeBSD and Mac OS X 10.13, the return type is
289                                    int.  */
290 _GL_CXXALIAS_SYS_CAST (freelocale, void, (locale_t locale));
291 #  endif
292 # endif
293 # if @HAVE_FREELOCALE@
294 _GL_CXXALIASWARN (freelocale);
295 # endif
296 #elif defined GNULIB_POSIXCHECK
297 # undef freelocale
298 # if HAVE_RAW_DECL_FREELOCALE
299 _GL_WARN_ON_USE (freelocale, "freelocale is not portable");
300 # endif
301 #endif
302 
303 #endif /* _@GUARD_PREFIX@_LOCALE_H */
304 #endif /* _@GUARD_PREFIX@_LOCALE_H */
305 #endif /* !(__need_locale_t || _GL_ALREADY_INCLUDING_LOCALE_H) */
306