[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: new module 'setlocale-null'
From: |
Bruno Haible |
Subject: |
Re: new module 'setlocale-null' |
Date: |
Sun, 22 Dec 2019 19:35:40 +0100 |
User-agent: |
KMail/5.1.3 (Linux/4.4.0-166-generic; KDE/5.18.0; x86_64; ; ) |
While for most package, it is a convenience to have the setlocale_null
function declared in <locale.h>, for gettext's libintl it's better to
have it declared in a separate header file - because libintl does not use
the gnulib-overridden locale.h file.
2019-12-22 Bruno Haible <address@hidden>
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>.
diff --git a/lib/locale.in.h b/lib/locale.in.h
index f4eccc2..841bf9b 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 5e51201..180caef 100644
--- a/lib/localename.c
+++ b/lib/localename.c
@@ -34,6 +34,7 @@
#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. */
diff --git a/lib/setlocale_null.c b/lib/setlocale_null.c
index c201257..d676630 100644
--- a/lib/setlocale_null.c
+++ b/lib/setlocale_null.c
@@ -19,9 +19,10 @@
#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__
diff --git a/lib/setlocale_null.h b/lib/setlocale_null.h
new file mode 100644
index 0000000..de58e80
--- /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 <https://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <address@hidden>, 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 */
diff --git a/modules/setlocale-null b/modules/setlocale-null
index 17e8d9d..5240369 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:
-<locale.h>
+#include "setlocale_null.h" or #include <locale.h>
Link:
$(LIB_SETLOCALE_NULL)
- new module 'setlocale-null', Bruno Haible, 2019/12/15
- setlocale-null: remove need for -lpthread on musl libc, *BSD, Haiku, Bruno Haible, 2019/12/16
- Re: new module 'setlocale-null', Bruno Haible, 2019/12/18
- Re: new module 'setlocale-null',
Bruno Haible <=
- Re: new module 'setlocale-null', Bruno Haible, 2019/12/23
- Re: new module 'setlocale-null', Bruno Haible, 2019/12/24