Commit ab3c9473 authored by Bruno Haible's avatar Bruno Haible
Browse files

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>.
parent 74528fe2
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.
......@@ -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@)
......
......@@ -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. */
......
......@@ -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__
......
/* 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 */
......@@ -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)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment