* 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 <locale.h>.
+2019-12-22 Bruno Haible <bruno@clisp.org>
+
+ 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 <locale.h>.
+
2019-12-22 Bruno Haible <bruno@clisp.org>
strfmon_l: Fix test failures on FreeBSD and Cygwin.
#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@)
#include <string.h>
#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. */
#include <config.h>
/* Specification. */
-#include <locale.h>
+#include "setlocale_null.h"
#include <errno.h>
+#include <locale.h>
#include <stdlib.h>
#include <string.h>
#if defined _WIN32 && !defined __CYGWIN__
--- /dev/null
+/* 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 <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019. */
+
+#ifndef _SETLOCALE_NULL_H
+#define _SETLOCALE_NULL_H
+
+#include <stddef.h>
+
+#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 */
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
Depends-on:
locale
+snippet/arg-nonnull
configure.ac:
gl_FUNC_SETLOCALE_NULL
lib_SOURCES += setlocale_null.c
Include:
-<locale.h>
+#include "setlocale_null.h" or #include <locale.h>
Link:
$(LIB_SETLOCALE_NULL)