diff options
Diffstat (limited to 'lib/locale.in.h')
-rw-r--r-- | lib/locale.in.h | 179 |
1 files changed, 143 insertions, 36 deletions
diff --git a/lib/locale.in.h b/lib/locale.in.h index c3d34085..34f8c5b6 100644 --- a/lib/locale.in.h +++ b/lib/locale.in.h @@ -1,5 +1,5 @@ /* A POSIX <locale.h>. - Copyright (C) 2007-2024 Free Software Foundation, Inc. + Copyright (C) 2007-2025 Free Software Foundation, Inc. This file is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -20,7 +20,7 @@ @PRAGMA_COLUMNS@ #if (defined _WIN32 && !defined __CYGWIN__ && defined __need_locale_t) \ - || defined _GL_ALREADY_INCLUDING_LOCALE_H + || defined _@GUARD_PREFIX@_ALREADY_INCLUDING_LOCALE_H /* Special invocation convention: - Inside mingw header files, @@ -34,12 +34,12 @@ #ifndef _@GUARD_PREFIX@_LOCALE_H -#define _GL_ALREADY_INCLUDING_LOCALE_H +#define _@GUARD_PREFIX@_ALREADY_INCLUDING_LOCALE_H /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_LOCALE_H@ -#undef _GL_ALREADY_INCLUDING_LOCALE_H +#undef _@GUARD_PREFIX@_ALREADY_INCLUDING_LOCALE_H #ifndef _@GUARD_PREFIX@_LOCALE_H #define _@GUARD_PREFIX@_LOCALE_H @@ -69,6 +69,85 @@ # define LC_MESSAGES 1729 #endif +#if !@HAVE_LOCALE_T@ +# if !defined GNULIB_defined_locale_t +/* The values of the POSIX-standardized LC_* macros are: + + LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME + + glibc, Solaris, 3 0 5 4 1 2 + Android + macOS, *BSD 1 2 6 3 4 5 + native Windows 1 2 1729 3 4 5 + + We map these to the log2(LC_*_MASK) values, chosen to be compatible with + later releases of the same operating system. */ +# if defined __APPLE__ && defined __MACH__ /* macOS */ +/* LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME + + category 1 2 6 3 4 5 + log2(LC_*_MASK) 0 1 2 3 4 5 + */ +# define gl_log2_lc_mask(category) ((0x2543100 >> (4 * (category))) & 0xf) +# elif defined __FreeBSD__ || defined __DragonFly__ /* FreeBSD */ +/* LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME + + category 1 2 6 3 4 5 + log2(LC_*_MASK) 0 1 5 2 3 4 + */ +# define gl_log2_lc_mask(category) ((category) - 1) +# elif defined _WIN32 && !defined __CYGWIN__ /* native Windows */ +# define gl_log2_lc_mask(category) \ + ((category) == LC_MESSAGES ? 0 : (category)) +# else /* glibc, Solaris, Android, NetBSD, OpenBSD */ +# define gl_log2_lc_mask(category) (category) +# endif +/* From there we map them to array indices 0..5. */ +# if (gl_log2_lc_mask (LC_COLLATE) == 0 || gl_log2_lc_mask (LC_CTYPE) == 0 \ + || gl_log2_lc_mask (LC_MESSAGES) == 0) + /* glibc, Solaris, Android, macOS, FreeBSD, native Windows */ +# define gl_log2_lcmask_to_index(c) (c) +# define gl_index_to_log2_lcmask(i) (i) +# else + /* NetBSD, OpenBSD */ +# define gl_log2_lcmask_to_index(c) ((c) - 1) +# define gl_index_to_log2_lcmask(i) ((i) + 1) +# endif +/* Define the LC_*_MASK macros. */ +# define LC_COLLATE_MASK (1 << gl_log2_lc_mask (LC_COLLATE)) +# define LC_CTYPE_MASK (1 << gl_log2_lc_mask (LC_CTYPE)) +# define LC_MESSAGES_MASK (1 << gl_log2_lc_mask (LC_MESSAGES)) +# define LC_MONETARY_MASK (1 << gl_log2_lc_mask (LC_MONETARY)) +# define LC_NUMERIC_MASK (1 << gl_log2_lc_mask (LC_NUMERIC)) +# define LC_TIME_MASK (1 << gl_log2_lc_mask (LC_TIME)) +# define LC_ALL_MASK \ + (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | LC_MONETARY_MASK \ + | LC_NUMERIC_MASK | LC_TIME_MASK) +/* Now define the locale_t type. */ +struct gl_locale_category_t +{ + char *name; + bool is_c_locale; +# if @HAVE_WINDOWS_LOCALE_T@ + /* Use the native Windows '_locale_t' type. + Documentation: + <https://learn.microsoft.com/en-us/cpp/c-runtime-library/locale> + This field is NULL if is_c_locale is true. But don't use this NULL value, + since for the native Windows *_l functions a null _locale_t means to use + the global locale. */ + _locale_t system_locale; +# endif +}; +struct gl_locale_t +{ + struct gl_locale_category_t category[6]; +}; +typedef struct gl_locale_t *locale_t; +# define LC_GLOBAL_LOCALE ((locale_t)(-1)) +# define GNULIB_defined_locale_t 1 +# endif +#endif + /* On native Windows with MSVC, 'struct lconv' lacks the members int_p_* and int_n_*. Instead of overriding 'struct lconv', merely define these member names as macros. This avoids trouble in C++ mode. */ @@ -83,7 +162,8 @@ /* Bionic libc's 'struct lconv' is just a dummy. */ #if @REPLACE_STRUCT_LCONV@ -# define lconv rpl_lconv +# if !defined GNULIB_defined_struct_lconv +# define lconv rpl_lconv struct lconv { /* All 'char *' are actually 'const char *'. */ @@ -160,6 +240,8 @@ struct lconv number. */ char int_n_sep_by_space; }; +# define GNULIB_defined_struct_lconv 1 +# endif #endif #if @GNULIB_LOCALECONV@ @@ -218,7 +300,7 @@ _GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - " # include "setlocale_null.h" #endif -#if /*@GNULIB_NEWLOCALE@ ||*/ (@GNULIB_LOCALENAME_UNSAFE@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_NEWLOCALE@) +#if @GNULIB_NEWLOCALE@ || (@GNULIB_GETLOCALENAME_L_UNSAFE@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_NEWLOCALE@) # if @REPLACE_NEWLOCALE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef newlocale @@ -231,19 +313,17 @@ _GL_FUNCDECL_RPL (newlocale, locale_t, _GL_CXXALIAS_RPL (newlocale, locale_t, (int category_mask, const char *name, locale_t base)); # else -# if @HAVE_NEWLOCALE@ +# if !@HAVE_NEWLOCALE@ +_GL_FUNCDECL_SYS (newlocale, locale_t, + (int category_mask, const char *name, locale_t base), + _GL_ARG_NONNULL ((2))); +# endif _GL_CXXALIAS_SYS (newlocale, locale_t, (int category_mask, const char *name, locale_t base)); -# endif # endif -# if __GLIBC__ >= 2 && @HAVE_NEWLOCALE@ +# if __GLIBC__ >= 2 _GL_CXXALIASWARN (newlocale); # endif -# if @HAVE_NEWLOCALE@ || @REPLACE_NEWLOCALE@ -# ifndef HAVE_WORKING_NEWLOCALE -# define HAVE_WORKING_NEWLOCALE 1 -# endif -# endif #elif defined GNULIB_POSIXCHECK # undef newlocale # if HAVE_RAW_DECL_NEWLOCALE @@ -251,37 +331,33 @@ _GL_WARN_ON_USE (newlocale, "newlocale is not portable"); # endif #endif -#if @GNULIB_DUPLOCALE@ || (@GNULIB_LOCALENAME_UNSAFE@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_DUPLOCALE@) -# if @HAVE_DUPLOCALE@ /* locale_t may be undefined if !@HAVE_DUPLOCALE@. */ -# if @REPLACE_DUPLOCALE@ -# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -# undef duplocale -# define duplocale rpl_duplocale -# define GNULIB_defined_duplocale 1 -# endif +#if @GNULIB_DUPLOCALE@ || (@GNULIB_GETLOCALENAME_L_UNSAFE@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_DUPLOCALE@) +# if @REPLACE_DUPLOCALE@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef duplocale +# define duplocale rpl_duplocale +# define GNULIB_defined_duplocale 1 +# endif _GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale), _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale)); -# else -_GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale)); +# else +# if !@HAVE_DUPLOCALE@ +_GL_FUNCDECL_SYS (duplocale, locale_t, (locale_t locale), _GL_ARG_NONNULL ((1))); # endif +_GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale)); # endif -# if __GLIBC__ >= 2 && @HAVE_DUPLOCALE@ +# if __GLIBC__ >= 2 _GL_CXXALIASWARN (duplocale); # endif -# if @HAVE_DUPLOCALE@ -# ifndef HAVE_WORKING_DUPLOCALE -# define HAVE_WORKING_DUPLOCALE 1 -# endif -# endif #elif defined GNULIB_POSIXCHECK # undef duplocale # if HAVE_RAW_DECL_DUPLOCALE -_GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - " +_GL_WARN_ON_USE (duplocale, "duplocale is unportable and buggy on some glibc systems - " "use gnulib module duplocale for portability"); # endif #endif -#if /*@GNULIB_FREELOCALE@ ||*/ (@GNULIB_LOCALENAME_UNSAFE@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_FREELOCALE@) +#if @GNULIB_FREELOCALE@ || (@GNULIB_GETLOCALENAME_L_UNSAFE@ && @LOCALENAME_ENHANCE_LOCALE_FUNCS@ && @HAVE_FREELOCALE@) # if @REPLACE_FREELOCALE@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) # undef freelocale @@ -291,13 +367,14 @@ _GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - " _GL_FUNCDECL_RPL (freelocale, void, (locale_t locale), _GL_ARG_NONNULL ((1))); _GL_CXXALIAS_RPL (freelocale, void, (locale_t locale)); # else -# if @HAVE_FREELOCALE@ +# if !@HAVE_FREELOCALE@ +_GL_FUNCDECL_SYS (freelocale, void, (locale_t locale), _GL_ARG_NONNULL ((1))); +# endif /* Need to cast, because on FreeBSD and Mac OS X 10.13, the return type is int. */ _GL_CXXALIAS_SYS_CAST (freelocale, void, (locale_t locale)); -# endif # endif -# if __GLIBC__ >= 2 && @HAVE_FREELOCALE@ +# if __GLIBC__ >= 2 _GL_CXXALIASWARN (freelocale); # endif #elif defined GNULIB_POSIXCHECK @@ -307,6 +384,36 @@ _GL_WARN_ON_USE (freelocale, "freelocale is not portable"); # endif #endif +#if @GNULIB_GETLOCALENAME_L@ +# if @REPLACE_GETLOCALENAME_L@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef getlocalename_l +# define getlocalename_l rpl_getlocalename_l +# endif +_GL_FUNCDECL_RPL (getlocalename_l, const char *, + (int category, locale_t locale), + _GL_ARG_NONNULL ((2))); +_GL_CXXALIAS_RPL (getlocalename_l, const char *, + (int category, locale_t locale)); +# else +# if !@HAVE_GETLOCALENAME_L@ +_GL_FUNCDECL_SYS (getlocalename_l, const char *, + (int category, locale_t locale), + _GL_ARG_NONNULL ((2))); +# endif +_GL_CXXALIAS_SYS (getlocalename_l, const char *, + (int category, locale_t locale)); +# endif +# if __GLIBC__ >= 2 +_GL_CXXALIASWARN (getlocalename_l); +# endif +#elif defined GNULIB_POSIXCHECK +# undef getlocalename_l +# if HAVE_RAW_DECL_GETLOCALENAME_L +_GL_WARN_ON_USE (getlocalename_l, "getlocalename_l is not portable"); +# endif +#endif + #endif /* _@GUARD_PREFIX@_LOCALE_H */ #endif /* _@GUARD_PREFIX@_LOCALE_H */ -#endif /* !(__need_locale_t || _GL_ALREADY_INCLUDING_LOCALE_H) */ +#endif /* !(__need_locale_t || _@GUARD_PREFIX@_ALREADY_INCLUDING_LOCALE_H) */ |