From: Bruno Haible Date: Sun, 22 Dec 2019 18:34:41 +0000 (+0100) Subject: setlocale-null: Add standalone include file. X-Git-Tag: v1.0~4434 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=ab3c9473eee5516e2425be7ad3ebe1bd16fa725a;p=gnulib.git setlocale-null: Add standalone include file. * lib/setlocale_null.h: New file, extracted from lib/locale.in.h. * lib/locale.in.h: Include setlocale_null.h. (SETLOCALE_NULL_MAX, SETLOCALE_NULL_ALL_MAX, setlocale_null_r, setlocale_null): Remove declarations. * lib/setlocale_null.c: Include setlocale_null.h. * lib/localename.c: Likewise. * modules/setlocale-null (Files): Add lib/setlocale_null.h. (Depends-on): Add snippet/arg-nonnull. (Include): Allow either "setlocale_null.h" or . --- diff --git a/ChangeLog b/ChangeLog index 0787d67cf4..b5dedb14da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2019-12-22 Bruno Haible + + setlocale-null: Add standalone include file. + * lib/setlocale_null.h: New file, extracted from lib/locale.in.h. + * lib/locale.in.h: Include setlocale_null.h. + (SETLOCALE_NULL_MAX, SETLOCALE_NULL_ALL_MAX, setlocale_null_r, + setlocale_null): Remove declarations. + * lib/setlocale_null.c: Include setlocale_null.h. + * lib/localename.c: Likewise. + * modules/setlocale-null (Files): Add lib/setlocale_null.h. + (Depends-on): Add snippet/arg-nonnull. + (Include): Allow either "setlocale_null.h" or . + 2019-12-22 Bruno Haible strfmon_l: Fix test failures on FreeBSD and Cygwin. diff --git a/lib/locale.in.h b/lib/locale.in.h index f4eccc230c..841bf9bdbe 100644 --- a/lib/locale.in.h +++ b/lib/locale.in.h @@ -207,53 +207,8 @@ _GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - " #endif #if @GNULIB_SETLOCALE_NULL@ -/* Recommended size of a buffer for a locale name for a single category. - On glibc systems, you can have locale names that are relative file names; - assume a maximum length 256. - In native Windows, in 2018 the longest locale name was of length 58 - ("FYRO Macedonian_Former Yugoslav Republic of Macedonia.1251"). */ -# define SETLOCALE_NULL_MAX (256+1) -/* Recommended size of a buffer for a locale name with all categories. - On glibc systems, you can have locale names that are relative file names; - assume maximum length 256 for each. There are 12 categories; so, the - maximum total length is 148+12*256. - In native Windows, there are 5 categories, and the maximum total length is - 55+5*58. */ -# define SETLOCALE_NULL_ALL_MAX (148+12*256+1) -/* setlocale_null_r (CATEGORY, BUF, BUFSIZE) is like setlocale (CATEGORY, NULL), - except that - - it is guaranteed to be multithread-safe, - - it returns the resulting locale category name or locale name in the - user-supplied buffer BUF, which must be BUFSIZE bytes long. - The recommended minimum buffer size is - - SETLOCALE_NULL_MAX for CATEGORY != LC_ALL, and - - SETLOCALE_NULL_ALL_MAX for CATEGORY == LC_ALL. - The return value is an error code: 0 if the call is successful, EINVAL if - CATEGORY is invalid, or ERANGE if BUFSIZE is smaller than the length needed - size (including the trailing NUL byte). In the latter case, a truncated - result is returned in BUF, but still NUL-terminated if BUFSIZE > 0. - For this call to be multithread-safe, *all* calls to - setlocale (CATEGORY, NULL) in all other threads must have been converted - to use setlocale_null_r or setlocale_null as well, and the other threads - must not make other setlocale invocations (since changing the global locale - has side effects on all threads). */ -_GL_FUNCDECL_SYS (setlocale_null_r, int, - (int category, char *buf, size_t bufsize) - _GL_ARG_NONNULL ((2))); -_GL_CXXALIAS_SYS (setlocale_null_r, int, - (int category, char *buf, size_t bufsize)); -_GL_CXXALIASWARN (setlocale_null_r); -/* setlocale_null (CATEGORY) is like setlocale (CATEGORY, NULL), except that - it is guaranteed to be multithread-safe. - The return value is NULL if CATEGORY is invalid. - For this call to be multithread-safe, *all* calls to - setlocale (CATEGORY, NULL) in all other threads must have been converted - to use setlocale_null_r or setlocale_null as well, and the other threads - must not make other setlocale invocations (since changing the global locale - has side effects on all threads). */ -_GL_FUNCDECL_SYS (setlocale_null, const char *, (int category)); -_GL_CXXALIAS_SYS (setlocale_null, const char *, (int category)); -_GL_CXXALIASWARN (setlocale_null); +/* Included here for convenience. */ +# include "setlocale_null.h" #endif #if /*@GNULIB_NEWLOCALE@ ||*/ (@GNULIB_LOCALENAME@ && @HAVE_NEWLOCALE@) diff --git a/lib/localename.c b/lib/localename.c index 5e51201a92..180caefc3a 100644 --- a/lib/localename.c +++ b/lib/localename.c @@ -34,6 +34,7 @@ #include #include "flexmember.h" +#include "setlocale_null.h" /* We cannot support uselocale() on platforms where the locale_t type is fake. See intl-thread-locale.m4 for details. */ diff --git a/lib/setlocale_null.c b/lib/setlocale_null.c index c20125709a..d676630a6a 100644 --- a/lib/setlocale_null.c +++ b/lib/setlocale_null.c @@ -19,9 +19,10 @@ #include /* Specification. */ -#include +#include "setlocale_null.h" #include +#include #include #include #if defined _WIN32 && !defined __CYGWIN__ diff --git a/lib/setlocale_null.h b/lib/setlocale_null.h new file mode 100644 index 0000000000..de58e80522 --- /dev/null +++ b/lib/setlocale_null.h @@ -0,0 +1,82 @@ +/* Query the name of the current global locale. + Copyright (C) 2019 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2019. */ + +#ifndef _SETLOCALE_NULL_H +#define _SETLOCALE_NULL_H + +#include + +#include "arg-nonnull.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Recommended size of a buffer for a locale name for a single category. + On glibc systems, you can have locale names that are relative file names; + assume a maximum length 256. + In native Windows, in 2018 the longest locale name was of length 58 + ("FYRO Macedonian_Former Yugoslav Republic of Macedonia.1251"). */ +#define SETLOCALE_NULL_MAX (256+1) + +/* Recommended size of a buffer for a locale name with all categories. + On glibc systems, you can have locale names that are relative file names; + assume maximum length 256 for each. There are 12 categories; so, the + maximum total length is 148+12*256. + In native Windows, there are 5 categories, and the maximum total length is + 55+5*58. */ +#define SETLOCALE_NULL_ALL_MAX (148+12*256+1) + +/* setlocale_null_r (CATEGORY, BUF, BUFSIZE) is like setlocale (CATEGORY, NULL), + except that + - it is guaranteed to be multithread-safe, + - it returns the resulting locale category name or locale name in the + user-supplied buffer BUF, which must be BUFSIZE bytes long. + The recommended minimum buffer size is + - SETLOCALE_NULL_MAX for CATEGORY != LC_ALL, and + - SETLOCALE_NULL_ALL_MAX for CATEGORY == LC_ALL. + The return value is an error code: 0 if the call is successful, EINVAL if + CATEGORY is invalid, or ERANGE if BUFSIZE is smaller than the length needed + size (including the trailing NUL byte). In the latter case, a truncated + result is returned in BUF, but still NUL-terminated if BUFSIZE > 0. + For this call to be multithread-safe, *all* calls to + setlocale (CATEGORY, NULL) in all other threads must have been converted + to use setlocale_null_r or setlocale_null as well, and the other threads + must not make other setlocale invocations (since changing the global locale + has side effects on all threads). */ +extern int setlocale_null_r (int category, char *buf, size_t bufsize) + _GL_ARG_NONNULL ((2)); + +/* setlocale_null (CATEGORY) is like setlocale (CATEGORY, NULL), except that + it is guaranteed to be multithread-safe. + The return value is NULL if CATEGORY is invalid. + For this call to be multithread-safe, *all* calls to + setlocale (CATEGORY, NULL) in all other threads must have been converted + to use setlocale_null_r or setlocale_null as well, and the other threads + must not make other setlocale invocations (since changing the global locale + has side effects on all threads). */ +extern const char *setlocale_null (int category); + + +#ifdef __cplusplus +} +#endif + +#endif /* _SETLOCALE_NULL_H */ diff --git a/modules/setlocale-null b/modules/setlocale-null index 17e8d9d745..52403692c5 100644 --- a/modules/setlocale-null +++ b/modules/setlocale-null @@ -2,6 +2,7 @@ Description: setlocale_null() function: query the name of the current global locale. Files: +lib/setlocale_null.h lib/setlocale_null.c lib/setlocale-lock.c lib/windows-initguard.h @@ -10,6 +11,7 @@ m4/threadlib.m4 Depends-on: locale +snippet/arg-nonnull configure.ac: gl_FUNC_SETLOCALE_NULL @@ -22,7 +24,7 @@ Makefile.am: lib_SOURCES += setlocale_null.c Include: - +#include "setlocale_null.h" or #include Link: $(LIB_SETLOCALE_NULL)