]> Savannah Git Hosting - gnulib.git/commitdiff
xstrerror: New module.
authorBruno Haible <bruno@clisp.org>
Thu, 5 Oct 2023 16:01:05 +0000 (18:01 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 5 Oct 2023 20:07:13 +0000 (22:07 +0200)
* lib/xstrerror.h: New file.
* lib/xstrerror.c: New file.
* modules/xstrerror: New file.
* modules/strerror_r-posix (configure.ac): Update comment.

ChangeLog
lib/xstrerror.c [new file with mode: 0644]
lib/xstrerror.h [new file with mode: 0644]
modules/strerror_r-posix
modules/xstrerror [new file with mode: 0644]

index f09de5233ea527d9d1eccaee5950bbd246794c74..b8aefaf2222c864d5169b36a7014527d92d42edf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+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
diff --git a/lib/xstrerror.c b/lib/xstrerror.c
new file mode 100644 (file)
index 0000000..d00b996
--- /dev/null
@@ -0,0 +1,59 @@
+/* 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);
+}
diff --git a/lib/xstrerror.h b/lib/xstrerror.h
new file mode 100644 (file)
index 0000000..95beb1d
--- /dev/null
@@ -0,0 +1,45 @@
+/* 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 */
index 25f049365a5bc3009c18d05f9a6d6930bc169bbf..779a821e9ed6df58c144970814c79b675c9e838b 100644 (file)
@@ -19,7 +19,7 @@ AS_IF([test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1], [
   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:
diff --git a/modules/xstrerror b/modules/xstrerror
new file mode 100644 (file)
index 0000000..927d4c7
--- /dev/null
@@ -0,0 +1,26 @@
+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