summaryrefslogtreecommitdiff
path: root/lib/strfmon_l.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2017-09-23 12:22:17 +0200
committerBruno Haible <bruno@clisp.org>2017-09-23 17:29:45 +0200
commit19882ec15628386c45977ade98293e26791b7a15 (patch)
tree852f03b877af3fbd5048fbd4f3d431906c0cfdff /lib/strfmon_l.c
parentb2fc4a431927a6fbdd523bef93357134d9c489a9 (diff)
downloadgnulib-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.c64
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;
+}