bug-gnulib
[Top][All Lists]
Advanced

[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)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]