master
  1/* Copyright (C) 1991-2025 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  */