* lib/xstrerror.h: New file.
* lib/xstrerror.c: New file.
* modules/xstrerror: New file.
* modules/strerror_r-posix (configure.ac): Update comment.
+2023-10-05 Bruno Haible <bruno@clisp.org>
+
+ xstrerror: New module.
+ * lib/xstrerror.h: New file.
+ * lib/xstrerror.c: New file.
+ * modules/xstrerror: New file.
+ * modules/strerror_r-posix (configure.ac): Update comment.
+
2023-10-05 Paul Eggert <eggert@cs.ucla.edu>
isnan: slightly simplify configuration
--- /dev/null
+/* Return diagnostic string based on error code.
+ Copyright (C) 2023 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xstrerror.h"
+
+#include <string.h>
+
+#include "xvasprintf.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(msgid) gettext (msgid)
+
+char *
+xstrerror (const char *message, int errnum)
+{
+ /* Get the internationalized description of errnum,
+ in a stack-allocated buffer. */
+ const char *errdesc;
+ char errbuf[1024];
+#if !GNULIB_STRERROR_R_POSIX && STRERROR_R_CHAR_P
+ errdesc = strerror_r (errnum, errbuf, sizeof errbuf);
+#else
+ if (strerror_r (errnum, errbuf, sizeof errbuf) == 0)
+ errdesc = errbuf;
+ else
+ errdesc = NULL;
+#endif
+ if (errdesc == NULL)
+ errdesc = _("Unknown system error");
+
+ if (message != NULL)
+ {
+ /* Allow e.g. French translators to insert a space before the colon. */
+ char *result = xasprintf (_("%s: %s"), message, errdesc);
+ if (result == NULL)
+ /* Probably a buggy translation. Use a safe fallback. */
+ result = xasprintf ("%s%s%s", message, ": ", errdesc);
+ return result;
+ }
+ else
+ return xstrdup (errdesc);
+}
--- /dev/null
+/* Return diagnostic string based on error code.
+ Copyright (C) 2023 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/>. */
+
+#ifndef _XSTRERROR_H
+#define _XSTRERROR_H
+
+/* This file uses _GL_ATTRIBUTE_MALLOC, _GL_ATTRIBUTE_RETURNS_NONNULL. */
+#if !_GL_CONFIG_H_INCLUDED
+ #error "Please include config.h first."
+#endif
+
+/* Get 'free'. */
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return a freshly allocated diagnostic string that contains a given string
+ MESSAGE and the (internationalized) description of the error code ERRNUM.
+ Upon [ENOMEM] memory allocation error, call xalloc_die.
+
+ This function is multithread-safe. */
+extern char *xstrerror (const char *message, int errnum)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+ _GL_ATTRIBUTE_RETURNS_NONNULL;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _XSTRERROR_H */
gl_PREREQ_STRERROR_R
])
gl_STRING_MODULE_INDICATOR([strerror_r])
-dnl For the modules argp, error.
+dnl For the modules argp, error, xstrerror.
gl_MODULE_INDICATOR([strerror_r-posix])
Makefile.am:
--- /dev/null
+Description:
+xstrerror() function: return diagnostic string based on error code.
+Multithread-safe. With out-of-memory checking.
+
+Files:
+lib/xstrerror.h
+lib/xstrerror.c
+
+Depends-on:
+strerror_r-posix
+xalloc
+xvasprintf
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += xstrerror.c
+
+Include:
+"xstrerror.h"
+
+License:
+GPL
+
+Maintainer:
+all