getprogname: Add support for ASCII-compatible environments in z/OS.
authorBruno Haible <bruno@clisp.org>
Thu, 1 Jun 2023 14:18:02 +0000 (16:18 +0200)
committerBruno Haible <bruno@clisp.org>
Sun, 4 Jun 2023 19:15:51 +0000 (21:15 +0200)
Reported by Mike Fulton <mikefultonpersonal@gmail.com> in
<https://lists.gnu.org/archive/html/bug-gnulib/2023-05/msg00198.html>.

* lib/getprogname.c (getprogname): On z/OS, when compiling for an
ASCII-compatible environment, convert the result from EBCDIC to ASCII.

ChangeLog
lib/getprogname.c

index 8c0c188175ee4504712e2d99414e01915d0d4c0e..9cb9ad7ba789f98e66cf2b5e87c0e73683be9fb8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2023-06-01  Bruno Haible  <bruno@clisp.org>
+
+       getprogname: Add support for ASCII-compatible environments in z/OS.
+       Reported by Mike Fulton <mikefultonpersonal@gmail.com> in
+       <https://lists.gnu.org/archive/html/bug-gnulib/2023-05/msg00198.html>.
+       * lib/getprogname.c (getprogname): On z/OS, when compiling for an
+       ASCII-compatible environment, convert the result from EBCDIC to ASCII.
+
 2023-05-30  Nick Bowler  <nbowler@draconx.ca>
 
        readline: fix memory leak in replacement readline.
index 32c96043b0eeeefb5e60b4721852cc2d4c0d5296..a56261e13b45c84cb92df10bbc4b7934995cf9d8 100644 (file)
@@ -214,7 +214,19 @@ getprogname (void)
                 {
                   char *s = strdup (last_component (buf.ps_pathptr));
                   if (s)
-                    p = s;
+                    {
+#  if defined __XPLINK__ && __CHARSET_LIB == 1
+                      /* The compiler option -qascii is in use.
+                         https://makingdeveloperslivesbetter.wordpress.com/2022/01/07/is-z-os-ascii-or-ebcdic-yes/
+                         https://www.ibm.com/docs/en/zos/2.5.0?topic=features-macros-related-compiler-option-settings
+                         So, convert the result from EBCDIC to ASCII.
+                         https://www.ibm.com/docs/en/zos/2.5.0?topic=functions-e2a-s-convert-string-from-ebcdic-ascii */
+                      if (__e2a_s (s) == (size_t)-1)
+                        free (s);
+                      else
+#  endif
+                        p = s;
+                    }
                   break;
                 }
             }