aboutsummaryrefslogtreecommitdiffstats
path: root/vms
diff options
context:
space:
mode:
Diffstat (limited to 'vms')
-rw-r--r--vms/ChangeLog50
-rw-r--r--vms/config_h.com1652
-rw-r--r--vms/descrip.mms57
-rw-r--r--vms/fcntl.h10
-rw-r--r--vms/gawk.hlp26
-rw-r--r--vms/gawk_ident.com21
-rw-r--r--vms/gawkmisc.vms459
-rw-r--r--vms/generate_config_vms_h_gawk.com284
-rw-r--r--vms/vms-conf.h678
-rw-r--r--vms/vms-notes1140
-rw-r--r--vms/vms.h24
-rw-r--r--vms/vms_args.c22
-rw-r--r--vms/vms_cli.c28
-rw-r--r--vms/vms_crtl_init.c470
-rw-r--r--vms/vms_fwrite.c12
-rw-r--r--vms/vms_gawk.c14
-rw-r--r--vms/vms_misc.c27
-rw-r--r--vms/vms_popen.c10
-rw-r--r--vms/vmsbuild.com51
-rw-r--r--vms/vmstest.com47
20 files changed, 4273 insertions, 809 deletions
diff --git a/vms/ChangeLog b/vms/ChangeLog
index f8344654..6cc5afb7 100644
--- a/vms/ChangeLog
+++ b/vms/ChangeLog
@@ -1,3 +1,53 @@
+2013-12-20 John E. Malmberg <wb8tyw@qsl.net>
+
+ * descrip.mms: Set CC exact symbol names, cleanup repository.
+ * generate_config_vms_h_gawk.com: Use correct VMS exit codes.
+ * vmsbuild.com: Set CC exact symbol names.
+ * vmstest.com: Extract correct Unix status for failed tests.
+ * vms.h, vms_args.c, vms_cli.c, vms_fwrite.c, vms_gawk.c,
+ vms_misc.c, vms_popen.c: Correct case of function names.
+ * vms.hlp: Updated with new information about exit codes.
+
+2013-12-10 John E. Malmberg <wb8tyw@qsl.net>
+
+ * gawkmisc.vms: Add lots of includes.
+ (sys_trnlnm): New function.
+ (gawk_name): Improved.
+ (os_arg_fixup): Fix up time zone.
+
+2013-12-08 John E. Malmberg <wb8tyw@qsl.net>
+
+ * descrip.mms: Add IEEE float for non-vax.
+ Add vms_crtl_init.c.
+ Remove code to generate version.c
+ * generate_config_vms_h_gawk.com (__attribute__): Removed
+ definition from here.
+ * version_c.com: removed no longer used.
+ * vmsbuild.com: Add IEEE float for non-vax.
+ Add vms_crtl_init.c
+ Remove code to generate version.c
+ Changes that should have been in the previous commit.
+ * vms_misc.c (vms_open): VMS CRTL for 8.3 Alpha is setting
+ errno to ENOENT instead of EISDIR for ".".
+
+2013-12-05 John E. Malmberg <wb8tyw@qsl.net>
+
+ * New config_h.com to generate config.h
+ * New gawk_ident.com generates ident line for link option file.
+ * Add version_c.com to create version.c from version.in.
+ * Remove fcntl.h covering up real fcntl.h. If an older version
+ of VMS needs this file, the build procedure should be updated
+ to generate it from a template.
+ * descrip.mms: Use command files to generate files based
+ on same input files as a Linux build.
+ * gawkmisc.vms (files_are_same): support _USE_STD_STAT for VMS 8.x.
+ * generate_config_vms_h_gawk.com: Generates a helper file
+ config_vms.h to cover issues config_h.com can not handle.
+ * vmsbuild.com: Use command files to generate files based
+ on the same input files as a Linux build.
+ * vms_misc.c (vms_open): VMS CRTL setting errno to ENOENT where
+ it should be set to EMFILE.
+
2013-12-06 Arnold D. Robbins <arnold@skeeve.com>
* vms-conf.h (__attribute__): Removed definition from here; fixed
diff --git a/vms/config_h.com b/vms/config_h.com
new file mode 100644
index 00000000..406e1266
--- /dev/null
+++ b/vms/config_h.com
@@ -0,0 +1,1652 @@
+$! File: config_h.com
+$!
+$! $Id: config_h.com,v 1.1.1.1 2012/12/02 19:25:21 wb8tyw Exp $
+$!
+$! This procedure attempts to figure out how to build a config.h file
+$! for the current project.
+$!
+$! The P1 parameter of "NOBUILTINS" inhibits the default #include <builtins.h>
+$! that is normally added. This include can cause side effects if
+$! special VMS compiler settings are used.
+$!
+$! The CONFIGURE shell script will be examined for hints and a few symbols
+$! but most of the tests will not produce valid results on OpenVMS. Some
+$! will produce false positives and some will produce false negatives.
+$!
+$! It is easier to just read the config.h_in file and make up tests based
+$! on what is in it!
+$!
+$! This file will create an empty config_vms.h file if one does not exist.
+$! The config_vms.h is intended for manual edits to handle things that
+$! this procedure can not.
+$!
+$! The config_vms.h will be invoked by the resulting config.h file.
+$!
+$! This procedure knows about the DEC C RTL on the system it is on.
+$! Future versions may be handle the GNV, the OpenVMS porting library,
+$! and others.
+$!
+$! This procedure may not guess the options correctly for all architectures,
+$! and is a work in progress.
+$!
+$! Copyright 2011, John Malmberg
+$!
+$! Permission to use, copy, modify, and/or distribute this software for any
+$! purpose with or without fee is hereby granted, provided that the above
+$! copyright notice and this permission notice appear in all copies.
+$!
+$! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+$! WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+$! MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+$! ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+$! WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+$! ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+$! OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+$!
+$! 15-Jan-2001 J. Malmberg Original
+$! 29-Apr-2001 J. Malmberg Also look for config.*in* in a [.include]
+$! subdirectory
+$! 30-Apr-2001 J. Malmberg Update for SAMBA checks
+$! 09-Apr-2005 J. Malmberg Update for RSYNC and large file.
+$! 29-Sep-2011 J. Malmberg Update for Bash 4.2
+$! 01-Mar-2012 J. Malmberg Warn about getcwd(0,0)
+$! 21-Dec-2012 J. Malmberg Update for gawk
+$!============================================================================
+$!
+$ss_normal = 1
+$ss_abort = 44
+$ss_control_y = 1556
+$status = ss_normal
+$on control_y then goto control_y
+$on warning then goto general_error
+$!
+$! Some information for writing timestamps to created files
+$!----------------------------------------------------------
+$my_proc = f$environment("PROCEDURE")
+$my_proc_file = f$parse(my_proc,,,"NAME") + f$parse(my_proc,,,"TYPE")
+$tab[0,8] = 9
+$datetime = f$element(0,".",f$cvtime(,"ABSOLUTE","DATETIME"))
+$username = f$edit(f$getjpi("","USERNAME"),"TRIM")
+$!
+$pid = f$getjpi("","PID")
+$tfile1 = "SYS$SCRATCH:config_h_temp1_''pid'.TEMP"
+$dchfile = "SYS$SCRATCH:config_h_decc_''pid'.TEMP"
+$configure_script = "SYS$SCRATCH:configure_script_''pid'.TEMP"
+$!
+$! Get the system type
+$!----------------------
+$arch_type = f$getsyi("arch_type")
+$!
+$! Does config_vms.h exist?
+$!-------------------------
+$update_config_vms = 0
+$file = f$search("sys$disk:[]config_vms.h")
+$if file .nes. ""
+$then
+$ write sys$output "Found existing custom file ''file'."
+$else
+$ update_config_vms = 1
+$ write sys$output "Creating new sys$disk:[]config_vms.h for you."
+$ gosub write_config_vms
+$endif
+$!
+$!
+$! On some platforms, DCL search has problems with searching a file
+$! on a NFS mounted volume. So copy it to sys$scratch:
+$!
+$if f$search(configure_script) .nes. "" then delete 'configure_script';*
+$copy PRJ_ROOT:configure 'configure_script'
+$!
+$!
+$! Write out the header
+$!----------------------
+$gosub write_config_h_header
+$!
+$!
+$!
+$! config.h.in could have at least five different names depending
+$! on how it was transferred to OpenVMS
+$!------------------------------------------------------------------
+$cfile = f$search("sys$disk:[]config.h.in")
+$if cfile .eqs. ""
+$then
+$ cfile = f$search("sys$disk:[]config.h_in")
+$ if cfile .eqs. ""
+$ then
+$ cfile = f$search("sys$disk:[]configh.in")
+$ if cfile .eqs. ""
+$ then
+$ cfile = f$search("sys$disk:[]config__2eh.in")
+$ if cfile .eqs. ""
+$ then
+$ cfile = f$search("sys$disk:[]config.h__2ein")
+$ endif
+$ endif
+$ endif
+$endif
+$if f$trnlnm("PRJ_INCLUDE") .nes. ""
+$then
+$ cfile = f$search("PRJ_INCLUDE:config.h.in")
+$ if cfile .eqs. ""
+$ then
+$ cfile = f$search("PRJ_INCLUDE:config.h_in")
+$ if cfile .eqs. ""
+$ then
+$ cfile = f$search("PRJ_INCLUDE:config__2eh.in")
+$ if cfile .eqs. ""
+$ then
+$ cfile = f$search("PRJ_INCLUDE:config__2eh.in")
+$ if cfile .eqs. ""
+$ then
+$ cfile = f$search("PRJ_INCLUDE:config.h__2ein")
+$ endif
+$ endif
+$ endif
+$ endif
+$endif
+$if cfile .eqs. ""
+$then
+$ write sys$output "Can not find sys$disk:config.h.in"
+$ line_out = "Looked for config.h.in, config.h_in, configh.in, "
+$ line_out = line_out + "config__2eh.in, "config.h__2ein"
+$ write/symbol sys$output line_out
+$ if f$trnlnm("PRJ_INCLUDE") .nes. ""
+$ then
+$ write sys$output "Also looked in PRJ_INCLUDE: for these files."
+$ endif
+$!
+$ write tf ""
+$ write tf -
+ " /* Could not find sys$disk:config.h.in */"
+$ write tf -
+ " /* Looked also for config.h_in, configh.in, config__2eh.in, */"
+$ write tf -
+ " /* config.h__2ein */"
+$ if f$trnlnm("PRJ_INCLUDE") .nes. ""
+$ then
+$ write tf -
+ " /* Also looked in PRJ_INCLUDE: for these files. */"
+$ endif
+$ write tf -
+ "/*--------------------------------------------------------------*/
+$ write tf ""
+$ goto write_tail
+$endif
+$!
+$!
+$! Locate the DECC libraries in use
+$!-----------------------------------
+$decc_rtldef = f$parse("decc$rtldef","sys$library:.tlb;0")
+$decc_shr = f$parse("decc$shr","sys$share:.exe;0")
+$!
+$! Dump the DECC header names into a file
+$!----------------------------------------
+$if f$search(dchfile) .nes. "" then delete 'dchfile';*
+$if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$define/user sys$output 'tfile1'
+$library/list 'decc_rtldef'
+$open/read/error=rtldef_loop1_end tf1 'tfile1'
+$open/write/error=rtldef_loop1_end tf2 'dchfile'
+$rtldef_loop1:
+$ read/end=rtldef_loop1_end tf1 line_in
+$ line_in = f$edit(line_in,"TRIM,COMPRESS")
+$ key1 = f$element(0," ",line_in)
+$ key2 = f$element(1," ",line_in)
+$ if key1 .eqs. " " .or. key1 .eqs. "" then goto rtldef_loop1
+$ if key2 .nes. " " .and. key2 .nes. "" then goto rtldef_loop1
+$ write tf2 "|",key1,"|"
+$ goto rtldef_loop1
+$rtldef_loop1_end:
+$if f$trnlnm("tf1","lnm$process",,"SUPERVISOR") .nes. "" then close tf1
+$if f$trnlnm("tf2","lnm$process",,"SUPERVISOR") .nes. "" then close tf2
+$if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$!
+$!
+$! Now calculate what should be in the file from reading
+$! config.h.in and CONFIGURE.
+$!---------------------------------------------------------------
+$open/read inf 'cfile'
+$do_comment = 0
+$if_block = 0
+$cfgh_in_loop1:
+$!set nover
+$ read/end=cfgh_in_loop1_end inf line_in
+$ xline = f$edit(line_in,"TRIM,COMPRESS")
+$!
+$! Blank line handling
+$!---------------------
+$ if xline .eqs. ""
+$ then
+$ write tf ""
+$ goto cfgh_in_loop1
+$ endif
+$ xlen = f$length(xline)
+$ key = f$extract(0,2,xline)
+$!
+$! deal with comments by copying exactly
+$!-----------------------------------------
+$ if (do_comment .eq. 1) .or. (key .eqs. "/*")
+$ then
+$ do_comment = 1
+$ write tf line_in
+$ key = f$extract(xlen - 2, 2, xline)
+$ if key .eqs. "*/" then do_comment = 0
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! Some quick parsing
+$!----------------------
+$ keyif = f$extract(0,3,xline)
+$ key1 = f$element(0," ",xline)
+$ key2 = f$element(1," ",xline)
+$ key2a = f$element(0,"_",key2)
+$ key2b = f$element(1,"_",key2)
+$ key2_len = f$length(key2)
+$ key2_h = f$extract(key2_len - 2, 2, key2)
+$ key2_t = f$extract(key2_len - 5, 5, key2)
+$ if key2_t .eqs. "_TYPE" then key2_h = "_T"
+$ key64 = 0
+$ if f$locate("64", xline) .lt. xlen then key64 = 1
+$!
+$!write sys$output "xline = ''xline'"
+$!
+$! Comment out this section of the ifblock
+$!-----------------------------------------
+$ if if_block .ge. 3
+$ then
+$ write tf "/* ", xline, " */"
+$ if keyif .eqs. "#en" then if_block = 0
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! Handle the end of an ifblock
+$!-------------------------------
+$ if keyif .eqs. "#en"
+$ then
+$ write tf xline
+$ if_block = 0
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key1 .eqs. "#ifndef"
+$ then
+$! Manual check for _ALL_SOURCE on AIX error
+$!-----------------------------------------------
+$ if key2 .eqs. "_ALL_SOURCE"
+$ then
+$ write tf "/* ", xline, " */"
+$!
+$! Ignore the rest of the block
+$!--------------------------------------
+$ if_block = 3
+$ goto cfgh_in_loop1
+$ endif
+$ endif
+$!
+$!
+$! Default action for an #if/#else/#endif
+$!------------------------------------------
+$ if keyif .eqs. "#if" .or. keyif .eqs. "#el"
+$ then
+$ if_block = 1
+$ write tf xline
+$ goto cfgh_in_loop1
+$ endif
+$!
+$!
+$! Process "normal?" stuff
+$!---------------------------
+$ if key1 .eqs. "#undef"
+$ then
+$ key2c = f$element(2, "_", key2)
+$ if (key2c .eqs. "_") .or. (key2c .eqs. "H") then key2c = ""
+$ key2d = f$element(3, "_", key2)
+$ if (key2d .eqs. "_") .or. (key2d .eqs. "H") then key2d = ""
+$ key2e = f$element(4, "_", key2)
+$ if (key2e .eqs. "_") .or. (key2e .eqs. "H") then key2e = ""
+$ if key2d .eqs. "T"
+$ then
+$ if key2e .eqs. "TYPE"
+$ then
+$ key2_h = "_T"
+$ key2d = ""
+$ endif
+$ endif
+$!
+$ double_under = 0
+$!
+$ if key2 .eqs. "bits16_t"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' short"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "u_bits16_t"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' unsigned short"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "bits32_t"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' int"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "u_bits32_t"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' unsigned int"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "intmax_t"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#ifdef __VAX"
+$ write tf "#define ''key2' long"
+$ write tf "#else"
+$ write tf "#define ''key2' long long"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "uintmax_t"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#ifdef __VAX"
+$ write tf "#define ''key2' unsigned long"
+$ write tf "#else"
+$ write tf "#define ''key2' unsigned long long"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "socklen_t"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' int"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "GETGROUPS_T"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' gid_t"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_SYS_SIGLIST"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 0"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_SYS_ERRLIST"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_STRUCT_DIRENT_D_INO"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! ! The header files have this information, however
+$! ! The ioctl() call only works on sockets.
+$! if key2 .eqs. "FIONREAD_IN_SYS_IOCTL"
+$! then
+$! write tf "#ifndef ''key2'"
+$! write tf "#define ''key2' 1"
+$! write tf "#endif"
+$! goto cfgh_in_loop1
+$! endif
+$!
+$! ! The header files have this information, however
+$! ! The ioctl() call only works on sockets.
+$! if key2 .eqs. "GWINSZ_IN_SYS_IOCTL"
+$! then
+$! write tf "#ifndef ''key2'"
+$! write tf "#define ''key2' 1"
+$! write tf "#endif"
+$! goto cfgh_in_loop1
+$! endif
+$!
+$! ! The header files have this information, however
+$! ! The ioctl() call only works on sockets.
+$! if key2 .eqs. "STRUCT_WINSIZE_IN_SYS_IOCTL"
+$! then
+$! write tf "#ifndef ''key2'"
+$! write tf "#define ''key2' 0"
+$! write tf "#endif"
+$! goto cfgh_in_loop1
+$! endif
+$!
+$ if key2 .eqs. "HAVE_STRUCT_TM_TM_ZONE"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_TM_ZONE"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_TIMEVAL"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_TZNAME"
+$ then
+$ write tf "#if __CRTL_VER >= 70000000"
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "WEXITSTATUS_OFFSET"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 2"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_GETPW_DECLS"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_CONFSTR"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_PRINTF"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_SBRK"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_STRSIGNAL"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 0"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2a .eqs. "HAVE_DECL_STRTOLD"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 0"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_STRTOIMAX"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 0"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_STRTOL"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_STRTOLL"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_STRTOUL"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_STRTOULL"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_STRTOUMAX"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 0"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "GETPGRP_VOID"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "NAMED_PIPES_MISSING"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "OPENDIR_NOT_ROBUST"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "PGRP_PIPE"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "CAN_REDEFINE_GETENV"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_PRINTF_A_FORMAT"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "CTYPE_NON_ASCII"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_LANGINFO_CODESET"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_LC_MESSAGES"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! This wants execve() to do this automagically to pass.
+$! if key2 .eqs. "HAVE_HASH_BANG_EXEC"
+$! then
+$! write tf "#ifndef ''key2'"
+$! write tf "#define ''key2' 1"
+$! write tf "#endif"
+$! goto cfgh_in_loop1
+$! endif
+$!
+$ if key2 .eqs. "ICONV_CONST"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2'"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "VOID_SIGHANDLER"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_POSIX_SIGNALS"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "UNUSABLE_RT_SIGNALS"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2a .eqs. "HAVE_DECL_FPURGE"
+$ then
+$ write tf "#ifndef ''key2a'"
+$ write tf "#define ''key2a' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_DECL_SETREGID"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_POSIX_SIGSETJMP"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "HAVE_LIBDL"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "STRCOLL_BROKEN"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2 .eqs. "DUP_BROKEN"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! This is for a test that getcwd(0,0) works.
+$! It does not on VMS.
+$!--------------------------
+$ if key2 .eqs. "GETCWD_BROKEN"
+$ then
+$ write sys$output ""
+$ write sys$output -
+ "%CONFIG_H-I-NONPORT, ''key2' being tested for!"
+$ write sys$output -
+ "-CONFIG_H-I-GETCWD, GETCWD(0,0) does not work on VMS."
+$ write sys$output -
+ "-CONFIG_H-I-GETCWD2, Work around hack probably required."
+$ write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$ if update_config_vms
+$ then
+$ open/append tfcv sys$disk:[]config_vms.h
+$ write tfcv ""
+$ write tfcv -
+ "/* Check config.h for use of ''key2' settings */"
+$ write tfcv ""
+$ close tfcv
+$ endif
+$
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2a .eqs. "HAVE" .or. key2a .eqs. "STAT"
+$ then
+$!
+$! Process extra underscores
+$!------------------------------------
+$ if f$locate("HAVE___", key2) .lt. key2_len
+$ then
+$ key2b = "__" + key2d
+$ key2d = ""
+$ double_under = 1
+$ else
+$ if f$locate("HAVE__", key2) .lt. key2_len
+$ then
+$ key2b = "_" + key2c
+$ key2c = ""
+$ double_under = 1
+$ endif
+$ endif
+$!
+$ if key2_h .eqs. "_H"
+$ then
+$!
+$! Looking for a header file
+$!---------------------------------------
+$ headf = key2b
+$ if key2c .nes. "" then headf = headf + "_" + key2c
+$ if key2d .nes. "" then headf = headf + "_" + key2d
+$!
+$! (key2b .eqs. "READLINE")
+$!
+$! Some special parsing
+$!------------------------------------------
+$ if (key2b .eqs. "SYS") .or. (key2b .eqs. "ARPA") .or. -
+ (key2b .eqs. "NET") .or. (key2b .eqs. "NETINET")
+$ then
+$ if key2c .nes. ""
+$ then
+$ headf = key2c
+$ if key2d .nes. "" then headf = key2c + "_" + key2d
+$ endif
+$ endif
+$!
+$! And of course what's life with out some special cases
+$!--------------------------------------------------------------------
+$ if key2b .eqs. "FILE"
+$ then
+$ write sys$output ""
+$ write sys$output -
+ "%CONFIG_H-I-NONPORT, ''key2' being asked for!"
+$ write sys$output -
+ "-CONFIG_H-I-FILE_OLD, file.h will not be configured as is obsolete!"
+$ write sys$output -
+ "-CONFIG_H_I-FCNTL_NEW, "Expecting fcntl.h to be configured instead!"
+$ write sys$output -
+ "-CONFIG_H_I-FCNTL_CHK, "Unable to verify at this time!"
+$ write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$!
+$ if update_config_vms
+$ then
+$ open/append tfcv sys$disk:[]config_vms.h
+$ write tfcv ""
+$ write tfcv -
+ "/* Check config.h for use of fcntl.h instead of file.h */"
+$ write tfcv ""
+$ close tfcv
+$ endif
+$ endif
+$!
+$! Now look it up in the DEC C RTL
+$!---------------------------------------------
+$ define/user sys$output nl:
+$ define/user sys$error nl:
+$ search/output=nl: 'dchfile' |'headf'|/exact
+$ if '$severity' .eq. 1
+$ then
+$ if key64 then write tf "#ifndef __VAX"
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$if p2 .nes. "" then write sys$output "''dchfile' - #define ''key2' 1"
+$ write tf "#endif"
+$ if key64 then write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ else
+$!
+$! Looking for a routine or a symbol
+$!------------------------------------------------
+$ if key2c .eqs. "MACRO"
+$ then
+$ if (key2b .eqs. "FILE") .or. (key2b .eqs. "DATE") -
+ .or. (key2b .eqs. "LINE") .or. (key2b .eqs. "TIME")
+$ then
+$ write tf "#ifndef HAVE_''key2b'"
+$ write tf "#define HAVE_''key2b' 1"
+$ write tf "#endif"
+$ endif
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! Special false tests
+$!-------------------------------------
+$ if double_under
+$ then
+$ if key2b .eqs. "_FCNTL" .or. key2b .eqs. "__FCNTL"
+$ then
+$ write tf "/* #undef HAVE_''key2b' */"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2b .eqs. "_STAT" .or. key2b .eqs. "__STAT"
+$ then
+$ write tf "/* #undef HAVE_''key2b' */"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if key2b .eqs. "_READ" .or. key2b .eqs. "__READ"
+$ then
+$ write tf "/* #undef HAVE_''key2b' */"
+$ goto cfgh_in_loop1
+$ endif
+$ endif
+$!
+$ keysym = key2b
+$ if key2c .nes. "" then keysym = keysym + "_" + key2c
+$ if key2d .nes. "" then keysym = keysym + "_" + key2d
+$ if key2e .nes. "" then keysym = keysym + "_" + key2e
+$!
+$!
+$! Stat structure members
+$!-------------------------------------
+$ if key2b .eqs. "STRUCT"
+$ then
+$ if key2c .eqs. "STAT" .and (key2d .nes. "")
+$ then
+$ key2b = key2b + "_" + key2c + "_" + key2d
+$ key2c = key2e
+$ key2d = ""
+$ key2e = ""
+$ endif
+$ endif
+$ if (key2b .eqs. "ST") .or. (key2b .eqs. "STRUCT_STAT_ST")
+$ then
+$ keysym = "ST" + "_" + key2c
+$ keysym = f$edit(keysym,"LOWERCASE")
+$ endif
+$ if key2a .eqs. "STAT"
+$ then
+$ if (f$locate("STATVFS", key2b) .eq. 0) .and. key2c .eqs. ""
+$ then
+$ keysym = f$edit(key2b, "LOWERCASE")
+$ endif
+$!$ if (key2b .eqs. "STATVFS" .or. key2b .eqs. "STATFS2" -
+$! .or. key2b .eqs. "STATFS3") .and. key2c .nes. ""
+$!
+$ if (key2b .eqs. "STATVFS") .and. key2c .nes. ""
+$ then
+$! Should really verify that the structure
+$! named by key2b actually exists first.
+$!------------------------------------------------------------
+$!
+$! Statvfs structure members
+$!-------------------------------------------------
+$ keysym = "f_" + f$edit(key2c,"LOWERCASE")
+$ endif
+$ endif
+$!
+$! UTMPX structure members
+$!--------------------------------------
+$ if key2b .eqs. "UT" .and. key2c .eqs. "UT"
+$ then
+$ keysym = "ut_" + f$edit(key2d,"LOWERCASE")
+$ endif
+$!
+$ if f$locate("MMAP",key2) .lt. key2_len
+$ then
+$ write sys$output ""
+$ write sys$output -
+ "%CONFIG_H-I-NONPORT, ''key2' being asked for!"
+$ write sys$output -
+ "-CONFIG_H-I-MMAP, MMAP operations only work on STREAM and BINARY files!"
+$ write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$ if update_config_vms
+$ then
+$ open/append tfcv sys$disk:[]config_vms.h
+$ write tfcv ""
+$ write tfcv -
+ "/* Check config.h for use of ''key2' settings */"
+$ write tfcv ""
+$ close tfcv
+$ endif
+$ endif
+$!
+$!
+$ if keysym .eqs. "CRYPT"
+$ then
+$ write sys$output ""
+$ write sys$output -
+ "%CONFIG_H-I-NONPORT, ''key2' being asked for!"
+$ write sys$output -
+ "-CONFIG_H-I-CRYPT, CRYPT operations on the VMS SYSUAF may not work!"
+$ write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$ if update_config_vms
+$ then
+$ open/append tfcv sys$disk:[]config_vms.h
+$ write tfcv ""
+$ write tfcv -
+ "/* Check config.h for use of ''keysym' */"
+$ write tfcv ""
+$ close tfcv
+$ endif
+$ endif
+$!
+$!
+$ if keysym .eqs. "EXECL"
+$ then
+$ write sys$output ""
+$ write sys$output -
+ "%CONFIG_H-I-NONPORT, ''key2' being asked for!"
+$ write sys$output -
+ "-CONFIG_H-I-EXCEL, EXECL configured, Will probably not work."
+$ write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$ if update_config_vms
+$ then
+$ open/append tfcv sys$disk:[]config_vms.h
+$ write tfcv ""
+$ write tfcv -
+ "/* Check config.h for use of ''keysym' */"
+$ write tfcv ""
+$ close tfcv
+$ endif
+$ endif
+$!
+$!
+$! Process if cpp supports ANSI-C stringizing '#' operator
+$!-----------------------------------------------------------------------
+$ if keysym .eqs. "STRINGIZE"
+$ then
+$ write tf "#ifndef HAVE_STRINGIZE"
+$ write tf "#define HAVE_STRINGSIZE 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if keysym .eqs. "VOLATILE"
+$ then
+$ write tf "#ifndef HAVE_VOLATILE"
+$ write tf "#define HAVE_VOLATILE 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if keysym .eqs. "ALLOCA"
+$ then
+$ write tf "#ifndef HAVE_ALLOCA"
+$ write tf "#define HAVE_ALLOCA 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if keysym .eqs. "ERRNO_DECL"
+$ then
+$ write tf "#ifndef HAVE_ERRNO_DECL"
+$ write tf "#define HAVE_ERRNO_DECL 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if keysym .eqs. "LONGLONG"
+$ then
+$ write tf "#ifndef __VAX"
+$ write tf "#pragma message disable longlongtype"
+$ write tf "#ifndef HAVE_LONGLONG"
+$ write tf "#define HAVE_LONGLONG 1"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! May need to test compiler version
+$!-----------------------------------------------
+$ if (keysym .eqs. "LONG_LONG") .or. -
+ (keysym .eqs. "LONG_LONG_INT")
+$ then
+$ write tf "#ifndef __VAX"
+$ write tf "#pragma message disable longlongtype"
+$ write tf "#ifndef HAVE_''keysym'"
+$ write tf "#define HAVE_''keysym' 1"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! May need to test compiler version
+$!-----------------------------------------------
+$ if keysym .eqs. "UNSIGNED_LONG_LONG"
+$ then
+$ write tf "#ifndef __VAX"
+$ write tf "#pragma message disable longlongtype"
+$ write tf "#ifndef HAVE_UNSIGNED_LONG_LONG"
+$ write tf "#define HAVE_UNSIGNED_LONG_LONG 1"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! May need to test compiler version
+$!-----------------------------------------------
+$ if keysym .eqs. "UNSIGNED_LONG_LONG_INT"
+$ then
+$ write tf "#ifndef __VAX"
+$ write tf "#pragma message disable longlongtype"
+$ write tf "#ifndef HAVE_UNSIGNED_LONG_LONG_INT"
+$ write tf "#define HAVE_UNSIGNED_LONG_LONG_INT 1"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! May need to test compiler version
+$!-----------------------------------------------
+$ if keysym .eqs. "LONG_DOUBLE"
+$ then
+$ write tf "#ifndef __VAX"
+$ write tf "#pragma message disable longlongtype"
+$ write tf "#ifndef HAVE_LONG_DOUBLE"
+$ write tf "#define HAVE_LONG_DOUBLE 1"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ if keysym .eqs. "FCNTL_LOCK"
+$ then
+$ write sys$output -
+ "%CONFIG_H-I-NONPORT, ''key2' being asked for!
+$ write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$!
+$! These libraries are provided by the DEC C RTL
+$!-------------------------------------------------------------
+$ if keysym .eqs. "LIBINET" .or. keysym .eqs. "LIBSOCKET"
+$ then
+$ write tf "#ifndef HAVE_''keysym'"
+$ write tf "#define HAVE_''keysym' 1"
+$if p2 .nes. "" then write sys$output "''decc_shr' #define ''keysym' 1"
+$ write tf "#endif
+$ goto cfgh_in_loop1
+$ endif
+$!
+$!
+$ if keysym .eqs. "HERRNO" then keysym = "h_errno"
+$ if keysym .eqs. "UTIMBUF" then keysym = "utimbuf"
+$ if key2c .eqs. "STRUCT"
+$ then
+$ keysym = f$edit(key2d,"LOWERCASE")
+$ else
+$ if key2_h .eqs. "_T"
+$ then
+$ if key2_t .eqs. "_TYPE"
+$ then
+$ keysym = f$extract(0, key2_len - 5, key2) - "HAVE_"
+$ endif
+$ keysym = f$edit(keysym,"LOWERCASE")
+$ endif
+$ endif
+$!
+$! Check the DEC C RTL shared image first
+$!------------------------------------------------------
+$ if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$ define/user sys$output nl:
+$ define/user sys$error nl:
+$ search/format=nonull/out='tfile1' 'decc_shr' 'keysym'
+$ if '$severity' .eq. 1
+$ then
+$!
+$! Not documented, but from observation
+$!------------------------------------------------------
+$ define/user sys$output nl:
+$ define/user sys$error nl:
+$ if arch_type .eq. 3
+$ then
+$ keyterm = "''keysym'<SOH>"
+$ else
+$ if arch_type .eq. 2
+$ then
+$ keyterm = "''keysym'<BS>"
+$ else
+$ keyterm = "''keysym'<STX>"
+$ endif
+$ endif
+$ search/out=nl: 'tfile1' -
+ "$''keyterm'","$g''keyterm'","$__utc_''keyterm'",-
+ "$__utctz_''keyterm'","$__bsd44_''keyterm'","$bsd_''keyterm'",-
+ "$''keysym'decc$","$G''keysym'decc$","$GX''keyterm'"
+$ severity = '$severity'
+$!
+$!
+$! Of course the 64 bit stuff is different
+$!---------------------------------------------------------
+$ if severity .ne. 1 .and. key64
+$ then
+$ define/user sys$output nl:
+$ define/user sys$error nl:
+$ search/out=nl: 'tfile1' "$_''keyterm'"
+$! search/out 'tfile1' "$_''keyterm'"
+$ severity = '$severity'
+$ endif
+$!
+$! UNIX compatability routines
+$!---------------------------------------------
+$ if severity .ne. 1
+$ then
+$ define/user sys$output nl:
+$ define/user sys$error nl:
+$ search/out=nl: 'tfile1' -
+ "$__unix_''keyterm'","$__vms_''keyterm'","$_posix_''keyterm'"
+$ severity = '$severity'
+$ endif
+$!
+$! VAX special handling routines
+$!---------------------------------------------
+$ if (severity .ne. 1) .and. (arch_type .eq. 1)
+$ then
+$ define/user sys$output nl:
+$ define/user sys$error nl:
+$ search/out=nl: 'tfile1' "DECC$''keysym'<SOH>"
+$ severity = '$severity'
+$ endif
+$!
+$! Show the result of the search
+$!------------------------------------------------
+$ if 'severity' .eq. 1
+$ then
+$ if key64 then write tf "#ifndef __VAX"
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$if p2 .nes. "" then write sys$output "''decc_shr' #define ''key2' 1"
+$ write tf "#endif"
+$ if key64 then write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ endif
+$ if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$!
+$! Check the DECC Header files next
+$!----------------------------------------------
+$ define/user sys$output nl:
+$ define/user sys$error nl:
+$ search/out=nl: 'decc_rtldef' -
+ "''keysym';", "''keysym'[", "struct ''keysym'"/exact
+$ severity = '$severity'
+$ if severity .eq. 1
+$ then
+$ if key64 then write tf "#ifndef __VAX"
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$if p2 .nes. "" then write sys$output "''decc_rtldef' #define ''key2' 1"
+$ write tf "#endif"
+$ if key64 then write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$ endif
+$ write tf "/* ", xline, " */"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$!
+$! Process SIZEOF directives found in SAMBA
+$!------------------------------------------------
+$ if key2a .eqs. "SIZEOF"
+$ then
+$ if key2b .eqs. "INO" .and. key2_h .eqs. "_T"
+$ then
+$ write tf "#ifndef SIZEOF_INO_T"
+$ write tf "#define SIZEOF_INO_T (6)"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ if key2b .eqs. "INTMAX" .and. key2_h .eqs. "_T"
+$ then
+$ write tf "#ifndef SIZEOF_INTMAX_T"
+$ write tf "#ifdef __VAX"
+$ write tf "#define SIZEOF_INTMAX_T (4)"
+$ write tf "#else"
+$ write tf "#define SIZEOF_INTMAX_T (8)"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ if key2b .eqs. "OFF" .and. key2_h .eqs. "_T"
+$ then
+$ write tf "#ifndef SIZEOF_OFF_T"
+$ write tf "#ifdef __VAX"
+$ write tf "#define SIZEOF_OFF_T (4)"
+$ write tf "#else"
+$ write tf "#define SIZEOF_OFF_T (8)"
+$ write tf "#endif"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ if key2b .eqs. "CHAR" .and. key2_h .eqs. "_P"
+$ then
+$ write tf "#ifndef SIZEOF_CHAR_P"
+$ write tf "#define SIZEOF_CHAR_P (4)"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ if (key2b .eqs. "INT")
+$ then
+$ write tf "#ifndef SIZEOF_''key2b'"
+$ write tf "#define SIZEOF_''key2b' (4)"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ if key2b .eqs. "UNSIGNED"
+$ then
+$ if key2c .eqs. "INT" .or. key2c .eqs. "LONG"
+$ then
+$ write tf "#ifndef SIZEOF_''key2b'_''key2c'"
+$ write tf "#define SIZEOF_''key2b'_''key2c' (4)"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ endif
+$ if key2b .eqs. "DOUBLE"
+$ then
+$ write tf "#ifndef SIZEOF_DOUBLE"
+$ write tf "#define SIZEOF_DOUBLE (8)"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ if key2b .eqs. "LONG"
+$ then
+$ if key2c .eqs. ""
+$ then
+$ write tf "#ifndef SIZEOF_LONG"
+$ write tf "#define SIZEOF_LONG (4)"
+$ write tf "#endif"
+$ else
+$ write tf "#ifndef SIZEOF_LONG_LONG"
+$ write tf "#ifndef __VAX"
+$ write tf "#define SIZEOF_LONG_LONG (8)"
+$ write tf "#endif"
+$ write tf "#endif"
+$ endif
+$ goto cfgh_in_loop1
+$ endif
+$ if key2b .eqs. "SHORT"
+$ then
+$ write tf "#ifndef SIZEOF_SHORT"
+$ write tf "#define SIZEOF_SHORT (2)"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ write tf "/* ", xline, " */"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! Process NEED directives
+$!-------------------------------
+$ if key2a .eqs. "NEED"
+$ then
+$ if key2b .eqs. "STRINGS" .and. key2_h .eqs. "_H"
+$ then
+$ write tf "#ifndef NEED_STRINGS_H"
+$ write tf "#define NEED_STRINGS_H 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$ write tf "/* ", xline, " */"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$!
+$! Process STATFS directives
+$!-------------------------------
+$! if key2a .eqs. "STATFS"
+$! then
+$! write tf "/* ", xline, " */"
+$! goto cfgh_in_loop1
+$! endif
+$!
+$! Process inline directive
+$!------------------------------
+$ if key2 .eqs. "inline"
+$ then
+$ write tf "#ifndef inline"
+$ write tf "#define inline __inline"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! Process restrict directive
+$!--------------------------------
+$ if key2 .eqs. "restrict"
+$ then
+$ write tf "#ifndef restrict"
+$ write tf "#define restrict __restrict"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! Process RETSIGTYPE directive
+$!----------------------------------
+$ if key2 .eqs. "RETSIGTYPE"
+$ then
+$ write tf "#ifndef RETSIGTYPE"
+$ write tf "#define RETSIGTYPE void"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! Process STDC_HEADERS (SAMBA!)
+$!---------------------------
+$ if key2 .eqs. "STDC_HEADERS"
+$ then
+$ write tf "#ifndef STDC_HEADERS"
+$ write tf "#define STDC_HEADERS 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! Process PROTOTYPES directive
+$!-------------------------------------
+$ if key2 .eqs. "PROTOTYPES"
+$ then
+$ write tf "#ifndef PROTOTYPES"
+$ write tf "#define PROTOTYPES 1"
+$ write tf "#endif"
+$ goto cfgh_in_loop1
+$ endif
+$!
+$! Special for SEEKDIR_RETURNS_VOID
+$!---------------------------------------
+$ if key2 .eqs. "SEEKDIR_RETURNS_VOID"
+$ then
+$ write tf "#ifndef SEEKDIR_RETURNS_VOID"
+$ write tf "#define SEEKDIR_RETURNS_VOID 1"
+$ write tf "#endif"
+$ endif
+$!
+$! TIME_WITH_SYS_TIME note: On VMS time.h and sys/time.h are same module.
+$!
+$! TIME_T_IN_SYS_TYPES_H
+$!------------------------------
+$ if key2 .eqs. "TIME_T_IN_TYPES_H"
+$ then
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ''key2' 1"
+$ write tf "#endif"
+$ endif
+$!
+$! Unknown - See if CONFIGURE can give a clue for this
+$!----------------------------------------------------------
+$ pflag = 0
+$ set_flag = 0
+$! gproj_name = proj_name - "_VMS" - "-VMS"
+$ if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$ define/user sys$output nl:
+$ define/user sys$error nl:
+$! if f$locate("FILE", key2) .lt. key2_len then pflag = 1
+$! if f$locate("DIR", key2) .eq. key2_len - 3 then pflag = 1
+$! if f$locate("PATH", key2) .eq. key2_len - 4 then pflag = 1
+$!
+$ search/out='tfile1' 'configure_script' "''key2'="/exact
+$ search_sev = '$severity'
+$ if 'search_sev' .eq. 1
+$ then
+$ open/read/err=unknown_cf_rd_error sf 'tfile1'
+$search_file_rd_loop:
+$ read/end=unknown_cf_rd_err sf line_in
+$ line_in = f$edit(line_in, "TRIM")
+$ skey1 = f$element(0,"=",line_in)
+$ if skey1 .eqs. key2
+$ then
+$ skey2 = f$element(1,"=",line_in)
+$ skey2a = f$extract(0,2,skey2)
+$!
+$! Keep these two cases separate to make it easier to add
+$! more future intelligence to this routine
+$!----------------------------------------------------------------------
+$ if skey2a .eqs. """`"
+$ then
+$! if pflag .eq. 1
+$! then
+$! write tf "#ifndef ''key2'"
+$! write tf "#define ",key2," """,gproj_name,"_",key2,""""
+$! write tf "#endif"
+$! else
+$! Ignore this for now
+$!------------------------------------------
+$ write tf "/* ", xline, " */"
+$! endif
+$ set_flag = 1
+$ goto found_in_configure
+$ endif
+$ if skey2a .eqs. """$"
+$ then
+$! if pflag .eq. 1
+$! then
+$! write tf "#ifndef ''key2'"
+$! write tf "#define ",key2," """,gproj_name,"_",key2,""""
+$! write tf "#endif"
+$! else
+$! Ignore this for now
+$!-------------------------------------------
+$ write tf "/* ", xline, " */"
+$! endif
+$ set_flag = 1
+$ goto found_in_configure
+$ endif
+$ if f$extract(0, 1, skey2) .eqs. "'"
+$ then
+$ skey2 = skey2 - "'" - "'"
+$ endif
+$ write tf "#ifndef ''key2'"
+$ write tf "#define ",key2," """,skey2,""""
+$ write tf "#endif"
+$ set_flag = 1
+$ else
+$ goto search_file_rd_loop
+$! if pflag .eq. 1
+$! then
+$! write tf "#ifndef ''key2'"
+$! write tf "#define ",key2," """,gproj_name,"_",key2,""""
+$! write tf "#endif"
+$! set_flag = 1
+$! endif
+$ endif
+$found_in_configure:
+$unknown_cf_rd_err:
+$ if f$trnlnm("sf","lnm$process",,"SUPERVISOR") .nes. ""
+$ then
+$ close sf
+$ endif
+$ if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$ if set_flag .eq. 1 then goto cfgh_in_loop1
+$ endif
+$ endif
+$!
+$!
+$!
+$! If it falls through everything else, comment it out
+$!-----------------------------------------------------
+$ write tf "/* ", xline, " */"
+$ goto cfgh_in_loop1
+$cfgh_in_loop1_end:
+$close inf
+$!
+$!
+$! Write out the tail
+$!--------------------
+$write_tail:
+$gosub write_config_h_tail
+$!
+$! Exit and clean up
+$!--------------------
+$general_error:
+$status = '$status'
+$all_exit:
+$set noon
+$if f$trnlnm("sf","lnm$process",,"SUPERVISOR") .nes. "" then close sf
+$if f$trnlnm("tf","lnm$process",,"SUPERVISOR") .nes. "" then close tf
+$if f$trnlnm("inf","lnm$process",,"SUPERVISOR") .nes. "" then close inf
+$if f$trnlnm("tf1","lnm$process",,"SUPERVISOR") .nes. "" then close tf1
+$if f$trnlnm("tf2","lnm$process",,"SUPERVISOR") .nes. "" then close tf2
+$if f$trnlnm("tfcv","lnm$process",,"SUPERVISOR") .nes. "" then close tfcv
+$if f$type(tfile1) .eqs. "STRING"
+$then
+$ if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$endif
+$if f$type(dchfile) .eqs. "STRING"
+$then
+$ if f$search(dchfile) .nes. "" then delete 'dchfile';*
+$endif
+$if f$type(configure_script) .eqs. "STRING"
+$then
+$ if f$search(configure_script) .nes. "" then delete 'configure_script';*
+$endif
+$exit 'status'
+$!
+$!
+$control_y:
+$ status = ss_control_y
+$ goto all_exit
+$!
+$!
+$!
+$! Gosub to write a new config_vms.h
+$!-----------------------------------
+$write_config_vms:
+$outfile = "sys$disk:[]config_vms.h"
+$create 'outfile'
+$open/append tf 'outfile'
+$write tf "/* File: config_vms.h"
+$write tf "**"
+$write tf "** This file contains the manual edits needed for porting"
+$!write tf "** the ''proj_name' package to OpenVMS.
+$write tf "**"
+$write tf "** Edit this file as needed. The procedure that automatically"
+$write tf "** generated this header stub will not overwrite or make any"
+$write tf "** changes to this file."
+$write tf "**"
+$write tf -
+ "** ", datetime, tab, username, tab, "Generated by ''my_proc_file'"
+$write tf "**"
+$write tf -
+ "**========================================================================*/"
+$write tf ""
+$close tf
+$return
+$!
+$! gosub to write out a documentation header for config.h
+$!----------------------------------------------------------------
+$write_config_h_header:
+$outfile = "sys$disk:[]config.h"
+$create 'outfile'
+$open/append tf 'outfile'
+$write tf "#ifndef CONFIG_H"
+$write tf "#define CONFIG_H"
+$write tf "/* File: config.h"
+$write tf "**"
+$write tf -
+ "** This file contains the options needed for porting "
+$write tf "** the project on a VMS system."
+$write tf "**"
+$write tf "** Try not to make any edits to this file, as it is"
+$write tf "** automagically generated."
+$write tf "**"
+$write tf "** Manual edits should be made to the config_vms.h file."
+$write tf "**"
+$write tf -
+ "** ", datetime, tab, username, tab, "Generated by ''my_proc_file'"
+$write tf "**"
+$write tf -
+ "**========================================================================*/"
+$write tf ""
+$write tf "#if (__CRTL_VER >= 70200000) && !defined (__VAX)"
+$write tf "#define _LARGEFILE 1"
+$write tf "#endif"
+$write tf ""
+$write tf "#ifndef __VAX"
+$write tf "#ifdef __CRTL_VER"
+$write tf "#if __CRTL_VER >= 80200000"
+$write tf "#define _USE_STD_STAT 1"
+$write tf "#endif"
+$write tf "#endif"
+$write tf "#endif"
+$write tf ""
+$!
+$if P1 .nes. "NOBUILTINS"
+$then
+$ write tf " /* Allow compiler builtins */"
+$ write tf "/*-------------------------*/"
+$ write tf "#ifdef __DECC_VER"
+$ write tf "#include <non_existant_dir:builtins.h>"
+$ write tf "#endif"
+$endif
+$!
+$write tf ""
+$return
+$!
+$! gosub to write out the tail for config.h and close it
+$!---------------------------------------------------------
+$write_config_h_tail:
+$write tf ""
+$write tf " /* Include the hand customized settings */"
+$write tf "/*--------------------------------------*/"
+$write tf "#include ""sys$disk:config_vms.h"""
+$write tf ""
+$write tf "#endif /* CONFIG_H */"
+$close tf
+$return
+$!
diff --git a/vms/descrip.mms b/vms/descrip.mms
index 77dad90a..2000e680 100644
--- a/vms/descrip.mms
+++ b/vms/descrip.mms
@@ -47,6 +47,7 @@ MAKEFILE = $(VMSDIR)Descrip.MMS
#CCFLAGS = /noOpt/Debug
# a comma separated list of macros to define
+# Do not specify _POSIX_EXIT here, other tricks are used for this.
CDEFS = "GAWK","HAVE_CONFIG_H"
.ifdef GNUC
@@ -67,8 +68,14 @@ CFLAGS = /Incl=[]/Obj=[]/Opt=noInline/Def=($(CDEFS)) $(CCFLAGS)
LIBS = sys$share:vaxcrtl.exe/Shareable
.else !!VAXC
# neither GNUC nor VAXC, assume DECC (same for either VAX or Alpha)
-CC = cc/DECC/Prefix=All
-CFLAGS = /Incl=[]/Obj=[]/Def=($(CDEFS)) $(CCFLAGS)
+.ifdef __VAX__
+CFLOAT =
+.else
+CFLOAT = /float=ieee/ieee_mode=denorm_results
+.endif
+CNAME = /NAME=(AS_IS,SHORT)
+CC = cc/DECC/Prefix=All/NESTED_INCLUDE=NONE$(CFLOAT)
+CFLAGS = /Incl=([],[.vms])/Obj=[]/Def=($(CDEFS))$(CNAME) $(CCFLAGS)
LIBS = # DECC$SHR instead of VAXCRTL, no special link option needed
.endif !VAXC
.endif !GNUC
@@ -106,7 +113,7 @@ AWKOBJS = $(AWKOBJ1),$(AWKOBJ2)
# VMSOBJS
# VMS specific stuff
VMSCODE = vms_misc.obj,vms_popen.obj,vms_fwrite.obj,vms_args.obj,\
- vms_gawk.obj,vms_cli.obj
+ vms_gawk.obj,vms_cli.obj,vms_crtl_init.obj
VMSCMD = gawk_cmd.obj # built from .cld file
VMSOBJS = $(VMSCODE),$(VMSCMD)
@@ -128,8 +135,8 @@ gawk : gawk.exe
gawk.exe : $(GAWKOBJ) $(AWKOBJS) $(VMSOBJS) gawk.opt
$(LINK) $(LINKFLAGS) gawk.opt/options
-gawk.opt : $(MAKEFILE) # create linker options file
- @ open/write opt sys$disk:[]gawk.opt ! ~ 'cat <<close >gawk.opt'
+gawk.opt : $(MAKEFILE) config.h # create linker options file
+ @ open/write opt sys$disk:[]gawk.opt ! ~ 'cat <<close >gawk.opt'
@ write opt "! GAWK -- GNU awk"
@ write opt "$(GAWKOBJ)"
@ write opt "$(AWKOBJ1)"
@@ -139,17 +146,19 @@ gawk.opt : $(MAKEFILE) # create linker options file
@ write opt "stack=48 !preallocate more pages (default is 20)"
@ write opt "iosegment=128 !ditto (default is 32)"
@ write opt "$(LIBS)"
- @ write opt "identification=""V$(REL).$(PATCHLVL)"""
- @ close opt
+ @ close opt
+ $ @$(VMSDIR)gawk_ident.com
$(VMSCODE) : awk.h config.h $(VMSDIR)redirect.h $(VMSDIR)vms.h
-$(AWKOBJS) : awk.h gettext.h mbsupport.h regex.h dfa.h config.h $(VMSDIR)redirect.h
+$(AWKOBJS) : awk.h gettext.h mbsupport.h regex.h dfa.h config.h \
+ $(VMSDIR)redirect.h
$(GAWKOBJ) : awk.h config.h $(VMSDIR)redirect.h
#-----------------------------------------------------------------------------
# Older versions of MMS have problems handling lower case file names typically
# found on ODS-5 disks. Fix this by adding explicit dependencies.
#_____________________________________________________________________________
+
array.obj : array.c
awkgram.obj : awkgram.c awk.h
builtin.obj : builtin.c floatmagic.h random.h
@@ -174,7 +183,8 @@ node.obj : node.c
profile.obj : profile.c
random.obj : random.c random.h
re.obj : re.c
-regex.obj : regex.c regcomp.c regex_internal.c regexec.c regex.h regex_internal.h
+regex.obj : regex.c regcomp.c regex_internal.c regexec.c regex.h \
+ regex_internal.h
str_array.obj : str_array.c
symbol.obj : symbol.c
version.obj : version.c
@@ -184,12 +194,14 @@ vms_fwrite.obj : $(VMSDIR)vms_fwrite.c
vms_args.obj : $(VMSDIR)vms_args.c
vms_gawk.obj : $(VMSDIR)vms_gawk.c
vms_cli.obj : $(VMSDIR)vms_cli.c
+vms_crtl_init.obj : $(VMSDIR)vms_crtl_init.c
replace.obj : replace.c $(MISSNGD)system.c $(MISSNGD)memcmp.c \
$(MISSNGD)memcpy.c $(MISSNGD)memset.c $(MISSNGD)memmove.c \
$(MISSNGD)strncasecmp.c $(MISSNGD)strerror.c \
$(MISSNGD)strftime.c $(MISSNGD)strchr.c $(MISSNGD)strtod.c \
$(MISSNGD)strtoul.c $(MISSNGD)tzset.c $(MISSNGD)mktime.c \
- $(MISSNGD)snprintf.c $(MISSNGD)getaddrinfo.c $(MISSNGD)usleep.c \
+ $(MISSNGD)snprintf.c $(MISSNGD)getaddrinfo.c \
+ $(MISSNGD)usleep.c \
$(MISSNGD)setenv.c $(MISSNGD)strcoll.c $(MISSNGD)wcmisc.c
# bison or yacc required
@@ -201,7 +213,8 @@ awkgram.c : awkgram.y # foo.y :: yacc => y[_]tab.c, bison => foo_tab.c
$(PARSER) $(YFLAGS) $<
@- if f$search("ytab.c") .nes."" then rename/new_vers ytab.c $@
@- if f$search("y_tab.c") .nes."" then rename/new_vers y_tab.c $@
- @- if f$search("awkgram_tab.c").nes."" then rename/new_vers awkgram_tab.c $@
+ @- if f$search("awkgram_tab.c").nes."" then \
+ rename/new_vers awkgram_tab.c $@
command.c : command.y
@- if f$search("ytab.c") .nes."" then delete ytab.c;*
@@ -211,10 +224,14 @@ command.c : command.y
$(PARSER) $(YFLAGS) $<
@- if f$search("ytab.c") .nes."" then rename/new_vers ytab.c $@
@- if f$search("y_tab.c") .nes."" then rename/new_vers y_tab.c $@
- @- if f$search("command_tab.c").nes."" then rename/new_vers command_tab.c $@
+ @- if f$search("command_tab.c").nes."" then \
+ rename/new_vers command_tab.c $@
+
+config_vms.h : $(VMSDIR)generate_config_vms_h_gawk.com
+ $ @$(VMSDIR)generate_config_vms_h_gawk.com
-config.h : $(VMSDIR)vms-conf.h
- copy $< sys$disk:[]$@
+config.h : configh.in config_vms.h $(VMSDIR)config_h.com
+ $ @$(VMSDIR)config_h.com
$(VMSCMD) : $(VMSDIR)gawk.cld
set command $(CLDFLAGS)/object=$@ $<
@@ -230,13 +247,18 @@ tidy :
clean :
- if f$search ("*.obj") .nes. "" then delete *.obj;*
+ - if f$search ("*.lis") .nes. "" then delete *.lis;*
- if f$search ("gawk.opt") .nes. "" then delete gawk.opt;*
spotless : clean tidy
- - if f$search("config.h").nes."" then rename config.h config.h-old/New
+ - if f$search("config.h").nes."" then delete config.h;*
+ - if f$search("config_vms.h").nes."" then delete config_vms.h;*
- if f$search("gawk.exe").nes."" then delete gawk.exe;*
- if f$search("gawk.dvi").nes."" then delete gawk.dvi;*
- - if f$search("[.doc]texindex.exe").nes."" then delete [.doc]texindex.exe;*
+ - if f$search("[.doc]texindex.exe").nes."" then \
+ delete [.doc]texindex.exe;*
+ - if f$search("[.cxx_repository]*.*;").nes."" then \
+ delete [.cxx_repository]*.*;*
#
# Note: this only works if you kept a copy of [.support]texindex.c
@@ -258,7 +280,8 @@ gawk.dvi : [.doc]texindex.exe [.doc]gawk.texi
@ write sys$output " Third (final) pass"
TeX gawk.texi
-@ purge
- -@ delete gawk.lis;,.aux;,gawk.%%;,.cps;,.fns;,.kys;,.pgs;,.toc;,.tps;,.vrs;
+ -@ delete \
+ gawk.lis;,.aux;,gawk.%%;,.cps;,.fns;,.kys;,.pgs;,.toc;,.tps;,.vrs;
@ rename/new_vers gawk.dvi [-]*.*
@ set default [-]
diff --git a/vms/fcntl.h b/vms/fcntl.h
deleted file mode 100644
index d975db7a..00000000
--- a/vms/fcntl.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* "fcntl.h" -- constants for BSD-style I/O routines (ala VAX C's <file.h>) */
-#define O_RDONLY 0
-#define O_WRONLY 1
-#define O_RDWR 2
-#define O_NDELAY 4
-#define O_NOWAIT 4
-#define O_APPEND 8
-#define O_CREAT 0x0200
-#define O_TRUNC 0x0400
-#define O_EXCL 0x0800
diff --git a/vms/gawk.hlp b/vms/gawk.hlp
index 4b82e7e9..177ef91c 100644
--- a/vms/gawk.hlp
+++ b/vms/gawk.hlp
@@ -1557,9 +1557,24 @@
4 exit
The exit statement can optionally pass a final status value to the
operating system. GAWK expects a UN*X-style value instead of a
- VMS status value, so 0 indicates success and non-zero indicates
- failure. The final exit status will be 1 (VMS success) if 0 is
- used, or even (VMS non-success) if non-zero is used.
+ VMS status value, so 0 indicates success. A failure is indicated
+ by 1 and VMS will set the ERROR status. A fatal error is indicated
+ by 2 and VMS seet the FATAL status. All other values will will have
+ the SUCCESS status. The exit value is encoded to comply with VMS
+ coding standards and will have the C_FACILITY_NO of 0x350000 with
+ the constant 0xA000 added to the number shifted over by 3 bits to
+ make room for the severity codes.
+
+ To extract the actual gawk exit code from the VMS status use:
+ unix_status = (vms_status .and. &x7f8) / 8
+
+ A C program that uses exec() to call gawk will get the original
+ UN*X-style exit value.
+
+ Older versions of Gawk treated Unix exit code 0 as 1, A failure as
+ 2, and a fatal error as 4, and passed all the other numbers through.
+ This violate the VMS exit status coding requirements.
+
3 changes
Changes between version 4.0.0 and earlier versions
@@ -1569,6 +1584,7 @@
General
dgawk.exe does interactive debugging of awk programs
pgawk.exe does comprehensive execution profiling of awk programs
+ pgawk.exe is not currently supplied for VMS.
-d[file] and -p[file] options added
-Wcompat and -Wusage options dropped; use -Wtraditional and -Whelp
BEGINFILE and ENDFILE built-in rule patterns
@@ -1594,6 +1610,10 @@
support for radix prefix '0' (octal) and '0x' (hexadecimal)
VMS-specific
+ The VMS exit codes now correctly encode the gawk exit status and
+ the VMS severity bits are set.
+ Large file support is enabled on the platforms that support it.
+ Extended filename support is enabled on the platforms that support it.
New command qualifiers: /EXTRA_COMMANDS, /PROFILE, /DUMP_VARIABLES,
/OPTIMIZE, /TRADITIONAL, /SANDBOX, /NON_DECIMAL_DATA
Revised qualifier: /LINT, takes optional argument list
diff --git a/vms/gawk_ident.com b/vms/gawk_ident.com
new file mode 100644
index 00000000..5b3966f9
--- /dev/null
+++ b/vms/gawk_ident.com
@@ -0,0 +1,21 @@
+$! gawk_ident.com - Append ident with version to gawk.
+$!
+$!
+$ open/read cfgh config.h
+$cfgh_loop:
+$ read/end=cfgh_loop_end cfgh line_in
+$ key1 = f$element(0, " ", line_in)
+$ if key1 .nes. "#define" then goto cfgh_loop
+$ key2 = f$element(1, " ", line_in)
+$ if key2 .nes. "VERSION" then goto cfgh_loop
+$ version_string = f$element(2, " ", line_in) - """" - """"
+$ ver_major = f$element(0, ".", version_string)
+$ ver_minor = f$element(1, ".", version_string)
+$ REL = ver_major + "." + ver_minor
+$ PATCHLVL = f$element(2, ".", version_string)
+$cfgh_loop_end:
+$ close cfgh
+$!
+$ open/append Fopt gawk.opt
+$ write Fopt "identification=""V''REL'.''PATCHLVL'"""
+$ close Fopt
diff --git a/vms/gawkmisc.vms b/vms/gawkmisc.vms
index cbc59cd7..046c5167 100644
--- a/vms/gawkmisc.vms
+++ b/vms/gawkmisc.vms
@@ -23,30 +23,446 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#include <descrip.h>
+#include <dvidef.h>
+#include <efndef.h>
+#include <fscndef.h>
+#include <stsdef.h>
+#include <time.h>
+#include <lnmdef.h>
+
+
+#pragma member_alignment save
+#pragma nomember_alignment longword
+struct item_list_3 {
+ unsigned short len;
+ unsigned short code;
+ void * bufadr;
+ unsigned short * retlen;
+};
+
+struct filescan_itmlst_2 {
+ unsigned short length;
+ unsigned short itmcode;
+ char * component;
+};
+
+#pragma member_alignment
+
+int SYS$GETDVIW(
+ unsigned long efn,
+ unsigned short chan,
+ const struct dsc$descriptor_s * devnam,
+ const struct item_list_3 * itmlst,
+ void * iosb,
+ void (* astadr)(unsigned long),
+ unsigned long astprm,
+ void * nullarg);
+
+int SYS$FILESCAN(
+ const struct dsc$descriptor_s * srcstr,
+ struct filescan_itmlst_2 * valuelist,
+ unsigned long * fldflags,
+ struct dsc$descriptor_s *auxout,
+ unsigned short * retlen);
+
+int SYS$TRNLNM(
+ const unsigned long * attr,
+ const struct dsc$descriptor_s * table_dsc,
+ struct dsc$descriptor_s * name_dsc,
+ const unsigned char * acmode,
+ const struct item_list_3 * item_list);
+
char quote = '\'';
char *defpath = DEFPATH;
char *deflibpath = DEFLIBPATH;
char envsep = ',';
+#define VMS_NAME_LEN 1
+static char vms_name[VMS_NAME_LEN+1];
+
+/* Take all the fun out of simply looking up a logical name */
+static int sys_trnlnm
+ (const char * logname,
+ char * value,
+ int value_len)
+{
+ const $DESCRIPTOR(table_dsc, "LNM$FILE_DEV");
+ const unsigned long attr = LNM$M_CASE_BLIND;
+ struct dsc$descriptor_s name_dsc;
+ int status;
+ unsigned short result;
+ struct item_list_3 itlst[2];
+
+ itlst[0].len = value_len;
+ itlst[0].code = LNM$_STRING;
+ itlst[0].bufadr = value;
+ itlst[0].retlen = &result;
+
+ itlst[1].len = 0;
+ itlst[1].code = 0;
+
+ name_dsc.dsc$w_length = strlen(logname);
+ name_dsc.dsc$a_pointer = (char *)logname;
+ name_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+ name_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+ status = SYS$TRNLNM(&attr, &table_dsc, &name_dsc, 0, itlst);
+
+ if ($VMS_STATUS_SUCCESS(status)) {
+
+ /* Null terminate and return the string */
+ value[result] = '\0';
+ }
+
+ return status;
+}
+
/* gawk_name --- pull out the "gawk" part from how the OS called us */
+/* You would not think that this should be a such a problem, but
+ * VMS extended file specifications are tricky to parse, and we have
+ * to tell the difference between a CRTL generated argv[0] and a
+ * passed exec() argv[0] and handle both cases.
+ */
+
char *
gawk_name(filespec)
const char *filespec;
{
- char *p, *q;
+ int status;
+ int result;
+ char * shell;
+ int lcname = 0;
+
+ /* If the path name starts with a /, then it is an absolute path
+ * that may have been generated by the CRTL instead of the command
+ * name. If it is the device name between the slashes, then this
+ * was likely from the run command and needs to be fixed up.
+ * If the DECC$POSIX_COMPLIANT_PATHNAMES is set to 2, then it is
+ * the DISK$VOLUME that will be present, and it will still need to
+ * be fixed.
+ */
+
+ if (filespec[0] == '/') {
+ char * nextslash;
+ int length;
+ struct item_list_3 itemlist[3];
+ unsigned short dvi_iosb[4];
+ char alldevnam[64];
+ unsigned short alldevnam_len;
+ struct dsc$descriptor_s devname_dsc;
+ char diskvolnam[256];
+ unsigned short diskvolnam_len;
+
+ /* Get some information about the disk */
+ /*--------------------------------------*/
+ itemlist[0].len = (sizeof alldevnam) - 1;
+ itemlist[0].code = DVI$_ALLDEVNAM;
+ itemlist[0].bufadr = alldevnam;
+ itemlist[0].retlen = &alldevnam_len;
+ itemlist[1].len = (sizeof diskvolnam) - 1 - 5;
+ itemlist[1].code = DVI$_VOLNAM;
+ itemlist[1].bufadr = &diskvolnam[5];
+ itemlist[1].retlen = &diskvolnam_len;
+ itemlist[2].len = 0;
+ itemlist[2].code = 0;
+
+ /* Add the prefix for the volume name. */
+ /* SYS$GETDVI will append the volume name to this */
+ strcpy(diskvolnam,"DISK$");
+
+ nextslash = strchr(&filespec[1], '/');
+ if (nextslash != NULL) {
+ length = nextslash - filespec - 1;
+
+ /* DECC requires a cast here */
+ devname_dsc.dsc$a_pointer = (char *)&filespec[1];
+ devname_dsc.dsc$w_length = length;
+ devname_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+ devname_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+ status = SYS$GETDVIW(
+ EFN$C_ENF,
+ 0,
+ &devname_dsc,
+ itemlist,
+ dvi_iosb,
+ NULL, 0, 0);
+ if (!$VMS_STATUS_SUCCESS(status)) {
+ /* If the sys$getdviw fails, then this path
+ * was passed by an exec() program and not
+ * from DCL, so do nothing.
+ * An example is "/tmp/program" where tmp:
+ * does not exist
+ */
+ result = 0;
+ } else if (!$VMS_STATUS_SUCCESS(dvi_iosb[0])) {
+ result = 0;
+ } else {
+ char * devnam;
+ int devnam_len;
+ char argv_dev[64];
+
+ /* Null terminate the returned alldevnam */
+ alldevnam[alldevnam_len] = 0;
+ devnam = alldevnam;
+ devnam_len = alldevnam_len;
+
+ /* Need to skip past any leading underscore */
+ if (devnam[0] == '_') {
+ devnam++;
+ devnam_len--;
+ }
+
+ /* And remove the trailing colon */
+ if (devnam[devnam_len - 1] == ':') {
+ devnam_len--;
+ devnam[devnam_len] = 0;
+ }
+
+ /* Null terminate the returned volnam */
+ diskvolnam_len += 5;
+ diskvolnam[diskvolnam_len] = 0;
+
+ /* Check first for normal CRTL behavior */
+ if (devnam_len == length) {
+ strncpy(vms_name, &filespec[1], length);
+ vms_name[length] = 0;
+ result = (strcasecmp(devnam, vms_name) == 0);
+ }
+
+ /* If we have not got a match check for
+ * POSIX Compliant behavior. To be more
+ * accurate, we could also check to see
+ * if that feature is active.
+ */
+ if ((result == 0) &&
+ (diskvolnam_len == length)) {
+ int cmp;
+ strncpy(vms_name, &filespec[1], length);
+ vms_name[length] = 0;
+ cmp = strcasecmp(diskvolnam, vms_name);
+ result = (cmp == 0);
+ }
+ }
+ }
+ } else {
+ /* The path did not start with a slash, so it could be VMS
+ * format. If it is vms format, it has a volume/device in
+ * it as it must be an absolute path
+ */
+ struct dsc$descriptor_s path_desc;
+ int status;
+ unsigned long field_flags;
+ struct filescan_itmlst_2 item_list[5];
+ char * volume;
+ char * name;
+ int name_len;
+ char * ext;
+
+ /* DECC requires a cast here */
+ path_desc.dsc$a_pointer = (char *)filespec;
+ path_desc.dsc$w_length = strlen(filespec);
+ path_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ path_desc.dsc$b_class = DSC$K_CLASS_S;
+
+ /* Don't actually need to initialize anything buf itmcode */
+ /* I just do not like uninitialized input values */
+
+ /* Sanity check, this must be the same length as input */
+ item_list[0].itmcode = FSCN$_FILESPEC;
+ item_list[0].length = 0;
+ item_list[0].component = NULL;
+
+ /* If the device is present, then it if a VMS spec */
+ item_list[1].itmcode = FSCN$_DEVICE;
+ item_list[1].length = 0;
+ item_list[1].component = NULL;
+
+ /* we need the program name and type */
+ item_list[2].itmcode = FSCN$_NAME;
+ item_list[2].length = 0;
+ item_list[2].component = NULL;
+
+ item_list[3].itmcode = FSCN$_TYPE;
+ item_list[3].length = 0;
+ item_list[3].component = NULL;
+
+ /* End the list */
+ item_list[4].itmcode = 0;
+ item_list[4].length = 0;
+ item_list[4].component = NULL;
+
+ status = SYS$FILESCAN(
+ (const struct dsc$descriptor_s *)&path_desc,
+ item_list, &field_flags, NULL, NULL);
+
+ if ($VMS_STATUS_SUCCESS(status) &&
+ (item_list[0].length == path_desc.dsc$w_length) &&
+ (item_list[1].length != 0)) {
+
+ char * dollar;
+ int keep_ext;
+ int i;
+
+ /* We need the filescan to be successful,
+ * same length as input, and a volume to be present.
+ *
+ * We will assume that we only get to this path on
+ * a version of VMS that does not support the EFS
+ * character set.
+ *
+ * There may be a xxx$ prefix on the image name.
+ * Linux programs do not handle that well, so
+ * strip the prefix.
+ */
+ name = item_list[2].component;
+ name_len = item_list[2].length;
+ dollar = strrchr(name, '$');
+ if (dollar != NULL) {
+ dollar++;
+ name_len = name_len - (dollar - name);
+ name = dollar;
+ }
+
+ strncpy(vms_name, name, name_len);
+ vms_name[name_len] = 0;
+
+ /* We only keep the extension if it is not ".exe" */
+ keep_ext = 0;
+ ext = item_list[3].component;
+
+ if (item_list[3].length != 1) {
+ if (item_list[3].length != 4) {
+ keep_ext = 1;
+ } else {
+ int x;
+ x = strncmp(ext, ".exe", 4);
+ if (x != 0) {
+ keep_ext = 1;
+ }
+ }
+ }
+
+ if (keep_ext == 1) {
+ strncpy(&vms_name[name_len],
+ ext, item_list[3].length);
+ }
+ }
+ }
- /* "device:[root.][directory.subdir]GAWK.EXE;n" -> "GAWK" */
- p = strrchr(filespec, ']'); /* directory punctuation */
- q = strrchr(filespec, '>'); /* alternate <international> punct */
+ if (result) {
+ char * lastslash;
+ char * dollar;
+ char * dotexe;
+ char * lastdot;
+ char * extension;
+
+ /* This means it is probably the name from a DCL command
+ * Find the last slash which separates the file from the
+ * path.
+ */
+ lastslash = strrchr(filespec, '/');
+
+ if (lastslash != NULL) {
+ int i;
+
+ lastslash++;
+
+ /* There may be a xxx$ prefix on the image name. */
+ /* Linux programs do not handle that well, so */
+ /* strip the prefix */
+ dollar = strrchr(lastslash, '$');
+
+ if (dollar != NULL) {
+ dollar++;
+ lastslash = dollar;
+ }
+
+ strcpy(vms_name, lastslash);
+
+ /* In UNIX mode + EFS character set, there should
+ * not be a version present, as it is not possible
+ * when parsing to tell if it is a version or part
+ * of the UNIX filename as UNIX programs use numeric
+ * extensions for many reasons.
+ */
+
+ lastdot = strrchr(vms_name, '.');
+ if (lastdot != NULL) {
+ int i;
+
+ i = 1;
+ while (isdigit(lastdot[i])) {
+ i++;
+ }
+ if (lastdot[i] == 0) {
+ *lastdot = 0;
+ }
+ }
+
+ /* Find the .exe on the name (case insenstive)
+ * and toss it
+ */
+ dotexe = strrchr(vms_name, '.');
+ if (dotexe != NULL) {
+ if ((dotexe[1] == 'e' || dotexe[1] == 'E') &&
+ (dotexe[2] == 'x' || dotexe[2] == 'X') &&
+ (dotexe[3] == 'e' || dotexe[3] == 'E') &&
+ (dotexe[4] == 0)) {
+
+ *dotexe = 0;
+ } else {
+ /* Also need to handle a null
+ * extension because of a CRTL bug.
+ */
+ if (dotexe[1] == 0) {
+ *dotexe = 0;
+ }
+ }
+ }
+
+ } else {
+ /* There is no way that the code should ever get here
+ * As we already verified that the '/' was present
+ */
+ fprintf(stderr,
+ "Sanity failure somewhere we lost a '/'\n");
+ }
+ } else {
+ /* No changes needed */
+ strncpy(vms_name, filespec, VMS_NAME_LEN);
+ vms_name[VMS_NAME_LEN] = 0;
+ }
- if (p == NULL || q > p)
- p = q;
- p = strdup(p == NULL ? filespec : (p + 1));
- if ((q = strrchr(p, '.')) != NULL)
- *q = '\0'; /* strip .typ;vers */
- return p;
+ /*
+ * The above fixes up the name, but for the DCL shell
+ * may leave it in upper case, which messes up the self tests.
+ * force it to lower case here.
+ */
+ shell = getenv("SHELL");
+ if (shell != NULL) {
+ if (strcmp(shell, "DCL") == 0) {
+ lcname = 1;
+ }
+ } else {
+ lcname = 1;
+ }
+ if (lcname == 1) {
+ int i = 0;
+ while (vms_name[i] != 0) {
+ vms_name[i] = tolower(vms_name[i]);
+ i++;
+ }
+ }
+ return vms_name;
}
/* os_arg_fixup --- fixup the command line */
@@ -56,7 +472,24 @@ os_arg_fixup(argcp, argvp)
int *argcp;
char ***argvp;
{
+ char *tz_rule;
+ int status;
+
(void) vms_arg_fixup(argcp, argvp);
+
+ /* Fix up the time zone */
+ /* For some reason it gets trashed */
+ tz_rule = malloc(1024);
+ status = sys_trnlnm("TZ", tz_rule, 1024);
+ if ($VMS_STATUS_SUCCESS(status)) {
+ setenv("TZ", tz_rule, 1);
+ } else {
+ status = sys_trnlnm("SYS$TIMEZONE_RULE", tz_rule, 1024);
+ if ($VMS_STATUS_SUCCESS(status)) {
+ setenv("TZ", tz_rule, 1);
+ }
+ }
+ free(tz_rule);
}
/* os_devopen --- open special per-OS devices */
@@ -208,11 +641,17 @@ files_are_same(char *newfile, SRCFILE *oldfile)
f2 = &oldfile->sbuf;
/* compare device string */
+#ifdef _USE_STD_STAT
+ return (f1->st_dev == f2->st_dev
+ /* and 48-bit file id cookie */
+ && f1->st_ino == f2->st_ino);
+ #else
return (strcmp(f1->st_dev, f2->st_dev) == 0
/* and 48-bit file id cookie stored in 3 short ints */
&& f1->st_ino[0] == f2->st_ino[0]
&& f1->st_ino[1] == f2->st_ino[1]
&& f1->st_ino[2] == f2->st_ino[2]);
+#endif
}
int
diff --git a/vms/generate_config_vms_h_gawk.com b/vms/generate_config_vms_h_gawk.com
new file mode 100644
index 00000000..03ad2015
--- /dev/null
+++ b/vms/generate_config_vms_h_gawk.com
@@ -0,0 +1,284 @@
+$! File: GENERATE_CONFIG_H_VMS_GAWK.COM
+$!
+$! Gawk like most open source products uses a variant of a config.h file.
+$! Depending on the curl version, this could be config.h or curl_config.h.
+$!
+$! For GNV based builds, the configure script is run and that produces
+$! a [curl_]config.h file. Configure scripts on VMS generally do not
+$! know how to do everything, so there is also a [-.lib]config-vms.h file
+$! that has VMS specific code that compensates for bugs in some of the
+$! VMS shared images.
+$!
+$! This generates a []config.h file and also a config_vms.h file,
+$! which is used to supplement that file.
+$!
+$!
+$! Copyright 2013, John Malmberg
+$!
+$! Permission to use, copy, modify, and/or distribute this software for any
+$! purpose with or without fee is hereby granted, provided that the above
+$! copyright notice and this permission notice appear in all copies.
+$!
+$! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+$! WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+$! MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+$! ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+$! WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+$! ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+$! OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+$!
+$!
+$! 28-Nov-2013 J. Malmberg
+$!
+$!=========================================================================
+$!
+$! Allow arguments to be grouped together with comma or separated by spaces
+$! Do no know if we will need more than 8.
+$ args = "," + p1 + "," + p2 + "," + p3 + "," + p4 + ","
+$ args = args + p5 + "," + p6 + "," + p7 + "," + p8 + ","
+$!
+$! Provide lower case version to simplify parsing.
+$ args_lower = f$edit(args, "LOWERCASE")
+$!
+$ args_len = f$length(args)
+$!
+$ if (f$getsyi("HW_MODEL") .lt. 1024)
+$ then
+$ arch_name = "VAX"
+$ else
+$ arch_name = ""
+$ arch_name = arch_name + f$edit(f$getsyi("ARCH_NAME"), "UPCASE")
+$ if (arch_name .eqs. "") then arch_name = "UNK"
+$ endif
+$!
+$!
+$! Start the configuration file.
+$! Need to do a create and then an append to make the file have the
+$! typical file attributes of a VMS text file.
+$ create sys$disk:[]config_vms.h
+$ open/append cvh sys$disk:[]config_vms.h
+$!
+$! Write the defines to prevent multiple includes.
+$! These are probably not needed in this case,
+$! but are best practice to put on all header files.
+$ write cvh "#ifndef __CONFIG_VMS_H__"
+$ write cvh "#define __CONFIG_VMS_H__"
+$ write cvh ""
+$!
+$ write cvh "#if __CRTL_VER >= 70000000"
+$ write cvh "#define VMS_V7"
+$ write cvh "#else"
+$ write cvh "#define HAVE_TZNAME 1 /* (faked in vms/vms_misc.c) */
+$ write cvh "#define HAVE_TZSET 1 /* (faked in vms/vms_misc.c) */
+$ write cvh "#endif"
+$ write cvh "#if __CRTL_VER >= 70200000"
+$ write cvh "#define DYNAMIC 1"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh "#define PRINTF_HAS_F_FORMAT 1"
+$ write cvh ""
+$ write cvh "/* The _Noreturn keyword of C11. */"
+$ write cvh "#ifndef _Noreturn"
+$ write cvh "# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \"
+$ write cvh " || 0x5110 <= __SUNPRO_C)"
+$ write cvh "# define _Noreturn __attribute__ ((__noreturn__))"
+$ write cvh "# elif defined _MSC_VER && 1200 <= _MSC_VER"
+$ write cvh "# define _Noreturn __declspec (noreturn)"
+$ write cvh "# else"
+$ write cvh "# define _Noreturn"
+$ write cvh "# endif"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * VAXCRTL is pre-ANSI and does some variations of numeric"
+$ write cvh " * formatting differently than gawk expects."
+$ write cvh " */"
+$ write cvh "#if defined(VAX) && !defined(__DECC)"
+$ write cvh -
+ "/* '0' format modifier for %e,%f,%g gives wrong results in many cases */"
+$ write cvh "#define VAXCRTL"
+$ write cvh "/* %g format chooses %e format when should use %f */"
+$ write cvh "#define GFMT_WORKAROUND 1"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * VAX C"
+$ write cvh " *"
+$ write cvh -
+ " * As of V3.2, VAX C is not yet ANSI-compliant. But it's close enough"
+$ write cvh -
+ " * for GAWK's purposes. Comment this out for VAX C V2.4 and earlier."
+$ write cvh -
+ " * YYDEBUG definition is needed for combination of VAX C V2.x and Bison."
+$ write cvh " */"
+$ write cvh "#if defined(VAXC) && !defined(__STDC__)"
+$ write cvh "#define __STDC__ 0"
+$ write cvh "#define NO_TOKEN_PASTING"
+$ write cvh "#define signed /*empty*/"
+$ write cvh "#define inline /*empty*/"
+$ write cvh "#ifndef __DECC /* DEC C does not support #pragma builtins */"
+$ write cvh "#define VAXC_BUILTINS"
+$ write cvh "#endif"
+$ write cvh "/* #define YYDEBUG 0 */"
+$ write cvh -
+ "#define NO_MBSUPPORT /* VAX C's preprocessor can't handle mbsupport.h */"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh ""
+$ write cvh "#if __DECC_VER >= 60400000 && !defined(DEBUG)"
+$ write cvh "/* disable ""new feature in C99"" diagnostics (for regex code); "
+$ write cvh " NEWC99 ought to suffice but doesn't (at least in V6.4) */"
+$ write cvh "#pragma message disable (NEWC99,DESIGNATORUSE)"
+$ write cvh "#ifdef __VAX
+$ write cvh "#endif
+$ write cvh "#pragma message disable (LONGDOUBLENYI)"
+$ write cvh "#endif"
+$!
+$! This stuff seems needed for VMS 7.3 and earlier, but not VMS 8.2+
+$ write cvh "#if __VMS_VER <= 80200000"
+$ write cvh "#ifdef HAVE_MKSTEMP"
+$ write cvh "#undef HAVE_MKSTEMP"
+$ write cvh "#endif"
+$ write cvh "#endif"
+$ write cvh ""
+$!
+$! VMS not legal for ANSI compiler to pre-define
+$ write cvh "#ifndef VMS"
+$ write cvh "#define VMS 1"
+$ write cvh "#endif"
+$ write cvh ""
+$!
+$! Need to temp hide stuff that gawk is replacing or redefining before
+$! including the header.
+$ write cvh "/* Need to hide some stuff */"
+$ write cvh "#define getopt hide_getopt"
+$ write cvh "#define optopt hide_optopt"
+$ write cvh "#define optind hide_optind"
+$ write cvh "#define optarg hide_optarg"
+$ write cvh "#define opterr hide_opterr"
+$ write cvh "#define getpgrp hide_getpgrp"
+$ write cvh "#define unsetenv hide_unsetenv"
+$ write cvh "#define read hide_read"
+$ write cvh "#define delete hide_delete"
+$ write cvh "#define getcwd hide_getcwd"
+$ write cvh "#define getgid hide_getgid"
+$ write cvh "#define getegid hide_getegid"
+$ write cvh "#define setgid hide_setgid"
+$ write cvh "#define exit hide_exit"
+$ write cvh "#define _exit hide__exit"
+$ write cvh "#include <unistd.h>"
+$ write cvh "#include <stdlib.h>"
+$ write cvh "#include <stdio.h>"
+$ write cvh "#include <time.h>"
+$ write cvh "#include <stsdef.h>"
+$ write cvh "#include <string.h>"
+$ write cvh "#undef getopt"
+$ write cvh "#undef optopt"
+$ write cvh "#undef optind"
+$ write cvh "#undef optarg"
+$ write cvh "#undef opterr"
+$ write cvh "#undef getpgrp"
+$ write cvh "#undef getcwd"
+$ write cvh "#undef unsetenv"
+$ write cvh "#undef read"
+$ write cvh "#undef delete"
+$ write cvh "#undef getgid"
+$ write cvh "#undef getegid"
+$ write cvh "#undef setgid"
+$ write cvh "#undef exit"
+$ write cvh "#undef _exit"
+$!
+$write cvh "#ifdef HAVE_STRNCASECMP"
+$write cvh "#undef HAVE_STRNCASECMP"
+$write cvh "#endif"
+$!
+$ write cvh "#define IN_CONFIG_H"
+$ write cvh "#include ""redirect.h"""
+$ write cvh "#undef IN_CONFIG_H"
+$ write cvh "#define getpgrp gawk_vms_getpgrp"
+$ write cvh "#ifdef HAVE_SETENV"
+$ write cvh "#undef HAVE_SETENV"
+$ write cvh "#endif"
+$ write cvh "#ifdef HAVE_UNSETENV"
+$ write cvh "#undef HAVE_UNSETENV"
+$ write cvh "#endif"
+$ write cvh "#ifdef HAVE_STRFTIME"
+$ write cvh "#undef HAVE_STRFTIME"
+$ write cvh "#define USE_INCLUDED_STRFTIME"
+$ write cvh "#endif /* HAVE_STRFTIME */"
+$ write cvh ""
+$ write cvh "#include <bitypes.h>"
+$ write cvh "#define INT32_MAX __INT32_MAX"
+$ write cvh "#define INT32_MIN __INT32_MIN"
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * DEFPATH"
+$ write cvh " * VMS: ""/AWK_LIBRARY"" => ""AWK_LIBRARY:"""
+$ write cvh " * The default search path for the -f option of gawk. It is"
+$ write cvh " * used if the AWKPATH environment variable is undefined."
+$ write cvh " *"
+$ write cvh " * Note: OK even if no AWK_LIBRARY logical name has been defined."
+$ write cvh " */"
+$ write cvh ""
+$ write cvh "#define DEFPATH "".,/AWK_LIBRARY"""
+$ write cvh "#define DEFLIBPATH "".,/AWK_LIBRARY"""
+$ write cvh "#define ENVSEP ','"
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * Extended source file access."
+$ write cvh " */"
+$ write cvh "#define DEFAULT_FILETYPE "".awk"""
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * fork/Pipe handling."
+$ write cvh " */"
+$ write cvh "#define PIPES_SIMULATED 1"
+$ write cvh ""
+$ write cvh "/* Extension for shared libraries */"
+$ write cvh "#define SHLIBEXT ""exe"""
+$ write cvh ""
+$! GAWK does not want to use ALLOCA
+$ write cvh "#define NO_ALLOCA"
+$ write cvh "#define STACK_DIRECTION (-1)"
+$ write cvh ""
+$ write cvh "void decc$exit(int status);"
+$ write cvh "#define _exit(foo) vms_exit(foo)"
+$ write cvh "#define exit(foo) vms_exit(foo)"
+$ write cvh ""
+$ write cvh "/* Use POSIX exit codes here */"
+$ write cvh "#ifdef EXIT_FAILURE"
+$ write cvh "#undef EXIT_FAILURE"
+$ write cvh "#endif"
+$ write cvh "#define EXIT_FAILURE (1)"
+$ write cvh ""
+$ write cvh "#define EXIT_FATAL (2)"
+$ write cvh ""
+$ write cvh "#ifndef C_FACILITY_NO"
+$ write cvh "#define C_FACILITY_NO 0x350000"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh "/* Build a Posix Exit with VMS severity */
+$ write cvh "static void vms_exit(int status) {"
+$ write cvh " int vms_status;"
+$ write cvh " /* Fake the __posix_exit with severity added */"
+$ write cvh " /* Undocumented correct way to do this. */"
+$ write cvh " vms_status = C_FACILITY_NO | 0xA000 | STS$M_INHIB_MSG;"
+$ write cvh " vms_status |= (status << 3);"
+$ write cvh " if (status == EXIT_FAILURE) {"
+$ write cvh " vms_status |= STS$K_ERROR;"
+$ write cvh " } else if (status == EXIT_FATAL) {"
+$ write cvh " vms_status |= STS$K_SEVERE;"
+$ write cvh " } else {"
+$ write cvh " vms_status |= STS$K_SUCCESS;"
+$ write cvh " }"
+$ write cvh " decc$exit(vms_status);"
+$ write cvh "}"
+$!
+$! Close out the file
+$!
+$ write cvh ""
+$ write cvh "#endif /* __CONFIG_VMS_H__ */"
+$ close cvh
+$!
+$all_exit:
+$ exit
diff --git a/vms/vms-conf.h b/vms/vms-conf.h
deleted file mode 100644
index 575b5de6..00000000
--- a/vms/vms-conf.h
+++ /dev/null
@@ -1,678 +0,0 @@
-#ifndef CONFIG_H
-#define CONFIG_H
-/*
- * config.h -- configuration definitions for gawk.
- *
- * For VMS (assumes V4.6 or later; tested on V7.3-1, V8.3.
- */
-
-/*
- * Copyright (C) 1991-1992, 1995-1996, 1999, 2001-2003, 2005, 2009, 2010, 2011,
- * 2012, the Free Software Foundation, Inc.
- *
- * This file is part of GAWK, the GNU implementation of the
- * AWK Programming Language.
- *
- * GAWK 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.
- *
- * GAWK 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#if 0 /* no longer used */
-/* Define to 1 if using alloca.c. */
-#define C_ALLOCA 1
-#else
-#define NO_ALLOCA /* vms/vms_fwrite.c needs this */
-/* If using the C implementation of alloca, define if you know the
- direction of stack growth for your system; otherwise it will be
- automatically deduced at run-time.
- STACK_DIRECTION > 0 => grows toward higher addresses
- STACK_DIRECTION < 0 => grows toward lower addresses
- STACK_DIRECTION = 0 => direction of growth unknown */
-#define STACK_DIRECTION (-1)
-#endif /*0*/
-
-#include <bitypes.h>
-#define INT32_MAX __INT32_MAX
-#define INT32_MIN __INT32_MIN
-
-/* dynamic loading is possible */
-#undef DYNAMIC
-
-/* Define to 1 if translation of program messages to the user's native
- language is requested. */
-#undef ENABLE_NLS
-
-/* Define to the type of elements in the array set by `getgroups'. Usually
- this is either `int' or `gid_t'. */
-#define GETGROUPS_T int
-
-/* Define to 1 if the `getpgrp' function requires zero arguments. */
-#define GETPGRP_VOID 1
-
-/* Define to 1 if you have the `alarm' function. */
-#define HAVE_ALARM 1
-
-/* Define to 1 if you have the <arpa/inet.h> header file. */
-#undef HAVE_ARPA_INET_H
-
-/* Define to 1 if you have the `atexit' function. */
-#define HAVE_ATEXIT 1
-
-/* Define to 1 if you have the `btowc' function. */
-#undef HAVE_BTOWC
-
-/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
- CoreFoundation framework. */
-#undef HAVE_CFLOCALECOPYCURRENT
-
-/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
- the CoreFoundation framework. */
-#undef HAVE_CFPREFERENCESCOPYAPPVALUE
-
-/* Define if the GNU dcgettext() function is already present or preinstalled.
- */
-#undef HAVE_DCGETTEXT
-
-/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't.
- */
-#undef HAVE_DECL_TZNAME
-
-/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
-#undef HAVE_DOPRNT
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#undef HAVE_FCNTL_H
-
-/* Define to 1 if you have the `fmod' function. */
-#define HAVE_FMOD 1
-
-/* have getaddrinfo */
-#undef HAVE_GETADDRINFO
-
-/* Define to 1 if you have the `getgrent' function. */
-#undef HAVE_GETGRENT
-
-/* Define to 1 if you have the `getgroups' function. */
-#undef HAVE_GETGROUPS
-
-/* Define if the GNU gettext() function is already present or preinstalled. */
-#undef HAVE_GETTEXT
-
-/* Define to 1 if you have the `grantpt' function. */
-#undef HAVE_GRANTPT
-
-/* Define if you have the iconv() function. */
-#undef HAVE_ICONV
-
-/* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
-#undef HAVE_INTMAX_T
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
- declares uintmax_t. */
-#undef HAVE_INTTYPES_H_WITH_UINTMAX
-
-/* Define to 1 if you have the `isascii' function. */
-#define HAVE_ISASCII 1
-
-/* Define to 1 if you have the `iswctype' function. */
-#define HAVE_ISWCTYPE 1
-
-/* Define to 1 if you have the `iswlower' function. */
-#define HAVE_ISWLOWER 1
-
-/* Define to 1 if you have the `iswupper' function. */
-#define HAVE_ISWUPPER 1
-
-/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
-#undef HAVE_LANGINFO_CODESET
-
-/* Define if your <locale.h> file defines LC_MESSAGES. */
-#undef HAVE_LC_MESSAGES
-
-/* Define to 1 if you have the <libintl.h> header file. */
-#undef HAVE_LIBINTL_H
-
-/* Define if you have the libsigsegv library. */
-#undef HAVE_LIBSIGSEGV
-
-/* Define to 1 if you have the `m' library (-lm). */
-#undef HAVE_LIBM
-
-/* Define to 1 if you have a fully functional readline library. */
-#undef HAVE_LIBREADLINE
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#undef HAVE_LOCALE_H
-
-/* Define if you have the 'long long' type. */
-#undef HAVE_LONG_LONG
-
-/* Define to 1 if the system has the type `long long int'. */
-#undef HAVE_LONG_LONG_INT
-
-/* Define to 1 if you have the `mbrlen' function. */
-#define HAVE_MBRLEN 1
-
-/* Define to 1 if mbrtowc and mbstate_t are properly declared. */
-#define HAVE_MBRTOWC 1
-
-/* Define to 1 if you have the <mcheck.h> header file. */
-#undef HAVE_MCHECK_H
-
-/* Define to 1 if you have the `memcmp' function. */
-#define HAVE_MEMCMP 1
-
-/* Define to 1 if you have the `memcpy' function. */
-#define HAVE_MEMCPY 1
-
-/* Define to 1 if you have the `memcpy_ulong' function. */
-#undef HAVE_MEMCPY_ULONG
-
-/* Define to 1 if you have the `memmove' function. */
-#define HAVE_MEMMOVE 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the `memset' function. */
-#define HAVE_MEMSET 1
-
-/* Define to 1 if you have the `memset_ulong' function. */
-#undef HAVE_MEMSET_ULONG
-
-/* Define to 1 if you have the `mkstemp' function. */
-#undef HAVE_MKSTEMP
-
-/* we have the mktime function */
-#define HAVE_MKTIME 1
-
-/* Define to 1 if you have the <netdb.h> header file. */
-#undef HAVE_NETDB_H
-
-/* Define to 1 if you have the <netinet/in.h> header file. */
-#undef HAVE_NETINET_IN_H
-
-/* we'll use the one in [.missing_d] */
-#undef HAVE_SETENV
-
-/* Define to 1 if you have the `setlocale' function. */
-#undef HAVE_SETLOCALE
-
-/* Define to 1 if you have the `setsid' function. */
-#undef HAVE_SETSID
-
-/* Define to 1 if you have the `snprintf' function. */
-#undef HAVE_SNPRINTF
-
-/* newer systems define this type here */
-#undef HAVE_SOCKADDR_STORAGE
-
-/* we have sockets on this system */
-#undef HAVE_SOCKETS
-
-/* Define to 1 if you have the <stdarg.h> header file. */
-#define HAVE_STDARG_H 1
-
-/* Define to 1 if you have the <stddef.h> header file. */
-#define HAVE_STDDEF_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
- uintmax_t. */
-#undef HAVE_STDINT_H_WITH_UINTMAX
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strchr' function. */
-#define HAVE_STRCHR 1
-
-/* Define to 1 if you have the `strcoll' function. */
-#define HAVE_STRCOLL 1
-
-/* Define to 1 if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the `strftime' function. */
-#undef HAVE_STRFTIME /* use the missing_d/strfime.c version */
-
-/* Define to 1 if cpp supports the ANSI # stringizing operator. */
-#ifdef VAXC
-#undef HAVE_STRINGIZE
-#else
-#define HAVE_STRINGIZE 1
-#endif
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strncasecmp' function. */
-#undef HAVE_STRNCASECMP
-
-/* Define to 1 if you have the <stropts.h> header file. */
-#undef HAVE_STROPTS_H
-
-/* Define to 1 if you have the `strtod' function. */
-#define HAVE_STRTOD 1
-
-/* Define to 1 if you have the `strtoul' function. */
-#define HAVE_STRTOUL 1
-
-/* Define to 1 if `st_blksize' is a member of `struct stat'. */
-#undef HAVE_STRUCT_STAT_ST_BLKSIZE
-
-/* Define to 1 if `tm_zone' is a member of `struct tm'. */
-#undef HAVE_STRUCT_TM_TM_ZONE
-
-/* Define to 1 if you have the `system' function. */
-#define HAVE_SYSTEM 1
-
-/* Define to 1 if you have the <sys/ioctl.h> header file. */
-#undef HAVE_SYS_IOCTL_H
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#undef HAVE_SYS_PARAM_H
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#undef HAVE_SYS_SOCKET_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#undef HAVE_SYS_TIME_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
-#undef HAVE_SYS_WAIT_H
-
-/* Define to 1 if you have the <termios.h> header file. */
-#undef HAVE_TERMIOS_H
-
-/* Define to 1 if you have the `tmpfile' function. */
-#define HAVE_TMPFILE 1
-/* Force snprintf.c to use tmpfile() instead of mkstemp(). */
-#ifdef HAVE_MKSTEMP
-#undef HAVE_MKSTEMP
-#endif
-
-/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
- `HAVE_STRUCT_TM_TM_ZONE' instead. */
-#undef HAVE_TM_ZONE
-
-/* Define to 1 if you have the `towlower' function. */
-#define HAVE_TOWLOWER 1
-
-/* Define to 1 if you have the `towupper' function. */
-#define HAVE_TOWUPPER 1
-
-/* Define to 1 if you don't have `tm_zone' but do have the external array
- `tzname'. */
-#define HAVE_TZNAME 1 /* (faked in vms/vms_misc.c) */
-
-/* Define to 1 if you have the `tzset' function. */
-#define HAVE_TZSET 1 /* (faked in vms/vms_misc.c) */
-
-/* Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>. */
-#undef HAVE_UINTMAX_T
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifdef __DECC
-#define HAVE_UNISTD_H 1
-#else
-#undef HAVE_UNISTD_H
-#endif
-
-/* Define if you have the 'unsigned long long' type. */
-#undef HAVE_UNSIGNED_LONG_LONG
-
-/* Define to 1 if the system has the type `unsigned long long int'. */
-#undef HAVE_UNSIGNED_LONG_LONG_INT
-
-/* Define to 1 if you have the `usleep' function. */
-#define HAVE_USLEEP 1
-
-/* Define to 1 if you have the `vprintf' function. */
-#define HAVE_VPRINTF 1
-
-/* Define to 1 if you have the <wchar.h> header file. */
-#define HAVE_WCHAR_H 1
-
-/* Define to 1 if you have the `wcrtomb' function. */
-#define HAVE_WCRTOMB 1
-
-/* Define to 1 if you have the `wcscoll' function. */
-#define HAVE_WCSCOLL 1
-
-/* Define to 1 if you have the `wctype' function. */
-#define HAVE_WCTYPE 1
-
-/* Define to 1 if you have the <wctype.h> header file. */
-#define HAVE_WCTYPE_H 1
-
-/* systems should define this type here */
-#define HAVE_WCTYPE_T 1
-
-/* systems should define this type here */
-#undef HAVE_WINT_T
-
-/* disable fatal errors on directories */
-#undef NO_DIRECTORY_FATAL
-
-/* disable lint checks */
-#undef NO_LINT
-
-/* Name of package */
-#define PACKAGE "gawk"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "bug-gawk@gnu.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "GNU Awk"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GNU Awk 4.1.0"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "gawk"
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "4.1.0"
-
-/* Define to 1 if *printf supports %F format */
-#undef PRINTF_HAS_F_FORMAT
-
-/* Define as the return type of signal handlers (`int' or `void'). */
-#define RETSIGTYPE void
-
-/* The size of a `unsigned int', as computed by sizeof. */
-#define SIZEOF_UNSIGNED_INT 4
-
-/* The size of a `unsigned long', as computed by sizeof. */
-#define SIZEOF_UNSIGNED_LONG 4
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* some systems define this type here */
-#undef TIME_T_IN_SYS_TYPES_H
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#undef TIME_WITH_SYS_TIME
-
-/* Define to 1 if your <sys/time.h> declares `struct tm'. */
-#undef TM_IN_SYS_TIME
-
-/* force use of our version of strftime */
-#define USE_INCLUDED_STRFTIME 1
-
-/* Version number of package */
-#define VERSION "4.1.0"
-
-/* Define to 1 if on AIX 3.
- System headers sometimes define this.
- We just want to avoid a redefinition error message. */
-#ifndef _ALL_SOURCE
-# undef _ALL_SOURCE
-#endif
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-#undef _FILE_OFFSET_BITS
-
-/* Enable GNU extensions on systems that have them. */
-#ifndef _GNU_SOURCE
-# undef _GNU_SOURCE
-#endif
-
-/* Define for large files, on AIX-style hosts. */
-#undef _LARGE_FILES
-
-/* Define to 1 if on MINIX. */
-#undef _MINIX
-
-/* The _Noreturn keyword of C11. */
-#ifndef _Noreturn
-# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
- || 0x5110 <= __SUNPRO_C)
-# define _Noreturn __attribute__ ((__noreturn__))
-# elif defined _MSC_VER && 1200 <= _MSC_VER
-# define _Noreturn __declspec (noreturn)
-# else
-# define _Noreturn
-# endif
-#endif
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
- this defined. */
-#undef _POSIX_1_SOURCE
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-#undef _POSIX_SOURCE
-
-/* Define to 1 if type `char' is unsigned and you are not using gcc. */
-#ifndef __CHAR_UNSIGNED__
-# undef __CHAR_UNSIGNED__
-#endif
-
-/* Enable extensions on Solaris. */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# undef _POSIX_PTHREAD_SEMANTICS
-#endif
-#ifndef _TANDEM_SOURCE
-# undef _TANDEM_SOURCE
-#endif
-
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-#undef gid_t
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
-#undef inline
-#endif
-
-/* Define to widest signed type if <inttypes.h> doesn't define. */
-#define intmax_t long int
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-#undef pid_t
-
-/* Define to the equivalent of the C99 'restrict' keyword, or to
- nothing if this is not supported. Do not define if restrict is
- supported directly. */
-#define restrict
-#if defined(__DECC) && (__DECC_VER >= 60400000)
-#undef restrict
-#endif
-
-/* Define to `unsigned' if <sys/types.h> doesn't define. */
-#undef size_t
-
-/* type to use in place of socklen_t if not defined */
-#undef socklen_t
-
-/* Define to `int' if <sys/types.h> does not define. */
-#define ssize_t int
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-#undef uid_t
-
-/* Define to unsigned long or unsigned long long if <stdint.h> and
- <inttypes.h> don't define. */
-#define uintmax_t unsigned long
-
-#if 0
-#include "custom.h" /* overrides for stuff autoconf can't deal with */
-#else
-
-/* Whether `time_t' is an unsigned type. */
-#define TIME_T_UNSIGNED 1
-
-/* Extension for shared libraries */
-#define SHLIBEXT "exe"
-
-
-/*******************************/
-/* Gawk configuration options. */
-/*******************************/
-
-/*
- * DEFPATH
- * VMS: "/AWK_LIBRARY" => "AWK_LIBRARY:"
- * The default search path for the -f option of gawk. It is used
- * if the AWKPATH environment variable is undefined.
- *
- * Note: OK even if no AWK_LIBRARY logical name has been defined.
- */
-
-#define DEFPATH ".,/AWK_LIBRARY"
-#define DEFLIBPATH ".,/AWK_LIBRARY"
-#define ENVSEP ','
-
-/*
- * Extended source file access.
- */
-#define DEFAULT_FILETYPE ".awk"
-
-/*
- * Pipe handling.
- */
-#define PIPES_SIMULATED 1
-
-/*
- * VAXCRTL is pre-ANSI and does some variations of numeric formatting
- * differently than gawk expects.
- */
-#if defined(VAX) && !defined(__DECC)
-/* '0' format modifier for %e,%f,%g gives wrong results in many cases */
-#define VAXCRTL
-/* %g format chooses %e format when should use %f */
-#define GFMT_WORKAROUND 1
-#endif
-
-/*
- * VAX C
- *
- * As of V3.2, VAX C is not yet ANSI-compliant. But it's close enough
- * for GAWK's purposes. Comment this out for VAX C V2.4 and earlier.
- * YYDEBUG definition is needed for combination of VAX C V2.x and Bison.
- */
-#if defined(VAXC) && !defined(__STDC__)
-#define __STDC__ 0
-#define NO_TOKEN_PASTING
-#define signed /*empty*/
-#define inline /*empty*/
-#ifndef __DECC /* DEC C does not support #pragma builtins even in VAXC mode */
-#define VAXC_BUILTINS
-#endif
-/* #define YYDEBUG 0 */
-#define NO_MBSUPPORT /* VAX C's preprocessor can't handle mbsupport.h */
-#endif
-
-/*
- * DEC C
- *
- * Digital's ANSI complier.
- */
-#ifdef __DECC
- /* DEC C implies DECC$SHR, which doesn't have the %g problem of VAXCRTL */
-#undef GFMT_WORKAROUND
- /* DEC C V5.x introduces incompatibilities with prior porting efforts */
-#define _DECC_V4_SOURCE
-#define __SOCKET_TYPEDEFS
-#if __VMS_VER >= 60200000
-# undef __VMS_VER
-# define __VMS_VER 60100000
-#endif
-#if __CRTL_VER >= 60200000
-# if __CRTL_VER >= 70320000
-# define CRTL_VER_V732
-# define HAVE_SNPRINTF 1
-# endif
-# if __CRTL_VER >= 70301000
-# define CRTL_VER_V731
-# endif
-# undef __CRTL_VER
-# define __CRTL_VER 60100000
-#endif
-#if __DECC_VER >= 60400000 && !defined(DEBUG)
-/* disable "new feature in C99" diagnostics (for regex code);
- NEWC99 ought to suffice but doesn't (at least in V6.4) */
-#pragma message disable (NEWC99,DESIGNATORUSE)
-#endif
-#endif /* __DECC */
-
-/*
- * GNU C
- *
- * Versions of GCC (actually GAS) earlier than 1.38 don't produce the
- * right code for ``extern const'' constructs, and other usages of
- * const might not be right either. The old set of include files from
- * the gcc-vms distribution did not contain prototypes, and this could
- * provoke some const-related compiler warnings. If you've got an old
- * version of gcc for VMS, define 'const' out of existance, and by all
- * means obtain the most recent version!
- *
- * Note: old versions of GCC should also avoid defining STDC_HEADERS,
- * because most of the ANSI-C required header files are missing.
- */
-#ifdef __GNUC__
-/* #define const */
-/* #undef STDC_HEADERS */
-/* #undef HAVE_STDDEF_H */
-#ifndef STDC_HEADERS
-#define alloca __builtin_alloca
-#define environ $$PsectAttributes_NOSHR$$environ /* awful GAS kludge */
-#endif
-#undef REGEX_MALLOC /* use true alloca() in regex.c */
-#endif
-
-/* EXIT_SUCCESS and EXIT_FAILURE normally come from <stdlib.h> */
-#ifndef HAVE_STDLIB_H
-# define EXIT_SUCCESS 1 /* SYS$_NORMAL */
-# define EXIT_FAILURE 0x10000002 /* STS$M_INHIB_MSG|STS$K_ERROR */
-#endif
-/* EXIT_FATAL is specific to gawk, not part of Standard C */
-#define EXIT_FATAL 0x10000004 /* STS$M_INHIB_MSG|STS$K_SEVERE */
-
-#define IN_CONFIG_H
-#include "vms/redirect.h"
-#undef IN_CONFIG_H
-
-#endif /*"custom.h"*/
-
-#endif /*CONFIG_H*/
diff --git a/vms/vms-notes b/vms/vms-notes
index 23943bb9..2d57648e 100644
--- a/vms/vms-notes
+++ b/vms/vms-notes
@@ -6,3 +6,1143 @@ Per Anders Wallin, the HP VMS porting guide is available at
http://h71000.www7.hp.com/portability/portingguidelines.html
This file documents this fact, and anything else of interest.
+From wb8tyw@qsl.net Wed Dec 11 20:03:44 2013
+Return-Path: <wb8tyw@qsl.net>
+Received: from skeeve.com (skeeve.com [127.0.0.1])
+ by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id rBBI3gNX002464
+ for <arnold@localhost>; Wed, 11 Dec 2013 20:03:43 +0200
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ frenzy.freefriends.org
+X-Spam-Level:
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM
+ autolearn=ham version=3.3.1
+X-Envelope-From: wb8tyw@qsl.net
+X-Envelope-To: <arnold@skeeve.com>
+Received: from frenzy.freefriends.org [66.54.153.139]
+ by skeeve.com with IMAP (fetchmail-6.3.21)
+ for <arnold@localhost> (single-drop); Wed, 11 Dec 2013 20:03:43 +0200 (IST)
+Received: from Encompasserve.org (Eisner.encompasserve.org [67.53.90.116])
+ by freefriends.org (8.14.6/8.14.6) with ESMTP id rBB5jaW9020988
+ for <arnold@skeeve.com>; Tue, 10 Dec 2013 22:45:40 -0700
+Received: from [192.168.0.101]
+ (173-19-202-206.client.mchsi.com [173.19.202.206])
+ by Encompasserve.org (PMDF V6.6 #13031)
+ with ESMTPSA id <01P1SYL5LELG002FZE@Encompasserve.org> for arnold@skeeve.com;
+ Tue, 10 Dec 2013 23:45:35 -0600 (CST)
+Date: Tue, 10 Dec 2013 23:45:36 -0600
+From: "John E. Malmberg" <wb8tyw@qsl.net>
+Subject: Re: Some questions...
+In-reply-to: <201312110426.rBB4QXXc003297@skeeve.com>
+To: Aharon Robbins <arnold@skeeve.com>
+Cc: wb8tyw@qsl.net
+Message-id: <52A7FC00.2040905@qsl.net>
+MIME-version: 1.0
+Content-type: text/plain; charset=ISO-8859-1; format=flowed
+Content-transfer-encoding: 7BIT
+User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20130215
+ Thunderbird/17.0.3
+References: <529A9537.7090404@qsl.net> <201312110426.rBB4QXXc003297@skeeve.com>
+Status: RO
+
+On 12/10/2013 10:26 PM, Aharon Robbins wrote:
+> Hi. Some questions about your changes.
+>
+> 1. I notice that there is at least one instance of #if __VMS, where as
+> it seems most code uses #if VMS. Is that on purpose? If not, which
+> is correct?
+
+VMS is a macro historically pre-defined by C compilers on C before the
+ANSI rules.
+
+Under strict ANSI rules, a standards compliant compiler is not allowed
+to pre-define macros that are not prefixed by "__".
+
+Which means that you can not count on the VMS macro being defined unless
+you do it yourself.
+
+So __VMS is the ANSI correct definition. But it would be a lot of work
+to change all the code.
+
+The vms_config.h that is now generated has these lines in it to make
+sure that VMS is defined.
+
+#ifdef __VMS /* ANSI compliant */
+#ifndef VMS /* PRE-ansi */
+#define VMS 1
+#endif
+#endif
+
+This may be needed for other architectures. It only shows up as an
+issue if you set a "strict" compliance flag on the compile command.
+
+> 2. For the include of the main wrapper. Gawk already has a routine
+> os_arg_fixup which is intended to manipulate argc and argv as needed
+> by an OS-specific routine before main() parses it. A quick look at
+> the wrapper looks to me like it could be made to fit within that framework,
+> which would keep #if and the include out of the mainline code.
+
+I can look at that. I can also look to see if I can move the logic from
+vms_crtl_init.c into it in a way that would sidestep that it has no
+copyright notice at all. The result would be code that is almost
+identical to code that is in the official Perl distribution.
+
+GNV was started as a user project and when the VMS POSIX product was
+dropped and they needed a Unix like environment, Digital took over the
+GNV product, but did not really do much to keep it up to date.
+
+The routine in vms_crtl_init.c is actually called before main() is
+called, so just linking a module with it in is all that it takes to
+activate the change. Unfortunately I do not know how to get it to
+magically fix up the argv array.
+
+> If that looks reasonable to you, can you make that change? You can send
+> it as a diff against what you currently have already done.
+
+I will look at it tomorrow night. I also found another change needed
+for vms_args.c to work properly under a bash shell.
+
+> I'm sorry about the hassle on the copyrights, but I really have to play
+> this game by the FSF rules. I hope we can get it clarified soon
+> so that I can include the files in the dist.
+
+I hope so. I have not seen a reply from Karl yet. He did say that
+there are other options.
+
+This would clear the way for getting the similar code accepted into the
+Bash and coreutils repositories. I have a report that the first bash
+4.3 beta built on VMS and looked real good on the test run.
+
+I am currently working on adapting the packaging scripts from bash and
+coreutils to gawk. Each product has had it unique features, so I have
+not yet come up with a generic set of scripts.
+
+This is a preview what will be coming:
+
+backup_gawk_src.com - Builds a VMS equivalent to tar archive. By
+placing the source in the PCSI kit, it covers the requirement of
+providing source somewhere with the binary.
+
+build_gawk_pcsi_desc.com - Creates a VMS PCSI package manifest file.
+
+build_gawk_pcsi_text.com - text output by the VMS PCSI package installer.
+
+compare_gawk_source.com - I have the source checked out on an NFS
+server. The backup program needs me to copy it to a VMS volume first.
+This procedure makes sure that the two copies are the same and ready for
+backup.
+
+gawk_alias_setup.com - Sets up gawk and awk links to gnv$gawk.exe.
+Needed to repair when sins of the past partially break an install.
+
+gawk_verb.cld - for gawk to use gnv$gawk.exe as an image. Different
+than gawk.cld. To properly add an image to the VMS command table, it
+needs a prefix. I have "GNV$" registered as a prefix for this purpose.
+
+gnv_gawk_kit_name.com - Calculates the VMS PCSI package name, used for
+both file names and file contents.
+
+gnv_gawk_startup.com - Run at VMS startup to make sure that the
+environment is set up properly for gawk.
+
+pcsi_gawk_file_list.txt - Source file for build_gawk_pcsi_desc.com.
+
+remove_old_gawk.com - Needed to properly clean up sins of the past.
+Only touches the the GNV provided gawk and awk programs.
+
+stage_gawk_install.com - Does a pre-install into a fake "root" directory
+tree for the kitting procedure to pull files out of.
+
+Regards,
+-John
+
+From wb8tyw@qsl.net Thu Dec 12 12:21:57 2013
+Return-Path: <wb8tyw@qsl.net>
+Received: from skeeve.com (skeeve.com [127.0.0.1])
+ by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id rBCAIn2l004322
+ for <arnold@localhost>; Thu, 12 Dec 2013 12:21:55 +0200
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ frenzy.freefriends.org
+X-Spam-Level:
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM
+ autolearn=ham version=3.3.1
+X-Envelope-From: wb8tyw@qsl.net
+X-Envelope-To: <arnold@skeeve.com>
+Received: from frenzy.freefriends.org [66.54.153.139]
+ by skeeve.com with IMAP (fetchmail-6.3.21)
+ for <arnold@localhost> (single-drop); Thu, 12 Dec 2013 12:21:55 +0200 (IST)
+Received: from Encompasserve.org (Eisner.encompasserve.org [67.53.90.116])
+ by freefriends.org (8.14.6/8.14.6) with ESMTP id rBC6FboY024650
+ for <arnold@skeeve.com>; Wed, 11 Dec 2013 23:15:41 -0700
+Received: from [192.168.0.101]
+ (173-19-202-206.client.mchsi.com [173.19.202.206])
+ by Encompasserve.org (PMDF V6.6 #13031)
+ with ESMTPSA id <01P1UDWPUU7M002J4J@Encompasserve.org> for arnold@skeeve.com;
+ Thu, 12 Dec 2013 00:15:35 -0600 (CST)
+Date: Thu, 12 Dec 2013 00:15:38 -0600
+From: "John E. Malmberg" <wb8tyw@qsl.net>
+Subject: Re: Some questions...
+In-reply-to: <201312110755.rBB7tIrb026097@freefriends.org>
+To: arnold@skeeve.com
+Cc: wb8tyw@qsl.net
+Message-id: <52A9548A.5060604@qsl.net>
+MIME-version: 1.0
+Content-type: multipart/mixed; boundary="Boundary_(ID_0V6xQMBg8dMk2LzZyR0ioQ)"
+User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20130215
+ Thunderbird/17.0.3
+References: <529A9537.7090404@qsl.net> <201312110426.rBB4QXXc003297@skeeve.com>
+ <52A7FC00.2040905@qsl.net> <201312110755.rBB7tIrb026097@freefriends.org>
+Status: RO
+X-Status: A
+
+This is a multi-part message in MIME format.
+
+--Boundary_(ID_0V6xQMBg8dMk2LzZyR0ioQ)
+Content-type: text/plain; charset=ISO-8859-1; format=flowed
+Content-transfer-encoding: 7BIT
+
+I moved the vms_gawk_main_wrapper.c code into gawkmisc.vms so that file
+is not needed anymore.
+
+I also discovered that we were not building with exact case public
+symbols, so I fixed up the source to build with exact case symbols.
+This will be more important when building dynamic plug-ins, and in the
+future if and when the other related packages can be built with it.
+
+This caused small changes to most of the source files in VMS, as all the
+system services routines were in the wrong case.
+
+I see that just about everything has been backed out of git until the
+legal stuff is resolved.
+
+This is what I currently have for io.c changes based on a branch I just
+made against master.
+
+And this is what the diff for the vms/gawkmisc.vms changes are, which
+eliminates the change to main.c.
+
+Regards,
+-John
+
+
+
+On 12/11/2013 1:55 AM, arnold@skeeve.com wrote:
+> Hi.
+>
+> Thahks for the answers. I will address some of this later; I'm at work now.
+>
+> I would like to emphasize that, from my perspective, the priorities are:
+>
+> 1. Code changes (os_arg_fixup, etc.).
+> 2. Documentation revisions.
+> 3. The other VMS-only goodies that you described.
+>
+> The documentation revisions are not optional; I have to have them.
+>
+> But, as I said, it's enough if you give me plain text. I can do the
+> markup. If the markup is what's holding you back then don't bother,
+> just send me text, with some kind of clear indication of the sectioning /
+> subsectioning (if any), and I'll do the markup.
+>
+> Karl replied further to me; I don't know if it was on purpose or
+> by accident that he didn't include you. I will include you on the
+> further correspondance that I need to send.
+>
+> Believe me, I very much want to move this forward, but I really do
+> have to play by the rules.
+>
+> Thanks,
+>
+> Arnold
+>
+
+
+--Boundary_(ID_0V6xQMBg8dMk2LzZyR0ioQ)
+Content-type: application/gzip; name=gawk_io_c_vms.patch.gz
+Content-transfer-encoding: base64
+Content-disposition: attachment; filename=gawk_io_c_vms.patch.gz
+
+H4sICANRqVICAzAwMDEtaW8uYy1yZWRpcmVjdC1BZGQtYWRkaXRpb25hbC1WTVMtZXJyb3It
+Y29kZXMucGF0Y2gAnVV/b9pIEP0bf4q5pmptwI5tzM82FRRImyqQXEhzV51OyPaOwY3t5Wwn
+TdT0u9/sGhNIIuVyKyTvzs6bfTNvdjlMeQy+7Ti+z3zT902n6wZdz/acltU0zQBNn7VZs2m2
+ut0GTHgCM1yB1QbT7Mkf2KZpKYcUpgdf+DKBiRvFHqYLeP/D6+S3P/r/ZJGRYP5BGbk59uAP
+ZHWwLBihT1irAXaj12z0GjboZss0ldmV9x39vAd/nQ7Oh5//hpAbPqgpsjAlu9aDAWPgMhbm
+IU/cCC4mM8A05Sn4nGFmSIACaoI3eRBGSIgzzNNb4CtMwA1yJM+IZ2GygIzHCMIpMxRF13UF
+hks3WeAxX8Ad0HCgRkMpSMghzLYpzVtD1yXaLoKBL6OIRLsQJhmmgmum1rQ6NIFhhMVa1xSF
+hUEAur4Ic3D370/37udKmDC8AdfqYIc1DAO7zGx6Llim2XIcQXsbqRCbHXS/D7pVb0DNqreh
+31dqouq6ZeskQjmkcmPjXjw5HilYK/2rL1blMfal+pAKG+bmhvnM53lOzRQG4eXGCO8zYWZG
+7IZRP/P8RcQ9d50EKFApOYhzMHZvPcy4f4llHgyDMJGZQEAZjL58Oj01dpWSeE9+1vo4AV2j
+Junjt5sMW51dfaRjIY2cSlVsq94iXehDWpA0sIcJnSIo7oVBQQOZSrXUlNpemPjRFUNKLqMd
+Y/lB2AI6O4DZ7PV8/OfHb+fHEzIWuG0jmDe2azkA+1WpTMdwIEMqd3Wf/ItDtw5I4/IEKIM9
+rJQaMK0ijWK2xVwk5rRskZjTaheJQam1enTy8eshVKv+VSrWdfA4jyC7DFcr0pviVCoV4li4
+xW7iLjDGhF4DIir2qKUSDgdgvpPLgNGc4bVoHTVI3FhEDJOYWk59lb7StHdKjdyolqoqfA/g
+aHoxOD4azT8PpqPjsQZv3oC6DnoA48nhERk1+ClhRX5znqC6DvSE5T9S+FXSF9eBEPLMIgnB
+7jdgfJ6nbnl/ikpUrlaMHs35+OxsejIPk7ygSiFFlbtOp07vZ63blF8ylddRnZ6MxlCVyzne
+rOr0COXFbn67wmJZpVhBtK654PCgDHB3B/emqaxMwWqnCKJTRQtSWyl6od4gWi3dfdFnF23D
+epvBEM7OjyHMiEJ+lSbiZudLWtLTmKPLZIEe4WpPwzDDDU6wodvOg5KyunSvMXmbQ56GyICT
+ewornuX6RcuwIbslXJxpopv03Wvy+9eT8wFdE/o3Gz7ce/YKibwxEsR2ynh0ItpLZrfZ3d3e
+KTFFJaFlSyrw7FCv3Rv/9Qa9ncXdnaI/H+ApvMxU0+4f6/8BF8e/GH82oQCD4VCCK1LWJxxm
+36ba0z24fn3KSv+kVxcUy2gbXUX5F+2/BB3kCAAA
+
+--Boundary_(ID_0V6xQMBg8dMk2LzZyR0ioQ)
+Content-type: application/gzip; name=gawk_gawkmisc_vms.gdiff.gz
+Content-transfer-encoding: base64
+Content-disposition: attachment; filename=gawk_gawkmisc_vms.gdiff.gz
+
+H4sICINTqVICA2dhd2tfZ2F3a21pc2Nfdm1zLmdkaWZmAJ0aa1PbSPKz+RWzDgU22MY2JLsX
+X3LLgtmllpBUTPZxHKWSpbGtQ5YUjcRj9/jv193z0OhhlrtUBdBMT09Pv7tn+v0+OxCp56Rx
+nB0s3fvbg7u1oD/WgfAG8NH6lfvslHtsNGLj8dvX3709/I6Nh6PDrf39fYbgL198OH47/ptc
+/P33rD8+7B0O2T78Ojp6w77/fouxPXYW55HvZkEc9dh55A167PWInaVudBsGEZtlKedZj50F
+i2zFzsI4Tnvsh1hkCP7hmLHheDQa9keHw1GPfZkdI8qDLba1/yqIvDD3Ofu7yPwgHqzel8fS
+IFpWBr3sMeE1QD8M5jRoD/tceGmQVID9u8Dni8ogX0T1wYXwGkZFJuqDWbCuEhVGaw1HZCWp
+u1y7bM3Xc546bhgsozWPMibcO15MR3ENIIyj5X2c+lv7wJDcy1iQ8bUTBiJzDtmfW/utPBIA
+CzIVqzgFeB5N6qNe7HMcvosDHwQ6zxeunzbA7bGUZxLF0wQJV5sughDY6UZOkK1D2HqMWzP4
+V999ma0mjXOwVJGBk97KTWE7L14ncQQHNTtuYhXOBcCQ2e+z7R+nV6e/nP/akahKeyG/GAi0
+1zCneLFy7VkvjgTIQZ7TF962UpwsTh0BFPr8LnLXmxbY0thjkjsWrOJ3EIt5dbSzx1yRgRi6
+nRLx3d6mUwF4kq7r2KM8DN102Z3YLDo7v5jOTo4vOy8/KTgdmLTwbxT+Hrtzw5zjuTdSu8cW
+ob8I3aWoY6xv7uYPcZ5tFppWzOKQjI559fny4vJD7ZBVUtysdLC/4kTmzkPuwMRLSGegHlXg
+ChVK2V1vDQbwUlVSX3RiieFrHmecvWO7/9rdnaixPXAziQuO9x07nZ59Or76yZ4Bx1hMXpz/
+YM/z6E7whCG+HqDbfwXwQcTZLx9mzuXxh6lzMb1kI3QB4Po9uQZDCx732gbaH92QVA722JV7
+y5kbhixbcbbIIwZCZfGCiWCdhI8gjfgWnDrLE+bCxzLw3JDYhxFBb4TCFY/CydIIvCgxqyMZ
+pdgIC3FNr+RISCHVEGKgbwc1Zmsf3aTEsH0KRvH5/NPVx8+dQsisDTpEFuOcTn9pI8dbTXqE
+WgTsQuAPzsnxbOr8cHF+eYrgm7RD6wbC0MHgjLlo8LwpF3mYWahsdQgysLvrsWRzS34NbwZw
+OiDHnHRiz6GrVbQ6s6vP55c/lqZlBNCrS1PS0GBqx9Bkpkd60+HEHlObDSWoPvMAuXHvyJgA
+03Aw+LujxEdcLoG6ThIDjziS1ZFi7SrgGuzc8TEVQMWenWz/7Jxe/f5p6lw1wHmhK4SBO7k4
+ns2cmSRUCgPmLE+yQ66C7VjasWMMnA17UhZdxZQF62yjKcyujq++wK8vJyfT2awjEXe7GCUB
+rAWWcZmjVfB0HUQuGLEb+ejR8jQiU5HJDllBq0UiuZbMvyFzH6J9tp4ImVplFAlH2RaDLTDL
+I+tkfcghE9wQzQ/xt3GuzRIXNG2Rxmu2iu9p4uOMgQ2GoIbACJmWAabf45zdx3noQ0aCCILo
+Fn669KdAhcWpOZyCidxbwa8kjYFd6x5kFhCowRyBKYw/ZBxSKJ8CCBMJ94IFWDzmkYK5KWdw
+aO/2kWUxEiZ4j7hyz9mKkiL0wzGwTHkTP1gseMojj8PO2T0HNXTZyeerC7bkEU+BqT4gXd6B
+ChMelzAkIHyY4A/c63RL85AF+EDWPAbd9FzBxQAXHBhnu7dVMLRDIRAO0N1itivSw+BS/9zq
+t+Rg0mN7X+v2jl+FkSuvJVZwPD0beiQ8Y0cgiPMFnZ18OE0CvjQT7D7IkO0HPZyOQCcZyMUF
+jsxFHOaZXAEokIcot7X7SFwF1gF4wbD5I+EnNgZwLu766K5xDDKzNbBIIsG9BwzJkVuRQPhd
+AMIgsrRESJfB4FZcKNJQYySOe1ewMLjlEAdIBRE2hRChNiKhRJz7AsUOyrUIHlAtk4Fcrlhx
+Oj052f70cXb+m3Py8cOni/PjyysHwxpGoxnSJniGGMY2bzQrYP357OftXz5efPkwlay5D0DB
+YLsEhANpplTCQI2LDH8iVYBSItGUSbIOjB/QuoD69Q6M9mCXzL+lRR2BORBrUNxS3jpZbjX7
+fL7GP68PbwikEi+gkHEwrbw+ktO0C1iyTFev3xw1rjIAOl5sDFwSzMQuid8PxO1dHOIG49dv
+mukyIGoLhEHv9COIRUB9A3q2iNM1uQHQV+2hcJ3yfwd7/Rf9k9CGTyYgdkTwBwctNoftsj4b
+TarAKmhBIbHtHF9cQOQHFapBmUBpsNVAioBZZ6+BG1WpKxhF5MH/17UVNomgszX6RhZ9O5Zw
+Xt/U4AoiaxKyAMel+F4aL8d4dE7Hvi+9UwqJ4wMDqdIn4M7XXLkMLVGrbJOW5SYJBIfqAvL4
+GGPkOlBOL3nsFBT32mS/bRV/W8aoZHrhrdLOjjHE0U2PzFAeBUy0gP7mHbv8cnGhLLRlUpQC
+os80HqU8BAgHQQcEjvxrHoDDAB8MsSNjK4hMiuaWZTkb0xqbyEnjKitvsvxEDeyZPKgJ+Jlk
+qFVOh4oSG2Za07PL7RNnennWk99D9XvH2kINaZ1Rn9pPqU/kOqVRQykWkss3f5VDtSTrVQiA
+4mB7yTPAfM8WbhDaoUYHPvinQo7KACDSQXxUeQCkK8vUXcuQE2cGnuLS6QlQKGLmxzi3wiaU
+AThGFC7UMhwjTfsgWycHClmb3ZMWwNBbA+/HoCOYQ/EHYIkelnrSktmAMbbWE+OhAMSbOGJc
+/vCmYMsGJGpWxR7LccnQU/FSOnxAeuTAlIoehu+V3JUCN2WhmHJpl2eOVQShkju8KWhUillz
+qnrCkT6o6k0LemQ8ZuI2SFC+ENciKC4heaHiEnLOVHhxYZGkZIomFZ2dXcNBten+/qT0jZv2
++2rsydr9mFL3dXwnOZGloIK4rxdDkdi0pXUocCVy/7e1/Uv7tWpLbfY9vVA20mcaksqOn+2/
+UxHHnrkuA91YHp+2O1lx7xZcYwpMR4cfYSgPZQI555BiBjBY54GUqHZlxdHBZ0fo4XVfAYqt
+kvtW8IpM032QwzZLjBl0MAxAOu+tE7V3z3QtukiCdjwlLoJnUXUHWesS/ruQNGdQ3HjyxHFq
+jJqyT3YSgxsIXDAmfW5IkK8oc12D7hlo1/NyTLZ7uINHlZMbgnuReFGLeQEcLGRSuuDg/FJy
+Mq6XBXd8UPEdyNqOPjQeiu3sKBDsl1REXXC+YD26AWDS5P+SxHOiaAFWFY61HIr4XchCQxeS
+o3VlAemf+MP2bNhq0nWRH8gylUojXRlRECc3HmSK63NqbVE6usdkCmqXNECYGsUaH3QBg7tM
+TQ5UqRNEajXMwzT8XOcio0K4Xnq1ihymMcFGMAdHTD1Q1Iqtct9pEfDQd6iXaufs9b6sqR90
+BqibY3QMe0Q3VWhjiuA6FigASISKTO+vch5zlo0JT1Ep18DrHSJTbTdAP5fwVCGfy3bwVHG0
+m6F95RBpHnWVB1IOssANIUvHsEIJAF6Y6PuLIqU9Z/9G8cs8gUpbiD3FaqgioyRXnUihS0XK
+hV0AepQeoCfTFq1IlN9gIqx4gmpGWIpix9F1hyboHTubnVxuO9Ty/zQ9mdQgDYOH9TlzA8Nk
+TlzwR6VbWvlFUSKbwhqKLGr1UJ5cJXFUJxGKrPOT6aQGt5HA0XMEgkOVQqMiRKZ0VEVgXkda
+UiVpXCcJ+waTGtRGgsYbCSpgDuu7oJZOalAbdzl87thTVTchZO2ER/beVbRHz2x5tHHLUl1g
+3SupWPMXlyndHWOWPb2mcFQUZox36zFZH1Btptn6fI9VxT0kpFHl37Fmb9O8sFDFbzAQmQau
+SaRjvGpTlQvw6ZbzxJGuUo0EVqn4q6Wf2lmr5pbIPY8LschDWRhhL7DB7GU3SschtVaZ4UAt
+1OthN1lZC0Gw1NziLI7Aty1lT8xUSDCqlwFySJexGRMvyJZpoSlcRJ4k2NfBM0zPZnoV8gM8
+J/h4wWuUXFFowJ4j9YgfHh62dZMglj3CYO0uVYtAL7oIovyBaTsW2q2qNq06TRhiTDccy0DN
+rBaExiVzJNVMbTbdiQFRxUaD9asimkQugxM1GGR2tLu9a1WwCqjSVlBrTWVhbWf+7JvFfWbn
+RYp6W+GetthWH/WqLV3y22t85TG4gZw95R6Y2+NA5HP4uPnx+NefB9PfppOozfrvWRu/28iX
+fiuxTqLjLJzmBk7DsE1ncLEkjzA0Up+Oln5tXvpeL3VD0AeqQv5O4T+itW74XqIiJIAG+UWJ
+HrKK/ec/7CsDiC7MEHFfJwWVfp5YoP8oWjJvEcU+G3W7E4WxY1OXAFmDXTBfLRBEvvdV36UQ
+tVJ5BhAmJmgAWmvqeXDx01EX0Hb+q8dVBowSUjc0KrWWfoCsEL0FqSvdjJDNBTr9RF1vD/gD
+b2tKtG8pUmv50RwltNtBXjTFGODEyOjlM0BHRYVgETDSKXmpu0AO70En8g9SABFm/LCqp47T
+A5QaBPd9kK7V4GjaRqX+RQVgjlYA2+fRQtupi0X1nVpEUcOZu5NKlWEa+rIwKTfxIaG0mvj1
+oGBGMjj6pLIQRisZtlSCIrJfUSrI3UgorcB7NXceylsacgnUonKxSWXd0KAzPAt0WoDJuWxi
+3q8CqGAFT1ysQIUJROYCRq3FkDCwahZzzGaLlz1VHZwL4Ir7K4VDA0XeUFvG/xQptGEc6GDx
+kliB2UaxrhoxTM+26uQNucbT/4++3mZh2YnrZmtadjNmQdfiz3nEvlye/8bw3Qj4OwjA5chL
+qThwUF7J6riIvCB+6she3G0Jy90ksRDBPOR62T1m9XgTixWPvno1DsrKE1K6SNbL1H0h0YlK
+IjNwIQeMiHJwGxHkJWng6YXGAKjwBi2IHqHIdAUMWJHcaA+YjyWggnHo6YtIrCGr4ikpYyuw
+nA0YCShNJxB+sAwyjeA6uLGbJUauT4UHLSBVC0ZD7xXkDidNnuzAMld0klrZiXUdbJvgbSww
+B1s/XZOp4QqQGQiklOhIb/MC3ijAGmswfMq5a9We5LsYmMtj091qk0lOj+X0g71Ejf22Yclh
+wy6Hz+9ypJhcpOTAZ3PyYXN8wm4t9tp0aa8chEtP5hSMrYhgNZ6Lmoq3h6qpmev2f9F8s5ip
+mGPHszpVjeGsRKpxhWSa7N591O8tOL3d1G8uONggJfMIrPXiWGCe74ZgO/4jWmkAJZVfIAB/
+LW9CpBco6c4iScEyFlBN+TxNVbBsqwYFXq5gFxKvbeXlBuwTxthvR6T/iuRTqabu3GVM7yyX
+WEUA84Ec0w2rpFdFXLHflEnEjc/NTK/xSb6the3kzTx2BN059uXxgl7gKzNtVPQwxdxQYvCk
+lxdyHYafkGPvFz1dBOsS4DJaYU9F0DWUagVCwUNweRzctXqaAHg9WgwqFsb3ajHJyLwSaNGG
+QDpIj0d3nfbsp+nFhWQgqpOcLpsmjUOcgISKpiGlAtLb3ZLGmVcjo0ZZlKef1G56tEiiyD8a
+nVU+0fAfXJydtdnj7+DUdGgbWjsd5TZVYqUzYw0I6fKTersUC8dNlw4IDpiMz5fkX9ZDFBbi
+40RgJT5Tf/2m9y3bP/p23Bsf0St1JH8PMHiJef64h993Cb3N0Q9usj+cNA957XXOFmt18DVt
+l2gzlHQIY48uxpKueZVzBomDIg6ffrM/4ki1mnASlIzeOchQhmoBIhd4TwRCVHag6ADmrd0w
+jL3OaDiWabJpthRPIDvtq39CGq3W9JiBfcnzMzA5pXAVJITB1pTGnell3PmH6T8/Xk6dz18u
+po2EvJCSZ0kxSrJIOe+oyW5ZRaDujRMsmkFB6A96VOaGDAy2/3GmWpVCa8l4+F1vNGL7b45G
+vdG3pCcg6MUYX0HEoY+ep/9ezPMF7EJeC6spfJimWp7Wq7xXwcLnC+Z8mU3hjKd0zkKhO4sR
+IMqQPrSpxVh/KW+I6nv0XX8eyKY9C3zYKr4NdINyZ4cpDAF4/wIDfCFv2CuUEtCot1NOodi1
+Z+0p3YM60eadBRT51KNmh/qBfpTJN4AVgtSdaUETDNSBRlWgUQPQuAo0Jlfxikd+sFCiBjK2
+/gvg4az2BTMAAA==
+
+--Boundary_(ID_0V6xQMBg8dMk2LzZyR0ioQ)--
+
+From wb8tyw@qsl.net Sun Dec 8 19:58:11 2013
+Return-Path: <wb8tyw@qsl.net>
+Received: from skeeve.com (skeeve.com [127.0.0.1])
+ by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id rB8Hw8Y1002346
+ for <arnold@localhost>; Sun, 8 Dec 2013 19:58:10 +0200
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ frenzy.freefriends.org
+X-Spam-Level:
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM
+ autolearn=ham version=3.3.1
+X-Envelope-From: wb8tyw@qsl.net
+X-Envelope-To: <arnold@skeeve.com>
+Received: from frenzy.freefriends.org [66.54.153.139]
+ by skeeve.com with IMAP (fetchmail-6.3.21)
+ for <arnold@localhost> (single-drop); Sun, 08 Dec 2013 19:58:10 +0200 (IST)
+Received: from Encompasserve.org (Eisner.encompasserve.org [67.53.90.116])
+ by freefriends.org (8.14.6/8.14.6) with ESMTP id rB84BBd2018585
+ for <arnold@skeeve.com>; Sat, 7 Dec 2013 21:11:14 -0700
+Received: from [192.168.0.101]
+ (173-19-202-206.client.mchsi.com [173.19.202.206])
+ by Encompasserve.org (PMDF V6.6 #13031)
+ with ESMTPSA id <01P1OOF0VUTE001YI1@Encompasserve.org> for arnold@skeeve.com;
+ Sat, 07 Dec 2013 22:11:09 -0600 (CST)
+Date: Sat, 07 Dec 2013 22:11:05 -0600
+From: "John E. Malmberg" <wb8tyw@qsl.net>
+Subject: Re: VMS patch for config.h generation, passing tests.
+In-reply-to: <52A277C3.303@qsl.net>
+To: "John E. Malmberg" <wb8tyw@qsl.net>
+Cc: arnold@skeeve.com, r.pat.rankin@gmail.com, anders_s_wallin@yahoo.se
+Message-id: <52A3F159.9000607@qsl.net>
+MIME-version: 1.0
+Content-type: text/plain; charset=ISO-8859-1; format=flowed
+Content-transfer-encoding: 7BIT
+User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20130215
+ Thunderbird/17.0.3
+References: <52A17089.9060701@qsl.net>
+ <201312060840.rB68eH2F029601@freefriends.org> <52A277C3.303@qsl.net>
+Status: R
+X-Status: A
+
+I have merged in your changes with my local copy, but not sure yet what
+to do to get the git status happy.
+
+Unfortunately the VMS 8.3 Alpha manyfile test failed. Closing 2 files
+in io.c was not good enough. I am trying again with closing 4 files.
+Still failed. I am going to have to add some diagnostics to identify
+the failure.
+
+And the beginfile1 test also is failing on VMS 8.3 Alpha. I will look
+at that after I resolve the manyfile issue.
+
+I also did not notice that ofmta test failed on VMS 7.3 VAX. The
+floating point number is rounding differently. I get the same result
+with the replacement SNPRINTF or the VMS provided SNPRINTF.
+
+TOAD> diff ofmta.ok sys$disk:[]_ofmta.tmp
+************
+File SRC_ROOT:[GAWK.TEST]OFMTA.OK;1
+ 5 4.234
+ 6 4.2345 hi
+******
+File LCL_ROOT:[GAWK.TEST]_OFMTA.TMP;2
+ 5 4.235
+ 6 4.2345 hi
+************
+
+I tried that build again with #undef HAVE_VPRINTF, and it failed.
+
+ From eval.c:
+ I1 8733 #ifndef HAVE_VPRINTF
+ I1 8734 #error "you lose: you need a system with vfprintf"
+ .1
+%CC-E-ERRORMESSAGE, (1) #error "you lose: you need a system with vfprintf"
+
+Note that the error message has the wrong routine name.
+
+I have looked over the manual, and will try to get some detailed changes
+to it.
+
+Some preliminary things to help collect my thoughts.
+
+As the MMS program has a lot of issues with ODS-5, Some open source
+programmers have switched to Madgoat Make, known as MMK from
+https://github.com/endlesssoftware/mmk . MMK uses most unmodified MMS
+description files and handles ODS-5 volumes better than MMS does.
+
+The optional POSIX subsystem is no longer supported on VMS. While I
+used to know at what version this support stopped in my head, I have
+forgotten, and so far have not found that with an online search.
+
+Most of the C runtime routines that formerly required the POSIX
+subsystem are in the VMS C runtime, so there no separate POSIX builds
+needed for newer versions of VMS.
+
+The behavior of the VMS C runtime is controlled by feature settings that
+can be set by logical names before the program is run.
+
+These feature settings include the support of longer filenames with
+almost any characters including UTF-8, on ODS-5 volumes and if routines
+should behave in a more Unix like fashion.
+
+I will be adding vms_crtl_init.c to the next commit for vmsbuild.com and
+descrip.mms. This vms_crtl_init.c detects when the program is running
+under a bash or similar shell and sets the feature settings for better
+UNIX compatibility, or sets them for better DCL compatibilities.
+It makes sure that the extended filename support is enabled.
+This way a single binary can be used for both the VMS environment and
+the DCL environment.
+
+As a replacement, a GNV https://sourceforge.net/projects/gnv/ was
+created. There is older version of gawk that is provided by that package.
+
+Recently a group of programmers have started trying to correct issues
+with the GNV project and reorganize it as a collection of packages along
+wth a VMSPORTS https://sourceforge.net/projects/vms-ports/ effort.
+
+The GNV environment provides a Bash shell and several other utilities
+intended to simulate a Unix environment.
+
+The web page https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/
+documents what needs to be done before installing these newer packages
+while GNV is in the transition phase.
+
+Currently only Bash 4.2.45 and Coreutils 8.21 have been packaged, both
+are fixing critical issues in GNV.
+
+I plan to have a GAWK PCSI package that will be installed with the VMS
+PRODUCT command. This package will install into the GNV directory
+structure, which mimics a Linux directory tree, so I will need to
+determine where to put the gawk.hlp file in it.
+
+Regards,
+-John
+
+
+
+On 12/6/2013 7:20 PM, John E. Malmberg wrote:
+> Hello Arnold,
+>
+> I almost missed this, the gmail randomizer threw it in the spam folder.
+> It tends to do that with about 1 to 5 percent of my incoming e-mail.
+>
+> I am still learning git, so I am not sure how to regenerate the patch
+> set. If you can help me with the commands, I can try to regenerate it.
+>
+> I ended up doing two patches, because I forgot that VMS execute
+> permission is interpreted differently than Unix, so is usually on.
+>
+> I did not change the commands to kick off the build procedure, just the
+> internals.
+>
+> Unfortunately Texinfo is not in my toolbox. I will look at the *.tex*
+> files to see what I can figure out for editing the source format for any
+> changes. I did update the readme.vms FILE.
+>
+> Also this patch should enable the dynamic extension loading, which I
+> forgot to put in the change list.
+>
+> To better support dynamic extensions, gawk on VMS/ALPHA should be built
+> using IEEE floating point.
+>
+> This slightly changes the precision of floating point output. I am not
+> sure that anyone would notice. IA64 defaults to IEEE, and VAX can not
+> support IEEE.
+>
+> The reason for this is that most open source packages expect the IEEE
+> behavior, so it seems best to default to that when possible.
+>
+> When we get this step resolved, I am going to work on the procedure to
+> generate a installable package in the VMS PCSI format.
+>
+> Regards,
+> -John
+>
+>
+>
+> On 12/6/2013 2:40 AM, arnold@skeeve.com wrote:
+>> Hi.
+>>
+>> Thanks for this. I already pushed the change you suggested about
+>> version.c. Do you want to pull and regenerate this patch set?
+>> Or should I just apply it all and you'll send me an updated patch?
+>>
+>> Finally, we need the manual updated about the build procedure. If
+>> Texinfo isn't in your toolbox, you can just send me plain text and I'll
+>> handle the formatting, but the manual needs to be updated and also
+>> and README files.
+>>
+>> This is great work and it's exciting that VMS gawk is progressing
+>> this way.
+>>
+>> Thanks,
+>>
+>> Arnold
+>>
+>> "John E. Malmberg" <wb8tyw@qsl.net> wrote:
+>>
+>>> Forgot to document that the previous strftime test was incorrect as it
+>>> was not specifying a timezone on VMS versions that support timezones
+>>> which made the behavior different than on Unix/Linux. The test has been
+>>> fixed.
+>>>
+>>> All tests now passing on VAX/VMS 7.3, Alpha and IA64/VMS 8.4.
+>>> Tests are still running on ALPHA/VMS 8.3, but I am expecting them to
+>>> also pass.
+>>>
+>>> VMS build procedures no longer need to be edited when the version number
+>>> changes.
+>>>
+>>> 2013-12-05 John E. Malmberg <wb8tyw@qsl.net>
+>>>
+>>> * New config_h.com to generate config.h
+>>>
+>>> * New gawk_ident.com generates ident line for link option file.
+>>>
+>>> * Add version_c.com to create version.c from version.in.
+>>>
+>>> * Remove fcntl.h covering up real fcntl.h. If an older version
+>>> of VMS needs this file, the build procedure should be updated
+>>> to generate it from a template.
+>>>
+>>> * descrip.mms: Use command files to generate files based
+>>> on same input files as a Linux build.
+>>>
+>>> * gawkmisc.vms (files_are_same): support _USE_STD_STAT for VMS 8.x.
+>>>
+>>> * generate_config_vms_h_gawk.com: Generates a helper file
+>>> config_vms.h to cover issues config_h.com can not handle.
+>>>
+>>> * vmsbuild.com: Use command files to generate files based
+>>> on the same input files as a Linux build.
+>>>
+>>> * vms_misc.c (vms_open): VMS CRTL setting errno to ENOENT where
+>>> it should be set to EMFILE.
+>>>
+>>> Regards,
+>>> -John
+>
+
+From wb8tyw@gmail.com Mon Dec 16 21:27:20 2013
+Return-Path: <wb8tyw@gmail.com>
+Received: from skeeve.com (skeeve.com [127.0.0.1])
+ by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id rBGJQJfQ002202
+ for <arnold@localhost>; Mon, 16 Dec 2013 21:27:19 +0200
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ frenzy.freefriends.org
+X-Spam-Level:
+X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,
+ DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW autolearn=ham
+ version=3.3.1
+X-Envelope-From: wb8tyw@gmail.com
+X-Envelope-To: <arnold@skeeve.com>
+Received: from frenzy.freefriends.org [66.54.153.139]
+ by skeeve.com with IMAP (fetchmail-6.3.21)
+ for <arnold@localhost> (single-drop); Mon, 16 Dec 2013 21:27:19 +0200 (IST)
+Received: from mail-ie0-f173.google.com (mail-ie0-f173.google.com [209.85.223.173])
+ by freefriends.org (8.14.6/8.14.6) with ESMTP id rBG6Tatb002732
+ for <arnold@skeeve.com>; Sun, 15 Dec 2013 23:29:39 -0700
+Received: by mail-ie0-f173.google.com with SMTP id to1so5932042ieb.4
+ for <arnold@skeeve.com>; Sun, 15 Dec 2013 22:29:36 -0800 (PST)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=gmail.com; s=20120113;
+ h=message-id:date:from:user-agent:mime-version:to:cc:subject
+ :content-type;
+ bh=ksiNjtwxRvh74kzY1LKaRL/l+Ja2PriUxgPwwm+Igho=;
+ b=BiJLgaDXXU4R0IwBKeNvon0qca3q3Le4HtVArPhKruA9rRhSqfVcTRHrQ8fF1r0f5h
+ N28vQidBEX3PNHi9k0uzfHF1sqT7LHGxOfSS/7ipk8UWoa4BVB3taSOFAAMzTkQUeduC
+ 2RNaWLJHjFR4xRvkOwYqJPVikLyg2atmds6iLoxKOFbNCz+KUFQacDmaCLiibEg4pxV1
+ DsZWlBKLFrl8wXF5+gy3ZAj3FafIZluCgY5rUqrfXxrV9a7kumGrgljPG84MAOT01eCe
+ nXnlrhJgxIAjndT7sYPSYGZkeieSagmN57kRqefNkHk9PhdF5RbY3J0PBC7r0cJn/MKE
+ Uh0A==
+X-Received: by 10.50.154.102 with SMTP id vn6mr13663789igb.1.1387175375953;
+ Sun, 15 Dec 2013 22:29:35 -0800 (PST)
+Received: from [192.168.0.101] (173-19-202-206.client.mchsi.com. [173.19.202.206])
+ by mx.google.com with ESMTPSA id da14sm14704681igc.1.2013.12.15.22.29.33
+ for <multiple recipients>
+ (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
+ Sun, 15 Dec 2013 22:29:34 -0800 (PST)
+Message-ID: <52AE9DD7.1020409@gmail.com>
+Date: Mon, 16 Dec 2013 00:29:43 -0600
+From: John Malmberg <wb8tyw@gmail.com>
+User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20130215 Thunderbird/17.0.3
+MIME-Version: 1.0
+To: Aharon Robbins <arnold@skeeve.com>
+CC: "John E. Malmberg" <wb8tyw@qsl.net>
+Subject: Updates for gawktexi.in,readme.vms
+Content-Type: multipart/mixed;
+ boundary="------------040502020402090508010905"
+Status: RO
+X-Status: A
+
+This is a multi-part message in MIME format.
+--------------040502020402090508010905
+Content-Type: text/plain; charset=ISO-8859-1; format=flowed
+Content-Transfer-Encoding: 7bit
+
+Hello Arnold,
+
+These are the preliminary updates for the VMS documentation.
+
+I forgot to document (not sure where to put it)
+
+ * The exit code reporting in GAWK is wrong and violates VMS
+ standards. This is a common problem in older ports because
+ the exit() was not implemented correctly, and neither was
+ the rest of the C runtime. Day 1 porting bug that was inevitable.
+
+ The first problem is that if I fix it to report the correct exit
+ status, it would break DCL procedures written to expect the
+ wrong value.
+
+ The second problem is that the new exit() call does not
+ allow setting the severity values and the existing gawk code
+ is setting them for tests to use.
+
+ Using reverse engineering, I have determined how to encode
+ the correct exit codes with severity into the old exit()
+ API.
+
+ If the shell is a UNIX shell:
+
+ * The input parameters and options are handled the same as Unix.
+ (I have forgotten if I sent you that patch yet)
+
+ * The exit codes are correct. The DCL severity information
+ is also added even though most C programs will not use them.
+
+I do not know if would be permissible to change the behavior to always
+use the correct exit code with the severity values set.
+
+Existing DCL code using the severity values would not notice this change.
+
+I would have to document how to convert UNIX exit codes to DCL values
+for people to get the original codes back.
+
+
+
+In the documentation, I have been trying to change the case of the
+filenames referenced in the VMS sections to be exact instead in upper case.
+
+
+In general, on the older ODS-2 VMS file system, the files were stored
+and displayed in upper case.
+
+In the newer ODS-5 file system, filenames are stored in a case preserved
+state and are when unpacked from a repository are still in lower case.
+
+The VMS DCL shell also has an optional mode /PARSE=EXTEND mode where it
+handles those names.
+
+In the normal mode DCL converts all unquoted parameters to upper case,
+and then the C runtime converts all unquoted parameters to lower case.
+A slight but significant difference.
+
+In the extended mode, DCL and the C runtime will also not do any
+conversion of parameters.
+
+Which means that in extended mode, the target to the MMS or MMK program
+needs to be in the exact case, or it may not be found.
+
+When you have an NFS mounted volume, like I do, things get a bit strange
+on older VMS, like VAX/VMS, because it presents lower case filenames in
+upper case, and uses the $ character to indicate when the case gets
+inverted.
+
+Example:
+
+TOAD> dir src_root:[gawk.readme_d]readme.vms
+%DIRECT-E-OPENIN, error opening SRC_ROOT:[GAWK.README_D]README.VMS;* as
+input
+
+TOAD> dir src_root:[gawk.$readme_$d]$readme.vms
+
+Directory SRC_ROOT:[GAWK.$README_$D]
+
+$README.VMS;1
+
+On current versions of VMS that support ODS-5, the exact case of the
+files are seen.
+
+EAGLE> dir src_root:[gawk.readme_d]readme.vms
+
+Directory SRC_ROOT:[gawk.README_d]
+
+README.VMS;1
+
+This affects build procedures as they must look for both path names.
+
+Regards,
+-John
+
+--------------040502020402090508010905
+Content-Type: text/plain; charset=windows-1252;
+ name="gawktexti_in.gdiff"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment;
+ filename="gawktexti_in.gdiff"
+
+--- /src_root/gawk/doc/gawktexi.in Fri Dec 13 17:43:41 2013
++++ /vms_root/gawk/doc/gawktexi.in Sun Dec 15 23:28:13 2013
+@@ -32713,6 +32713,9 @@
+ @item
+ Prestandard VAX C compiler for VAX/VMS
+
++@item
++GCC for VAX and Alpha has not been tested for a while.
++
+ @end itemize
+
+ @end itemize
+@@ -33993,41 +33996,96 @@
+ @appendixsubsubsec Compiling @command{gawk} on VMS
+ @cindex compiling @command{gawk} for VMS
+
+-To compile @command{gawk} under VMS, there is a @code{DCL} command procedure that
+-issues all the necessary @code{CC} and @code{LINK} commands. There is
+-also a @file{Makefile} for use with the @code{MMS} utility. From the source
+-directory, use either:
++To compile @command{gawk} under VMS, there is a @code{DCL} command procedure
++that issues all the necessary @code{CC} and @code{LINK} commands. There is
++also a @file{Makefile} for use with the @code{MMS} or @code{MMK} utility.
++From the source directory, use either:
+
+ @example
+-$ @kbd{@@[.VMS]VMSBUILD.COM}
++$ @kbd{@@[.vms]vmsbuild.com}
+ @end example
+
+ @noindent
+ or:
+
+ @example
+-$ @kbd{MMS/DESCRIPTION=[.VMS]DESCRIP.MMS GAWK}
++$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms gawk}
+ @end example
++or:
++
++@example
++$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms gawk}
++@end example
++
++The @code{MMK} is an open source freeware near clone of @code{MMS} and
++can better handle @code{ODS-5} volumes with upper and lower case filenames.
++@code{MMK} is available from @url{https://github.com/endlesssoftware/mmk}.
++
++With @CODE{ODS-5} volumes and extended parsing enabled, the case of the target
++parameter may need to be exact.
+
+ Older versions of @command{gawk} could be built with VAX C or
+ GNU C on VAX/VMS, as well as with DEC C, but that is no longer
+ supported. DEC C (also briefly known as ``Compaq C'' and now known
+ as ``HP C,'' but referred to here as ``DEC C'') is required. Both
+-@code{VMSBUILD.COM} and @code{DESCRIP.MMS} contain some obsolete support
++@code{vmsbuild.com} and @code{descrip.mms} contain some obsolete support
+ for the older compilers but are set up to use DEC C by default.
+
+-@command{gawk} has been tested under Alpha/VMS 7.3-1 using Compaq C V6.4,
+-and on Alpha/VMS 7.3, Alpha/VMS 7.3-2, and IA64/VMS 8.3.@footnote{The IA64
+-architecture is also known as ``Itanium.''}
++@command{gawk} has been tested under VAX/VMS 7.3 and Alpha/VMS 7.3-1
++using Compaq C V6.4, and Alpha/VMS 7.3, Alpha/VMS 7.3-2, and IA64/VMS 8.3.
++Most recent builds are were using HP C V7.3 on Alpha VMS 8.3 and both
++Alpha and IA64 VMS 8.4 using HP C 7.3.
++@footnote{The IA64 architecture is also known as ``Itanium.''}
++
++Work is currently being done for a procedure to build @code{gawk} and create
++a PCSI kit for compatible with the GNV product.
++
++@appendixsubsubsec Compiling @command{gawk} Dynamic Extensions on VMS
++
++Dynamic extensions need to be compiled with the same compiler options for
++floating point, pointer size, and symbol name handling as @code{gawk}.
++Alpha and Itanium should use IEEE floating point. The pointer size is 32 bits,
++and the symbol name handling is to be exact case with CRC shortening for
++symbols longer than 32 bits.
++
++Alpha and Itanium:
++
++@example
++/name=(as_is,short)
++/float=ieee/ieee_mode=denorm_results
++@end example
++
++VAX:
++
++@example
++/name=(as_is,short)
++@end example
++
++Compile time macros needed to be defined before the first VMS supplied
++header file is included.
++
++@example
++#if (__CRTL_VER >= 70200000) && !defined (__VAX)
++#define _LARGEFILE 1
++#endif
++
++#ifndef __VAX
++#ifdef __CRTL_VER
++#if __CRTL_VER >= 80200000
++#define _USE_STD_STAT 1
++#endif
++#endif
++#endif
++@end example
+
+ @node VMS Installation Details
+ @appendixsubsubsec Installing @command{gawk} on VMS
+
+-To install @command{gawk}, all you need is a ``foreign'' command, which is
+-a @code{DCL} symbol whose value begins with a dollar sign. For example:
++To use @command{gawk}, all you need is a ``foreign'' command, which is a
++@code{DCL} symbol whose value begins with a dollar sign. For example:
+
+ @example
+-$ @kbd{GAWK :== $disk1:[gnubin]GAWK}
++$ @kbd{GAWK :== $disk1:[gnubin]gawk}
+ @end example
+
+ @noindent
+@@ -34039,10 +34097,15 @@
+ @file{sylogin.com} procedure, which allows all users
+ to run @command{gawk}.
+
++If your @command{gawk} was installed by a PCSI kit into the
++@file{GNV$GNU:} directory tree, the program will be known as
++@file{GNV$GNU:[bin]gnv$gawk.exe} and the help file will be
++@file{GNV$GNU:[vms_help]gawk.hlp}.
++
+ Optionally, the help entry can be loaded into a VMS help library:
+
+ @example
+-$ @kbd{LIBRARY/HELP SYS$HELP:HELPLIB [.VMS]GAWK.HLP}
++$ @kbd{LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp}
+ @end example
+
+ @noindent
+@@ -34106,6 +34169,19 @@
+ of @env{AWKPATH} is a comma-separated list of directory specifications.
+ When defining it, the value should be quoted so that it retains a single
+ translation and not a multitranslation @code{RMS} searchlist.
++
++@node VMS GNV
++
++The VMS GNV package provides a build environment similar to POSIX with ports
++of a collection of open source tools. The @command{gawk} found in the GNV
++base kit is an older port. Currently the GNV project is being reorganized
++to be individual PCSI packages for each component.
++@url{https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/}
++
++The normal build procedure @command{gawk} will produce a program that
++is suitable for use with GNV. At this time work is being done to create
++the procedures for building a PCSI kit to replace the older @code{gawk}
++port.
+
+ @ignore
+ @c The VMS POSIX product, also known as POSIX for OpenVMS, is long defunct
+
+--------------040502020402090508010905
+Content-Type: text/plain; charset=windows-1252;
+ name="readme_vms.gdiff"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment;
+ filename="readme_vms.gdiff"
+
+--- /src_root/gawk/readme_d/README.VMS Fri Dec 13 17:43:41 2013
++++ /vms_root/gawk/readme_d/README.VMS Sun Dec 15 22:57:42 2013
+@@ -37,6 +37,38 @@
+ GAWK was originally ported for VMS V4.6 and up. It has not been tested
+ with a release that old for some time.
+
++Compiling dynamic extensions on VMS:
++
++Dynamic extensions need to be compiled with the same compiler options for
++floating point, pointer size, and symbol name handling as gawk.
++Alpha and Itanium should use IEEE floating point. The pointer size is 32 bits,
++and the symbol name handling is to be exact case with CRC shortening for
++symbols longer than 32 bits.
++
++Alpha and Itanium:
++
++/name=(as_is,short)
++/float=ieee/ieee_mode=denorm_results
++
++VAX:
++
++/name=(as_is,short)
++
++Compile time macros needed to be defined before the first VMS supplied
++header file is included.
++
++#if (__CRTL_VER >= 70200000) && !defined (__VAX)
++#define _LARGEFILE 1
++#endif
++
++#ifndef __VAX
++#ifdef __CRTL_VER
++#if __CRTL_VER >= 80200000
++#define _USE_STD_STAT 1
++#endif
++#endif
++#endif
++
+
+ Installing GAWK on VMS:
+
+@@ -47,6 +79,10 @@
+ That symbol should be placed in the user's login.com or in the system-
+ wide sylogin.com procedure so that it will be defined every time the
+ user logs on.
++
++If your gawk was installed by a PCSI kit into the GNV$GNU: directory tree,
++the program will be known as GNV$GNU:[bin]gnv$gawk.exe and the help file
++will be GNV$GNU:[vms_help]gawk.hlp.
+
+ Optionally, the help entry can be loaded into a VMS help library.
+ |$ LIBRARY/HELP SYS$HELP:HELPLIB [.VMS]GAWK.HLP
+
+--------------040502020402090508010905--
+
+From wb8tyw@qsl.net Wed Dec 11 20:03:44 2013
+Return-Path: <wb8tyw@qsl.net>
+Received: from skeeve.com (skeeve.com [127.0.0.1])
+ by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id rBBI3gNX002464
+ for <arnold@localhost>; Wed, 11 Dec 2013 20:03:43 +0200
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
+ frenzy.freefriends.org
+X-Spam-Level:
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM
+ autolearn=ham version=3.3.1
+X-Envelope-From: wb8tyw@qsl.net
+X-Envelope-To: <arnold@skeeve.com>
+Received: from frenzy.freefriends.org [66.54.153.139]
+ by skeeve.com with IMAP (fetchmail-6.3.21)
+ for <arnold@localhost> (single-drop); Wed, 11 Dec 2013 20:03:43 +0200 (IST)
+Received: from Encompasserve.org (Eisner.encompasserve.org [67.53.90.116])
+ by freefriends.org (8.14.6/8.14.6) with ESMTP id rBB5jaW9020988
+ for <arnold@skeeve.com>; Tue, 10 Dec 2013 22:45:40 -0700
+Received: from [192.168.0.101]
+ (173-19-202-206.client.mchsi.com [173.19.202.206])
+ by Encompasserve.org (PMDF V6.6 #13031)
+ with ESMTPSA id <01P1SYL5LELG002FZE@Encompasserve.org> for arnold@skeeve.com;
+ Tue, 10 Dec 2013 23:45:35 -0600 (CST)
+Date: Tue, 10 Dec 2013 23:45:36 -0600
+From: "John E. Malmberg" <wb8tyw@qsl.net>
+Subject: Re: Some questions...
+In-reply-to: <201312110426.rBB4QXXc003297@skeeve.com>
+To: Aharon Robbins <arnold@skeeve.com>
+Cc: wb8tyw@qsl.net
+Message-id: <52A7FC00.2040905@qsl.net>
+MIME-version: 1.0
+Content-type: text/plain; charset=ISO-8859-1; format=flowed
+Content-transfer-encoding: 7BIT
+User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20130215
+ Thunderbird/17.0.3
+References: <529A9537.7090404@qsl.net> <201312110426.rBB4QXXc003297@skeeve.com>
+Status: R
+
+On 12/10/2013 10:26 PM, Aharon Robbins wrote:
+> Hi. Some questions about your changes.
+>
+> 1. I notice that there is at least one instance of #if __VMS, where as
+> it seems most code uses #if VMS. Is that on purpose? If not, which
+> is correct?
+
+VMS is a macro historically pre-defined by C compilers on C before the
+ANSI rules.
+
+Under strict ANSI rules, a standards compliant compiler is not allowed
+to pre-define macros that are not prefixed by "__".
+
+Which means that you can not count on the VMS macro being defined unless
+you do it yourself.
+
+So __VMS is the ANSI correct definition. But it would be a lot of work
+to change all the code.
+
+The vms_config.h that is now generated has these lines in it to make
+sure that VMS is defined.
+
+#ifdef __VMS /* ANSI compliant */
+#ifndef VMS /* PRE-ansi */
+#define VMS 1
+#endif
+#endif
+
+This may be needed for other architectures. It only shows up as an
+issue if you set a "strict" compliance flag on the compile command.
+
+> 2. For the include of the main wrapper. Gawk already has a routine
+> os_arg_fixup which is intended to manipulate argc and argv as needed
+> by an OS-specific routine before main() parses it. A quick look at
+> the wrapper looks to me like it could be made to fit within that framework,
+> which would keep #if and the include out of the mainline code.
+
+I can look at that. I can also look to see if I can move the logic from
+vms_crtl_init.c into it in a way that would sidestep that it has no
+copyright notice at all. The result would be code that is almost
+identical to code that is in the official Perl distribution.
+
+GNV was started as a user project and when the VMS POSIX product was
+dropped and they needed a Unix like environment, Digital took over the
+GNV product, but did not really do much to keep it up to date.
+
+The routine in vms_crtl_init.c is actually called before main() is
+called, so just linking a module with it in is all that it takes to
+activate the change. Unfortunately I do not know how to get it to
+magically fix up the argv array.
+
+> If that looks reasonable to you, can you make that change? You can send
+> it as a diff against what you currently have already done.
+
+I will look at it tomorrow night. I also found another change needed
+for vms_args.c to work properly under a bash shell.
+
+> I'm sorry about the hassle on the copyrights, but I really have to play
+> this game by the FSF rules. I hope we can get it clarified soon
+> so that I can include the files in the dist.
+
+I hope so. I have not seen a reply from Karl yet. He did say that
+there are other options.
+
+This would clear the way for getting the similar code accepted into the
+Bash and coreutils repositories. I have a report that the first bash
+4.3 beta built on VMS and looked real good on the test run.
+
+I am currently working on adapting the packaging scripts from bash and
+coreutils to gawk. Each product has had it unique features, so I have
+not yet come up with a generic set of scripts.
+
+This is a preview what will be coming:
+
+backup_gawk_src.com - Builds a VMS equivalent to tar archive. By
+placing the source in the PCSI kit, it covers the requirement of
+providing source somewhere with the binary.
+
+build_gawk_pcsi_desc.com - Creates a VMS PCSI package manifest file.
+
+build_gawk_pcsi_text.com - text output by the VMS PCSI package installer.
+
+compare_gawk_source.com - I have the source checked out on an NFS
+server. The backup program needs me to copy it to a VMS volume first.
+This procedure makes sure that the two copies are the same and ready for
+backup.
+
+gawk_alias_setup.com - Sets up gawk and awk links to gnv$gawk.exe.
+Needed to repair when sins of the past partially break an install.
+
+gawk_verb.cld - for gawk to use gnv$gawk.exe as an image. Different
+than gawk.cld. To properly add an image to the VMS command table, it
+needs a prefix. I have "GNV$" registered as a prefix for this purpose.
+
+gnv_gawk_kit_name.com - Calculates the VMS PCSI package name, used for
+both file names and file contents.
+
+gnv_gawk_startup.com - Run at VMS startup to make sure that the
+environment is set up properly for gawk.
+
+pcsi_gawk_file_list.txt - Source file for build_gawk_pcsi_desc.com.
+
+remove_old_gawk.com - Needed to properly clean up sins of the past.
+Only touches the the GNV provided gawk and awk programs.
+
+stage_gawk_install.com - Does a pre-install into a fake "root" directory
+tree for the kitting procedure to pull files out of.
+
+Regards,
+-John
+
diff --git a/vms/vms.h b/vms/vms.h
index 0fb73d5b..3991d39b 100644
--- a/vms/vms.h
+++ b/vms/vms.h
@@ -54,26 +54,26 @@ typedef struct _itm { U_Short len, code; void *buffer; U_Short *retlen; } Itm;
#define Descrip(strdsc,strbuf) Dsc strdsc = {sizeof strbuf - 1, (char *)strbuf}
extern int shell$is_shell(void);
-extern U_Long lib$find_file(const Dsc *, Dsc *, void *, ...);
-extern U_Long lib$find_file_end(void *);
+extern U_Long LIB$FIND_FILE(const Dsc *, Dsc *, void *, ...);
+extern U_Long LIB$FIND_FILE_END(void *);
#ifndef NO_TTY_FWRITE
-extern U_Long lib$get_ef(long *);
-extern U_Long sys$assign(const Dsc *, short *, long, const Dsc *);
-extern U_Long sys$dassgn(short);
-extern U_Long sys$qio(U_Long, U_Long, U_Long, void *,
+extern U_Long LIB$GET_EF(long *);
+extern U_Long SYS$ASSIGN(const Dsc *, short *, long, const Dsc *);
+extern U_Long SYS$DASSGN(short);
+extern U_Long SYS$QIO(U_Long, U_Long, U_Long, void *,
void (*)(U_Long), U_Long,
const char *, int, int, U_Long, int, int);
-extern U_Long sys$synch(long, void *);
+extern U_Long SYS$SYNCH(long, void *);
#endif /*!NO_TTY_FWRITE*/
-extern U_Long lib$spawn(const Dsc *,const Dsc *,const Dsc *,
+extern U_Long LIB$SPAWN(const Dsc *,const Dsc *,const Dsc *,
const U_Long *,const Dsc *,U_Long *,U_Long *,...);
/* system services for logical name manipulation */
-extern U_Long sys$trnlnm(const U_Long *,const Dsc *,const Dsc *,
+extern U_Long SYS$TRNLNM(const U_Long *,const Dsc *,const Dsc *,
const unsigned char *,Itm *);
-extern U_Long sys$crelnm(const U_Long *,const Dsc *,const Dsc *,
+extern U_Long SYS$CRELNM(const U_Long *,const Dsc *,const Dsc *,
const unsigned char *,const Itm *);
-extern U_Long sys$crelog(int,const Dsc *,const Dsc *,unsigned char);
-extern U_Long sys$dellnm(const Dsc *,const Dsc *,const unsigned char *);
+extern U_Long SYS$CRELOG(int,const Dsc *,const Dsc *,unsigned char);
+extern U_Long SYS$DELLNM(const Dsc *,const Dsc *,const unsigned char *);
extern void v_add_arg(int, const char *);
extern void vms_exit(int);
diff --git a/vms/vms_args.c b/vms/vms_args.c
index 0a296105..9788275d 100644
--- a/vms/vms_args.c
+++ b/vms/vms_args.c
@@ -106,10 +106,26 @@ vms_arg_fixup( int *pargc, char ***pargv )
char **argv = *pargv;
int i, argc = *pargc;
int err_to_out_redirect = 0, out_to_err_redirect = 0;
+ char * shell;
+ int using_shell;
/* make sure AWK_LIBRARY has a value */
if (!getenv("AWK_LIBRARY"))
vms_define("AWK_LIBRARY", "SYS$LIBRARY:");
+
+ /* Check if running under a shell instead of DCL */
+ using_shell = 1;
+ shell = getenv("SHELL");
+ if (shell != NULL) {
+ if (strcmp(shell, "DCL") == 0) {
+ using_shell = 0;
+ }
+ } else {
+ using_shell = 0;
+ }
+ if (using_shell) {
+ return;
+ }
#ifdef CHECK_DECSHELL /* don't define this if linking with DECC$SHR */
if (shell$is_shell())
return; /* don't do anything if we're running DEC/Shell */
@@ -325,12 +341,12 @@ vms_expand_wildcards( const char *prospective_filespec )
*/
len = -1; /* overload 'len' with flag value */
context = NULL; /* init */
- while (vmswork(lib$find_file(&spec, &result, &context))) {
+ while (vmswork(LIB$FIND_FILE(&spec, &result, &context))) {
for (len = sizeof(res_buf)-1; len > 0 && res_buf[len-1] == ' '; len--) ;
res_buf[len] = '\0'; /* terminate after discarding trailing blanks */
v_add_arg(v_argc++, strdup(res_buf)); /* store result */
}
- (void)lib$find_file_end(&context);
+ (void)LIB$FIND_FILE_END(&context);
if (len >= 0) /* (still -1 => never entered loop) */
--v_argc; /* undo final post-increment */
return;
@@ -395,7 +411,7 @@ vms_define( const char *log_name, const char *trans_val )
log_dsc.len = len;
itemlist[0].buffer = (char *)trans_val;
itemlist[0].len = strlen(trans_val);
- return sys$crelnm(&attr, &lnmtable, &log_dsc, &acmode, itemlist);
+ return SYS$CRELNM(&attr, &lnmtable, &log_dsc, &acmode, itemlist);
}
/* t_strstr -- strstr() substitute; search 'str' for 'sub' */
diff --git a/vms/vms_cli.c b/vms/vms_cli.c
index ac793c1a..0cfe96fc 100644
--- a/vms/vms_cli.c
+++ b/vms/vms_cli.c
@@ -29,13 +29,13 @@
#include <string.h>
#endif
-extern U_Long cli$present(const Dsc *);
-extern U_Long cli$get_value(const Dsc *, Dsc *, short *);
-extern U_Long cli$dcl_parse(const Dsc *, const void *, ...);
-extern U_Long sys$cli(void *, ...);
-extern U_Long sys$filescan(const Dsc *, void *, long *);
+extern U_Long CLI$PRESENT(const Dsc *);
+extern U_Long CLI$GET_VALUE(const Dsc *, Dsc *, short *);
+extern U_Long CLI$DCL_PARSE(const Dsc *, const void *, ...);
+extern U_Long SYS$CLI(void *, ...);
+extern U_Long SYS$FILESCAN(const Dsc *, void *, long *);
extern void *lib$establish(U_Long (*handler)(void *, void *));
-extern U_Long lib$sig_to_ret(void *, void *); /* condition handler */
+extern U_Long LIB$SIG_TO_RET(void *, void *); /* condition handler */
/* Cli_Present() - call CLI$PRESENT to determine whether a parameter or */
/* qualifier is present on the [already parsed] command line */
@@ -43,10 +43,10 @@ U_Long
Cli_Present( const char *item )
{
Dsc item_dsc;
- (void)lib$establish(lib$sig_to_ret);
+ (void)lib$establish(LIB$SIG_TO_RET);
item_dsc.len = strlen(item_dsc.adr = (char *)item);
- return cli$present(&item_dsc);
+ return CLI$PRESENT(&item_dsc);
}
/* Cli_Get_Value() - call CLI$GET_VALUE to retreive the value of a */
@@ -57,11 +57,11 @@ Cli_Get_Value( const char *item, char *result, int size )
Dsc item_dsc, res_dsc;
U_Long sts;
short len = 0;
- (void)lib$establish(lib$sig_to_ret);
+ (void)lib$establish(LIB$SIG_TO_RET);
item_dsc.len = strlen(item_dsc.adr = (char *)item);
res_dsc.len = size, res_dsc.adr = result;
- sts = cli$get_value(&item_dsc, &res_dsc, &len);
+ sts = CLI$GET_VALUE(&item_dsc, &res_dsc, &len);
result[len] = '\0';
return sts;
}
@@ -79,11 +79,11 @@ Cli_Parse_Command( const void *cmd_tables, const char *cmd_verb )
U_Long sts;
int ltmp;
char longbuf[8200];
- (void)lib$establish(lib$sig_to_ret);
+ (void)lib$establish(LIB$SIG_TO_RET);
memset(&cmd, 0, sizeof cmd);
cmd.rqtype = CLI$K_GETCMD; /* command line minus the verb */
- sts = sys$cli(&cmd, (void *)0, (void *)0); /* get actual command line */
+ sts = SYS$CLI(&cmd, (void *)0, (void *)0); /* get actual command line */
if (vmswork(sts)) { /* ok => cli available & verb wasn't "RUN" */
/* invoked via symbol => have command line (which might be empty) */
@@ -92,7 +92,7 @@ Cli_Parse_Command( const void *cmd_tables, const char *cmd_verb )
/* need to strip image name from MCR invocation */
memset(fscn, 0, sizeof fscn);
fscn[0].code = FSCN$_FILESPEC; /* full file specification */
- (void)sys$filescan(&cmd.rdesc, fscn, (long *)0);
+ (void)SYS$FILESCAN(&cmd.rdesc, fscn, (long *)0);
cmd.rdesc.len -= fscn[0].len; /* shrink size */
cmd.rdesc.adr += fscn[0].len; /* advance ptr */
}
@@ -102,7 +102,7 @@ Cli_Parse_Command( const void *cmd_tables, const char *cmd_verb )
cmd.rdesc.len = sizeof longbuf - ltmp;
strncpy(&longbuf[ltmp], cmd.rdesc.adr, cmd.rdesc.len);
cmd.rdesc.len += ltmp, cmd.rdesc.adr = longbuf;
- sts = cli$dcl_parse(&cmd.rdesc, cmd_tables);
+ sts = CLI$DCL_PARSE(&cmd.rdesc, cmd_tables);
}
return sts;
diff --git a/vms/vms_crtl_init.c b/vms/vms_crtl_init.c
new file mode 100644
index 00000000..081ae2cc
--- /dev/null
+++ b/vms/vms_crtl_init.c
@@ -0,0 +1,470 @@
+/* File: VMS_CRTL_INIT.C
+
+ This file is common to a lot of projects.
+
+ $Id: vms_crtl_init.c,v 1.1.1.1 2012/12/02 19:25:22 wb8tyw Exp $
+
+ Module that provides a LIB$INITIALIZE routine for the GNV toolset that
+ will turn on some CRTL features that are not enabled by default.
+
+ The CRTL features can also be turned on via logical names, but that
+ impacts all programs and some aren't ready, willing, or able to handle
+ the settings that GNV needs.
+
+ The original module was found linked with GPL V2 modules, and thus must
+ be able to be distributed under the GPL V2 provisions.
+
+ As this module or similar is needed for virtually all programs built to run
+ under GNV or UNIX, it can be distributed with other licenses.
+
+ Edit History
+
+ 1-001 John Reagan Initial version using the old style interface
+ but with the new version commented out.
+
+ 1-002 John Reagan Switch to new API for setting features
+
+ 1-003 Steve Pitcher Add DECC$RENAME_NO_INHERIT.
+
+ 1-004 Steve Pitcher Quiet these, if the DECC feature doesn't exist.
+
+ 2-001 J. Malmberg New GNV requirements:
+ Three variations of object modules:
+ 1. For use with shells, sets the logical
+ name GNV$UNIX_SHELL.
+
+ 2. For utilities, if the logical name
+ GNV$UNIX_SHELL is set, it means that the
+ settings should assume that they are
+ running under a UNIX like shell.
+
+ 3. A third setting is for utilities that
+ always should behave as if they are
+ running under a UNIX shell.
+
+ If GNV$GNU is defined, then locally define
+ SYS$POSIX_ROOT to it. GNV$GNU can be set in
+ the SYSTEM table by the GNV setup.
+ SYS$POSIX_ROOT can not.
+
+ The logical name BIN also needs to be defined
+ here, otherwise the CRTL replaces it with
+ SYS$SYSTEM:
+
+ Never set the POSIX UID here, it will break
+ every reference to a GID/UID on systems that
+ do not have every VMS account mapped to a UID/GID
+ by TCPIP services.
+
+ Reformat text to fit 80 columns.
+
+ Remove all VAX C specific code.
+
+ Linker is probably using exact case, so public
+ symbols for LIB$* and SYS$* must be in upper case.
+
+ 2-002 J. Malmberg Support for VAX builds. OpenVMS/VAX does not have the
+ 17-Jun-2010 DECC$FEATURE routines. At this time I will not
+ be concerned if a feature setting exists on VAX,
+ as all we are doing is setting a logical name.
+
+ 2-003 J. Malmberg Add DECC$FILENAME_UNIX_NOVERSION as version numbers
+ will usually mess up ported programs.
+
+*/
+
+#include <stdio.h>
+#include <descrip.h>
+#include <lnmdef.h>
+#include <stsdef.h>
+#include <string.h>
+
+#pragma message disable pragma
+#pragma message disable dollarid
+#pragma message disable valuepres
+
+#pragma member_alignment save
+#pragma nomember_alignment longword
+#pragma message save
+#pragma message disable misalgndmem
+struct itmlst_3 {
+ unsigned short int buflen;
+ unsigned short int itmcode;
+ void *bufadr;
+ unsigned short int *retlen;
+};
+#pragma message restore
+#pragma member_alignment restore
+
+#ifdef __VAX
+#define ENABLE "ENABLE"
+#define DISABLE "DISABLE"
+#else
+
+#define ENABLE TRUE
+#define DISABLE 0
+int decc$feature_get_index (const char *name);
+int decc$feature_set_value (int index, int mode, int value);
+
+#endif
+
+int SYS$TRNLNM(
+ const unsigned long * attr,
+ const struct dsc$descriptor_s * table_dsc,
+ struct dsc$descriptor_s * name_dsc,
+ const unsigned char * acmode,
+ const struct itmlst_3 * item_list);
+int SYS$CRELNM(
+ const unsigned long * attr,
+ const struct dsc$descriptor_s * table_dsc,
+ const struct dsc$descriptor_s * name_dsc,
+ const unsigned char * acmode,
+ const struct itmlst_3 * item_list);
+int LIB$SIGNAL(int);
+
+/* Take all the fun out of simply looking up a logical name */
+static int sys_trnlnm
+ (const char * logname,
+ char * value,
+ int value_len)
+{
+ const $DESCRIPTOR(table_dsc, "LNM$FILE_DEV");
+ const unsigned long attr = LNM$M_CASE_BLIND;
+ struct dsc$descriptor_s name_dsc;
+ int status;
+ unsigned short result;
+ struct itmlst_3 itlst[2];
+
+ itlst[0].buflen = value_len;
+ itlst[0].itmcode = LNM$_STRING;
+ itlst[0].bufadr = value;
+ itlst[0].retlen = &result;
+
+ itlst[1].buflen = 0;
+ itlst[1].itmcode = 0;
+
+ name_dsc.dsc$w_length = strlen(logname);
+ name_dsc.dsc$a_pointer = (char *)logname;
+ name_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+ name_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+ status = SYS$TRNLNM(&attr, &table_dsc, &name_dsc, 0, itlst);
+
+ if ($VMS_STATUS_SUCCESS(status)) {
+
+ /* Null terminate and return the string */
+ /*--------------------------------------*/
+ value[result] = '\0';
+ }
+
+ return status;
+}
+
+/* How to simply create a logical name */
+static int sys_crelnm
+ (const char * logname,
+ const char * value)
+{
+ int ret_val;
+ const char * proc_table = "LNM$PROCESS_TABLE";
+ struct dsc$descriptor_s proc_table_dsc;
+ struct dsc$descriptor_s logname_dsc;
+ struct itmlst_3 item_list[2];
+
+ proc_table_dsc.dsc$a_pointer = (char *) proc_table;
+ proc_table_dsc.dsc$w_length = strlen(proc_table);
+ proc_table_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+ proc_table_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+ logname_dsc.dsc$a_pointer = (char *) logname;
+ logname_dsc.dsc$w_length = strlen(logname);
+ logname_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+ logname_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+ item_list[0].buflen = strlen(value);
+ item_list[0].itmcode = LNM$_STRING;
+ item_list[0].bufadr = (char *)value;
+ item_list[0].retlen = NULL;
+
+ item_list[1].buflen = 0;
+ item_list[1].itmcode = 0;
+
+ ret_val = SYS$CRELNM(NULL, &proc_table_dsc, &logname_dsc, NULL, item_list);
+
+ return ret_val;
+}
+
+
+ /* Start of DECC RTL Feature handling */
+
+/*
+** Sets default value for a feature
+*/
+#ifdef __VAX
+static void set_feature_default(const char *name, const char *value)
+{
+ sys_crelnm(name, value);
+}
+#else
+static void set_feature_default(const char *name, int value)
+{
+ int index;
+
+ index = decc$feature_get_index(name);
+
+ if (index > 0)
+ decc$feature_set_value (index, 0, value);
+}
+#endif
+
+static void set_coe ( void )
+{
+
+ char gnv_posix_root[4096];
+ char unix_shell_name[255];
+ int use_unix_settings = 0;
+ int status;
+ int gnv_posix_root_found = 0;
+
+ /* If this is compiled for use with a UNIX shell, then the logical
+ * name GNV$UNIX_SHELL will be set to that shell name.
+ *
+ * Else, if the GNV$UNIX_SHELL logical name is set, then this application
+ * is running under some UNIX like shell, so it should modify it's
+ * behavior to be UNIX like.
+ *
+ * If the above logical name is not set, then the application should
+ * expect that it is running under DCL, and should expect VMS filenames
+ * on input, and may need to output filenames in VMS format.
+ *
+ * This can be overriden at compile time with GNV_UNIX_TOOL being
+ * defined.
+ *
+ * So this means that there will be multiple object modules from this
+ * source module. One for each shell, one for programs that can function
+ * in both DCL and UNIX environments, and one for programs that require
+ * a UNIX environment.
+ */
+
+#ifdef GNV_UNIX_SHELL
+ use_unix_settings = 1;
+
+ status = sys_crelnm("GNV$UNIX_SHELL", GNV_UNIX_SHELL);
+ if (!$VMS_STATUS_SUCCESS(status)) {
+ /* We have a big problem */
+ LIB$SIGNAL(status);
+ }
+#else
+
+#ifdef GNV_UNIX_TOOL
+ use_unix_settings = 1;
+#else
+ status = sys_trnlnm("GNV$UNIX_SHELL",
+ unix_shell_name, sizeof
+ unix_shell_name -1);
+ if (!$VMS_STATUS_SUCCESS(status)) {
+ unix_shell_name[0] = 0;
+ use_unix_settings = 0;
+ }
+#endif /* GNV_UNIX_TOOL */
+
+#endif /* GNV_UNIX_SHELL */
+
+ /* New style interface that works only on very recent
+ (Apr 2001 and beyond) CRTLs */
+
+ /*
+ * Only setting defaults allows logical names to
+ * override these settings.
+ */
+
+ /* Always set */
+
+ /* ACCESS should check ACLs or it is lying. */
+ set_feature_default("DECC$ACL_ACCESS_CHECK" , ENABLE);
+
+ /* We always want the new parse style */
+ set_feature_default ("DECC$ARGV_PARSE_STYLE" , ENABLE);
+
+ /* Unless we are in POSIX compliant mode, we want the old POSIX root
+ * enabled.
+ */
+ set_feature_default("DECC$DISABLE_POSIX_ROOT", DISABLE);
+
+ /* EFS charset, means UTF-8 support */
+ /* VTF-7 support is controlled by a feature setting called UTF8 */
+ set_feature_default ("DECC$EFS_CHARSET" , ENABLE);
+ set_feature_default ("DECC$EFS_CASE_PRESERVE" , ENABLE);
+
+
+ /* Support timestamps when available */
+ set_feature_default ("DECC$EFS_FILE_TIMESTAMPS" , ENABLE);
+
+ /* Cache environment varibles - performance improvements */
+ set_feature_default ("DECC$ENABLE_GETENV_CACHE" , ENABLE);
+
+ /* Start out with new file attribute inheritance */
+#ifdef __VAX
+ set_feature_default ("DECC$EXEC_FILEATTR_INHERITANCE", "2");
+#else
+ set_feature_default ("DECC$EXEC_FILEATTR_INHERITANCE", 2);
+#endif
+
+ /* Don't display trailing dot after files without type */
+ set_feature_default ("DECC$READDIR_DROPDOTNOTYPE" , ENABLE);
+
+ /* For standard output channels buffer output until terminator */
+ /* Gets rid of output logs with single character lines in them. */
+ set_feature_default ("DECC$STDIO_CTX_EOL" , ENABLE);
+
+ /* Fix mv aa.bb aa */
+ set_feature_default ("DECC$RENAME_NO_INHERIT" , ENABLE);
+
+ if (use_unix_settings) {
+
+ /* POSIX requires that open files be able to be removed */
+ set_feature_default ("DECC$ALLOW_REMOVE_OPEN_FILES", ENABLE);
+
+ set_feature_default ("DECC$FILENAME_UNIX_ONLY" , ENABLE);
+ /* FILENAME_UNIX_ONLY Implicitly sets
+ decc$disable_to_vms_logname_translation */
+
+ set_feature_default ("DECC$FILE_PERMISSION_UNIX", ENABLE);
+
+ /* For now this only with UNIX mode, applications can override
+ * with out using a LIB$INITIALIZE setting.
+ * This should be an application specific setting only enabled
+ * if the application requires it.
+ * Left here for now for backwards compatibility
+ */
+ set_feature_default ("DECC$FILE_SHARING" , ENABLE);
+
+ set_feature_default ("DECC$FILE_OWNER_UNIX" , ENABLE);
+ set_feature_default ("DECC$POSIX_SEEK_STREAM_FILE", ENABLE);
+
+ } else {
+ set_feature_default("DECC$FILENAME_UNIX_REPORT", ENABLE);
+ }
+
+ /* When reporting UNIX filenames, glob the same way */
+ set_feature_default ("DECC$GLOB_UNIX_STYLE" , ENABLE);
+
+ /* The VMS version numbers on Unix filenames is incompatible with most */
+ /* ported packages. */
+ set_feature_default("DECC$FILENAME_UNIX_NO_VERSION", ENABLE);
+
+ /* The VMS version numbers on Unix filenames is incompatible with most */
+ /* ported packages. */
+ set_feature_default("DECC$UNIX_PATH_BEFORE_LOGNAME", ENABLE);
+
+ /* Set strtol to proper behavior */
+ set_feature_default("DECC$STRTOL_ERANGE", ENABLE);
+
+ /* Pipe feature settings are longer needed with virtual memory pipe
+ code. Programs that use pipe need to be converted to use the
+ virtual memory pipe code, which effectively removes the hangs and
+ left over temporary files.
+
+ Comment left here to prevent regressions, as the larger pipe size
+ actually hurts memory usage with the new algorithm.
+ */
+ /* do_not_set_default ("DECC$PIPE_BUFFER_SIZE" , 8192); */
+
+
+ /* Rather than remove this completely, a comment is left here to warn
+ * someone from putting this bug back in.
+ *
+ * POSIX style UIDs require that the system administrator have set the
+ * system up to use POSIX style UIDs and GIDs. And if they have done
+ * so, then they should set the DECC$POSIX_STYLE_UID as a system wide
+ * logical name.
+ *
+ * Setting them in a program will break all routines that expect GID/UID
+ * stuff to work on systems set up by default with out mappings.
+ *
+ * Most utilities do not reference GID/UID values, so it took a while for
+ * this bug to surface.
+ */
+ /* do_not_set_default ("DECC$POSIX_STYLE_UID" , TRUE); */
+
+
+
+ /* GNV depends on SYS$POSIX_ROOT to be properly set. Since SYS$POSIX_ROOT
+ * globally affects all C applications, SYS$POSIX_ROOT can not be set
+ * anywhere that can be seen by other applications.
+ *
+ * So GNV$GNU is used instead, and SYS$POSIX_ROOT will be set in
+ * in the process table in user mode to that value.
+ *
+ * Restriction: The system manager should not point GNV$GNU at
+ * SYS$POSIX_ROOT, or anything that resolves to SYS$POSIX_ROOT.
+ *
+ */
+
+ status = sys_trnlnm("GNV$GNU",
+ gnv_posix_root,
+ sizeof gnv_posix_root - 1);
+ if ($VMS_STATUS_SUCCESS(status)) {
+ status = sys_crelnm("SYS$POSIX_ROOT", "GNV$GNU:");
+ gnv_posix_root_found = 1;
+ }
+
+ /* GNV depends on BIN being set to GNV$GNU:[bin]. Since BIN
+ * is not prefixed, and it affects everything globally, it needs to
+ * be set here if it is not defined already.
+ * If it is set already, assume that it is correct, rather than
+ * trying to second guess the user.
+ * If GNV$GNU is not defined, then define bin to be SYS$POSIX_ROOT.
+ */
+
+ status = sys_trnlnm("BIN",
+ gnv_posix_root,
+ sizeof gnv_posix_root - 1);
+ if (!$VMS_STATUS_SUCCESS(status)) {
+ if (gnv_posix_root_found) {
+ status = sys_crelnm("BIN", "GNV$GNU:[BIN]");
+ } else {
+ status = sys_crelnm("BIN", "SYS$POSIX_ROOT:[BIN]");
+ }
+ }
+
+}
+
+#pragma nostandard
+#pragma extern_model save
+#ifdef __VAX
+#pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long, nopic
+#else
+#pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long
+# if __INITIAL_POINTER_SIZE
+# pragma __pointer_size __save
+# pragma __pointer_size 32
+# else
+# pragma __required_pointer_size __save
+# pragma __required_pointer_size 32
+# endif
+#endif
+/* Set our contribution to the LIB$INITIALIZE array */
+void (* const iniarray[])(void) = {set_coe, } ;
+#ifndef __VAX
+# if __INITIAL_POINTER_SIZE
+# pragma __pointer_size __restore
+# else
+# pragma __required_pointer_size __restore
+# endif
+#endif
+
+
+/*
+** Force a reference to LIB$INITIALIZE to ensure it
+** exists in the image.
+*/
+int LIB$INITIALIZE(void);
+#ifdef __DECC
+#pragma extern_model strict_refdef
+#endif
+ int lib_init_ref = (int) LIB$INITIALIZE;
+#ifdef __DECC
+#pragma extern_model restore
+#pragma standard
+#endif
diff --git a/vms/vms_fwrite.c b/vms/vms_fwrite.c
index 1a16f58c..435fead2 100644
--- a/vms/vms_fwrite.c
+++ b/vms/vms_fwrite.c
@@ -83,9 +83,9 @@ tty_fwrite( const void *buf, size_t size, size_t number, FILE *file )
fgetname(file, devnam); /* get 'file's name */
device.len = strlen(device.adr = devnam); /* create descriptor */
- if (vmswork(sys$assign(&device, &chan, 0, (Dsc *)0))) {
+ if (vmswork(SYS$ASSIGN(&device, &chan, 0, (Dsc *)0))) {
/* get an event flag; use #0 if problem */
- if (evfn == -1 && vmsfail(lib$get_ef(&evfn))) evfn = 0;
+ if (evfn == -1 && vmsfail(LIB$GET_EF(&evfn))) evfn = 0;
} else chan = 0; /* $ASSIGN failed */
}
/* store channel for later use; -1 => don't repeat failed init attempt */
@@ -119,19 +119,19 @@ tty_fwrite( const void *buf, size_t size, size_t number, FILE *file )
else if (pos < count) pos++, cc_fmt |= POSTFIX_CR, extra++;
/* wait for previous write, if any, to complete */
if (pt > (char *)buf) {
- sts = sys$synch(evfn, &iosb);
+ sts = SYS$SYNCH(evfn, &iosb);
if (vmswork(sts)) sts = iosb.status, result += iosb.count;
if (vmsfail(sts)) break;
}
/* queue an asynchronous write */
- sts = sys$qio(evfn, chan, io_func, &iosb, (void (*)(U_Long))0, 0L,
+ sts = SYS$QIO(evfn, chan, io_func, &iosb, (void (*)(U_Long))0, 0L,
pt, pos, 0, cc_fmt, 0, 0);
if (vmsfail(sts)) break; /*(should never happen)*/
pt += pos, count -= pos;
}
/* wait for last write to complete */
if (pt > (char *)buf && vmswork(sts)) {
- sts = sys$synch(evfn, &iosb);
+ sts = SYS$SYNCH(evfn, &iosb);
if (vmswork(sts)) sts = iosb.status, result += iosb.count;
}
if (vmsfail(sts)) errno = EVMSERR, vaxc$errno = sts;
@@ -202,7 +202,7 @@ tty_fclose( FILE *file )
short chan = file_num < _NFILE ? channel[file_num] : -1;
if (chan > 0)
- (void)sys$dassgn(chan); /* deassign the channel (ie, close) */
+ (void)SYS$DASSGN(chan); /* deassign the channel (ie, close) */
if (file_num < _NFILE)
channel[file_num] = 0; /* clear stale info */
}
diff --git a/vms/vms_gawk.c b/vms/vms_gawk.c
index f22e2fa9..fce0fa85 100644
--- a/vms/vms_gawk.c
+++ b/vms/vms_gawk.c
@@ -37,16 +37,16 @@
#define Present(arg) vmswork(Cli_Present(arg))
#define Get_Value(arg,buf,siz) vmswork(Cli_Get_Value(arg,buf,siz))
-#ifndef __ia64__
-extern void gawk_cmd(); /* created with $ SET COMMAND/OBJECT */
-#define GAWK_CMD ((const void *)gawk_cmd)
-#else /* linker on Itanium is much pickier about such things */
+#ifndef __DECC
+extern void GAWK_CMD(); /* created with $ SET COMMAND/OBJECT */
+#define gawk_cmd ((const void *)GAWK_CMD) */
+#else /* Use ANSI definitions for DEC C */
#pragma extern_model save
#pragma extern_model strict_refdef
/* (could use globalvalue rather than _refdef if we omit GAWK_CMD's `&') */
-extern void *gawk_cmd;
+extern void *GAWK_CMD;
#pragma extern_model restore
-#define GAWK_CMD ((const void *)&gawk_cmd)
+#define gawk_cmd ((const void *)&GAWK_CMD)
#endif
extern void _exit(int);
static int vms_usage(int);
@@ -88,7 +88,7 @@ vms_gawk()
command, so we'll now attempt to generate a command from the
foreign command string and parse that.
*/
- sts = Cli_Parse_Command(GAWK_CMD, "GAWK"); /* (*not* CmdName) */
+ sts = Cli_Parse_Command(gawk_cmd, "GAWK"); /* (*not* CmdName) */
if (vmswork(sts))
sts = Cli_Present("GAWK_P1");
}
diff --git a/vms/vms_misc.c b/vms/vms_misc.c
index cd92d7ef..ed479539 100644
--- a/vms/vms_misc.c
+++ b/vms/vms_misc.c
@@ -118,15 +118,24 @@ vms_open( const char *name, int mode, ... )
result = creat(name, 0, "rfm=stmlf", "rat=cr", "shr=nil", "mbc=32");
} else {
struct stat stb;
+ int stat_result;
const char *mbc, *shr = "shr=get", *ctx = "ctx=stm";
-
- if (stat((char *)name, &stb) < 0) { /* assume DECnet */
+
+ stat_result = stat((char *)name, &stb);
+ if ( stat_result < 0) { /* assume DECnet */
mbc = "mbc=8";
} else { /* ordinary file; allow full sharing iff record format */
mbc = "mbc=32";
if ((stb.st_fab_rfm & 0x0F) < FAB$C_STM) shr = "shr=get,put,upd";
}
result = open(name, mode, 0, shr, mbc, "mbf=2");
+ if ((stat_result >= 0) && (result < 0) && (errno == ENOENT)) {
+ /* ENOENT not possible because stat succeeded */
+ errno = EMFILE;
+ if (S_ISDIR(stb.st_mode)) {
+ errno = EISDIR; /* Bug seen in VMS 8.3 */
+ }
+ }
}
/* This is only approximate; the ACP -> RMS -> VAXCRTL interface
@@ -165,8 +174,8 @@ vms_devopen( const char *name, int mode )
#define VMS_UNITS_PER_SECOND 10000000L /* hundreds of nanoseconds, 1e-7 */
#define UNIX_EPOCH "01-JAN-1970 00:00:00.00"
-extern U_Long sys$bintim(), sys$gettim();
-extern U_Long lib$subx(), lib$ediv();
+extern U_Long SYS$BINTIM(), SYS$GETTIM();
+extern U_Long LIB$SUBX(), LIB$EDIV();
/*
* Get current time in microsecond precision.
@@ -183,13 +192,13 @@ vms_gettimeofday(struct timeval *tv, void *timezone__not_used)
const long thunk = VMS_UNITS_PER_SECOND;
long now[2], quad[2];
- if (!epoch[0]) sys$bintim(&epoch_dsc, epoch); /* 1 Jan 0:0:0 1970 */
+ if (!epoch[0]) SYS$BINTIM(&epoch_dsc, epoch); /* 1 Jan 0:0:0 1970 */
/* get current time, as VMS quadword time */
- sys$gettim(now);
+ SYS$GETTIM(now);
/* convert the quadword time so that it's relative to Unix epoch */
- lib$subx(now, epoch, quad); /* quad = now - epoch; */
+ LIB$SUBX(now, epoch, quad); /* quad = now - epoch; */
/* convert 1e-7 units into seconds and fraction of seconds */
- lib$ediv(&thunk, quad, &tv->tv_sec, &tv->tv_usec);
+ LIB$EDIV(&thunk, quad, &tv->tv_sec, &tv->tv_usec);
/* convert fraction of seconds into microseconds */
tv->tv_usec /= (VMS_UNITS_PER_SECOND / 1000000);
@@ -272,7 +281,7 @@ int fork( void ) {
#include <fab.h>
#include <nam.h>
-extern unsigned long sys$parse(), sys$search();
+extern unsigned long SYS$PARSE(), SYS$SEARCH();
/* Work around a VAXCRTL bug. If a file is located via a searchlist,
and if the device it's on is not the same device as the one specified
diff --git a/vms/vms_popen.c b/vms/vms_popen.c
index 62f3f719..6c5c5086 100644
--- a/vms/vms_popen.c
+++ b/vms/vms_popen.c
@@ -172,7 +172,7 @@ vms_execute( const char *command, const char *input, const char *output )
out_p = 0;
push_logicals(); /* guard against user-mode definitions of sys$Xput */
- sts = lib$spawn(&cmd, in_p, out_p, (U_Long *)0,
+ sts = LIB$SPAWN(&cmd, in_p, out_p, (U_Long *)0,
(Dsc *)0, (U_Long *)0, &cmpltn_sts);
pop_logicals(); /* restore environment */
@@ -219,9 +219,9 @@ static const Descrip(sys_output,"SYS$OUTPUT");
static const unsigned char acmode = PSL$C_USER; /* only care about user-mode */
/* macros for simplfying the code a bunch */
-#define DelTrans(l) sys$dellnm(&lnmtable, (l), &acmode)
-#define GetTrans(l,i) sys$trnlnm((U_Long *)0, &lnmtable, (l), &acmode, (i))
-#define SetTrans(l,i) sys$crelnm((U_Long *)0, &lnmtable, (l), &acmode, (i))
+#define DelTrans(l) SYS$DELLNM(&lnmtable, (l), &acmode)
+#define GetTrans(l,i) SYS$TRNLNM((U_Long *)0, &lnmtable, (l), &acmode, (i))
+#define SetTrans(l,i) SYS$CRELNM((U_Long *)0, &lnmtable, (l), &acmode, (i))
/* itemlist manipulation macros; separate versions for aggregate and scalar */
#define SetItmA(i,c,p,r) ((i).code = (c), (i).len = sizeof (p),\
(i).buffer = (p), (i).retlen = (U_Short *)(r))
@@ -333,7 +333,7 @@ restore_translation( const Dsc *logname, const Itm *itemlist )
/* assert( itemlist[2].code == LNM$_STRING ); */
trans_val.adr = itemlist[2].buffer;
trans_val.len = itemlist[2].len;
- (void) sys$crelog(LOG_PROCESS_TABLE, logname, &trans_val, LOG_USERMODE);
+ (void) SYS$CRELOG(LOG_PROCESS_TABLE, logname, &trans_val, LOG_USERMODE);
} else {
/* $crelnm definition; itemlist could specify multiple translations,
but has already been setup properly for use as-is.
diff --git a/vms/vmsbuild.com b/vms/vmsbuild.com
index 95c6aeb3..2c0d39f0 100644
--- a/vms/vmsbuild.com
+++ b/vms/vmsbuild.com
@@ -15,9 +15,18 @@ $!
$ REL = "4.1" !release version number
$ PATCHLVL = "0"
$!
+$ if (f$getsyi("HW_MODEL") .lt. 1024)
+$ then
+$ arch_name = "VAX"
+$ else
+$ arch_name = f$edit(f$getsyi("ARCH_NAME"), "UPCASE")
+$ endif
$!
$ CCFLAGS = "/noList" ! "/noOpt/Debug"
+$! CCFLAGS = "/list/show=(expan,incl)
$ CDEFS = "GAWK,HAVE_CONFIG_H"
+$! Do not specify _POSIX_EXIT here, we are using other tricks for that.
+$!
$!
$ if p1.eqs."" then p1 = "DECC" !default compiler
$ if p1.eqs."GNUC"
@@ -38,8 +47,17 @@ $ CFLAGS = "/Incl=[]/Obj=[]/Opt=noInline/Def=(''CDEFS')''CCFLAGS'"
$ LIBS = "sys$share:vaxcrtl.exe/Shareable"
$ else !!VAXC
$! neither GNUC nor VAXC, assume DECC (same for either VAX or Alpha)
+$ if arch_name .eqs. "vax"
+$ then
+$ CFLOAT = ""
+$ else
+$ CFLOAT = "/float=ieee/ieee_mode=denorm_results"
+$ endif
$ CC = "cc/DECC/Prefix=All"
-$ CFLAGS = "/Incl=[]/Obj=[]/Def=(''CDEFS')''CCFLAGS'"
+$ CNAME = "/NAME=(AS_IS,SHORT)
+$ CINC = "/NESTED_INCLUDE=NONE"
+$ CFLAGS = "/Incl=([],[.vms])/Obj=[]/Def=(''CDEFS')''CINC'''CCFLAGS'"
+$ CFLAGS = CNAMES + CFLOAT + CFLAGS
$ LIBS = "" ! DECC$SHR instead of VAXCRTL, no special link option needed
$ endif !VAXC
$ endif !GNUC
@@ -47,12 +65,15 @@ $!
$ cc = CC + CFLAGS
$ show symbol cc
$!
-$ if f$search("config.h").nes."" then -
- if f$cvtime(f$file_attr("config.h","RDT")).ges.-
- f$cvtime(f$file_attr("[.vms]vms-conf.h","RDT")) then goto config_ok
-$ v = f$verify(1)
-$ copy [.vms]vms-conf.h []config.h
-$! 'f$verify(v)'
+$ if f$search("config.h") .nes. ""
+$ then
+$ if f$cvtime(f$file_attr("config.h", "RDT")) .ges. -
+ f$cvtime(f$file_attr("configh.in","RDT")) then goto config_ok
+$ endif
+$ v = f$verify(0)
+$ @[.vms]generate_config_vms_h_gawk.com
+$ @[.vms]config_h.com NOBUILTINS
+$!
$config_ok:
$ if f$search("awkgram.c").nes."" then goto awkgram_ok
$ write sys$output " You must process `awkgram.y' with ""yacc"" or ""bison"""
@@ -70,7 +91,7 @@ $ if f$search("ytab.c").nes."" .or. f$search("y_tab.c").nes."" then - !yacc
write sys$output " or else rename `ytab.c' or `y_tab.c' to `command.c'."
$ exit
$command_ok:
-$ v = f$verify(1)
+$ v1 = f$verify(1)
$ cc array.c
$ cc awkgram.c
$ cc builtin.c
@@ -106,7 +127,8 @@ $ cc [.vms]vms_fwrite.c
$ cc [.vms]vms_args.c
$ cc [.vms]vms_gawk.c
$ cc [.vms]vms_cli.c
-$ set command/Object=[]gawk_cmd.obj [.vms]gawk.cld
+$ cc [.vms]vms_crtl_init.c
+$ set command/Object=[]gawk_cmd.obj sys$disk:[.vms]gawk.cld
$! 'f$verify(v)'
$!
$ close/noLog Fopt
@@ -116,18 +138,21 @@ array.obj,awkgram.obj,builtin.obj,dfa.obj,ext.obj,field.obj,floatcomp.obj
gawkmisc.obj,getopt.obj,getopt1.obj,io.obj
main.obj,msg.obj,node.obj
random.obj,re.obj,regex.obj,replace.obj,version.obj,eval.obj,profile.obj
-command.obj,debug.obj,int_array.obj,cint_array.obj,gawkapi.obj,mpfr.obj,str_array.obj,symbol.obj
+command.obj,debug.obj,int_array.obj,cint_array.obj,gawkapi.obj,mpfr.obj
+str_array.obj,symbol.obj
[]vms_misc.obj,vms_popen.obj,vms_fwrite.obj,vms_args.obj
-[]vms_gawk.obj,vms_cli.obj,gawk_cmd.obj
+[]vms_gawk.obj,vms_cli.obj,gawk_cmd.obj,vms_crtl_init.obj
psect_attr=environ,noshr !extern [noshare] char **
stack=48 !preallocate more pages (default is 20)
iosegment=128 !ditto (default is 32)
+$!
+$ v1 = f$verify(1)
+$ @[.vms]gawk_ident.com
$ open/append Fopt gawk.opt
$ write Fopt libs
-$ write Fopt "identification=""V''REL'.''PATCHLVL'"""
$ close Fopt
$!
-$ v = f$verify(1)
+$ v1 = f$verify(1)
$ link/exe=gawk.exe gawk.opt/options
$! 'f$verify(v)'
$ exit
diff --git a/vms/vmstest.com b/vms/vmstest.com
index 25404373..1b5b7ed9 100644
--- a/vms/vmstest.com
+++ b/vms/vmstest.com
@@ -578,7 +578,7 @@ $defref: echo "defref"
$ set noOn
$ AWKPATH_srcdir
$ gawk --lint -f defref.awk >_defref.tmp 2>&1
-$ if .not.$status then call exit_code 2 _defref.tmp
+$ if .not. $status then call exit_code '$status' _defref.tmp
$ set On
$ cmp defref.ok sys$disk:[]_defref.tmp
$ if $status then rm _defref.tmp;
@@ -601,7 +601,7 @@ $ mon = f$cvtime(now,"ABSOLUTE","MONTH")
$ mon = f$extract(0,1,mon) + f$edit(f$extract(1,2,mon),"LOWERCASE")
$ day = f$cvtime(now,,"DAY")
$ tim = f$extract(0,8,f$cvtime(now,,"TIME"))
-$ tz = ""
+$ tz = f$trnlnm("SYS$TIMEZONE_NAME")
$ yr = f$cvtime(now,,"YEAR")
$ if f$trnlnm("FTMP").nes."" then close/noLog ftmp
$ open/Write ftmp strftime.in
@@ -637,7 +637,7 @@ $
$incdupe: echo "''test'"
$ set noOn
$ gawk --lint -i inclib -i inclib.awk "BEGIN {print sandwich(""a"", ""b"", ""c"")}" > _'test'.tmp 2>&1
-$ if .not. $status then call exit_code 1 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;*
$ set On
@@ -646,7 +646,7 @@ $
$incdupe2: echo "''test'"
$ set noOn
$ gawk --lint -f inclib -f inclib.awk >_'test'.tmp 2>&1
-$ if .not. $status then call exit_code 1 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;*
$ set On
@@ -661,7 +661,7 @@ $
$incdupe4: echo "''test'"
$ set NoOn
$ gawk --lint -f hello -i hello.awk >_'test'.tmp 2>&1
-$ if .not. $status then call exit_code 2 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;*
$ set On
@@ -670,7 +670,7 @@ $
$incdupe5: echo "''test'"
$ set NoOn
$ gawk --lint -i hello -f hello.awk >_'test'.tmp 2>&1
-$ if .not. $status then call exit_code 2 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;*
$ set On
@@ -679,7 +679,7 @@ $
$incdupe6: echo "''test'"
$ set NoOn
$ gawk --lint -i inchello -f hello.awk >_'test'.tmp 2>&1
-$ if .not. $status then call exit_code 2 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;*
$ set On
@@ -688,7 +688,7 @@ $
$incdupe7: echo "''test'"
$ set NoOn
$ gawk --lint -f hello -i inchello >_'test'.tmp 2>&1
-$ if .not. $status then call exit_code 2 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;*
$ set On
@@ -706,7 +706,7 @@ $symtab2:
$symtab3: echo "''test'"
$ set noOn
$ gawk -f 'test'.awk >_'test'.tmp 2>&1
-$ if .not. $status then call exit_code 2 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;*
$ set On
@@ -717,7 +717,7 @@ $symtab5:
$symtab7: echo "''test'"
$ set noOn
$ gawk -f 'test'.awk <'test'.in >_'test'.tmp 2>&1
-$ if .not. $status then call exit_code 2 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;*
$ set On
@@ -897,7 +897,7 @@ $noparms: echo "noparms"
$ set noOn
$ AWKPATH_srcdir
$ gawk -f noparms.awk >_noparms.tmp 2>&1
-$ if .not.$status then call exit_code 1 _noparms.tmp
+$ if .not. $status then call exit_code '$status' _noparms.tmp
$ set On
$ cmp noparms.ok sys$disk:[]_noparms.tmp
$ if $status then rm _noparms.tmp;
@@ -968,8 +968,9 @@ $subslash:
$ echo "''test'"
$ set noOn
$ gawk -f 'test'.awk >_'test'.tmp 2>&1
-$ if .not.$status then call exit_code 2 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ set On
+$ diff 'test'.ok sys$disk:[]_'test'.tmp/out='test'.diff
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;
$ return
@@ -1077,7 +1078,7 @@ $lintwarn: echo "lintwarn"
$ set noOn
$ AWKPATH_srcdir
$ gawk --lint -f lintwarn.awk >_lintwarn.tmp 2>&1
-$ if .not.$status then call exit_code 1 _lintwarn.tmp
+$ if .not. $status then call exit_code '$status' _lintwarn.tmp
$ set On
$ cmp lintwarn.ok sys$disk:[]_lintwarn.tmp
$ if $status then rm _lintwarn.tmp;
@@ -1120,7 +1121,7 @@ $sclifin:
$ echo "''test'"
$ set noOn
$ gawk -f 'test'.awk 'test'.in >_'test'.tmp 2>&1
-$ if .not.$status then call exit_code 2 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ set On
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;
@@ -1132,7 +1133,7 @@ $ !
$ echo "''test'"
$ set noOn
$ gawk -f 'test'.awk <'test'.in >_'test'.tmp 2>&1
-$ if .not.$status then call exit_code 2 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ set On
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;
@@ -1157,7 +1158,7 @@ $unterm:
$ echo "''test'"
$ set noOn
$ gawk -f 'test'.awk 'test'.in >_'test'.tmp 2>&1
-$ if .not.$status then call exit_code 1 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ set On
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;
@@ -1217,7 +1218,7 @@ $synerr2:
$ echo "''test'"
$ set noOn
$ gawk -f 'test'.awk >_'test'.tmp 2>&1
-$ if .not.$status then call exit_code 1 _'test'.tmp
+$ if .not. $status then call exit_code '$status' _'test'.tmp
$ set On
$ cmp 'test'.ok sys$disk:[]_'test'.tmp
$ if $status then rm _'test'.tmp;
@@ -1237,7 +1238,7 @@ $
$space: echo "space"
$ set noOn
$ gawk -f " " space.awk >_space.tmp 2>&1
-$ if .not.$status then call exit_code 2 _space.tmp
+$ if .not. $status then call exit_code '$status' _space.tmp
$ set On
$! we get a different error from what space.ok expects
$ gawk "{gsub(""file specification syntax error"", ""no such file or directory""); print}" -
@@ -1320,7 +1321,7 @@ $
$! This test is somewhat suspect for vms due to exit code manipulation
$exitval1: echo "exitval1"
$ gawk -f exitval1.awk >_exitval1.tmp 2>&1
-$ if $status then call exit_code 0 _exitval1.tmp
+$ if $status then call exit_code '$status' _exitval1.tmp
$ cmp exitval1.ok sys$disk:[]_exitval1.tmp
$ if $status then rm _exitval1.tmp;
$ return
@@ -1424,7 +1425,7 @@ $! nofile.ok expects no/such/file, but using that name in the test would
$! yield "file specification syntax error" instead of "no such file..."
$ set noOn
$ gawk "{}" no-such-file >_nofile.tmp 2>&1
-$ if .not.$status then call exit_code 2 _nofile.tmp
+$ if .not. $status then call exit_code '$status' _nofile.tmp
$ set On
$! restore altered file name
$ gawk "{gsub(""no-such-file"", ""no/such/file""); print}" _nofile.tmp >_nofile.too
@@ -1496,7 +1497,7 @@ $
$mixed1: echo "mixed1"
$ set noOn
$ gawk -f /dev/null --source "BEGIN {return junk}" >_mixed1.tmp 2>&1
-$ if .not.$status then call exit_code 1 _mixed1.tmp
+$ if .not. $status then call exit_code '$status' _mixed1.tmp
$ set On
$ cmp mixed1.ok sys$disk:[]_mixed1.tmp
$ if $status then rm _mixed1.tmp;
@@ -1869,10 +1870,12 @@ $ endsubroutine !fixup_LRL
$
$! add a fake "EXIT CODE" record to the end of the temporary output file
$! to simulate the ``|| echo EXIT CODE $$? >>_$@'' shell script usage
+$! Unix code = vms_code & (255 * 2^3) >> 3
$exit_code: subroutine
+$ unix_status = (p1 .and. %x7f8) / 8
$ if f$trnlnm("FTMP").nes."" then close/noLog ftmp
$ open/Append ftmp 'p2'
-$ write ftmp "EXIT CODE: ",p1
+$ write ftmp "EXIT CODE: ",'unix_status'
$ close ftmp
$ endsubroutine !exit_code
$