diff options
author | Bruno Haible <bruno@clisp.org> | 2017-09-23 12:22:17 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2017-09-23 17:29:45 +0200 |
commit | 19882ec15628386c45977ade98293e26791b7a15 (patch) | |
tree | 852f03b877af3fbd5048fbd4f3d431906c0cfdff /lib/strfmon_l.c | |
parent | b2fc4a431927a6fbdd523bef93357134d9c489a9 (diff) | |
download | gnulib-19882ec15628386c45977ade98293e26791b7a15.tar.gz |
strfmon_l: New module.
* modules/strfmon_l: New file.
* lib/strfmon_l.c: New file.
* m4/strfmon_l.m4: New file.
* doc/posix-functions/strfmon_l.texi: Mention the new module.
* modules/strfmon_l-tests: New file.
* tests/test-strfmon_l.c: New file.
Diffstat (limited to 'lib/strfmon_l.c')
-rw-r--r-- | lib/strfmon_l.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/strfmon_l.c b/lib/strfmon_l.c new file mode 100644 index 0000000000..ac80d652d1 --- /dev/null +++ b/lib/strfmon_l.c @@ -0,0 +1,64 @@ +/* strfmon_l override. + Copyright (C) 2017 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, 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/>. */ + +#include <config.h> + +/* Specification. */ +#include <monetary.h> + +#include <locale.h> +#include <stdarg.h> + +#undef strfmon_l + +/* This override can only support a limited number of arguments. */ +#define MAX_ARG_WORDS 16 + +ssize_t +rpl_strfmon_l (char *s, size_t maxsize, locale_t locale, const char *format, ...) +{ + /* Work around glibc 2.23 bug + <https://sourceware.org/bugzilla/show_bug.cgi?id=19633>. */ + va_list argptr; + double args[MAX_ARG_WORDS]; + int i; + locale_t orig_locale; + ssize_t result; + + orig_locale = uselocale ((locale_t)0); + + if (uselocale (locale) == (locale_t)0) + /* errno is set. */ + return -1; + + va_start (argptr, format); + /* Hack: Consume more arguments than those that are actually given. */ + for (i = 0; i < MAX_ARG_WORDS; i++) + args[i] = va_arg (argptr, double); + + result = strfmon_l (s, maxsize, locale, format, + args[0], args[1], args[2], args[3], args[4], args[5], + args[6], args[7], args[8], args[9], args[10], args[11], + args[12], args[13], args[14], args[15]); + + va_end (argptr); + + if (uselocale (orig_locale) == (locale_t)0) + /* errno is set. */ + return -1; + + return result; +} |