The last patch missed a prototype for xmalloc in vmsify.c, which
resulted in compiler warnings. Appended is another update which fixes
this. Again, the other previously submitted patches for VMS are not
affected.
>From ac639da6228ee4de086e317666df68803606731e Mon Sep 17 00:00:00 2001
From: Hartmut Becker <becker.isman...@freenet.de>
Date: Sun, 31 Aug 2014 19:11:08 +0200
Subject: [PATCH] Enhance/fix VMS setting of program name, MAKE/MAKE_COMMAND
 variables

* default.c, main.c, makeint.h, vmsfunctions.c: prefix argv[0] with
  "mcr " for MAKE/MAKE_COMMAND and set the program name
  to the image filename (without the .exe;version)
* vmsfunctions.c: remove obsolete code
* vmsify: use xmalloc
---
 default.c      |    3 +-
 main.c         |   14 ++--
 makeint.h      |    8 ++-
 vmsfunctions.c |  207 +++++++++++++++++++++++---------------------------------
 vmsify.c       |   23 ++++---
 5 files changed, 115 insertions(+), 140 deletions(-)

diff --git a/default.c b/default.c
index 48b899d..4eedff7 100644
--- a/default.c
+++ b/default.c
@@ -1,5 +1,5 @@
 /* Data base of default implicit rules for GNU Make.
-Copyright (C) 1988-2013 Free Software Foundation, Inc.
+Copyright (C) 1988-2014 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
@@ -332,7 +332,6 @@ static const char *default_variables[] =
     "CC", "cc",
 #endif
     "CD", "builtin_cd",
-    "MAKE", "make",
     "ECHO", "write sys$$output \"",
 #ifdef GCC_IS_NATIVE
     "C++", "gcc/plus",
diff --git a/main.c b/main.c
index 0508ae1..754f794 100644
--- a/main.c
+++ b/main.c
@@ -1,5 +1,5 @@
 /* Argument parsing and main program of GNU Make.
-Copyright (C) 1988-2013 Free Software Foundation, Inc.
+Copyright (C) 1988-2014 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
@@ -1161,11 +1161,7 @@ main (int argc, char **argv, char **envp)
     program = "make";
   else
     {
-#ifdef VMS
-      program = strrchr (argv[0], ']');
-#else
       program = strrchr (argv[0], '/');
-#endif
 #if defined(__MSDOS__) || defined(__EMX__)
       if (program == 0)
         program = strrchr (argv[0], '\\');
@@ -1195,7 +1191,11 @@ main (int argc, char **argv, char **envp)
         }
 #endif
       if (program == 0)
+#ifdef VMS
+        program = vms_progname(argv[0]);
+#else
         program = argv[0];
+#endif
       else
         ++program;
     }
@@ -1581,7 +1581,11 @@ main (int argc, char **argv, char **envp)
 
   /* The extra indirection through $(MAKE_COMMAND) is done
      for hysterical raisins.  */
+#ifdef VMS
+  define_variable_cname("MAKE_COMMAND", vms_command(argv[0]), o_default, 0);
+#else
   define_variable_cname ("MAKE_COMMAND", argv[0], o_default, 0);
+#endif
   define_variable_cname ("MAKE", "$(MAKE_COMMAND)", o_default, 1);
 
   if (command_variables != 0)
diff --git a/makeint.h b/makeint.h
index 5133cf1..f36065c 100644
--- a/makeint.h
+++ b/makeint.h
@@ -1,5 +1,5 @@
 /* Miscellaneous global declarations and portability cruft for GNU Make.
-Copyright (C) 1988-2013 Free Software Foundation, Inc.
+Copyright (C) 1988-2014 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
@@ -614,6 +614,12 @@ extern char *program;
 #else
 extern const char *program;
 #endif
+
+#ifdef VMS
+const char *vms_command(const char *argv0);
+const char *vms_progname(const char *argv0);
+#endif
+
 extern char *starting_directory;
 extern unsigned int makelevel;
 extern char *version_string, *remote_description, *make_host;
diff --git a/vmsfunctions.c b/vmsfunctions.c
index 1907e3a..6ed136c 100644
--- a/vmsfunctions.c
+++ b/vmsfunctions.c
@@ -1,5 +1,5 @@
 /* VMS functions
-Copyright (C) 1996-2013 Free Software Foundation, Inc.
+Copyright (C) 1996-2014 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
@@ -18,14 +18,14 @@ this program.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "debug.h"
 #include "job.h"
 
+#include <ctype.h>
+#include <string.h>
+
 #ifdef __DECC
 #include <starlet.h>
 #endif
-#include <descrip.h>
+
 #include <rms.h>
-#include <iodef.h>
-#include <atrdef.h>
-#include <fibdef.h>
 #include "vmsdir.h"
 
 #ifdef HAVE_VMSDIR_H
@@ -127,135 +127,100 @@ closedir (DIR *dir)
 }
 #endif /* compiled for OpenVMS prior to V7.x */
 
-char *
-getwd (char *cwd)
+/* Argv0 will be a full vms file specification, like
+   node$dka100:[utils.gnumake]make.exe;47
+   prefix it with "mcr " to make it a vms command, executable for DCL. */
+const char *
+vms_command(const char* argv0)
 {
-  static char buf[512];
-
-  if (cwd)
-    return (getcwd (cwd, 512));
-  else
-    return (getcwd (buf, 512));
+  size_t l = strlen(argv0) + 1;
+  char* s = xmalloc(l + 4);
+  memcpy(s, "mcr ", 4);
+  memcpy(s+4, argv0, l);
+  return s;
 }
 
-#if 0
-/*
- * Is this used? I don't see any reference, so I suggest to remove it.
- */
-int
-vms_stat (char *name, struct stat *buf)
+/* Argv0 aka argv[0] will be a full vms file specification, like
+   node$dka100:[utils.gnumake]make.exe;47, set up by the CRTL.
+   The vms progname should be ^^^^, the file name without
+   file type .exe and ;version.
+   Use sys$parse to get the name part of the file specification. That is
+   in the above example, pick up "make" and return a copy of that string.
+   If something goes wrong in sys$parse (unlikely, this is a VMS/CRTL supplied
+   file specification) or if there is an empty name part (not easy to produce,
+   but it is possible) just return "make".
+   Somes notes ...
+   NAM[L]$M_SYNCHK requests a syntax check, only.
+   NAM is for ODS2 names (shorter parts, output usually converted to UPPERCASE).
+   NAML is for ODS2/ODS5 names (longer parts, output unchanged).
+   NAM$M_NO_SHORT_UPCASE may not be available for older versions of VMS.
+   NAML is not available on older versions of VMS (NAML$C_BID not defined).
+   argv[0] on older versions of VMS (no extended parse style and no
+   CRTL feature DECC$ARGV_PARSE_STYLE) is always in lowercase. */
+const char *
+vms_progname(const char* argv0)
 {
   int status;
-  int i;
+  static struct FAB fab;
+  char *progname;
+  const char *fallback = "make";
 
-  static struct FAB Fab;
-  static struct NAM Nam;
-  static struct fibdef Fib;	/* short fib */
-  static struct dsc$descriptor FibDesc =
-  { sizeof (Fib), DSC$K_DTYPE_Z, DSC$K_CLASS_S, (char *) &Fib };
-  static struct dsc$descriptor_s DevDesc =
-  { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &Nam.nam$t_dvi[1] };
-  static char EName[NAM$C_MAXRSS];
-  static char RName[NAM$C_MAXRSS];
-  static struct dsc$descriptor_s FileName =
-  { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0 };
-  static struct dsc$descriptor_s string =
-  { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0 };
-  static unsigned long Rdate[2];
-  static unsigned long Cdate[2];
-  static struct atrdef Atr[] =
-  {
-#if defined(VAX)
-    /* Revision date */
-    { sizeof (Rdate), ATR$C_REVDATE, (unsigned int) &Rdate[0] },
-    /* Creation date */
-    { sizeof (Cdate), ATR$C_CREDATE, (unsigned int) &Cdate[0] },
+#ifdef NAML$C_BID
+  static char esa[NAML$C_MAXRSS];
+  static struct NAML naml;
 #else
-    /* Revision date */
-    { sizeof (Rdate), ATR$C_REVDATE, &Rdate[0] },
-    /* Creation date */
-    { sizeof (Cdate), ATR$C_CREDATE, &Cdate[0]},
+  static char esa[NAM$C_MAXRSS];
+  static struct NAM nam;
 #endif
-    { 0, 0, 0 }
-  };
-  static short int DevChan;
-  static short int iosb[4];
-
-  name = vmsify (name, 0);
-
-  /* initialize RMS structures, we need a NAM to retrieve the FID */
-  Fab = cc$rms_fab;
-  Fab.fab$l_fna = name;		/* name of file */
-  Fab.fab$b_fns = strlen (name);
-  Fab.fab$l_nam = &Nam;		/* FAB has an associated NAM */
-
-  Nam = cc$rms_nam;
-  Nam.nam$l_esa = EName;	/* expanded filename */
-  Nam.nam$b_ess = sizeof (EName);
-  Nam.nam$l_rsa = RName;	/* resultant filename */
-  Nam.nam$b_rss = sizeof (RName);
-
-  /* do $PARSE and $SEARCH here */
-  status = sys$parse (&Fab);
-  if (!(status & 1))
-    return -1;
 
-  DevDesc.dsc$w_length = Nam.nam$t_dvi[0];
-  status = sys$assign (&DevDesc, &DevChan, 0, 0);
-  if (!(status & 1))
-    return -1;
-
-  FileName.dsc$a_pointer = Nam.nam$l_name;
-  FileName.dsc$w_length = Nam.nam$b_name + Nam.nam$b_type + Nam.nam$b_ver;
-
-  /* Initialize the FIB */
-  for (i = 0; i < 3; i++)
-    {
-#ifndef __VAXC
-      Fib.fib$w_fid[i] = Nam.nam$w_fid[i];
-      Fib.fib$w_did[i] = Nam.nam$w_did[i];
+  fab = cc$rms_fab;
+  fab.fab$l_fna = (char*)argv0;
+  fab.fab$b_fns = strlen(argv0);
+
+#ifdef NAML$C_BID
+  fab.fab$l_naml = &naml;
+  naml = cc$rms_naml;
+  naml.naml$l_long_expand = esa;
+  naml.naml$l_long_expand_alloc = NAML$C_MAXRSS;
+  naml.naml$b_nop = NAML$M_SYNCHK;
+  naml.naml$l_input_flags = NAML$M_NO_SHORT_OUTPUT;
 #else
-      Fib.fib$r_fid_overlay.fib$w_fid[i] = Nam.nam$w_fid[i];
-      Fib.fib$r_did_overlay.fib$w_did[i] = Nam.nam$w_did[i];
+  fab.fab$l_nam = &nam;
+  nam = cc$rms_nam;
+  nam.nam$l_esa = esa;
+  nam.nam$b_ess = NAM$C_MAXRSS;
+# ifdef NAM$M_NO_SHORT_UPCASE
+  nam.nam$b_nop = NAM$M_SYNCHK | NAM$M_NO_SHORT_UPCASE;
+# else
+  nam.nam$b_nop = NAM$M_SYNCHK;
+# endif
 #endif
-    }
 
-  status = sys$qiow (0, DevChan, IO$_ACCESS, &iosb, 0, 0,
-		     &FibDesc, &FileName, 0, 0, &Atr, 0);
-  sys$dassgn (DevChan);
-  if (!(status & 1))
-    return -1;
-  status = iosb[0];
+  status = sys$parse(&fab);
   if (!(status & 1))
-    return -1;
-
-  status = stat (name, buf);
-  if (status)
-    return -1;
-
-  buf->st_mtime = ((Rdate[0] >> 24) & 0xff) + ((Rdate[1] << 8) & 0xffffff00);
-  buf->st_ctime = ((Cdate[0] >> 24) & 0xff) + ((Cdate[1] << 8) & 0xffffff00);
-
-  return 0;
-}
+    return fallback;
+
+#ifdef NAML$C_BID
+  if (naml.naml$l_long_name_size == 0)
+    return fallback;
+  progname = xmalloc(naml.naml$l_long_name_size + 1);
+  memcpy(progname, naml.naml$l_long_name, naml.naml$l_long_name_size);
+  progname[naml.naml$l_long_name_size] = '\0';
+#else
+  if (nam.nam$b_name == 0)
+    return fallback;
+  progname = xmalloc(nam.nam$b_name + 1);
+# ifdef NAM$M_NO_SHORT_UPCASE
+  memcpy(progname, nam.nam$l_name, nam.nam$b_name);
+# else
+    {
+      int i;
+      for (i = 0; i < nam.nam$b_name; i++)
+        progname[i] = tolower(nam.nam$l_name[i]);
+    }
+# endif
+  progname[nam.nam$b_name] = '\0';
 #endif
 
-char *
-cvt_time (unsigned long tval)
-{
-  static long int date[2];
-  static char str[27];
-  static struct dsc$descriptor date_str =
-  { 26, DSC$K_DTYPE_T, DSC$K_CLASS_S, str };
-
-  date[0] = (tval & 0xff) << 24;
-  date[1] = ((tval >> 8) & 0xffffff);
-
-  if ((date[0] == 0) && (date[1] == 0))
-    return ("never");
-
-  sys$asctim (0, &date_str, date, 0);
-  str[26] = '\0';
-
-  return (str);
+  return progname;
 }
diff --git a/vmsify.c b/vmsify.c
index c87d68c..cc90485 100644
--- a/vmsify.c
+++ b/vmsify.c
@@ -22,6 +22,8 @@ this program.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <string.h>
 #include <ctype.h>
 
+#include "makeint.h"
+
 #if VMS
 #include <unixlib.h>
 #include <stdlib.h>
@@ -137,9 +139,7 @@ trnlog (const char *name)
     }
   reslt[resltlen] = '\0';
 
-  s = malloc (resltlen+1);
-  if (s == 0)
-    return "";
+  s = xmalloc (resltlen+1);
   strcpy (s, reslt);
   return s;
 }
@@ -221,10 +221,11 @@ vmsify (const char *name, int type)
    max 39 filetype
    max 5 version
 */
-#define MAXPATHLEN 512
+/* todo: VMSMAXPATHLEN is defined for ODS2 names: it needs to be adjusted. */
+#define VMSMAXPATHLEN 512
 
   enum namestate nstate;
-  static char vmsname[MAXPATHLEN+1];
+  static char vmsname[VMSMAXPATHLEN+1];
   const char *fptr;
   const char *t;
   char *vptr;
@@ -402,9 +403,9 @@ vmsify (const char *name, int type)
 	      fptr++;
 	    if (*fptr == 0)		/* just // */
 	      {
-		char cwdbuf[MAXPATHLEN+1];
+		char cwdbuf[VMSMAXPATHLEN+1];
 
-		s1 = getcwd(cwdbuf, MAXPATHLEN);
+		s1 = getcwd(cwdbuf, VMSMAXPATHLEN);
 		if (s1 == 0)
 		  {
                     vmsname[0] = '\0';
@@ -796,9 +797,9 @@ vmsify (const char *name, int type)
 	      }
 	    {					/* got '..' or '../' */
               char *vp;
-	      char cwdbuf[MAXPATHLEN+1];
+	      char cwdbuf[VMSMAXPATHLEN+1];
 
-	      vp = getcwd(cwdbuf, MAXPATHLEN);
+	      vp = getcwd(cwdbuf, VMSMAXPATHLEN);
 	      if (vp == 0)
 		{
                   vmsname[0] = '\0';
@@ -856,9 +857,9 @@ vmsify (const char *name, int type)
 
 	    {
               char *vp;
-	      char cwdbuf[MAXPATHLEN+1];
+	      char cwdbuf[VMSMAXPATHLEN+1];
 
-	      vp = getcwd(cwdbuf, MAXPATHLEN);
+	      vp = getcwd(cwdbuf, VMSMAXPATHLEN);
 	      if (vp == 0)
 		{
                   vmsname[0] = '\0';
-- 
1.7.10.4

_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to