aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--README_d/ChangeLog8
-rw-r--r--README_d/README.VMS63
-rw-r--r--doc/ChangeLog4
-rw-r--r--doc/gawk.info1151
-rw-r--r--doc/gawk.texi116
-rw-r--r--doc/gawktexi.in116
-rw-r--r--io.c20
-rw-r--r--main.c1
-rw-r--r--vms/ChangeLog40
-rw-r--r--vms/config_h.com1652
-rw-r--r--vms/descrip.mms54
-rw-r--r--vms/fcntl.h10
-rw-r--r--vms/gawk_ident.com21
-rw-r--r--vms/gawkmisc.vms459
-rw-r--r--vms/generate_config_vms_h_gawk.com290
-rw-r--r--vms/vms-conf.h678
-rw-r--r--vms/vms-notes1140
-rw-r--r--vms/vms_crtl_init.c470
-rw-r--r--vms/vms_misc.c13
-rw-r--r--vms/vmsbuild.com46
-rw-r--r--vms/vmstest.com2
22 files changed, 5051 insertions, 1308 deletions
diff --git a/ChangeLog b/ChangeLog
index 6f81613a..fb6f6c0d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,11 @@
systems.
* awk.h (HAVE_VPRINTF): Remove check.
+2013-12-12 John E. Malmberg <wb8tyw@qsl.net>
+
+ * io.c (redirect): Add additional VMS error codes.
+ (nextfile): Retry open after closing some files.
+
2013-12-10 Scott Deifik <scottd.mail@sbcglobal.net>
* io.c (closemaybesocket): Add definition for DJGPP.
diff --git a/README_d/ChangeLog b/README_d/ChangeLog
index 49c30f13..beaf198e 100644
--- a/README_d/ChangeLog
+++ b/README_d/ChangeLog
@@ -1,3 +1,11 @@
+2013-12-16 John E. Malmberg <wb8tyw@qsl.net>
+
+ * README.VMS: Further updates.
+
+2013-12-05 John E. Malmberg <wb8tyw@qsl.net>
+
+ * README.VMS: updated with current build information.
+
2013-07-02 Arnold D. Robbins <arnold@skeeve.com>
* README.pc: Update that |& also now works on MinGW.
diff --git a/README_d/README.VMS b/README_d/README.VMS
index b47cb0f7..2bf8e86e 100644
--- a/README_d/README.VMS
+++ b/README_d/README.VMS
@@ -6,21 +6,68 @@ CC and LINK commands, and there's also a Makefile for use with the MMS
utility. From the source directory, use either
|$ @[.VMS]VMSBUILD.COM
or
- |$ MMS/DECRIPTION=[.VMS]DECSRIP.MMS GAWK
+ |$ MMS/DESCRIPTION=[.VMS]DESCRIP.MMS gawk
+or
+ |$ MMK/DESCRIPTION=[.VMS]DESCRIP.MMS gawk
+
+Note that on IA64 and Alpha the case of the target may be important.
DEC C -- use either vmsbuild.com or descrip.mms as is.
+ DEC C is also known as Compaq C and HP C.
+
VAX C -- use `@vmsbuild VAXC' or `MMS/MACRO=("VAXC")'. On a system
with both VAX C and DEC C installed where DEC C is the default,
use `MMS/MACRO=("VAXC","CC=CC/VAXC")' for the MMS variant; for
the vmsbuild.com variant, any need for `/VAXC' will be detected
automatically.
+ * IMPORTANT NOTE * VAX C should not be used on VAX/VMS 5.5-2 and
+ later. Use DEC C instead.
+
GNU C -- use `@vmsbuild GNUC' or `MMS/MACRO=("GNUC")'. On a system
where the GCC command is not already defined, use either
`@vmsbuild GNUC DO_GNUC_SETUP' or
`MMS/MACRO=("GNUC","DO_GNUC_SETUP")'.
- Tested under Alpha/VMS V7.1 using DEC C V6.4. GAWK should work
-without modifications for VMS V4.6 and up.
+Most recent builds are using:
+ OpenVMS VAX 7.3 using DEC C 6.4
+ OpenVMS Alpha 8.3 using HP C V 7.3
+ OpenVMS Alpha 8.4 using HP C V 7.3
+ OpenVMS IA64 8.4 using HP C V 7.3
+
+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:
@@ -33,6 +80,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
(You may want to substitute a site-specific help library rather than
@@ -79,9 +130,3 @@ separated list of directory specifications. When defining it, the
value should be quoted so that it retains a single translation, not a
multi-translation RMS searchlist.
-------------------------------
-Thu Jun 18 05:22:10 IDT 2009
-============================
-
-On OpenVMS V7.3 (Alpha) the "manyfiles" test is known to fail. The reason
-is not (yet) known.
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 9b77b107..ad7c52a3 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,7 @@
+2013-12-16 John E. Malmberg <wb8tyw@qsl.net>
+
+ * gawktexi.in: Updates to VMS sections.
+
2013-12-12 Arnold D. Robbins <arnold@skeeve.com>
* gawktexi.in: Fix the presentation of asort() and asorti().
diff --git a/doc/gawk.info b/doc/gawk.info
index 42228cae..bc807235 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -614,9 +614,12 @@ texts being (a) (see below), and with the Back-Cover Texts being (b)
* VMS Installation:: Installing `gawk' on VMS.
* VMS Compilation:: How to compile `gawk' under
VMS.
+* VMS Dynamic Extensions:: Compiling `gawk' dynamic
+ extensions on VMS.
* VMS Installation Details:: How to install `gawk' under
VMS.
* VMS Running:: How to run `gawk' under VMS.
+* VMS GNV:: The VMS GNV Project.
* VMS Old Gawk:: An old version comes with some VMS
systems.
* Bugs:: Reporting Problems and Bugs.
@@ -10735,7 +10738,7 @@ File: gawk.info, Node: Multidimensional, Next: Arrays of Arrays, Prev: Uninit
* Menu:
-* Multiscanning:: Scanning multidimensional arrays.
+* Multiscanning:: Scanning multidimensional arrays.
A multidimensional array is an array in which an element is
identified by a sequence of indices instead of a single index. For
@@ -25204,6 +25207,8 @@ the current version of `gawk'.
- Prestandard VAX C compiler for VAX/VMS
+ - GCC for VAX and Alpha has not been tested for a while.
+

@@ -26229,51 +26234,106 @@ older designation "VMS" is used throughout to refer to OpenVMS.
* Menu:
* VMS Compilation:: How to compile `gawk' under VMS.
+* VMS Dynamic Extensions:: Compiling `gawk' dynamic extensions on
+ VMS.
* VMS Installation Details:: How to install `gawk' under VMS.
* VMS Running:: How to run `gawk' under VMS.
+* VMS GNV:: The VMS GNV Project.
* VMS Old Gawk:: An old version comes with some VMS systems.

-File: gawk.info, Node: VMS Compilation, Next: VMS Installation Details, Up: VMS Installation
+File: gawk.info, Node: VMS Compilation, Next: VMS Dynamic Extensions, Up: VMS Installation
B.3.2.1 Compiling `gawk' on VMS
...............................
To compile `gawk' under VMS, there is a `DCL' command procedure that
issues all the necessary `CC' and `LINK' commands. There is also a
-`Makefile' for use with the `MMS' utility. From the source directory,
-use either:
+`Makefile' for use with the `MMS' or `MMK' utility. From the source
+directory, use either:
+
+ $ @[.vms]vmsbuild.com
+
+or:
- $ @[.VMS]VMSBUILD.COM
+ $ MMS/DESCRIPTION=[.vms]descrip.mms gawk
or:
- $ MMS/DESCRIPTION=[.VMS]DESCRIP.MMS GAWK
+ $ MMK/DESCRIPTION=[.vms]descrip.mms gawk
+
+ `MMK' is an open source freeware near clone of `MMS' and can better
+handle `ODS-5' volumes with upper- and lower-case filenames. `MMK' is
+available from `https://github.com/endlesssoftware/mmk'.
+
+ With `ODS-5' volumes and extended parsing enabled, the case of the
+target parameter may need to be exact.
Older versions of `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 `VMSBUILD.COM' and `DESCRIP.MMS'
+to here as "DEC C") is required. Both `vmsbuild.com' and `descrip.mms'
contain some obsolete support for the older compilers but are set up to
use DEC C by default.
- `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.(1)
+ `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.
+The most recent builds used HP C V7.3 on Alpha VMS 8.3 and both Alpha
+and IA64 VMS 8.4 used HP C 7.3.(1)
+
+ Work is currently being done for a procedure to build `gawk' and
+create a PCSI kit for compatible with the GNV product.
---------- Footnotes ----------
(1) The IA64 architecture is also known as "Itanium."

-File: gawk.info, Node: VMS Installation Details, Next: VMS Running, Prev: VMS Compilation, Up: VMS Installation
+File: gawk.info, Node: VMS Dynamic Extensions, Next: VMS Installation Details, Prev: VMS Compilation, Up: VMS Installation
+
+B.3.2.2 Compiling `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 `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.
+
+ For Alpha and Itanium:
+
+ /name=(as_is,short)
+ /float=ieee/ieee_mode=denorm_results
+
+ For VAX:
+
+ /name=(as_is,short)
+
+ Compile time macros need 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
+
+
+File: gawk.info, Node: VMS Installation Details, Next: VMS Running, Prev: VMS Dynamic Extensions, Up: VMS Installation
-B.3.2.2 Installing `gawk' on VMS
+B.3.2.3 Installing `gawk' on VMS
................................
-To install `gawk', all you need is a "foreign" command, which is a
-`DCL' symbol whose value begins with a dollar sign. For example:
+To use `gawk', all you need is a "foreign" command, which is a `DCL'
+symbol whose value begins with a dollar sign. For example:
- $ GAWK :== $disk1:[gnubin]GAWK
+ $ GAWK :== $disk1:[gnubin]gawk
Substitute the actual location of `gawk.exe' for `$disk1:[gnubin]'. The
symbol should be placed in the `login.com' of any user who wants to run
@@ -26281,9 +26341,14 @@ symbol should be placed in the `login.com' of any user who wants to run
Alternatively, the symbol may be placed in the system-wide
`sylogin.com' procedure, which allows all users to run `gawk'.
+ 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
+ $ LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp
(You may want to substitute a site-specific help library rather than
the standard VMS library `HELPLIB'.) After loading the help text, the
@@ -26305,9 +26370,9 @@ If `AWK_LIBRARY' has no definition, a default value of `SYS$LIBRARY:'
is used for it.

-File: gawk.info, Node: VMS Running, Next: VMS Old Gawk, Prev: VMS Installation Details, Up: VMS Installation
+File: gawk.info, Node: VMS Running, Next: VMS GNV, Prev: VMS Installation Details, Up: VMS Installation
-B.3.2.3 Running `gawk' on VMS
+B.3.2.4 Running `gawk' on VMS
.............................
Command-line parsing and quoting conventions are significantly different
@@ -26341,9 +26406,25 @@ When defining it, the value should be quoted so that it retains a single
translation and not a multitranslation `RMS' searchlist.

-File: gawk.info, Node: VMS Old Gawk, Prev: VMS Running, Up: VMS Installation
+File: gawk.info, Node: VMS GNV, Next: VMS Old Gawk, Prev: VMS Running, Up: VMS Installation
+
+B.3.2.5 The VMS GNV Project
+...........................
+
+The VMS GNV package provides a build environment similar to POSIX with
+ports of a collection of open source tools. The `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. See
+`https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/'.
+
+ The normal build procedure for `gawk' produces 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 `gawk' port.
+
+
+File: gawk.info, Node: VMS Old Gawk, Prev: VMS GNV, Up: VMS Installation
-B.3.2.4 Some VMS Systems Have An Old Version of `gawk'
+B.3.2.6 Some VMS Systems Have An Old Version of `gawk'
......................................................
Some versions of VMS have an old version of `gawk'. To access it,
@@ -32176,520 +32257,522 @@ Index

Tag Table:
Node: Top1360
-Node: Foreword40460
-Node: Preface44805
-Ref: Preface-Footnote-147858
-Ref: Preface-Footnote-247954
-Node: History48186
-Node: Names50560
-Ref: Names-Footnote-152037
-Node: This Manual52109
-Ref: This Manual-Footnote-157883
-Node: Conventions57983
-Node: Manual History60139
-Ref: Manual History-Footnote-163587
-Ref: Manual History-Footnote-263628
-Node: How To Contribute63702
-Node: Acknowledgments64846
-Node: Getting Started69055
-Node: Running gawk71434
-Node: One-shot72620
-Node: Read Terminal73845
-Ref: Read Terminal-Footnote-175495
-Ref: Read Terminal-Footnote-275771
-Node: Long75942
-Node: Executable Scripts77318
-Ref: Executable Scripts-Footnote-179151
-Ref: Executable Scripts-Footnote-279253
-Node: Comments79800
-Node: Quoting82267
-Node: DOS Quoting86890
-Node: Sample Data Files87565
-Node: Very Simple90609
-Node: Two Rules95208
-Node: More Complex97355
-Ref: More Complex-Footnote-1100285
-Node: Statements/Lines100370
-Ref: Statements/Lines-Footnote-1104832
-Node: Other Features105097
-Node: When106025
-Node: Invoking Gawk108172
-Node: Command Line109633
-Node: Options110416
-Ref: Options-Footnote-1125808
-Node: Other Arguments125833
-Node: Naming Standard Input128491
-Node: Environment Variables129585
-Node: AWKPATH Variable130143
-Ref: AWKPATH Variable-Footnote-1132901
-Node: AWKLIBPATH Variable133161
-Node: Other Environment Variables133879
-Node: Exit Status136842
-Node: Include Files137517
-Node: Loading Shared Libraries141086
-Node: Obsolete142450
-Node: Undocumented143147
-Node: Regexp143389
-Node: Regexp Usage144778
-Node: Escape Sequences146804
-Node: Regexp Operators152473
-Ref: Regexp Operators-Footnote-1159853
-Ref: Regexp Operators-Footnote-2160000
-Node: Bracket Expressions160098
-Ref: table-char-classes161988
-Node: GNU Regexp Operators164511
-Node: Case-sensitivity168234
-Ref: Case-sensitivity-Footnote-1171202
-Ref: Case-sensitivity-Footnote-2171437
-Node: Leftmost Longest171545
-Node: Computed Regexps172746
-Node: Reading Files176083
-Node: Records178085
-Ref: Records-Footnote-1186974
-Node: Fields187011
-Ref: Fields-Footnote-1190044
-Node: Nonconstant Fields190130
-Node: Changing Fields192332
-Node: Field Separators198291
-Node: Default Field Splitting200920
-Node: Regexp Field Splitting202037
-Node: Single Character Fields205379
-Node: Command Line Field Separator206438
-Node: Field Splitting Summary209879
-Ref: Field Splitting Summary-Footnote-1212990
-Node: Constant Size213091
-Node: Splitting By Content217675
-Ref: Splitting By Content-Footnote-1221401
-Node: Multiple Line221441
-Ref: Multiple Line-Footnote-1227288
-Node: Getline227467
-Node: Plain Getline229683
-Node: Getline/Variable231778
-Node: Getline/File232925
-Node: Getline/Variable/File234266
-Ref: Getline/Variable/File-Footnote-1235865
-Node: Getline/Pipe235952
-Node: Getline/Variable/Pipe238651
-Node: Getline/Coprocess239758
-Node: Getline/Variable/Coprocess241010
-Node: Getline Notes241747
-Node: Getline Summary244534
-Ref: table-getline-variants244942
-Node: Read Timeout245854
-Ref: Read Timeout-Footnote-1249595
-Node: Command line directories249652
-Node: Printing250282
-Node: Print251913
-Node: Print Examples253250
-Node: Output Separators256034
-Node: OFMT257794
-Node: Printf259152
-Node: Basic Printf260058
-Node: Control Letters261597
-Node: Format Modifiers265409
-Node: Printf Examples271418
-Node: Redirection274133
-Node: Special Files281098
-Node: Special FD281631
-Ref: Special FD-Footnote-1285256
-Node: Special Network285330
-Node: Special Caveats286180
-Node: Close Files And Pipes286976
-Ref: Close Files And Pipes-Footnote-1293959
-Ref: Close Files And Pipes-Footnote-2294107
-Node: Expressions294257
-Node: Values295389
-Node: Constants296065
-Node: Scalar Constants296745
-Ref: Scalar Constants-Footnote-1297604
-Node: Nondecimal-numbers297786
-Node: Regexp Constants300786
-Node: Using Constant Regexps301261
-Node: Variables304316
-Node: Using Variables304971
-Node: Assignment Options306695
-Node: Conversion308567
-Ref: table-locale-affects314068
-Ref: Conversion-Footnote-1314692
-Node: All Operators314801
-Node: Arithmetic Ops315431
-Node: Concatenation317936
-Ref: Concatenation-Footnote-1320728
-Node: Assignment Ops320848
-Ref: table-assign-ops325836
-Node: Increment Ops327167
-Node: Truth Values and Conditions330601
-Node: Truth Values331684
-Node: Typing and Comparison332733
-Node: Variable Typing333526
-Ref: Variable Typing-Footnote-1337423
-Node: Comparison Operators337545
-Ref: table-relational-ops337955
-Node: POSIX String Comparison341504
-Ref: POSIX String Comparison-Footnote-1342460
-Node: Boolean Ops342598
-Ref: Boolean Ops-Footnote-1346676
-Node: Conditional Exp346767
-Node: Function Calls348499
-Node: Precedence352093
-Node: Locales355762
-Node: Patterns and Actions356851
-Node: Pattern Overview357905
-Node: Regexp Patterns359574
-Node: Expression Patterns360117
-Node: Ranges363802
-Node: BEGIN/END366768
-Node: Using BEGIN/END367530
-Ref: Using BEGIN/END-Footnote-1370261
-Node: I/O And BEGIN/END370367
-Node: BEGINFILE/ENDFILE372649
-Node: Empty375563
-Node: Using Shell Variables375879
-Node: Action Overview378164
-Node: Statements380521
-Node: If Statement382375
-Node: While Statement383874
-Node: Do Statement385918
-Node: For Statement387074
-Node: Switch Statement390226
-Node: Break Statement392323
-Node: Continue Statement394313
-Node: Next Statement396106
-Node: Nextfile Statement398496
-Node: Exit Statement401139
-Node: Built-in Variables403555
-Node: User-modified404650
-Ref: User-modified-Footnote-1413008
-Node: Auto-set413070
-Ref: Auto-set-Footnote-1426148
-Ref: Auto-set-Footnote-2426353
-Node: ARGC and ARGV426409
-Node: Arrays430260
-Node: Array Basics431765
-Node: Array Intro432591
-Node: Reference to Elements436908
-Node: Assigning Elements439178
-Node: Array Example439669
-Node: Scanning an Array441401
-Node: Controlling Scanning443715
-Ref: Controlling Scanning-Footnote-1448802
-Node: Delete449118
-Ref: Delete-Footnote-1451883
-Node: Numeric Array Subscripts451940
-Node: Uninitialized Subscripts454123
-Node: Multidimensional455750
-Node: Multiscanning458842
-Node: Arrays of Arrays460431
-Node: Functions465071
-Node: Built-in465890
-Node: Calling Built-in466968
-Node: Numeric Functions468956
-Ref: Numeric Functions-Footnote-1472788
-Ref: Numeric Functions-Footnote-2473145
-Ref: Numeric Functions-Footnote-3473193
-Node: String Functions473462
-Ref: String Functions-Footnote-1496382
-Ref: String Functions-Footnote-2496511
-Ref: String Functions-Footnote-3496759
-Node: Gory Details496846
-Ref: table-sub-escapes498525
-Ref: table-sub-posix-92499879
-Ref: table-sub-proposed501230
-Ref: table-posix-sub502584
-Ref: table-gensub-escapes504129
-Ref: Gory Details-Footnote-1505305
-Ref: Gory Details-Footnote-2505356
-Node: I/O Functions505507
-Ref: I/O Functions-Footnote-1512492
-Node: Time Functions512639
-Ref: Time Functions-Footnote-1523572
-Ref: Time Functions-Footnote-2523640
-Ref: Time Functions-Footnote-3523798
-Ref: Time Functions-Footnote-4523909
-Ref: Time Functions-Footnote-5524021
-Ref: Time Functions-Footnote-6524248
-Node: Bitwise Functions524514
-Ref: table-bitwise-ops525076
-Ref: Bitwise Functions-Footnote-1529297
-Node: Type Functions529481
-Node: I18N Functions530632
-Node: User-defined532259
-Node: Definition Syntax533063
-Ref: Definition Syntax-Footnote-1537973
-Node: Function Example538042
-Node: Function Caveats540636
-Node: Calling A Function541057
-Node: Variable Scope542172
-Node: Pass By Value/Reference545135
-Node: Return Statement548643
-Node: Dynamic Typing551624
-Node: Indirect Calls552555
-Node: Library Functions562240
-Ref: Library Functions-Footnote-1565753
-Ref: Library Functions-Footnote-2565896
-Node: Library Names566067
-Ref: Library Names-Footnote-1569538
-Ref: Library Names-Footnote-2569758
-Node: General Functions569844
-Node: Strtonum Function570872
-Node: Assert Function573802
-Node: Round Function577128
-Node: Cliff Random Function578671
-Node: Ordinal Functions579687
-Ref: Ordinal Functions-Footnote-1582757
-Ref: Ordinal Functions-Footnote-2583009
-Node: Join Function583218
-Ref: Join Function-Footnote-1584989
-Node: Getlocaltime Function585189
-Node: Readfile Function588930
-Node: Data File Management590769
-Node: Filetrans Function591401
-Node: Rewind Function595470
-Node: File Checking596857
-Node: Empty Files597951
-Node: Ignoring Assigns600181
-Node: Getopt Function601734
-Ref: Getopt Function-Footnote-1613037
-Node: Passwd Functions613240
-Ref: Passwd Functions-Footnote-1622215
-Node: Group Functions622303
-Node: Walking Arrays630387
-Node: Sample Programs632524
-Node: Running Examples633198
-Node: Clones633926
-Node: Cut Program635150
-Node: Egrep Program644995
-Ref: Egrep Program-Footnote-1652768
-Node: Id Program652878
-Node: Split Program656494
-Ref: Split Program-Footnote-1660013
-Node: Tee Program660141
-Node: Uniq Program662944
-Node: Wc Program670373
-Ref: Wc Program-Footnote-1674639
-Ref: Wc Program-Footnote-2674839
-Node: Miscellaneous Programs674931
-Node: Dupword Program676119
-Node: Alarm Program678150
-Node: Translate Program682903
-Ref: Translate Program-Footnote-1687290
-Ref: Translate Program-Footnote-2687538
-Node: Labels Program687672
-Ref: Labels Program-Footnote-1691043
-Node: Word Sorting691127
-Node: History Sorting695011
-Node: Extract Program696850
-Ref: Extract Program-Footnote-1704353
-Node: Simple Sed704481
-Node: Igawk Program707543
-Ref: Igawk Program-Footnote-1722700
-Ref: Igawk Program-Footnote-2722901
-Node: Anagram Program723039
-Node: Signature Program726107
-Node: Advanced Features727207
-Node: Nondecimal Data729093
-Node: Array Sorting730676
-Node: Controlling Array Traversal731373
-Node: Array Sorting Functions739657
-Ref: Array Sorting Functions-Footnote-1743526
-Node: Two-way I/O743720
-Ref: Two-way I/O-Footnote-1749152
-Node: TCP/IP Networking749222
-Node: Profiling752066
-Node: Internationalization759563
-Node: I18N and L10N760988
-Node: Explaining gettext761674
-Ref: Explaining gettext-Footnote-1766742
-Ref: Explaining gettext-Footnote-2766926
-Node: Programmer i18n767091
-Node: Translator i18n771293
-Node: String Extraction772086
-Ref: String Extraction-Footnote-1773047
-Node: Printf Ordering773133
-Ref: Printf Ordering-Footnote-1775917
-Node: I18N Portability775981
-Ref: I18N Portability-Footnote-1778430
-Node: I18N Example778493
-Ref: I18N Example-Footnote-1781131
-Node: Gawk I18N781203
-Node: Debugger781824
-Node: Debugging782795
-Node: Debugging Concepts783228
-Node: Debugging Terms785084
-Node: Awk Debugging787681
-Node: Sample Debugging Session788573
-Node: Debugger Invocation789093
-Node: Finding The Bug790425
-Node: List of Debugger Commands796913
-Node: Breakpoint Control798247
-Node: Debugger Execution Control801911
-Node: Viewing And Changing Data805271
-Node: Execution Stack808627
-Node: Debugger Info810094
-Node: Miscellaneous Debugger Commands814076
-Node: Readline Support819252
-Node: Limitations820083
-Node: Arbitrary Precision Arithmetic822335
-Ref: Arbitrary Precision Arithmetic-Footnote-1823984
-Node: General Arithmetic824132
-Node: Floating Point Issues825852
-Node: String Conversion Precision826733
-Ref: String Conversion Precision-Footnote-1828438
-Node: Unexpected Results828547
-Node: POSIX Floating Point Problems830700
-Ref: POSIX Floating Point Problems-Footnote-1834525
-Node: Integer Programming834563
-Node: Floating-point Programming836302
-Ref: Floating-point Programming-Footnote-1842633
-Ref: Floating-point Programming-Footnote-2842903
-Node: Floating-point Representation843167
-Node: Floating-point Context844332
-Ref: table-ieee-formats845171
-Node: Rounding Mode846555
-Ref: table-rounding-modes847034
-Ref: Rounding Mode-Footnote-1850049
-Node: Gawk and MPFR850228
-Node: Arbitrary Precision Floats851483
-Ref: Arbitrary Precision Floats-Footnote-1853926
-Node: Setting Precision854242
-Ref: table-predefined-precision-strings854928
-Node: Setting Rounding Mode857073
-Ref: table-gawk-rounding-modes857477
-Node: Floating-point Constants858664
-Node: Changing Precision860093
-Ref: Changing Precision-Footnote-1861490
-Node: Exact Arithmetic861664
-Node: Arbitrary Precision Integers864802
-Ref: Arbitrary Precision Integers-Footnote-1867820
-Node: Dynamic Extensions867967
-Node: Extension Intro869425
-Node: Plugin License870690
-Node: Extension Mechanism Outline871375
-Ref: load-extension871792
-Ref: load-new-function873270
-Ref: call-new-function874265
-Node: Extension API Description876280
-Node: Extension API Functions Introduction877493
-Node: General Data Types882359
-Ref: General Data Types-Footnote-1887958
-Node: Requesting Values888257
-Ref: table-value-types-returned888988
-Node: Constructor Functions889942
-Node: Registration Functions892962
-Node: Extension Functions893647
-Node: Exit Callback Functions895872
-Node: Extension Version String897121
-Node: Input Parsers897771
-Node: Output Wrappers907528
-Node: Two-way processors912038
-Node: Printing Messages914246
-Ref: Printing Messages-Footnote-1915323
-Node: Updating `ERRNO'915475
-Node: Accessing Parameters916214
-Node: Symbol Table Access917444
-Node: Symbol table by name917956
-Node: Symbol table by cookie919703
-Ref: Symbol table by cookie-Footnote-1923833
-Node: Cached values923896
-Ref: Cached values-Footnote-1927345
-Node: Array Manipulation927436
-Ref: Array Manipulation-Footnote-1928534
-Node: Array Data Types928573
-Ref: Array Data Types-Footnote-1931276
-Node: Array Functions931368
-Node: Flattening Arrays935134
-Node: Creating Arrays941986
-Node: Extension API Variables946711
-Node: Extension Versioning947347
-Node: Extension API Informational Variables949248
-Node: Extension API Boilerplate950334
-Node: Finding Extensions954138
-Node: Extension Example954698
-Node: Internal File Description955428
-Node: Internal File Ops959519
-Ref: Internal File Ops-Footnote-1971027
-Node: Using Internal File Ops971167
-Ref: Using Internal File Ops-Footnote-1973520
-Node: Extension Samples973786
-Node: Extension Sample File Functions975310
-Node: Extension Sample Fnmatch983795
-Node: Extension Sample Fork985521
-Node: Extension Sample Inplace986739
-Node: Extension Sample Ord988517
-Node: Extension Sample Readdir989353
-Node: Extension Sample Revout990885
-Node: Extension Sample Rev2way991478
-Node: Extension Sample Read write array992168
-Node: Extension Sample Readfile994051
-Node: Extension Sample API Tests994869
-Node: Extension Sample Time995394
-Node: gawkextlib996758
-Node: Language History999518
-Node: V7/SVR3.11001040
-Node: SVR41003360
-Node: POSIX1004802
-Node: BTL1006188
-Node: POSIX/GNU1006922
-Node: Common Extensions1012457
-Node: Ranges and Locales1013763
-Ref: Ranges and Locales-Footnote-11018381
-Ref: Ranges and Locales-Footnote-21018408
-Ref: Ranges and Locales-Footnote-31018668
-Node: Contributors1018889
-Node: Installation1023964
-Node: Gawk Distribution1024858
-Node: Getting1025342
-Node: Extracting1026168
-Node: Distribution contents1027860
-Node: Unix Installation1033380
-Node: Quick Installation1033997
-Node: Additional Configuration Options1036441
-Node: Configuration Philosophy1037918
-Node: Non-Unix Installation1040272
-Node: PC Installation1040730
-Node: PC Binary Installation1042029
-Node: PC Compiling1043877
-Node: PC Testing1046821
-Node: PC Using1047997
-Node: Cygwin1052182
-Node: MSYS1053182
-Node: VMS Installation1053696
-Node: VMS Compilation1054299
-Ref: VMS Compilation-Footnote-11055306
-Node: VMS Installation Details1055364
-Node: VMS Running1056999
-Node: VMS Old Gawk1058606
-Node: Bugs1059080
-Node: Other Versions1062936
-Node: Notes1069020
-Node: Compatibility Mode1069820
-Node: Additions1070603
-Node: Accessing The Source1071530
-Node: Adding Code1072970
-Node: New Ports1079015
-Node: Derived Files1083150
-Ref: Derived Files-Footnote-11088471
-Ref: Derived Files-Footnote-21088505
-Ref: Derived Files-Footnote-31089105
-Node: Future Extensions1089203
-Node: Implementation Limitations1089780
-Node: Extension Design1091032
-Node: Old Extension Problems1092186
-Ref: Old Extension Problems-Footnote-11093694
-Node: Extension New Mechanism Goals1093751
-Ref: Extension New Mechanism Goals-Footnote-11097116
-Node: Extension Other Design Decisions1097302
-Node: Extension Future Growth1099408
-Node: Old Extension Mechanism1100244
-Node: Basic Concepts1101984
-Node: Basic High Level1102665
-Ref: figure-general-flow1102936
-Ref: figure-process-flow1103535
-Ref: Basic High Level-Footnote-11106764
-Node: Basic Data Typing1106949
-Node: Glossary1110304
-Node: Copying1135766
-Node: GNU Free Documentation License1173323
-Node: Index1198460
+Node: Foreword40645
+Node: Preface44990
+Ref: Preface-Footnote-148043
+Ref: Preface-Footnote-248139
+Node: History48371
+Node: Names50745
+Ref: Names-Footnote-152222
+Node: This Manual52294
+Ref: This Manual-Footnote-158068
+Node: Conventions58168
+Node: Manual History60324
+Ref: Manual History-Footnote-163772
+Ref: Manual History-Footnote-263813
+Node: How To Contribute63887
+Node: Acknowledgments65031
+Node: Getting Started69240
+Node: Running gawk71619
+Node: One-shot72805
+Node: Read Terminal74030
+Ref: Read Terminal-Footnote-175680
+Ref: Read Terminal-Footnote-275956
+Node: Long76127
+Node: Executable Scripts77503
+Ref: Executable Scripts-Footnote-179336
+Ref: Executable Scripts-Footnote-279438
+Node: Comments79985
+Node: Quoting82452
+Node: DOS Quoting87075
+Node: Sample Data Files87750
+Node: Very Simple90794
+Node: Two Rules95393
+Node: More Complex97540
+Ref: More Complex-Footnote-1100470
+Node: Statements/Lines100555
+Ref: Statements/Lines-Footnote-1105017
+Node: Other Features105282
+Node: When106210
+Node: Invoking Gawk108357
+Node: Command Line109818
+Node: Options110601
+Ref: Options-Footnote-1125993
+Node: Other Arguments126018
+Node: Naming Standard Input128676
+Node: Environment Variables129770
+Node: AWKPATH Variable130328
+Ref: AWKPATH Variable-Footnote-1133086
+Node: AWKLIBPATH Variable133346
+Node: Other Environment Variables134064
+Node: Exit Status137027
+Node: Include Files137702
+Node: Loading Shared Libraries141271
+Node: Obsolete142635
+Node: Undocumented143332
+Node: Regexp143574
+Node: Regexp Usage144963
+Node: Escape Sequences146989
+Node: Regexp Operators152658
+Ref: Regexp Operators-Footnote-1160038
+Ref: Regexp Operators-Footnote-2160185
+Node: Bracket Expressions160283
+Ref: table-char-classes162173
+Node: GNU Regexp Operators164696
+Node: Case-sensitivity168419
+Ref: Case-sensitivity-Footnote-1171387
+Ref: Case-sensitivity-Footnote-2171622
+Node: Leftmost Longest171730
+Node: Computed Regexps172931
+Node: Reading Files176268
+Node: Records178270
+Ref: Records-Footnote-1187159
+Node: Fields187196
+Ref: Fields-Footnote-1190229
+Node: Nonconstant Fields190315
+Node: Changing Fields192517
+Node: Field Separators198476
+Node: Default Field Splitting201105
+Node: Regexp Field Splitting202222
+Node: Single Character Fields205564
+Node: Command Line Field Separator206623
+Node: Field Splitting Summary210064
+Ref: Field Splitting Summary-Footnote-1213175
+Node: Constant Size213276
+Node: Splitting By Content217860
+Ref: Splitting By Content-Footnote-1221586
+Node: Multiple Line221626
+Ref: Multiple Line-Footnote-1227473
+Node: Getline227652
+Node: Plain Getline229868
+Node: Getline/Variable231963
+Node: Getline/File233110
+Node: Getline/Variable/File234451
+Ref: Getline/Variable/File-Footnote-1236050
+Node: Getline/Pipe236137
+Node: Getline/Variable/Pipe238836
+Node: Getline/Coprocess239943
+Node: Getline/Variable/Coprocess241195
+Node: Getline Notes241932
+Node: Getline Summary244719
+Ref: table-getline-variants245127
+Node: Read Timeout246039
+Ref: Read Timeout-Footnote-1249780
+Node: Command line directories249837
+Node: Printing250467
+Node: Print252098
+Node: Print Examples253435
+Node: Output Separators256219
+Node: OFMT257979
+Node: Printf259337
+Node: Basic Printf260243
+Node: Control Letters261782
+Node: Format Modifiers265594
+Node: Printf Examples271603
+Node: Redirection274318
+Node: Special Files281283
+Node: Special FD281816
+Ref: Special FD-Footnote-1285441
+Node: Special Network285515
+Node: Special Caveats286365
+Node: Close Files And Pipes287161
+Ref: Close Files And Pipes-Footnote-1294144
+Ref: Close Files And Pipes-Footnote-2294292
+Node: Expressions294442
+Node: Values295574
+Node: Constants296250
+Node: Scalar Constants296930
+Ref: Scalar Constants-Footnote-1297789
+Node: Nondecimal-numbers297971
+Node: Regexp Constants300971
+Node: Using Constant Regexps301446
+Node: Variables304501
+Node: Using Variables305156
+Node: Assignment Options306880
+Node: Conversion308752
+Ref: table-locale-affects314253
+Ref: Conversion-Footnote-1314877
+Node: All Operators314986
+Node: Arithmetic Ops315616
+Node: Concatenation318121
+Ref: Concatenation-Footnote-1320913
+Node: Assignment Ops321033
+Ref: table-assign-ops326021
+Node: Increment Ops327352
+Node: Truth Values and Conditions330786
+Node: Truth Values331869
+Node: Typing and Comparison332918
+Node: Variable Typing333711
+Ref: Variable Typing-Footnote-1337608
+Node: Comparison Operators337730
+Ref: table-relational-ops338140
+Node: POSIX String Comparison341689
+Ref: POSIX String Comparison-Footnote-1342645
+Node: Boolean Ops342783
+Ref: Boolean Ops-Footnote-1346861
+Node: Conditional Exp346952
+Node: Function Calls348684
+Node: Precedence352278
+Node: Locales355947
+Node: Patterns and Actions357036
+Node: Pattern Overview358090
+Node: Regexp Patterns359759
+Node: Expression Patterns360302
+Node: Ranges363987
+Node: BEGIN/END366953
+Node: Using BEGIN/END367715
+Ref: Using BEGIN/END-Footnote-1370446
+Node: I/O And BEGIN/END370552
+Node: BEGINFILE/ENDFILE372834
+Node: Empty375748
+Node: Using Shell Variables376064
+Node: Action Overview378349
+Node: Statements380706
+Node: If Statement382560
+Node: While Statement384059
+Node: Do Statement386103
+Node: For Statement387259
+Node: Switch Statement390411
+Node: Break Statement392508
+Node: Continue Statement394498
+Node: Next Statement396291
+Node: Nextfile Statement398681
+Node: Exit Statement401324
+Node: Built-in Variables403740
+Node: User-modified404835
+Ref: User-modified-Footnote-1413193
+Node: Auto-set413255
+Ref: Auto-set-Footnote-1426333
+Ref: Auto-set-Footnote-2426538
+Node: ARGC and ARGV426594
+Node: Arrays430445
+Node: Array Basics431950
+Node: Array Intro432776
+Node: Reference to Elements437093
+Node: Assigning Elements439363
+Node: Array Example439854
+Node: Scanning an Array441586
+Node: Controlling Scanning443900
+Ref: Controlling Scanning-Footnote-1448987
+Node: Delete449303
+Ref: Delete-Footnote-1452068
+Node: Numeric Array Subscripts452125
+Node: Uninitialized Subscripts454308
+Node: Multidimensional455935
+Node: Multiscanning459028
+Node: Arrays of Arrays460617
+Node: Functions465257
+Node: Built-in466076
+Node: Calling Built-in467154
+Node: Numeric Functions469142
+Ref: Numeric Functions-Footnote-1472974
+Ref: Numeric Functions-Footnote-2473331
+Ref: Numeric Functions-Footnote-3473379
+Node: String Functions473648
+Ref: String Functions-Footnote-1496568
+Ref: String Functions-Footnote-2496697
+Ref: String Functions-Footnote-3496945
+Node: Gory Details497032
+Ref: table-sub-escapes498711
+Ref: table-sub-posix-92500065
+Ref: table-sub-proposed501416
+Ref: table-posix-sub502770
+Ref: table-gensub-escapes504315
+Ref: Gory Details-Footnote-1505491
+Ref: Gory Details-Footnote-2505542
+Node: I/O Functions505693
+Ref: I/O Functions-Footnote-1512678
+Node: Time Functions512825
+Ref: Time Functions-Footnote-1523758
+Ref: Time Functions-Footnote-2523826
+Ref: Time Functions-Footnote-3523984
+Ref: Time Functions-Footnote-4524095
+Ref: Time Functions-Footnote-5524207
+Ref: Time Functions-Footnote-6524434
+Node: Bitwise Functions524700
+Ref: table-bitwise-ops525262
+Ref: Bitwise Functions-Footnote-1529483
+Node: Type Functions529667
+Node: I18N Functions530818
+Node: User-defined532445
+Node: Definition Syntax533249
+Ref: Definition Syntax-Footnote-1538159
+Node: Function Example538228
+Node: Function Caveats540822
+Node: Calling A Function541243
+Node: Variable Scope542358
+Node: Pass By Value/Reference545321
+Node: Return Statement548829
+Node: Dynamic Typing551810
+Node: Indirect Calls552741
+Node: Library Functions562426
+Ref: Library Functions-Footnote-1565939
+Ref: Library Functions-Footnote-2566082
+Node: Library Names566253
+Ref: Library Names-Footnote-1569724
+Ref: Library Names-Footnote-2569944
+Node: General Functions570030
+Node: Strtonum Function571058
+Node: Assert Function573988
+Node: Round Function577314
+Node: Cliff Random Function578857
+Node: Ordinal Functions579873
+Ref: Ordinal Functions-Footnote-1582943
+Ref: Ordinal Functions-Footnote-2583195
+Node: Join Function583404
+Ref: Join Function-Footnote-1585175
+Node: Getlocaltime Function585375
+Node: Readfile Function589116
+Node: Data File Management590955
+Node: Filetrans Function591587
+Node: Rewind Function595656
+Node: File Checking597043
+Node: Empty Files598137
+Node: Ignoring Assigns600367
+Node: Getopt Function601920
+Ref: Getopt Function-Footnote-1613223
+Node: Passwd Functions613426
+Ref: Passwd Functions-Footnote-1622401
+Node: Group Functions622489
+Node: Walking Arrays630573
+Node: Sample Programs632710
+Node: Running Examples633384
+Node: Clones634112
+Node: Cut Program635336
+Node: Egrep Program645181
+Ref: Egrep Program-Footnote-1652954
+Node: Id Program653064
+Node: Split Program656680
+Ref: Split Program-Footnote-1660199
+Node: Tee Program660327
+Node: Uniq Program663130
+Node: Wc Program670559
+Ref: Wc Program-Footnote-1674825
+Ref: Wc Program-Footnote-2675025
+Node: Miscellaneous Programs675117
+Node: Dupword Program676305
+Node: Alarm Program678336
+Node: Translate Program683089
+Ref: Translate Program-Footnote-1687476
+Ref: Translate Program-Footnote-2687724
+Node: Labels Program687858
+Ref: Labels Program-Footnote-1691229
+Node: Word Sorting691313
+Node: History Sorting695197
+Node: Extract Program697036
+Ref: Extract Program-Footnote-1704539
+Node: Simple Sed704667
+Node: Igawk Program707729
+Ref: Igawk Program-Footnote-1722886
+Ref: Igawk Program-Footnote-2723087
+Node: Anagram Program723225
+Node: Signature Program726293
+Node: Advanced Features727393
+Node: Nondecimal Data729279
+Node: Array Sorting730862
+Node: Controlling Array Traversal731559
+Node: Array Sorting Functions739843
+Ref: Array Sorting Functions-Footnote-1743712
+Node: Two-way I/O743906
+Ref: Two-way I/O-Footnote-1749338
+Node: TCP/IP Networking749408
+Node: Profiling752252
+Node: Internationalization759749
+Node: I18N and L10N761174
+Node: Explaining gettext761860
+Ref: Explaining gettext-Footnote-1766928
+Ref: Explaining gettext-Footnote-2767112
+Node: Programmer i18n767277
+Node: Translator i18n771479
+Node: String Extraction772272
+Ref: String Extraction-Footnote-1773233
+Node: Printf Ordering773319
+Ref: Printf Ordering-Footnote-1776103
+Node: I18N Portability776167
+Ref: I18N Portability-Footnote-1778616
+Node: I18N Example778679
+Ref: I18N Example-Footnote-1781317
+Node: Gawk I18N781389
+Node: Debugger782010
+Node: Debugging782981
+Node: Debugging Concepts783414
+Node: Debugging Terms785270
+Node: Awk Debugging787867
+Node: Sample Debugging Session788759
+Node: Debugger Invocation789279
+Node: Finding The Bug790611
+Node: List of Debugger Commands797099
+Node: Breakpoint Control798433
+Node: Debugger Execution Control802097
+Node: Viewing And Changing Data805457
+Node: Execution Stack808813
+Node: Debugger Info810280
+Node: Miscellaneous Debugger Commands814262
+Node: Readline Support819438
+Node: Limitations820269
+Node: Arbitrary Precision Arithmetic822521
+Ref: Arbitrary Precision Arithmetic-Footnote-1824170
+Node: General Arithmetic824318
+Node: Floating Point Issues826038
+Node: String Conversion Precision826919
+Ref: String Conversion Precision-Footnote-1828624
+Node: Unexpected Results828733
+Node: POSIX Floating Point Problems830886
+Ref: POSIX Floating Point Problems-Footnote-1834711
+Node: Integer Programming834749
+Node: Floating-point Programming836488
+Ref: Floating-point Programming-Footnote-1842819
+Ref: Floating-point Programming-Footnote-2843089
+Node: Floating-point Representation843353
+Node: Floating-point Context844518
+Ref: table-ieee-formats845357
+Node: Rounding Mode846741
+Ref: table-rounding-modes847220
+Ref: Rounding Mode-Footnote-1850235
+Node: Gawk and MPFR850414
+Node: Arbitrary Precision Floats851669
+Ref: Arbitrary Precision Floats-Footnote-1854112
+Node: Setting Precision854428
+Ref: table-predefined-precision-strings855114
+Node: Setting Rounding Mode857259
+Ref: table-gawk-rounding-modes857663
+Node: Floating-point Constants858850
+Node: Changing Precision860279
+Ref: Changing Precision-Footnote-1861676
+Node: Exact Arithmetic861850
+Node: Arbitrary Precision Integers864988
+Ref: Arbitrary Precision Integers-Footnote-1868006
+Node: Dynamic Extensions868153
+Node: Extension Intro869611
+Node: Plugin License870876
+Node: Extension Mechanism Outline871561
+Ref: load-extension871978
+Ref: load-new-function873456
+Ref: call-new-function874451
+Node: Extension API Description876466
+Node: Extension API Functions Introduction877679
+Node: General Data Types882545
+Ref: General Data Types-Footnote-1888144
+Node: Requesting Values888443
+Ref: table-value-types-returned889174
+Node: Constructor Functions890128
+Node: Registration Functions893148
+Node: Extension Functions893833
+Node: Exit Callback Functions896058
+Node: Extension Version String897307
+Node: Input Parsers897957
+Node: Output Wrappers907714
+Node: Two-way processors912224
+Node: Printing Messages914432
+Ref: Printing Messages-Footnote-1915509
+Node: Updating `ERRNO'915661
+Node: Accessing Parameters916400
+Node: Symbol Table Access917630
+Node: Symbol table by name918142
+Node: Symbol table by cookie919889
+Ref: Symbol table by cookie-Footnote-1924019
+Node: Cached values924082
+Ref: Cached values-Footnote-1927531
+Node: Array Manipulation927622
+Ref: Array Manipulation-Footnote-1928720
+Node: Array Data Types928759
+Ref: Array Data Types-Footnote-1931462
+Node: Array Functions931554
+Node: Flattening Arrays935320
+Node: Creating Arrays942172
+Node: Extension API Variables946897
+Node: Extension Versioning947533
+Node: Extension API Informational Variables949434
+Node: Extension API Boilerplate950520
+Node: Finding Extensions954324
+Node: Extension Example954884
+Node: Internal File Description955614
+Node: Internal File Ops959705
+Ref: Internal File Ops-Footnote-1971213
+Node: Using Internal File Ops971353
+Ref: Using Internal File Ops-Footnote-1973706
+Node: Extension Samples973972
+Node: Extension Sample File Functions975496
+Node: Extension Sample Fnmatch983981
+Node: Extension Sample Fork985707
+Node: Extension Sample Inplace986925
+Node: Extension Sample Ord988703
+Node: Extension Sample Readdir989539
+Node: Extension Sample Revout991071
+Node: Extension Sample Rev2way991664
+Node: Extension Sample Read write array992354
+Node: Extension Sample Readfile994237
+Node: Extension Sample API Tests995055
+Node: Extension Sample Time995580
+Node: gawkextlib996944
+Node: Language History999704
+Node: V7/SVR3.11001226
+Node: SVR41003546
+Node: POSIX1004988
+Node: BTL1006374
+Node: POSIX/GNU1007108
+Node: Common Extensions1012709
+Node: Ranges and Locales1014015
+Ref: Ranges and Locales-Footnote-11018633
+Ref: Ranges and Locales-Footnote-21018660
+Ref: Ranges and Locales-Footnote-31018920
+Node: Contributors1019141
+Node: Installation1024216
+Node: Gawk Distribution1025110
+Node: Getting1025594
+Node: Extracting1026420
+Node: Distribution contents1028112
+Node: Unix Installation1033632
+Node: Quick Installation1034249
+Node: Additional Configuration Options1036693
+Node: Configuration Philosophy1038170
+Node: Non-Unix Installation1040524
+Node: PC Installation1040982
+Node: PC Binary Installation1042281
+Node: PC Compiling1044129
+Node: PC Testing1047073
+Node: PC Using1048249
+Node: Cygwin1052434
+Node: MSYS1053434
+Node: VMS Installation1053948
+Node: VMS Compilation1054712
+Ref: VMS Compilation-Footnote-11056327
+Node: VMS Dynamic Extensions1056385
+Node: VMS Installation Details1057406
+Node: VMS Running1059240
+Node: VMS GNV1060842
+Node: VMS Old Gawk1061547
+Node: Bugs1062017
+Node: Other Versions1065873
+Node: Notes1071957
+Node: Compatibility Mode1072757
+Node: Additions1073540
+Node: Accessing The Source1074467
+Node: Adding Code1075907
+Node: New Ports1081952
+Node: Derived Files1086087
+Ref: Derived Files-Footnote-11091408
+Ref: Derived Files-Footnote-21091442
+Ref: Derived Files-Footnote-31092042
+Node: Future Extensions1092140
+Node: Implementation Limitations1092717
+Node: Extension Design1093969
+Node: Old Extension Problems1095123
+Ref: Old Extension Problems-Footnote-11096631
+Node: Extension New Mechanism Goals1096688
+Ref: Extension New Mechanism Goals-Footnote-11100053
+Node: Extension Other Design Decisions1100239
+Node: Extension Future Growth1102345
+Node: Old Extension Mechanism1103181
+Node: Basic Concepts1104921
+Node: Basic High Level1105602
+Ref: figure-general-flow1105873
+Ref: figure-process-flow1106472
+Ref: Basic High Level-Footnote-11109701
+Node: Basic Data Typing1109886
+Node: Glossary1113241
+Node: Copying1138703
+Node: GNU Free Documentation License1176260
+Node: Index1201397

End Tag Table
diff --git a/doc/gawk.texi b/doc/gawk.texi
index 80638e46..f11e2be5 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -822,9 +822,12 @@ particular records in a file and perform operations upon them.
* VMS Installation:: Installing @command{gawk} on VMS.
* VMS Compilation:: How to compile @command{gawk} under
VMS.
+* VMS Dynamic Extensions:: Compiling @command{gawk} dynamic
+ extensions on VMS.
* VMS Installation Details:: How to install @command{gawk} under
VMS.
* VMS Running:: How to run @command{gawk} under VMS.
+* VMS GNV:: The VMS GNV Project.
* VMS Old Gawk:: An old version comes with some VMS
systems.
* Bugs:: Reporting Problems and Bugs.
@@ -15031,7 +15034,7 @@ on the command line (@pxref{Options}).
@section Multidimensional Arrays
@menu
-* Multiscanning:: Scanning multidimensional arrays.
+* Multiscanning:: Scanning multidimensional arrays.
@end menu
@cindex subscripts in arrays, multidimensional
@@ -33564,6 +33567,9 @@ Tandem (non-POSIX)
@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
@@ -34835,8 +34841,11 @@ The older designation ``VMS'' is used throughout to refer to OpenVMS.
@menu
* VMS Compilation:: How to compile @command{gawk} under VMS.
+* VMS Dynamic Extensions:: Compiling @command{gawk} dynamic extensions on
+ VMS.
* VMS Installation Details:: How to install @command{gawk} under VMS.
* VMS Running:: How to run @command{gawk} under VMS.
+* VMS GNV:: The VMS GNV Project.
* VMS Old Gawk:: An old version comes with some VMS systems.
@end menu
@@ -34844,41 +34853,99 @@ The older designation ``VMS'' is used throughout to refer to OpenVMS.
@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
+@noindent
+or:
+
+@example
+$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms gawk}
+@end example
+
+@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 @uref{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.
+The most recent builds used HP C V7.3 on Alpha VMS 8.3 and both
+Alpha and IA64 VMS 8.4 used HP C 7.3.@footnote{The IA64 architecture
+is also known as ``Itanium.''}
+
+Work is currently being done for a procedure to build @command{gawk} and create
+a PCSI kit for compatible with the GNV product.
+
+@node VMS Dynamic Extensions
+@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 @command{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.
+
+For Alpha and Itanium:
+
+@example
+/name=(as_is,short)
+/float=ieee/ieee_mode=denorm_results
+@end example
+
+For VAX:
+
+@example
+/name=(as_is,short)
+@end example
+
+Compile time macros need 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
@@ -34890,10 +34957,15 @@ Alternatively, the symbol may be placed in the system-wide
@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
@@ -34958,6 +35030,20 @@ 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
+@appendixsubsubsec The VMS GNV Project
+
+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.
+See @uref{https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/}.
+
+The normal build procedure for @command{gawk} produces 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 @command{gawk}
+port.
+
@ignore
@c The VMS POSIX product, also known as POSIX for OpenVMS, is long defunct
@c and building gawk for it has not been tested in many years, but these
diff --git a/doc/gawktexi.in b/doc/gawktexi.in
index f385107b..c4dbea5c 100644
--- a/doc/gawktexi.in
+++ b/doc/gawktexi.in
@@ -817,9 +817,12 @@ particular records in a file and perform operations upon them.
* VMS Installation:: Installing @command{gawk} on VMS.
* VMS Compilation:: How to compile @command{gawk} under
VMS.
+* VMS Dynamic Extensions:: Compiling @command{gawk} dynamic
+ extensions on VMS.
* VMS Installation Details:: How to install @command{gawk} under
VMS.
* VMS Running:: How to run @command{gawk} under VMS.
+* VMS GNV:: The VMS GNV Project.
* VMS Old Gawk:: An old version comes with some VMS
systems.
* Bugs:: Reporting Problems and Bugs.
@@ -14370,7 +14373,7 @@ on the command line (@pxref{Options}).
@section Multidimensional Arrays
@menu
-* Multiscanning:: Scanning multidimensional arrays.
+* Multiscanning:: Scanning multidimensional arrays.
@end menu
@cindex subscripts in arrays, multidimensional
@@ -32713,6 +32716,9 @@ Tandem (non-POSIX)
@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
@@ -33984,8 +33990,11 @@ The older designation ``VMS'' is used throughout to refer to OpenVMS.
@menu
* VMS Compilation:: How to compile @command{gawk} under VMS.
+* VMS Dynamic Extensions:: Compiling @command{gawk} dynamic extensions on
+ VMS.
* VMS Installation Details:: How to install @command{gawk} under VMS.
* VMS Running:: How to run @command{gawk} under VMS.
+* VMS GNV:: The VMS GNV Project.
* VMS Old Gawk:: An old version comes with some VMS systems.
@end menu
@@ -33993,41 +34002,99 @@ The older designation ``VMS'' is used throughout to refer to OpenVMS.
@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
+@noindent
+or:
+
+@example
+$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms gawk}
+@end example
+
+@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 @uref{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.
+The most recent builds used HP C V7.3 on Alpha VMS 8.3 and both
+Alpha and IA64 VMS 8.4 used HP C 7.3.@footnote{The IA64 architecture
+is also known as ``Itanium.''}
+
+Work is currently being done for a procedure to build @command{gawk} and create
+a PCSI kit for compatible with the GNV product.
+
+@node VMS Dynamic Extensions
+@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 @command{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.
+
+For Alpha and Itanium:
+
+@example
+/name=(as_is,short)
+/float=ieee/ieee_mode=denorm_results
+@end example
+
+For VAX:
+
+@example
+/name=(as_is,short)
+@end example
+
+Compile time macros need 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 +34106,15 @@ Alternatively, the symbol may be placed in the system-wide
@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
@@ -34107,6 +34179,20 @@ 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
+@appendixsubsubsec The VMS GNV Project
+
+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.
+See @uref{https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/}.
+
+The normal build procedure for @command{gawk} produces 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 @command{gawk}
+port.
+
@ignore
@c The VMS POSIX product, also known as POSIX for OpenVMS, is long defunct
@c and building gawk for it has not been tested in many years, but these
diff --git a/io.c b/io.c
index 4f244532..ac1855ba 100644
--- a/io.c
+++ b/io.c
@@ -121,6 +121,11 @@
#endif
#if defined(VMS)
+#include <ssdef.h>
+#ifndef SS$_EXBYTLM
+#define SS$_EXBYTLM 0x2a14 /* VMS 8.4 seen */
+#endif
+#include <rmsdef.h>
#define closemaybesocket(fd) close(fd)
#endif
@@ -462,6 +467,11 @@ nextfile(IOBUF **curfile, bool skipping)
/* IOBUF management: */
errno = 0;
fd = devopen(fname, binmode("r"));
+ if (fd == INVALID_HANDLE && errno == EMFILE) {
+ close_one();
+ close_one();
+ fd = devopen(fname, binmode("r"));
+ }
errcode = errno;
if (! do_traditional)
update_ERRNO_int(errno);
@@ -948,13 +958,13 @@ redirect(NODE *redir_exp, int redirtype, int *errflg)
if (errno == EMFILE || errno == ENFILE)
close_one();
#ifdef VMS
- /* Alpha/VMS V7.1's C RTL is returning this instead
+ /* Alpha/VMS V7.1+ C RTL is returning these instead
of EMFILE (haven't tried other post-V6.2 systems) */
-#define SS$_EXQUOTA 0x001C
-#define SS$_EXBYTLM 0x2a14 /* VMS 8.4 seen */
- else if (errno == EIO &&
+ else if ((errno == EIO || errno == EVMSERR) &&
(vaxc$errno == SS$_EXQUOTA ||
- vaxc$errno == SS$_EXBYTLM))
+ vaxc$errno == SS$_EXBYTLM ||
+ vaxc$errno == RMS$_ACC ||
+ vaxc$errno == RMS$_SYN))
close_one();
#endif
else {
diff --git a/main.c b/main.c
index e0bc1954..4f77510f 100644
--- a/main.c
+++ b/main.c
@@ -194,7 +194,6 @@ static const struct option optab[] = {
{ NULL, 0, NULL, '\0' }
};
-
/* main --- process args, parse program, run it, clean up */
int
diff --git a/vms/ChangeLog b/vms/ChangeLog
index f8344654..b941fbe5 100644
--- a/vms/ChangeLog
+++ b/vms/ChangeLog
@@ -1,3 +1,43 @@
+2013-12-10 John E. Malmberg <wb8tyw@qsl.net>
+
+ * gawkmisc.mvs: 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..5bf1b9e3 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,13 @@ 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
+CC = cc/DECC/Prefix=All/NESTED_INCLUDE=NONE$(CFLOAT)
+CFLAGS = /Incl=([],[.vms])/Obj=[]/Def=($(CDEFS)) $(CCFLAGS)
LIBS = # DECC$SHR instead of VAXCRTL, no special link option needed
.endif !VAXC
.endif !GNUC
@@ -106,7 +112,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 +134,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 +145,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 +182,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 +193,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 +212,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 +223,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 +246,16 @@ 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;*
#
# Note: this only works if you kept a copy of [.support]texindex.c
@@ -258,7 +277,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_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..11493e5d
--- /dev/null
+++ b/vms/generate_config_vms_h_gawk.com
@@ -0,0 +1,290 @@
+$! 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 "void __posix_exit(int status);"
+$ write cvh "#define _exit(foo) vms_exit(foo)"
+$ write cvh "#define exit(foo) vms_exit(foo)"
+$ write cvh ""
+$ write cvh "#define EXIT_FATAL (STS$M_INHIB_MSG | STS$K_SEVERE)"
+$ write cvh ""
+$ write cvh "#ifndef C_FACILITY_NO"
+$ write cvh "#define C_FACILITY_NO 0x350000"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh "/* Use old exit codes for DCL, correct for other cases */
+$ write cvh "static void vms_exit(int status) {"
+$ write cvh " char * shell;"
+$ write cvh " int vms_status;"
+$ write cvh " int use_old_exit = 0;"
+$ write cvh " shell = getenv(""SHELL"");"
+$ write cvh " if (shell != NULL) {"
+$ write cvh " if (strcmp(shell, ""DCL"") == 0) {"
+$ write cvh " use_old_exit = 1;"
+$ write cvh " }"
+$ write cvh " } else {"
+$ write cvh " use_old_exit = 1;"
+$ write cvh " }"
+$ write cvh " if (use_old_exit == 1) {"
+$ write cvh " decc$exit(status);"
+$ write cvh " }"
+$ write cvh " /* Fake the __posix_exit with severity added */"
+$ write cvh " /* Undocumented correct way to do the above unless */"
+$ write cvh " /* backwards compatibilty is needed */"
+$ write cvh " vms_status = C_FACILITY_NO | 0xA000 | STS$M_INHIB_MSG;"
+$ write cvh " if (status == EXIT_FAILURE) {"
+$ write cvh " vms_status |= (1 << 3) | STS$K_ERROR;"
+$ write cvh " } else if (status == EXIT_FATAL) {"
+$ write cvh " vms_status |= (2 << 3) | STS$K_SEVERE;"
+$ 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_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_misc.c b/vms/vms_misc.c
index cd92d7ef..ce190341 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
diff --git a/vms/vmsbuild.com b/vms/vmsbuild.com
index 95c6aeb3..ff5dc929 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,16 @@ $ 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'"
+$ CINC = "/NESTED_INCLUDE=NONE"
+$ CFLAGS = "/Incl=([],[.vms])/Obj=[]/Def=(''CDEFS')''CINC'''CCFLAGS'"
+$ CFLAGS = cfloat + CFLAGS
$ LIBS = "" ! DECC$SHR instead of VAXCRTL, no special link option needed
$ endif !VAXC
$ endif !GNUC
@@ -47,12 +64,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"""
@@ -106,7 +126,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,15 +137,18 @@ 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)
+$!
+$ v = 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)
diff --git a/vms/vmstest.com b/vms/vmstest.com
index 25404373..7b1c3a36 100644
--- a/vms/vmstest.com
+++ b/vms/vmstest.com
@@ -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