Annotation of 43BSDReno/share/doc/ps1/02.f77/f77.ms, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1980 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)f77.ms      5.4 (Berkeley) 4/28/86
                      6: .\"
                      7: .rm CM
                      8: .hw name-list
                      9: .de XX
                     10: .ne 3
                     11: .sp .3
                     12: .ti -0.8i
                     13: .ta 0.8i
                     14: \\$1   \c
                     15: ..
                     16: .\"
                     17: .\"    Nh macro - same as NH but also saves heading for table of contents
                     18: .\"    Nh usage: Nh level string, e.g.:  .Nh 2 "Short Integers"
                     19: .de Nh
                     20: .NH \\$1
                     21: \\$2
                     22: .XS
                     23: .if '2'\\$1' .ti .25i
                     24: .if '3'\\$1' .ti .5i
                     25: \\*(SN \\$2
                     26: .XE
                     27: .IP
                     28: ..
                     29: .EQ
                     30: delim $$
                     31: .EN
                     32: .ND ""
                     33: .\".RP
                     34: .TL
                     35: A Portable Fortran 77 Compiler
                     36: .AU
                     37: S. I. Feldman
                     38: .AU
                     39: P. J. Weinberger
                     40: .AI
                     41: Bell Laboratories
                     42: Murray Hill, New Jersey 07974
                     43: .AU
                     44: J. Berkman
                     45: .AI
                     46: University of California
                     47: Berkeley, CA 94720
                     48: .AB
                     49: The Fortran language has been revised.
                     50: The new language, known as\p
                     51: Fortran 77,
                     52: became an official American National Standard on April 3, 1978.
                     53: We report here on a compiler and run-time system for the new extended language.
                     54: It is believed to be the first complete Fortran 77 system to be implemented.
                     55: This compiler is designed to be portable,
                     56: to be correct and complete,
                     57: and to generate code compatible with calling sequences produced by C compilers.
                     58: In particular, this Fortran is quite usable on
                     59: .UX
                     60: systems.
                     61: In this paper, we describe the language compiled,
                     62: interfaces between procedures,
                     63: and file formats assumed by the \s-1I/O\s0 system.
                     64: Appendix A describes the Fortran 77 language extensions.
                     65: .PP
                     66: This is a standard Bell Laboratories
                     67: document reproduced with minor modifications
                     68: to the text.
                     69: The Bell Laboratory's appendix
                     70: on ``Differences Between Fortran 66 and Fortran 77''
                     71: has been changed to Appendix A,
                     72: and a local appendix has been added.
                     73: Appendix B contains
                     74: a list of Fortran 77 references
                     75: (some from the original Bell document
                     76: and some added at Berkeley).
                     77: .sp 2
                     78: .LP
                     79: Revised September, 1985
                     80: .AE
                     81: .LP
                     82: .CS 9 10 19 0 0 8
                     83: .\" the Table of Contents uses pages 2 and 3,
                     84: .\" hence the document begins at page 4.
                     85: .pn 4
                     86: .EH 'PS1:2-%''A Portable Fortran 77 Compiler'
                     87: .OH 'A Portable Fortran 77 Compiler''PS1:2-%'
                     88: .bp
                     89: .NH 0
                     90: INTRODUCTION
                     91: .XS
                     92: \*(SN Introduction
                     93: .XE
                     94: .LP
                     95: The Fortran language has been revised.
                     96: The new language, known as Fortran 77,
                     97: became an official American National Standard [1] on April 3, 1978.
                     98: Fortran 77 supplants 1966 Standard Fortran [2].
                     99: We report here on a compiler and run-time system for the new extended language.
                    100: The compiler and computation library were written by S.I.F., the \s-1I/O\s0 system by P.J.W.
                    101: We believe ours to be the first complete Fortran 77 system to be implemented.
                    102: This compiler is designed to be portable to a number of different machines,
                    103: to be correct and complete,
                    104: and to generate code compatible with calling sequences produced
                    105: by compilers for the C language [3].
                    106: In particular,
                    107: it is in use on
                    108: \s-1UNIX\s0
                    109: systems.
                    110: Two families of C compilers are in use at Bell Laboratories,
                    111: those based on D. M. Ritchie's \s-1PDP-11\s0 compiler [4]
                    112: and those based on S. C. Johnson's portable C compiler [5].
                    113: This Fortran compiler can drive the second passes of either family.
                    114: In this paper, we describe the language compiled,
                    115: interfaces between procedures,
                    116: and file formats assumed by the \s-1I/O\s0 system.
                    117: We will describe implementation details in companion papers.
                    118: .Nh 2 Usage
                    119: At present, versions of the compiler run on and compile
                    120: for the \s-1PDP-11\s0,
                    121: the \s-1VAX-11/780\s0,
                    122: and the Interdata 8/32
                    123: \s-1UNIX\s0
                    124: systems.
                    125: The command to run the compiler is
                    126: .DS
                    127: f\|77  \fIflags  file . . .\fR
                    128: .DE
                    129: .B f\|77
                    130: is a general-purpose command for compiling and loading Fortran and Fortran-related files.
                    131: \s-1EFL\s0 [6] and Ratfor [7] source files will be preprocessed before being presented to the Fortran compiler.
                    132: C and assembler source files will be compiled by the appropriate programs.
                    133: Object files will be loaded.
                    134: (The
                    135: .B f\|77
                    136: and
                    137: .B cc
                    138: commands cause slightly different loading sequences to be generated,
                    139: since Fortran programs need a few extra libraries and a different startup routine
                    140: than do C programs.)
                    141: The following file name suffixes are understood:
                    142: .DS 
                    143:  \f3.f\f1      Fortran source file
                    144:  \f3.F\f1      Fortran source file
                    145:  \f3.e\f1      \s-1EFL\s0 source file
                    146:  \f3.r\f1      Ratfor source file
                    147:  \f3.c\f1      C source file
                    148:  \f3.s\f1      Assembler source file
                    149:  \f3.o\f1      Object file
                    150: .DE
                    151: .IP
                    152: Arguments whose names end with \f3.f\f1 are taken to be
                    153: Fortran 77 source programs;
                    154: they are compiled, and
                    155: each object program is left on the file in the current directory
                    156: whose name is that of the source with \f3.o\f1 substituted
                    157: for \f3.f\f1.
                    158: .IP
                    159: Arguments whose names end with \f3.F\f1
                    160: are also taken to be Fortran 77 source programs; these are first
                    161: processed by the C preprocessor before being compiled by \fBf77\fP.
                    162: .IP
                    163: Arguments whose names end with \f3.r\f1 or \f3.e\f1
                    164: are taken to be Ratfor or \s-1EFL\s0
                    165: source programs, respectively; these are first transformed by the
                    166: appropriate preprocessor, then compiled by \fBf77\fP.
                    167: .IP
                    168: In the same way,
                    169: arguments whose names end 
                    170: with \f3.c\f1 or \f3.s\f1
                    171: are taken to be C or assembly source programs
                    172: and are compiled or assembled, producing a \f3.o\f1 file.
                    173: .IP
                    174: The following flags are understood:
                    175: .in +0.8i
                    176: .XX \(mi\f3c\f1
                    177: Compile but do not load.
                    178: Output for
                    179: .B x.f ,
                    180: .B x.F ,
                    181: .B x.e ,
                    182: .B x.r ,
                    183: .B x.c ,
                    184: or
                    185: .B x.s
                    186: is put on file
                    187: .B x.o .
                    188: .XX \(mi\f3d\f1
                    189: Used in debugging the compiler.
                    190: .XX \(mi\f3g\f1
                    191: Have the compiler produce additional
                    192: symbol table information for \fIdbx(1)\fR.
                    193: This flag is incompatible with \(mi\f3O\f1.
                    194: See section 1.4 for more details.
                    195: .XX \(mi\f3i2\f1
                    196: On machines which support short integers,
                    197: make the default integer constants and variables short
                    198: (see section 2.14).
                    199: (\fB\(mii4\fR is the standard value of this option).  
                    200: All logical quantities will be short.
                    201: .XX \(mi\f3m\f1
                    202: Apply the M4 macro preprocessor
                    203: to each \s-1EFL\s0 or Ratfor source file
                    204: before using the appropriate compiler.
                    205: .XX "\(mi\f3o\f1 \fIfile\fR"
                    206: Put executable module on file
                    207: .I file .
                    208: (Default is \fBa.out\fR).
                    209: .ne 6
                    210: .XX \(mi\f3onetrip\f1\ or\ \(mi\f31\f1
                    211: .br
                    212: Compile code that performs every
                    213: .B do
                    214: loop at least once
                    215: (see section 2.12).
                    216: .XX \(mi\f3p\f1
                    217: Generate code to produce usage profiles.
                    218: .XX \(mi\f3pg\f1
                    219: Generate code in the manner of \fB\(mip\fR, but invoke a run-time
                    220: recording mechanism that keeps more extensive statistics.
                    221: See
                    222: .I gprof (1).
                    223: .XX \(mi\f3q\f1
                    224: Suppress printing of file names and program unit names during compilation.
                    225: .XX \(mi\f3r8\f1
                    226: Treat all floating point variables,
                    227: constants, functions and intrinsics
                    228: as double precision and all complex
                    229: quantities as double complex.  See section 2.17.
                    230: .XX \(mi\f3u\f1
                    231: Make the default type of a variable
                    232: .B undefined
                    233: (see section 2.3).
                    234: .XX \(mi\f3v\f1
                    235: Print the version number of the compiler and the name of each pass.
                    236: .XX \(mi\f3w\f1
                    237: Suppress all warning messages.
                    238: .XX \(mi\f3w66\f1
                    239: Suppress warnings about Fortran 66 features used.
                    240: .XX \(mi\f3C\f1
                    241: Compile code that checks that subscripts are within array bounds.
                    242: For multi-dimensional arrays, only the equivalent linear subscript is
                    243: checked.
                    244: .XX \(mi\fBD\fP\fIname=def\fR
                    245: .XX \(mi\fBD\fP\fIname\fR
                    246: Define the
                    247: .I name
                    248: to the C preprocessor, as if by `#define'. If no definition is given, the name
                    249: is defined as "1". (\fB.F\fR files only).
                    250: .XX \(mi\f3E\f1\fIstr\fR
                    251: Use the string \fIstr\fR as an
                    252: \s-1EFL\s0 option in processing \f3.e\f1 files.
                    253: .XX \(mi\f3F\f1
                    254: Ratfor, \s-1EFL\s0, and \f3.F\f1 source files
                    255: are pre-processed into \f3.f\f1 files,
                    256: and those \f3.f\f1 files are left on the disk without being compiled.
                    257: .XX \(mi\fBI\fP\fIdir\fR
                    258: `#include' files whose names do not begin with `/' are always sought
                    259: first in the directory of the \fIfile\fR
                    260: argument, then in directories named in \fB\(miI\fR
                    261: options, then in directories on a standard list. (\fB.F\fR files only).
                    262: .XX \(mi\f3N\f1[\fBqxscn\fR]\fInnn\f1
                    263: .br
                    264: Make static tables in the compiler bigger. The compiler will complain
                    265: if it overflows its tables and suggest you apply one or more of these
                    266: flags. These flags have the following meanings:
                    267: .RS
                    268: .IP \fBq\fP
                    269: Maximum number of equivalenced variables. Default is 150.
                    270: .IP \fBx\fP
                    271: Maximum number of external names (common block names, subroutine and
                    272: function names). Default is 200.
                    273: .IP \fBs\fP
                    274: Maximum number of statement numbers. Default is 401.
                    275: .IP \fBc\fP
                    276: Maximum depth of nesting for control statements (e.g. DO loops). Default is
                    277: 20.
                    278: .IP \fBn\fP
                    279: Maximum number of identifiers. Default is 1009.
                    280: .RE
                    281: .XX \(mi\f3O\f1
                    282: Invoke the object code optimizer.
                    283: Incompatible with \(mi\f3g\f1.
                    284: .XX \(mi\f3R\f1\fIstr\fR
                    285: Use the string \fIstr\fR as a Ratfor option
                    286: in processing \f3.r\f1 files.
                    287: .XX \(mi\f3U\f1
                    288: Do not convert upper case letters to lower case.
                    289: The default is to convert Fortran programs to lower case
                    290: except within character string constants.
                    291: .XX \(mi\f3S\f1
                    292: Generate assembler output for each source file, but do not assemble it.
                    293: Assembler output for a source file
                    294: .B x.f ,
                    295: .B x.F ,
                    296: .B x.e ,
                    297: .B x.r ,
                    298: or
                    299: .B x.c
                    300: is put on file
                    301: .B x.s .
                    302: .in -0.8i
                    303: .IP
                    304: Other flags,
                    305: all library names (arguments beginning \fB\(mil\fR),
                    306: and any names not ending with one of the understood suffixes are passed
                    307: to the loader.
                    308: .Nh 2 Documentation\ Conventions
                    309: In running text, we write Fortran keywords and other literal strings in boldface lower case.
                    310: Examples will be presented in lightface lower case.
                    311: Names representing a class of values will be printed in italics.
                    312: .Nh 2 Implementation\ Strategy
                    313: The compiler and library are written entirely in C.
                    314: The compiler  generates C compiler intermediate code.
                    315: Since there are C compilers running on a variety of machines,
                    316: relatively small changes will make this Fortran compiler generate code for any of them.
                    317: Furthermore, this approach guarantees that the resulting programs are compatible with C usage.
                    318: The runtime computational library is complete.
                    319: The runtime \s-1I/O\s0 library makes use of D. M. Ritchie's Standard C \s-1I/O\s0 package [8]
                    320: for transferring data.
                    321: With the few exceptions described below, only documented calls are used,
                    322: so it should be relatively easy to modify to run on other operating
                    323: systems.
                    324: .Nh 2 Debugging\ Aids
                    325: A memory image is sometimes
                    326: written to a file \fBcore\fP in the current directory
                    327: upon abnormal termination for errors caught by the \fBf77\fP libraries,
                    328: user calls to \fBabort\fP, and certain signals (see \fBsigvec\fP\|(2)
                    329: in the \fI\s-1UNIX\s0 Programmer's Manual\fP).
                    330: \fBCore\fP is normally created only if
                    331: the \fB\(mig\fP flag was specified to \fBf77\fP during loading.\(dg
                    332: .FS
                    333: \(dgSpecify \fB\(mig\fP when loading with \fBcc\fP or \fBf77\fP;
                    334: specify \fB\(milg\fP as a library
                    335: when using \fBld\fP directly.
                    336: .FE
                    337: The source-level debugger
                    338: .I dbx (1)
                    339: may be used with the executable and the
                    340: .B core
                    341: file to examine the image and
                    342: determine what went wrong.
                    343: .IP
                    344: In the event that it is necessary to override this default behavior,
                    345: the user may set the environment variable \fBf77_dump_flag\fP.
                    346: If \fBf77_dump_flag\fP is set to a value beginning
                    347: with \fBn\fP, a \fBcore\fP file is not produced regardless of whether
                    348: \fB\(mig\fP was specified at compile time,
                    349: and if the value begins with \fBy\fP,
                    350: dumps are produced even if \fB\(mig\fP was not specified.
                    351: .NH 1
                    352: LANGUAGE EXTENSIONS
                    353: .XS
                    354: \*(SN Language Extensions
                    355: .XE
                    356: .LP
                    357: Fortran 77 includes almost all of Fortran 66 as a subset.
                    358: We describe the differences briefly in Appendix A.
                    359: The most important additions are a character string data type,
                    360: file-oriented input/output statements, and random access \s-1I/O\s0.
                    361: Also, the language has been cleaned up considerably.
                    362: .LP
                    363: In addition to implementing the language specified in the new Standard,
                    364: our compiler implements a few extensions described in this section.
                    365: Most are useful additions to the language.
                    366: The remainder are extensions
                    367: to make it easier to communicate with C procedures
                    368: or to permit compilation of
                    369: old (1966 Standard) programs.
                    370: .Nh 2 Double\ Complex\ Data\ Type
                    371: The new type
                    372: .B "double complex"
                    373: is defined.
                    374: Each datum is represented by a pair of double precision real values.
                    375: The statements
                    376: .DS
                    377: z1 = ( 0.1d0, 0.2d0 )
                    378: z2 = dcmplx( dx, dy )
                    379: .DE
                    380: assign double complex values to \fBz1\fP and \fBz2\fP.
                    381: The double precision values which constitute the double complex
                    382: value may be isolated by using \fBdreal\fP or \fBdble\fP for the
                    383: real part and \fBimag\fP or \fBdimag\fP for the
                    384: imaginary part.
                    385: To compute the double complex conjugate of a double complex value,
                    386: use \fBconjg\fP or \fBdconjg\fP.
                    387: The other \fBdouble complex\fP intrinsic functions may be
                    388: accessed using their generic names or specific names.
                    389: The generic names are: \fBabs\fP, \fBsqrt\fP, \fBexp\fP,
                    390: \fBlog\fP, \fBsin\fP, and \fBcos\fP.
                    391: The specific names are the same as the generic names preceded by
                    392: either \fBcd\fP or \fBz\fP, e.g. you may code \fBsqrt\fP,
                    393: \fBzsqrt\fP or \fBcdsqrt\fP to compute the square root of a double
                    394: complex value.
                    395: .Nh 2 Internal\ Files
                    396: The Fortran 77 standard introduces ``internal files'' (memory arrays), but
                    397: restricts their use to formatted sequential \s-1I/O\s0 statements.
                    398: Our \s-1I/O\s0 system also permits internal files to be used
                    399: in formatted direct reads and writes and list directed sequential read and
                    400: writes.
                    401: .Nh 2 Implicit\ Undefined\ Statement
                    402: Fortran 66 has a fixed rule that the type of a variable that does not appear in a type statement
                    403: is
                    404: .B integer
                    405: if its first letter is
                    406: \fBi, j, k, l, m\fR or \fBn\fR,
                    407: and
                    408: .B real
                    409: otherwise.
                    410: Fortran 77 has an
                    411: .B implicit
                    412: statement for overriding this rule.
                    413: As an aid to good programming practice, we permit an additional type,
                    414: .B undefined.
                    415: The statement
                    416: .DS
                    417: implicit undefined(a-z)
                    418: .DE
                    419: turns off the automatic data typing mechanism,
                    420: and the compiler will issue a diagnostic for each variable that is used but does
                    421: not appear in a type statement.
                    422: Specifying the
                    423: .B \(miu
                    424: compiler flag is equivalent to beginning each procedure with this statement.
                    425: .Nh 2 Recursion
                    426: Procedures may call themselves,
                    427: directly or through a chain of other procedures.
                    428: Since Fortran variables are by default
                    429: .B static ,
                    430: it is often necessary to use the
                    431: .B automatic
                    432: storage extension to prevent unexpected results
                    433: from recursive functions.
                    434: .Nh 2 Automatic\ Storage
                    435: Two new keywords are recognized,
                    436: .B static
                    437: and
                    438: .B automatic.
                    439: These keywords may appear as ``types'' in type statements and in
                    440: .B implicit
                    441: statements.
                    442: Local variables are static by default;
                    443: there is only one instance of the variable.
                    444: For variables declared
                    445: .B automatic,
                    446: there is a separate instance of the variable for each
                    447: invocation of the procedure.
                    448: Automatic variables may not appear in
                    449: .B equivalence,
                    450: .B data,
                    451: or
                    452: .B save
                    453: statements.
                    454: Neither type of variable is guaranteed to retain its value between
                    455: calls to a subprogram (see the \fBsave\fP statement in Appendix A).
                    456: .Nh 2 Source\ Input\ Format
                    457: The Standard expects input to the compiler to be in 72-column format:
                    458: except in comment lines,
                    459: the first five characters are the statement number, the next is the continuation character,
                    460: and the next 66 are the body of the line.
                    461: (If there are fewer than 72 characters on a line, the compiler pads it with blanks;
                    462: characters after the seventy-second are ignored.)
                    463: .IP
                    464: In order to make it easier to type Fortran programs,
                    465: our compiler also accepts input in variable length lines.
                    466: An ampersand ``&'' in the first position of a line indicates a continuation
                    467: line; the remaining characters form the body of the line.
                    468: A tab character in one of the first six positions of a line signals the
                    469: end of the statement number and continuation part of the line;
                    470: the remaining characters form the body of the line.
                    471: A tab elsewhere on the line is treated as another kind of blank by the
                    472: compiler.
                    473: .IP
                    474: In the Standard, there are only 26 letters \(em Fortran is a one-case language.
                    475: Consistent with ordinary
                    476: \s-1UNIX\s0
                    477: system usage, our compiler expects lower case input.
                    478: By default, the compiler converts all upper case characters to lower case except those inside character constants.
                    479: However, if the
                    480: .B \(miU
                    481: compiler flag is specified, upper case letters are not transformed.
                    482: In this mode, it is possible to specify external names with upper case letters in them,
                    483: and to have distinct variables differing only in case.
                    484: If \(mi\f3U\f1 is specified, 
                    485: keywords will only be recognized in lower case.
                    486: .Nh 2 Include\ Statement
                    487: The statement
                    488: .DS
                    489: include \(fmstuff\|\(fm
                    490: .DE
                    491: is replaced by the contents of the file
                    492: .B stuff ;
                    493: .B include
                    494: statements may be nested to a reasonable depth, currently ten.
                    495: .Nh 2 Binary\ Initialization\ Constants
                    496: A variable may be initialized in a
                    497: .B data
                    498: statement
                    499: by a binary constant, denoted by a letter followed by a quoted string.
                    500: If the letter is \fBb\fR, the string is binary, and only zeroes and ones are permitted.
                    501: If the letter is \fBo\fR, the string is octal, with digits \fB0\(mi7\fR.
                    502: If the letter is \fBz\fR or \fBx\fR, the string is hexadecimal, with digits \fB0\(mi9\fR, \fBa\(mif\fR.
                    503: Thus, the statements
                    504: .DS
                    505: integer a(3)
                    506: data a / b\(fm1010\|\(fm, o\(fm12\|\(fm, z\(fma\|\(fm /
                    507: .DE
                    508: initialize all three elements of
                    509: .B a
                    510: to ten.
                    511: .Nh 2 Character\ Strings
                    512: For compatibility with C usage, the following backslash escapes are recognized:
                    513: .DS
                    514: \f3\en\f1      newline
                    515: \f3\et\f1      tab
                    516: \f3\eb\f1      backspace
                    517: \f3\ef\f1      form feed
                    518: \f3\e0\f1      null
                    519: \f3\e\(fm\f1   apostrophe (does not terminate a string)
                    520: \f3\e"\f1      quotation mark (does not terminate a string)
                    521: \f3\e\e\f1     \e
                    522: \f3\e\fP\fIx\fR        \fIx\fR,  where \fIx\fR is any other character
                    523: .DE
                    524: Fortran 77 only has one quoting character, the apostrophe.
                    525: Our compiler and \s-1I/O\s0 system recognize
                    526: both the apostrophe `` \(fm '' and the double-quote `` " ''.
                    527: If a string begins with one variety of quote mark, the other may be embedded within it
                    528: without using the repeated quote or backslash escapes.
                    529: .IP
                    530: Each character string constant appearing outside a
                    531: .B data
                    532: statement is followed by a
                    533: null character to ease communication with C routines.
                    534: .Nh 2 Hollerith
                    535: Fortran 77 does not have the old Hollerith ``\fIn\fP\|\fBh\fR''
                    536: notation,
                    537: though the new Standard recommends implementing the old Hollerith feature
                    538: in order to improve compatibility with old programs.
                    539: In our compiler, Hollerith data may be used in place of character string constants,
                    540: and may also be used to initialize non-character variables in
                    541: .B data
                    542: statements.
                    543: .Nh 2 Equivalence\ Statements
                    544: As a very special and peculiar case,
                    545: Fortran 66 permits an element of a multiply-dimensioned array to be represented by
                    546: a singly-subscripted reference in
                    547: .B equivalence
                    548: statements.
                    549: Fortran 77 does not permit this usage, since
                    550: subscript lower bounds may now be different from 1.
                    551: Our compiler permits single subscripts in
                    552: .B equivalence
                    553: statements,
                    554: under the interpretation that all missing subscripts are equal to 1.
                    555: A warning message is printed for each such incomplete subscript.
                    556: .Nh 2 One-Trip\ \s-1DO\s0\ Loops
                    557: The Fortran 77 Standard requires that the range of a
                    558: .B do
                    559: loop not be performed
                    560: if the initial value is already past the limit value,
                    561: as in
                    562: .DS
                    563: do 10 i = 2, 1
                    564: .DE
                    565: The 1966 Standard stated that the effect of such a statement was undefined,
                    566: but it was common practice that the range of a
                    567: .B do
                    568: loop would be performed
                    569: at least once.
                    570: In order to accommodate old programs, though they were in violation of the 1966 Standard,
                    571: the
                    572: .B \(mionetrip
                    573: or
                    574: .B \(mi1
                    575: compiler flags causes non-standard loops to be generated.
                    576: .Nh 2 Commas\ in\ Formatted\ Input
                    577: The \s-1I/O\s0 system attempts to be more lenient than the
                    578: Standard when it seems worthwhile.
                    579: When doing a formatted read of non-character variables,
                    580: commas may be used as value separators in the input record,
                    581: overriding the field lengths given in the format statement.
                    582: Thus,
                    583: the format
                    584: .DS
                    585: (i10, f20.10, i4)
                    586: .DE
                    587: will read the record
                    588: .DS
                    589: \(mi345,.05e\(mi3,12
                    590: .DE
                    591: correctly.
                    592: .Nh 2 Short\ Integers
                    593: On machines that support halfword integers,
                    594: the compiler accepts declarations of type
                    595: .B integer\(**2.
                    596: (Ordinary integers follow the Fortran rules about occupying the same
                    597: space as a real variable; they are assumed to be of C type
                    598: .B "long int" ;
                    599: halfword integers are of C type
                    600: .B "short int" .)
                    601: An expression involving only objects of type
                    602: .B integer\(**2
                    603: is of that type.
                    604: Generic functions return short or long integers depending on the actual types of their arguments.
                    605: If a procedure is compiled using the
                    606: .B \(mii2
                    607: flag, all small integer constants will be
                    608: of type
                    609: .B integer\(**2.
                    610: If the precision of an integer-valued intrinsic function is not determined by the generic function rules,
                    611: one will be chosen that returns the prevailing length
                    612: (\fBinteger\(**2\fR when the \fB\(mii2\fR command flag is in effect).
                    613: When the
                    614: .B \(mii2
                    615: option is in effect, all quantities of type
                    616: .B logical
                    617: will be short.
                    618: Note that these short integer and logical quantities do not obey the standard rules for storage association.
                    619: .Nh 2 Additional\ Intrinsic\ Functions
                    620: This compiler supports all of the
                    621: intrinsic functions specified in the Fortran 77 Standard.
                    622: In addition, there are built-in functions
                    623: for performing bitwise logical and boolean operations on
                    624: integer and logical values
                    625: (\fBor\fR, \fBand\fR, \fBxor\fR, \fBnot\fR, \fBlshift\fP, and \fBrshift\fP),
                    626: and intrinsic functions for \fBdouble complex\fP values (see section 2.1).
                    627: The \fBf77\fP library contains many other functions, such as accessing
                    628: the \s-1UNIX\s0 command arguments (\fBgetarg\fR and \fBiargc\fR)
                    629: and environment (\fBgetenv\fR).
                    630: See \fBintro\fP(3f) and \fBbit\fP(3f) in the \fI\s-1UNIX\s0
                    631: Programmer's Manual\fP
                    632: for more information.
                    633: .Nh 2 Namelist\ \s-1I/O\s0
                    634: Namelist \s-1I/O\s0 provides an easy way to input and output information without
                    635: formats.
                    636: Although not part of the standard, namelist \s-1I/O\s0 was part of many
                    637: Fortran 66 systems and is a common extension to Fortran 77 systems.
                    638: .IP
                    639: Variables and arrays to be used in namelist \s-1I/O\s0 are declared as part of
                    640: a namelist in a \fBnamelist\fP statement, e.g.:
                    641: .DS
                    642:        character str\(**12
                    643:        logical flags(20)
                    644:        complex c(2)
                    645:        real arr1(2,3), arr2(0:3,4)
                    646:        namelist /basic/  arr1, arr2, key, str, c /flglst/ key, flags
                    647: .DE
                    648: This defines two namelists: list \fBbasic\fP consists of variables
                    649: \fBkey\fP and \fBstr\fP and arrays \fBarr1\fP, \fBarr2\fP,
                    650: and \fBc\fP; list \fBflglst\fP consists of variable \fBkey\fP and
                    651: array \fBflags\fP.
                    652: A namelist can include variables and arrays of any type, and
                    653: a variable or array may be in several different namelists.
                    654: However dummy arguments and array elements may not be in a namelist.
                    655: A namelist name may be used in external sequential \fBread\fP, \fBwrite\fP
                    656: and \fBprint\fP statements wherever a format could be used.
                    657: .IP
                    658: In a namelist \fBread\fP, column one of each data record is ignored.
                    659: The data begins with an ampersand in column 2 followed by
                    660: the namelist name and a blank.
                    661: Then there is a sequence of value assignments separated by commas
                    662: and finally an ``&end''.
                    663: A simple example of input data corresponding to namelist \fBbasic\fP is:
                    664: .DS
                    665: \ &basic key=5, str=\(fmhi there\(fm &end
                    666: .DE
                    667: .EQ
                    668: delim off
                    669: .EN
                    670: For compatibility with other systems, dollar signs
                    671: may be used instead of the ampersands:
                    672: .DS
                    673: \ $basic key=5, str=\(fmhi there\(fm $end
                    674: .DE
                    675: .IP
                    676: .EQ
                    677: delim $$
                    678: .EN
                    679: A value assignment in the data record must be one of three forms.
                    680: The simplest is a variable name followed by an equal sign
                    681: followed by a data value which is assigned to that variable,
                    682: e.g. ``key=5''.
                    683: The second form consists of an array name followed by ``=''
                    684: followed by one or more values to be assigned to the array,
                    685: e.g.:
                    686: .DS
                    687: c=(1.1,\-2.9),(\-1.8e+10,14.0e\-3)
                    688: .DE
                    689: assigns values to c(1) and c(2) in the complex array c.
                    690: .IP
                    691: As in other \fBread\fP statements, values are assigned in the order of the
                    692: array in memory, i.e. column-major order for two dimensional arrays.
                    693: Multiple copies of a value may be represented by a repetition count
                    694: followed by an asterisk followed by the value; e.g. ``3*55.4'' is the
                    695: same as ``55.4, 55.4, 55.4''.
                    696: It is an error to specify more values than the array can hold;
                    697: if less are specified, only that number of elements of the array
                    698: are changed.
                    699: The third form of a value assignment is a subscripted variable
                    700: name followed by ``='' followed by a value or values,
                    701: e.g.: ``arr2(0,4)=15.2''.
                    702: Only integer constant subscripts may be used.
                    703: The correct number of subscripts must be used and the subscripts
                    704: must be legal.
                    705: This form is the same as the form with an array name except the
                    706: array is filled starting at the named element.
                    707: .IP
                    708: In all three forms, the variable or array name must be declared
                    709: in the namelist.  The form of the data values is the same as in
                    710: list directed input except that in namelist \s-1I/O\s0,
                    711: character strings in the data must be enclosed in apostrophes or
                    712: double quotes, and
                    713: repetition counts must be followed by data values.
                    714: .IP
                    715: One use of namelist input is to read in a list of options or flags.
                    716: For example:
                    717: .DS
                    718:        logical flags(14)
                    719:        namelist /pars/ flags, iters, xlow, xhigh, xinc
                    720:        data flags/14*.false./
                    721: 
                    722: 10     read(5,pars,end=900)
                    723:        print pars
                    724:        call calc( xlow, xhigh, xinc, flags, iters )
                    725:        go to 10
                    726: 900    continue
                    727:        end
                    728: .DE
                    729: could be run with the following data (each record begins with a space):
                    730: .DS
                    731: \ &pars iters=10, xlow=0.0, xhigh=1.0, xinc=0.1 &end
                    732: \ &pars xinc=0.2,
                    733: \ \ \ flags(2)=2*.true., flags(8)=.true. &end
                    734: \ &pars xlow=2.0, xhigh=8.0 &end
                    735: .DE
                    736: The program reads parameters for the run from the first data set
                    737: and computes using them.
                    738: Then it loops and each successive set of namelist input data
                    739: specifies only those data items which need to be changed.
                    740: Note the second data set sets the $2 sup nd$, $3 sup rd$,
                    741: and $8 sup th$ elements in the array \fBflags\fP to \fB.true.\fP.
                    742: .IP
                    743: When a namelist name is used in a \fBwrite\fP or \fBprint\fP statement,
                    744: all the values in the namelist are output together with their names.
                    745: For example the \fBprint\fP in the program above prints the following:
                    746: .DS
                    747: \ &pars  flags=  f,  f,  f,  f,  f,  f,  f,  f,  f,  f,  f,  f,  f,  f, iters=
                    748: \   10, xlow=  0., xhigh=   1.00000, xinc=  0.100000
                    749: \ &end
                    750: \ &pars  flags=  f,  t,  t,  f,  f,  f,  f,  t,  f,  f,  f,  f,  f,  f, iters=
                    751: \   10, xlow=  0., xhigh=   1.00000, xinc=  0.200000
                    752: \ &end
                    753: \ &pars  flags=  f,  t,  t,  f,  f,  f,  f,  t,  f,  f,  f,  f,  f,  f, iters=
                    754: \   10, xlow=   2.00000, xhigh=   8.00000, xinc=  0.200000
                    755: \ &end
                    756: .DE
                    757: .IP
                    758: Each line begins with a space so that namelist output can be used as input to 
                    759: a namelist \fBread\fP.
                    760: The default is to use ampersands in namelist \fBprint\fP and
                    761: \fBwrite\fP.
                    762: However, dollar signs will be used if the last preceding namelist \fBread\fP
                    763: data set used dollar signs.
                    764: The character to be used is stored as the first character of the common
                    765: block \fBnamelistkey\fP.
                    766: .Nh 2 Automatic\ Precision\ Increase
                    767: The \(mi\fBr8\fP flag allows a user to run a program with increased
                    768: precision without changing any of the program source,
                    769: i.e. it allows a user to take a program coded in
                    770: single precision and compile and execute it as if it had
                    771: been coded in double precision.
                    772: The option extends the precision of all single precision real
                    773: and complex constants, variables, external functions, and intrinsic functions.
                    774: For example, the source:
                    775: .DS
                    776:        implicit complex(c)
                    777:        real last
                    778:        intrinsic sin, csin
                    779:        data last/0.3/
                    780: 
                    781:        x = 0.1
                    782:        y = sqrt(x)+sqrt(last)
                    783:        c1 = (0.1,0.2)
                    784:        c2 = sqrt(c1)
                    785:        x = real(i)
                    786:        y = aimag(c1)
                    787:        call fun(sin,csin)
                    788: .DE
                    789: is compiled under this flag as if it had been written as:
                    790: .DS
                    791:        implicit double precision (a-b,d-h,o-z), double complex(c)
                    792:        double precision last
                    793:        intrinsic dsin, cdsin
                    794:        data last/0.3d0/
                    795: 
                    796:        x = 0.1d0
                    797:        y = sqrt(x)+sqrt(last)
                    798:        c1 = (0.1d0,0.2d0)
                    799:        c2 = sqrt(c1)
                    800:        x = dreal(i)
                    801:        y = dimag(c1)
                    802:        call fun(dsin,cdsin)
                    803: .DE
                    804: When the \(mi\fBr8\f flag is invoked,
                    805: the calls using the generic name \fBsqrt\fP will refer to a different
                    806: specific function since the types of the arguments have changed.
                    807: This option extends the precision of all single precision \fBreal\fP
                    808: and \fBcomplex\fP variables and functions,
                    809: including those declared \fBreal\(**4\fP and \fBcomplex\(**8\fP.
                    810: .IP
                    811: In order to successfully use this flag to increase precision,
                    812: the entire program including
                    813: all the subroutines and functions it calls must be recompiled.
                    814: Programs which use dynamic memory allocation or
                    815: use equivalence or common statements to associate variables of different types
                    816: may have to be changed by hand.
                    817: Similar caveats apply to the sizes of records
                    818: in unformatted \s-1I/O\s0.
                    819: .Nh 2 Characters\ and\ Integers
                    820: A character constant of integer length or less
                    821: may be assigned to an integer variable.
                    822: Individual bytes are packed into
                    823: the integer in the native byte order.
                    824: The character constant is padded with blanks
                    825: to the width of the integer during the assignment.
                    826: Use of this feature is deprecated;
                    827: it is intended only as a porting aid
                    828: for extended Fortran 66 programs.
                    829: Note that the intrinsic
                    830: .B ichar
                    831: function behaves as the standard requires,
                    832: converting only single bytes to integers.
                    833: .NH 1
                    834: VIOLATIONS OF THE STANDARD
                    835: .XS
                    836: \*(SN Violations of the Standard
                    837: .XE
                    838: .LP
                    839: We know only a few ways in which our Fortran system violates the new standard:
                    840: .Nh 2 Double\ Precision\ Alignment
                    841: The Fortran Standards (both 1966 and 1977)
                    842: permit
                    843: .B common
                    844: or
                    845: .B equivalence
                    846: statements to force a double precision quantity onto an odd word boundary,
                    847: as in the following example:
                    848: .DS I
                    849: real a(4)
                    850: double precision b,c
                    851: .sp .5
                    852: equivalence (a(1),b), (a(4),c)
                    853: .DE
                    854: Some machines (e.g., Honeywell 6000, \s-1IBM 360\s0) require that double precision quantities be on double word boundaries;
                    855: other machines (e.g., \s-1IBM 370\s0), run inefficiently if this alignment rule is not observed.
                    856: It is possible to tell which equivalenced and common variables suffer from a forced odd
                    857: alignment, but every double precision argument would have to be assumed on a bad boundary.
                    858: To load such a quantity on some machines,
                    859: it would be necessary to use separate operations to move the upper and lower halves
                    860: into the halves of an aligned temporary, then to load that double precision temporary; the reverse would be
                    861: needed to store a result.
                    862: We have chosen to require that all double precision real and complex quantities
                    863: fall on even word boundaries on machines with corresponding hardware requirements,
                    864: and to issue a diagnostic if the source code demands a violation of the rule.
                    865: .Nh 2 Dummy\ Procedure\ Arguments
                    866: If any argument of a procedure is of type character,
                    867: all dummy procedure arguments of that procedure must be declared
                    868: in an
                    869: .B external
                    870: statement.
                    871: This requirement arises as a subtle corollary of the way we represent character string arguments
                    872: and of the one-pass nature of the compiler.
                    873: A warning is printed if a dummy procedure is not declared
                    874: .B external.
                    875: Code is correct if there are no
                    876: .B character
                    877: arguments.
                    878: .Nh 2 T\ and\ TL\ Formats
                    879: The implementation of the
                    880: .B t
                    881: (absolute tab)
                    882: and
                    883: .B tl
                    884: (leftward tab)
                    885: format codes
                    886: is defective.
                    887: These codes allow rereading or rewriting part of the
                    888: record which has already been processed
                    889: (section 6.3.2 in Appendix A).
                    890: The implementation uses seeks,
                    891: so if the unit is not one which allows seeks,
                    892: such as a terminal,
                    893: the program is in error.
                    894: A benefit of the implementation chosen is
                    895: that there is no upper limit on the length of
                    896: a record,
                    897: nor is it necessary to predeclare any record
                    898: lengths except where specifically required
                    899: by Fortran or the operating system.
                    900: .Nh 2 Carriage\ Control
                    901: The Standard leaves as implementation dependent which logical unit(s)
                    902: are treated as ``printer'' files.
                    903: In this implementation there is no printer file and
                    904: thus by default, no carriage control is recognized on formatted output.
                    905: This can be changed using \fBform=\|\(fmprint\|\(fm\fP in the
                    906: \fBopen\fP statement
                    907: for a unit, or by using the \fBfpr\fP(1) filter for output; see [9].
                    908: .Nh 2 Assigned\ Goto
                    909: The optional
                    910: .I list
                    911: associated with an assigned
                    912: .B goto
                    913: statement is not checked against the actual assigned value during execution.
                    914: .NH 1
                    915: INTER-PROCEDURE INTERFACE
                    916: .XS
                    917: \*(SN Inter-Procedure Interface
                    918: .XE
                    919: .LP
                    920: To be able to write C procedures that call or are called by Fortran procedures,
                    921: it is necessary to know the conventions for procedure names,
                    922: data representation,
                    923: return values,
                    924: and argument lists that the compiled code obeys.
                    925: .Nh 2 Procedure\ Names
                    926: On
                    927: \s-1UNIX\s0
                    928: systems,
                    929: the name of a common block or a Fortran procedure
                    930: has an underscore appended to it by the compiler
                    931: to distinguish it from a C procedure or external variable
                    932: with the same user-assigned name.
                    933: Fortran built-in procedure names have embedded underscores to avoid clashes
                    934: with user-assigned subroutine names.
                    935: .Nh 2 Data\ Representations
                    936: The following is a table of
                    937: corresponding Fortran and C declarations:
                    938: .KS
                    939: .TS
                    940: center;
                    941: l l
                    942: l l.
                    943: .B
                    944: Fortran        C
                    945: .R
                    946: .sp .5
                    947: integer\(**2 x short int x;
                    948: integer x      long int x;
                    949: logical x      long int x;
                    950: real x float x;
                    951: double precision x     double x;
                    952: complex x      struct { float r, i; } x;
                    953: double complex x       struct { double dr, di; } x;
                    954: character\(**6 x       char x[6];
                    955: .TE
                    956: .KE
                    957: (By the rules of Fortran,
                    958: .B integer,
                    959: .B logical,
                    960: and
                    961: .B real
                    962: data occupy the same amount of memory.)
                    963: .Nh 2 Arrays
                    964: The first element of a C array always has subscript zero,
                    965: while Fortran arrays begin at 1 by default.
                    966: Fortran arrays are stored in column-major order in contiguous storage,
                    967: C arrays are stored in row-major order.
                    968: Many mathematical libraries have subroutines which transpose a two dimensional
                    969: matrix, e.g. \fBf01crf\fP in the \fB\s-1NAG\s0\fP library and
                    970: \fBvtran\fP in the \fB\s-1IMSL\s0\fP library.
                    971: These may be used to transpose a two-dimensional array stored in C in row-major
                    972: order to Fortran column-major order or vice-versa.
                    973: .Nh 2 Return\ Values
                    974: A function of type
                    975: .B integer,
                    976: .B logical,
                    977: .B real,
                    978: or
                    979: .B "double precision"
                    980: declared as a C function returns the corresponding type.
                    981: A
                    982: .B complex
                    983: or
                    984: .B "double complex"
                    985: function is equivalent to a C routine
                    986: with an additional
                    987: initial argument that points to the place where the return value is to be stored.
                    988: Thus,
                    989: .DS
                    990: complex function f( . . . )
                    991: .DE
                    992: is equivalent to
                    993: .DS
                    994: f_(temp, . . .)
                    995: struct { float r, i; } \(**temp;
                    996:  . . .
                    997: .DE
                    998: A character-valued function is equivalent to a C routine with
                    999: two extra initial arguments:  a data address and a length.
                   1000: Thus,
                   1001: .DS
                   1002: character\(**15 function g( . . . )
                   1003: .DE
                   1004: is equivalent to
                   1005: .DS
                   1006: g_(result, length, . . .)
                   1007: char result[ ];
                   1008: long int length;
                   1009:  . . .
                   1010: .DE
                   1011: and could be invoked in C by
                   1012: .DS
                   1013: char chars[15];
                   1014:  . . .
                   1015: g_(chars, 15L, . . . );
                   1016: .DE
                   1017: Subroutines are invoked as if they were \fBinteger\fR-valued functions
                   1018: whose value specifies which alternate return to use.
                   1019: Alternate return arguments (statement labels) are not passed to the function,
                   1020: but are used to do an indexed branch in the calling procedure.
                   1021: (If the subroutine has no entry points with alternate return arguments,
                   1022: the returned value is undefined.)
                   1023: The statement
                   1024: .DS
                   1025: call nret(\(**1, \(**2, \(**3)
                   1026: .DE
                   1027: is treated exactly as if it were the computed
                   1028: .B goto
                   1029: .DS
                   1030: goto (1, 2, 3),  nret( )
                   1031: .DE
                   1032: .Nh 2 Argument\ Lists
                   1033: All Fortran arguments are passed by address.
                   1034: In addition,
                   1035: for every argument that is of type character or
                   1036: that is a dummy procedure,
                   1037: an argument giving the length of the value is passed.
                   1038: (The string lengths are
                   1039: .B "long int"
                   1040: quantities passed by value.)
                   1041: The order of arguments is then:
                   1042: .DS
                   1043: Extra arguments for complex and character functions
                   1044: Address for each datum or function
                   1045: A \fBlong int\fR for each character or procedure argument
                   1046: .DE
                   1047: Thus, the call in
                   1048: .DS
                   1049: external f
                   1050: character\(**7 s
                   1051: integer b(3)
                   1052:  . . .
                   1053: call sam(f, b(2), s)
                   1054: .DE
                   1055: is equivalent to that in
                   1056: .DS
                   1057: int f();
                   1058: char s[7];
                   1059: long int b[3];
                   1060:  . . .
                   1061: sam_(f, &b[1], s, 0L, 7L);
                   1062: .DE
                   1063: .Nh 2 System\ Interface
                   1064: To run a Fortran program, the system invokes a small C program which
                   1065: first initializes signal handling, then calls \fBf_init\fP to initialize
                   1066: the Fortran \s-1I/O\s0 library, then calls your Fortran main program,
                   1067: and then calls \fBf_exit\fP to close any Fortran files opened.
                   1068: .IP
                   1069: \fBf_init\fP initializes Fortran units 0, 5, and 6 to standard error,
                   1070: standard input, and standard output respectively.
                   1071: It also calls \fBsetlinebuf\fP to initiate line buffering 
                   1072: of standard error.
                   1073: If you are using Fortran subroutines which may do \s-1I/O\s0
                   1074: and you have a C main program,
                   1075: call \fBf_init\fP before calling the Fortran subroutines.
                   1076: Otherwise, Fortran units 0, 5, and 6 will be connected to files
                   1077: \fBfort.0\fP, \fBfort.5\fP, and \fBfort.6\fP,
                   1078: and error messages from the \fBf77\fP libraries will be written
                   1079: to \fBfort.0\fP instead of to standard error.
                   1080: If your C program terminates by calling the C function \fBexit\fP,
                   1081: all files are automatically closed.
                   1082: If there are Fortran scratch files to be deleted, first call \fBf_exit\fP.
                   1083: \fBF_init\fP and \fBf_exit\fP do not have any arguments.
                   1084: .IP
                   1085: The \fB\(mid\fP flag will show what libraries are used in loading Fortran
                   1086: programs.
                   1087: .NH 1
                   1088: FILE FORMATS
                   1089: .XS
                   1090: \*(SN File Formats
                   1091: .XE
                   1092: .Nh 2 Structure\ of\ Fortran\ Files
                   1093: Fortran requires four kinds of external files:
                   1094: sequential formatted and unformatted,
                   1095: and direct formatted and unformatted.
                   1096: On
                   1097: \s-1UNIX\s0
                   1098: systems,
                   1099: these are all implemented as ordinary files
                   1100: which are assumed to have the proper
                   1101: internal structure.
                   1102: .IP
                   1103: Fortran \s-1I/O\s0 is based on \f2records\f1.
                   1104: When a direct file is opened in a Fortran program,
                   1105: the record length of the records must be given,
                   1106: and this is used by the Fortran \s-1I/O\s0 system to
                   1107: make the file look as if it is made up of records
                   1108: of the given length.
                   1109: In the special case that the record length is given
                   1110: as 1,
                   1111: the files are not considered to be divided into records,
                   1112: but are treated as byte-addressable byte strings;
                   1113: that is,
                   1114: as ordinary
                   1115: \s-1UNIX\s0
                   1116: file system files.
                   1117: (A read or write request on such a file keeps consuming bytes until
                   1118: satisfied, rather than being restricted to a single record.)
                   1119: .IP
                   1120: The peculiar requirements on sequential unformatted files
                   1121: make it unlikely that they will ever be read or written by any means except Fortran \s-1I/O\s0 statements.
                   1122: Each record is preceded and followed by
                   1123: an integer containing the record's length in bytes.
                   1124: .IP
                   1125: The Fortran \s-1I/O\s0 system breaks sequential formatted files
                   1126: into records while reading by using each newline
                   1127: as a record separator.
                   1128: The result of reading off the end of a record is undefined according to the Standard.
                   1129: The \s-1I/O\s0 system is permissive and
                   1130: treats the record as being extended by blanks.
                   1131: On output,
                   1132: the \s-1I/O\s0 system will write a newline at the end of each
                   1133: record.
                   1134: It is also possible for programs to write newlines
                   1135: for themselves.
                   1136: This is an error,
                   1137: but the only effect will be that the single record
                   1138: the user thought he wrote will be treated as
                   1139: more than one record when being read or
                   1140: backspaced over.
                   1141: .Nh 2 Portability\ Considerations
                   1142: The Fortran \s-1I/O\s0 system uses only the facilities of the
                   1143: standard C \s-1I/O\s0 library,
                   1144: a widely available and fairly portable package,
                   1145: with the following two nonstandard features:
                   1146: the \s-1I/O\s0 system needs to know whether a file
                   1147: can be used for direct \s-1I/O\s0,
                   1148: and whether or not it is possible to backspace.
                   1149: Both of these facilities are implemented
                   1150: using the
                   1151: .B fseek
                   1152: routine,
                   1153: so there is a routine
                   1154: .B canseek
                   1155: which determines if
                   1156: .B fseek
                   1157: will have the desired effect.
                   1158: Also, the
                   1159: .B inquire
                   1160: statement provides the user
                   1161: with the ability to find out if two files are the
                   1162: same,
                   1163: and to get the name of an already opened file
                   1164: in a form which would enable the program to reopen
                   1165: it.
                   1166: Therefore there are two routines which
                   1167: depend on facilities of the operating system
                   1168: to provide these two services.
                   1169: In any case,
                   1170: the \s-1I/O\s0 system
                   1171: runs on the \s-1PDP-11\s0, \s-1VAX-11/780\s0, and Interdata 8/32
                   1172: \s-1UNIX\s0
                   1173: systems.
                   1174: .Nh 2 Logical\ Units\ and\ Files
                   1175: Fortran logical unit numbers may be any integer between 0 and 99.
                   1176: The number of simultaneously open files is currently limited to 48.
                   1177: .IP
                   1178: Units 5, 6, and 0 are connected before the program begins to
                   1179: standard input, standard output, and standard error respectively.
                   1180: .IP
                   1181: If an unit is opened explicitly by an \fBopen\fP statement with
                   1182: a \fBfile=\fP keyword, then the file name is the name from
                   1183: the \fBopen\fP statement.
                   1184: Otherwise, the default file name corresponding to unit \fIn\fP is
                   1185: \fBfort.\fP\fIn\fP.
                   1186: If there is an environment variable whose name is the same as
                   1187: the tail of the file name after periods are deleted,
                   1188: then the contents of that environment variable
                   1189: are used as the name of the file.
                   1190: See [9] for details.
                   1191: .IP
                   1192: The default connection for all units is for sequential formatted \s-1I/O\s0.
                   1193: The Standard does not specify where a file which has been explicitly
                   1194: \fBopen\fRed
                   1195: for sequential \s-1I/O\s0 is initially positioned.
                   1196: The \s-1I/O\s0 system will position the file at the beginning.
                   1197: Therefore a
                   1198: .B write
                   1199: will destroy any data already in the file, but a
                   1200: .B read
                   1201: will work reasonably.
                   1202: To position a file to its end,
                   1203: use a \fBread\fP loop, or the system dependent function \fBfseek\fP.
                   1204: The preconnected units
                   1205: 0, 5, and 6 are positioned as they come
                   1206: from the program's parent process.
                   1207: .bp
                   1208: .SH
                   1209: APPENDIX A:  Differences Between Fortran 66 and Fortran 77
                   1210: .XS
                   1211: Appendix A.  Differences Between Fortran 66 and Fortran 77
                   1212: .XE
                   1213: .LP
                   1214: The following is a very brief description of the differences
                   1215: between the 1966 [2] and the 1977 [1] Standard languages.
                   1216: We assume that the reader is familiar with Fortran 66.
                   1217: We do not pretend to be complete, precise,
                   1218: or unbiased,
                   1219: but plan to describe what we feel are the most important aspects of the new language.
                   1220: The best current information on the 1977 Standard is in publications of the
                   1221: \s-1X3J3\s0 Subcommittee of the
                   1222: American National Standards Institute, and
                   1223: the \s-1ANSI\s0 X3.9-1978 document, the official description of the language.
                   1224: The Standard is written in English rather than a meta-language,
                   1225: but it is forbidding and legalistic.
                   1226: A number of tutorials and textbooks
                   1227: are available
                   1228: (see Appendix B).
                   1229: .NH 0
                   1230: Features Deleted from Fortran 66
                   1231: .XS
                   1232: \*(SN Features Deleted from Fortran 66
                   1233: .XE
                   1234: .Nh 2 Hollerith
                   1235: All notions of ``Hollerith''
                   1236: (\fIn\fP\|\fBh\fR)
                   1237: as data
                   1238: have been officially removed, although our compiler, like almost all in the foreseeable future,
                   1239: will continue to support this archaism.
                   1240: .Nh 2 Extended\ Range\ of\ DO
                   1241: .IP
                   1242: In Fortran 66, under a set of very restrictive and rarely-understood conditions, it is permissible
                   1243: to jump out of the range of a
                   1244: .B do
                   1245: loop, then jump back into it.
                   1246: Extended range has been removed in the Fortran 77 language.
                   1247: The restrictions are so special, and the implementation of extended range is so unreliable in many compilers,
                   1248: that this change really counts as no loss.
                   1249: .NH 1
                   1250: Program Form
                   1251: .XS
                   1252: \*(SN Program Form
                   1253: .XE
                   1254: .Nh 2 Blank\ Lines
                   1255: Completely blank lines are now legal comment lines.
                   1256: .Nh 2 Program\ and\ Block\ Data\ Statements
                   1257: A main program may now begin with a statement that gives that program an external name:
                   1258: .DS
                   1259: program work
                   1260: .DE
                   1261: Block data procedures may also have names.
                   1262: .DS
                   1263: block data stuff
                   1264: .DE
                   1265: There is now a rule that only
                   1266: .I one
                   1267: unnamed
                   1268: block data procedure may appear in a program.
                   1269: (This rule is not enforced by our system.)
                   1270: The Standard does not specify the effect of the program and block data names,
                   1271: but they are clearly intended to aid conventional loaders.
                   1272: .Nh 2 ENTRY\ Statement
                   1273: Multiple entry points are now legal.
                   1274: Subroutine and function subprograms may have additional entry points,
                   1275: declared by an
                   1276: .B entry
                   1277: statement with an optional argument list.
                   1278: .DS
                   1279: entry extra(a, b, c)
                   1280: .DE
                   1281: Execution begins at the first statement following the
                   1282: .B entry
                   1283: line.
                   1284: All variable declarations must precede all executable statements in the procedure.
                   1285: If the procedure begins with a
                   1286: .B subroutine
                   1287: statement,
                   1288: all entry points are subroutine names.
                   1289: If it begins with a
                   1290: .B function
                   1291: statement, each entry is a function entry point,
                   1292: with type determined by the type declared for the entry name.
                   1293: If any entry is a character-valued function,
                   1294: then all entries must be.
                   1295: In a function, an entry name of the same type as that where control entered
                   1296: must be assigned a value.
                   1297: Arguments do not retain their values between calls.
                   1298: (The ancient trick of calling one entry point with a large number of arguments
                   1299: to cause the procedure to ``remember'' the locations of those arguments,
                   1300: then invoking an entry with just a few arguments for later calculation,
                   1301: is still illegal.
                   1302: Furthermore, the trick doesn't work in our implementation,
                   1303: since arguments are not kept in static storage.)
                   1304: .Nh 2 \s-1DO\s0\ Loops
                   1305: .B do
                   1306: variables and range parameters may now be of integer, real, or double precision types.
                   1307: (The use of floating point
                   1308: .B do
                   1309: variables is very dangerous
                   1310: because of the possibility of unexpected roundoff,
                   1311: and we strongly recommend against their use.)
                   1312: The action of the
                   1313: .B do
                   1314: statement is now defined for all values of the
                   1315: .B do
                   1316: parameters.
                   1317: The statement
                   1318: .DS
                   1319: do 10 i = l, u, d
                   1320: .DE
                   1321: performs
                   1322: $ max (0^,^ left floor ( u - l + d ) / d^ right floor )$
                   1323: iterations.
                   1324: The
                   1325: .B do
                   1326: variable has a predictable value when exiting a loop:
                   1327: the value at the time a
                   1328: .B goto
                   1329: or
                   1330: .B return
                   1331: terminates the loop;
                   1332: otherwise
                   1333: the value that failed the limit test.
                   1334: .Nh 2 Alternate\ Returns
                   1335: In a
                   1336: .B subroutine
                   1337: or subroutine
                   1338: .B entry
                   1339: statement,
                   1340: some of the arguments may be noted by an asterisk, as in
                   1341: .DS
                   1342: subroutine s(a, \(**, b, \(**)
                   1343: .DE
                   1344: The meaning of the ``alternate returns'' is described
                   1345: in section 5.2 of Appendix A.
                   1346: .NH 1
                   1347: Declarations
                   1348: .XS
                   1349: \*(SN Declarations
                   1350: .XE
                   1351: .Nh 2 CHARACTER\ Data\ Type
                   1352: One of the biggest improvements to the language is the addition of a character-string data type.
                   1353: Local and
                   1354: common character variables must have a length denoted by a constant expression:
                   1355: .DS
                   1356: character\(**17 a, b(3,4)
                   1357: character\(**(6+3) c
                   1358: .DE
                   1359: If the length is omitted entirely, it is assumed equal to 1.
                   1360: A character string argument may have a constant length,
                   1361: or the length may be declared to be the same as that of the corresponding actual argument at run time
                   1362: by a statement like
                   1363: .DS
                   1364: character\(**(\(**) a
                   1365: .DE
                   1366: (There is an intrinsic function
                   1367: .B len
                   1368: that returns the actual length of a character string.)
                   1369: Character arrays and common blocks containing character variables must be packed:
                   1370: in an array of character variables, the first character of one element must follow the last character of
                   1371: the preceding element, without holes.
                   1372: .Nh 2 IMPLICIT\ Statement
                   1373: The traditional implied declaration rules still hold:
                   1374: a variable whose name begins with
                   1375: \fBi, j, k, l, m,\fR or \fBn\fR is of type
                   1376: \f3integer\f1;
                   1377: other variables are of type
                   1378: .B real,
                   1379: unless otherwise declared.
                   1380: This general rule may be overridden with an
                   1381: .B implicit
                   1382: statement:
                   1383: .DS
                   1384: implicit real(a-c,g), complex(w-z), character\(**(17) (s)
                   1385: .DE
                   1386: declares that variables whose name begins with an
                   1387: \fBa ,b, c,\fR
                   1388: or
                   1389: \fBg\fR
                   1390: are
                   1391: .B real,
                   1392: those beginning with
                   1393: \fBw, x, y,\fR
                   1394: or
                   1395: \fBz\fR
                   1396: are assumed
                   1397: .B complex,
                   1398: and so on.
                   1399: It is still poor practice to depend on implicit typing, but this statement is an industry standard.
                   1400: .Nh 2 PARAMETER\ Statement
                   1401: It is now possible to give a constant a symbolic name, as in
                   1402: .DS
                   1403: character str\(**(\(**)
                   1404: parameter (x=17, y=x/3, pi=3.14159d0, str=\(fmhello\(fm)
                   1405: .DE
                   1406: The type of each parameter name is governed
                   1407: by the same implicit and explicit rules as for a variable.
                   1408: Symbolic names for \fBcharacter\fP constants may be declared with
                   1409: an implied length ``(\(**)''.
                   1410: The right side of each equal sign must be a constant expression
                   1411: (an expression made up of constants, operators, and already defined parameters).
                   1412: .Nh 2 Array\ Declarations
                   1413: Arrays may now have as many as seven dimensions.
                   1414: (Only three were permitted in 1966.)
                   1415: The lower bound of each dimension may be declared
                   1416: to be other than 1 by
                   1417: using a colon.
                   1418: Furthermore, an adjustable array bound may be an integer expression involving constants,
                   1419: arguments, and variables in
                   1420: .B common.
                   1421: .DS
                   1422: real a(\(mi5:3, 7, m:n), b(n+1:2\(**n)
                   1423: .DE
                   1424: The upper bound on the last dimension of an array argument may be denoted by an asterisk
                   1425: to indicate that the upper bound is not specified:
                   1426: .DS
                   1427: integer a(5, \(**),  b(\(**), c(0:1, \(mi2:\(**)
                   1428: .DE
                   1429: .Nh 2 SAVE\ Statement
                   1430: A little known rule of Fortran 66 is that variables in a procedure do
                   1431: not necessarily retain their values between invocations of that procedure.
                   1432: This rule permits overlay and stack implementations for the affected variables.
                   1433: In Fortran 77, three types of variables automatically keep there values:
                   1434: variables in blank common,
                   1435: variables defined in \fBdata\fP statements and never changed, and 
                   1436: variables in named common blocks which have not become undefined.
                   1437: At any instant in the execution of a program,
                   1438: if a named common block is declared neither in the currently executing procedure
                   1439: nor in any of the procedures in the chain of callers,
                   1440: all of the variables in that common block become undefined.
                   1441: Fortran 77 permits one to specify that certain variables and common blocks are
                   1442: to retain their values between invocations.
                   1443: The declaration
                   1444: .DS
                   1445: save a, /b/, c
                   1446: .DE
                   1447: leaves the values of the variables
                   1448: .B a
                   1449: and
                   1450: .B c
                   1451: and all of the contents of common block
                   1452: .B b
                   1453: unaffected by an exit from the procedure.
                   1454: The simple declaration
                   1455: .DS
                   1456: save
                   1457: .DE
                   1458: has this effect on all variables and common blocks in the procedure.
                   1459: A common block must be \fBsave\fRd in every procedure in which it is declared
                   1460: if the desired effect is to occur.
                   1461: .Nh 2 INTRINSIC\ Statement
                   1462: All of the functions specified in the Standard are in a single category,
                   1463: ``intrinsic functions'', rather than being divided into ``intrinsic'' and ``basic external'' functions.
                   1464: If an intrinsic function is to be passed to another procedure, it must be declared
                   1465: .B intrinsic.
                   1466: Declaring it
                   1467: .B external
                   1468: (as in Fortran 66) causes a function other than the built-in one to be passed.
                   1469: .NH 1
                   1470: Expressions
                   1471: .XS
                   1472: \*(SN Expressions
                   1473: .XE
                   1474: .Nh 2 Character\ Constants
                   1475: Character string constants are marked by strings surrounded by apostrophes.
                   1476: If an apostrophe is to be included in a constant, it is repeated:
                   1477: .DS
                   1478:  \(fmabc\(fm
                   1479:  \(fmain\(fm\(fmt\(fm
                   1480: .DE
                   1481: Although null (zero-length) character strings are not allowed in the
                   1482: standard Fortran, they may be used with \fBf77\fP.
                   1483: Our compiler has two different quotation marks, `` \(fm '' and `` " ''.
                   1484: (See section 2.9 in the main text.)
                   1485: .Nh 2 Concatenation
                   1486: One new operator has been added,
                   1487: character string concatenation, marked by a double slash
                   1488: ``//''.
                   1489: The result of a concatenation
                   1490: is the string containing the characters
                   1491: of the left operand followed by the characters of
                   1492: the right operand.
                   1493: The character expressions
                   1494: .DS
                   1495:  \(fmab\(fm // \(fmcd\(fm
                   1496:  \(fmabcd\(fm
                   1497: .DE
                   1498: are equal.
                   1499: .IP
                   1500: Dummy arguments of type character may be declared with implied
                   1501: lengths:
                   1502: .DS
                   1503: subroutine s ( a, b )
                   1504: character a\(**(\(**), b\(**(\(**)
                   1505: .DE
                   1506: Such dummy arguments may be used in concatenations in assign statements:
                   1507: .DS
                   1508: s = a // b
                   1509: .DE
                   1510: but not in other contexts.  For example:
                   1511: .DS
                   1512: if( a // b .eq. \(fmabc\(fm ) key = 1
                   1513: call sub( a // b )
                   1514: .DE
                   1515: are legal statements if ``a'' and ``b'' are dummy arguments
                   1516: declared with explicit lengths, or if they are not arguments.
                   1517: These are illegal if they are declared with implied lengths.
                   1518: .Nh 2 Character\ String\ Assignment
                   1519: The left and right sides of a character assignment may not share storage.
                   1520: (The assumed implementation of character assignment is to copy characters from the right to the left side.)
                   1521: If the left side is longer than the right, it is padded with blanks.
                   1522: If the left side is shorter than the right, trailing characters are discarded.
                   1523: Since the two sides of a character assignment must be disjoint, the
                   1524: following are illegal:
                   1525: .DS
                   1526: str = \(fm\ \(fm // str
                   1527: str = str(2:)
                   1528: .DE
                   1529: These are not flagged as errors during compilation or execution,
                   1530: however the result is undefined.
                   1531: .Nh 2 Substrings
                   1532: It is possible to extract a substring of a character variable or character
                   1533: array element, using the colon notation:
                   1534: .DS
                   1535: a(i,\|j) (m:n)
                   1536: .DE
                   1537: is the string of $(n-m+1)$ characters beginning at the
                   1538: $m sup th$ character of the character array element $a sub ij$.
                   1539: Results are undefined unless $m<=n$.
                   1540: Substrings may be used on the left sides of assignments and as procedure actual arguments.
                   1541: .Nh 2 Exponentiation
                   1542: It is now permissible to raise real quantities to complex powers,
                   1543: or complex quantities to real or complex powers.
                   1544: (The principal part of the logarithm is used.)
                   1545: Also, multiple exponentiation is now defined:
                   1546: .DS
                   1547: a\(**\(**b\(**\(**c is equivalent to a \(**\(** (b\(**\(**c)
                   1548: .DE
                   1549: .Nh 2 Relaxation\ of\ Restrictions
                   1550: Mixed mode expressions are now permitted.
                   1551: (For instance,
                   1552: it is permissible to combine integer and complex quantities in an expression.)
                   1553: .IP
                   1554: Constant expressions are permitted where a constant is allowed,
                   1555: except in
                   1556: .B data
                   1557: statements
                   1558: and
                   1559: .B format
                   1560: statements.
                   1561: (A constant expression is made up of explicit constants and
                   1562: \fBparameter\fRs
                   1563: and the Fortran operators,
                   1564: except for exponentiation to a floating-point power.)
                   1565: An adjustable dimension may now be an integer expression involving constants,
                   1566: arguments, and variables in
                   1567: .B common.
                   1568: .IP
                   1569: Subscripts may now be general integer expressions;
                   1570: the old
                   1571: $c v +- c'$
                   1572: rules have been removed.
                   1573: .B do
                   1574: loop bounds may be general integer, real, or double precision expressions.
                   1575: Computed
                   1576: .B goto
                   1577: expressions and \s-1I/O\s0 unit numbers may be general integer expressions.
                   1578: .NH 1
                   1579: Executable Statements
                   1580: .XS
                   1581: \*(SN Executable Statements
                   1582: .XE
                   1583: .Nh 2 IF-THEN-ELSE
                   1584: At last, the
                   1585: if-then-else
                   1586: branching structure has been added to Fortran.
                   1587: It is called a ``Block If\|''.
                   1588: A Block If begins with a statement of the form
                   1589: .DS
                   1590: if ( . . . ) then
                   1591: .DE
                   1592: and ends with an
                   1593: .DS
                   1594: end if
                   1595: .DE
                   1596: statement.
                   1597: Two other new statements may appear in a Block If.
                   1598: There may be several
                   1599: .DS
                   1600: else if (. . .) then
                   1601: .DE
                   1602: statements,
                   1603: followed by at most one
                   1604: .DS
                   1605: else
                   1606: .DE
                   1607: statement.
                   1608: If the logical expression in the Block If statement is true,
                   1609: the statements following it up to the next
                   1610: .B "else if",
                   1611: .B else,
                   1612: or
                   1613: .B "end if"
                   1614: are executed.
                   1615: Otherwise, the next
                   1616: .B "else if"
                   1617: statement in the group is executed.
                   1618: If none of the
                   1619: .B "else if"
                   1620: conditions are true, control passes to the statements following the
                   1621: .B else
                   1622: statement, if any.
                   1623: (The
                   1624: .B else
                   1625: block must follow all
                   1626: .B "else if"
                   1627: blocks in a Block If.
                   1628: Of course, there may be Block Ifs embedded inside of other Block If structures.)
                   1629: A case construct may be rendered:
                   1630: .DS
                   1631: if (s .eq. \(fmab\(fm) then
                   1632:  . . .
                   1633: else if (s .eq. \(fmcd\(fm) then
                   1634:  . . .
                   1635: else
                   1636:  . . .
                   1637: end if
                   1638: .DE
                   1639: .Nh 2 Alternate\ Returns
                   1640: Some of the arguments of a subroutine call may be statement labels preceded by an asterisk, as in:
                   1641: .DS
                   1642: call joe(j, \(**10, m, \(**2)
                   1643: .DE
                   1644: A
                   1645: .B return
                   1646: statement may have an integer expression, such as:
                   1647: .DS
                   1648: return k
                   1649: .DE
                   1650: If the entry point has
                   1651: $n$
                   1652: alternate return (asterisk) arguments
                   1653: and if $1<=k<=n$, the return is followed by a branch to the corresponding statement label;
                   1654: otherwise the usual return to the statement following the
                   1655: .B call
                   1656: is executed.
                   1657: .NH 1
                   1658: Input/Output
                   1659: .XS
                   1660: \*(SN Input/Output
                   1661: .XE
                   1662: .Nh 2 Format\ Variables
                   1663: A format may be the value of a character expression (constant or otherwise),
                   1664: or be stored in a character array, as in:
                   1665: .DS
                   1666: write(6, \(fm(i5)\(fm) x
                   1667: .DE
                   1668: .Nh 2 END=,\ ERR=,\ and\ IOSTAT=\ Clauses
                   1669: A
                   1670: .B read
                   1671: or
                   1672: .B write
                   1673: statement may contain
                   1674: .B end=,
                   1675: .B err=,
                   1676: and
                   1677: .B iostat=
                   1678: clauses, as in:
                   1679: .DS
                   1680: write(6, 101, err=20, iostat=a(4))
                   1681: read(5, 101, err=20, end=30, iostat=x)
                   1682: .DE
                   1683: Here 5 and 6 are the
                   1684: .I units
                   1685: on which the \s-1I/O\s0 is done,
                   1686: 101 is the statement number of the associated format,
                   1687: 20 and 30 are statement numbers,
                   1688: and
                   1689: .B a
                   1690: and
                   1691: .B x
                   1692: are integer variables.
                   1693: If an error occurs during \s-1I/O\s0,
                   1694: control returns to the program at statement 20.
                   1695: If the end of the file is reached,
                   1696: control returns to the program at statement 30.
                   1697: In any case, the variable referred to in
                   1698: the
                   1699: .B iostat=
                   1700: clause is given a value when
                   1701: the \s-1I/O\s0 statement finishes.
                   1702: (Yes, the value is assigned to the name on the right side of the equal sign.)
                   1703: This value is zero if all went well,
                   1704: negative for end of file,
                   1705: and some positive value for errors.
                   1706: .Nh 2 Formatted\ \s-1I/O\s0
                   1707: .NH 3
                   1708: Character Constants
                   1709: .IP
                   1710: Character constants in formats are copied literally to the output.
                   1711: .IP
                   1712: A format may be specified as a character constant within the
                   1713: .B read
                   1714: or
                   1715: .B write
                   1716: statement.
                   1717: .DS
                   1718: write(6,\|\(fm(i2,\|\(fm\|\(fm isn\|\(fm\|\(fm\|\(fm\|\(fm\|t \|\(fm\|\(fm,i1)\|\(fm) 7, 4
                   1719: .DE
                   1720: produces
                   1721: .DS
                   1722:  7 isn\|\(fm\|t 4
                   1723: .DE
                   1724: In the example above, the format is the character constant
                   1725: .DS
                   1726: (i2,\|\(fm isn\|\(fm\|\(fmt \|\(fm,i1)
                   1727: .DE
                   1728: and the embedded character constant
                   1729: .DS
                   1730:  isn\|\(fmt
                   1731: .DE
                   1732: is copied into the output.
                   1733: .IP
                   1734: The example could have been written more legibly by taking advantage
                   1735: of the two types of quote marks.
                   1736: .DS
                   1737: write(6,\|\(fm(i2," isn\|\(fm\|\|\(fm\|t ",i1)\|\(fm) 7, 4
                   1738: .DE
                   1739: However, the double quote is not standard Fortran 77.
                   1740: .IP
                   1741: The standard does not allow reading into character constants or
                   1742: Hollerith fields.
                   1743: In order to facilitate running older programs, the Fortran \s-1I/O\s0 library
                   1744: allows reading into Hollerith fields; however this is a practice to be
                   1745: avoided.
                   1746: .NH 3
                   1747: Positional Editing Codes
                   1748: .IP
                   1749: .B t,
                   1750: .B tl,
                   1751: .B tr,
                   1752: and
                   1753: .B x
                   1754: codes
                   1755: control where the
                   1756: next character is in the record.
                   1757: \fBtr\fIn\fR
                   1758: or
                   1759: \fIn\fBx\fR
                   1760: specifies that the next character is
                   1761: $n$ to the right of the current position.
                   1762: \fBtl\fIn\fR
                   1763: specifies that the next character is
                   1764: $n$ to the left of the current position,
                   1765: allowing parts of the record to be reconsidered.
                   1766: \fBt\fIn\fR
                   1767: says that the next character is to be character
                   1768: number $n$ in the record.
                   1769: (See section 3.3 in the main text.)
                   1770: .NH 3
                   1771: Colon
                   1772: .IP
                   1773: A colon in the format terminates the \s-1I/O\s0 operation
                   1774: if there are no more data items in the \s-1I/O\s0 list,
                   1775: otherwise it has no effect.
                   1776: In the fragment
                   1777: .DS
                   1778: x=\(fm("hello", :, " there", i4)\(fm
                   1779: write(6, x) 12
                   1780: write(6, x)
                   1781: .DE
                   1782: the first
                   1783: .B write
                   1784: statement prints
                   1785: .DS
                   1786: hello there 12
                   1787: .DE
                   1788: while the second only prints
                   1789: .DS
                   1790: hello
                   1791: .DE
                   1792: .NH 3
                   1793: Optional Plus Signs
                   1794: .IP
                   1795: According to the Standard,
                   1796: each implementation has the option of putting
                   1797: plus signs in front of non-negative
                   1798: numeric output.
                   1799: The
                   1800: .B sp
                   1801: format code may be used to make the optional plus
                   1802: signs actually appear for all subsequent items
                   1803: while the format is active.
                   1804: The
                   1805: .B ss
                   1806: format code guarantees that the \s-1I/O\s0 system will not
                   1807: insert the optional plus signs,
                   1808: and the
                   1809: .B s
                   1810: format code restores the default behavior of
                   1811: the \s-1I/O\s0 system.
                   1812: (Since we never put out optional plus signs,
                   1813: .B ss
                   1814: and
                   1815: .B s
                   1816: codes have the same effect in our implementation.)
                   1817: .NH 3
                   1818: Blanks on Input
                   1819: .IP
                   1820: Blanks in numeric input fields,
                   1821: other than leading blanks,
                   1822: will be ignored following a
                   1823: .B bn
                   1824: code in a format
                   1825: statement,
                   1826: and will be treated as zeros following a
                   1827: .B bz
                   1828: code in a format statement.
                   1829: The default for a unit may be changed by using
                   1830: the
                   1831: .B open
                   1832: statement.
                   1833: (Blanks are ignored by default.)
                   1834: .NH 3
                   1835: Unrepresentable Values
                   1836: .IP
                   1837: The Standard requires that if a numeric item
                   1838: cannot be represented in the form required by a format code,
                   1839: the output field must be filled with asterisks.
                   1840: (We think this should have been an option.)
                   1841: .NH 3
                   1842: Iw.m
                   1843: .IP
                   1844: There is a new integer output code,
                   1845: \fBi\fIw.m.\fR
                   1846: It is the same as
                   1847: \fBi\fIw\fR,
                   1848: except that there will be at least $m$
                   1849: digits in the output field,
                   1850: including,
                   1851: if necessary,
                   1852: leading zeros.
                   1853: The case \fBi\fR$w.0$ is special,
                   1854: in that if the value being printed is 0,
                   1855: the output field is
                   1856: entirely blank.
                   1857: \fBi\fIw\fB.1\fR
                   1858: is the same as
                   1859: \fBi\fIw\fR.
                   1860: .NH 3
                   1861: Floating Point
                   1862: .IP
                   1863: On input, exponents may start with the letter
                   1864: \fBE, D, e, \fRor \fBd.\fR
                   1865: All have the same meaning.
                   1866: On output we always use \fBe\fR or \fBd\fR.
                   1867: The
                   1868: .B e
                   1869: and
                   1870: .B d
                   1871: format codes also have identical meanings.
                   1872: A leading zero before the decimal point in
                   1873: .B e
                   1874: output
                   1875: without a scale factor is optional with the
                   1876: implementation.
                   1877: There is a
                   1878: \fBg\fIw.d\fR
                   1879: format code which is the same as
                   1880: \fBe\fIw.d\fR
                   1881: and
                   1882: \fBf\fIw.d\fR
                   1883: on input,
                   1884: but which chooses
                   1885: .B f
                   1886: or
                   1887: .B e
                   1888: formats for output depending
                   1889: on the size of the number and of $d$.
                   1890: .NH 3
                   1891: ``A'' Format Code
                   1892: .IP
                   1893: The
                   1894: .B a
                   1895: code is used for character data.
                   1896: \fBa\fIw\fR
                   1897: uses a field width of $w$,
                   1898: while a plain
                   1899: .B a
                   1900: uses the length of the internal character item.
                   1901: .Nh 2 Standard\ Units
                   1902: There are default formatted input and output units.
                   1903: The statement
                   1904: .DS
                   1905: read 10, a, b
                   1906: .DE
                   1907: reads from the standard unit using format statement 10.
                   1908: The default unit may be explicitly specified by an asterisk, as in
                   1909: .DS
                   1910: read(\(**, 10) a, b
                   1911: .DE
                   1912: Similarly, the standard output unit is specified by a
                   1913: .B print
                   1914: statement or an asterisk unit:
                   1915: .DS
                   1916: print 10
                   1917: write(\(**, 10)
                   1918: .DE
                   1919: .Nh 2 List-Directed\ \s-1I/O\s0
                   1920: List-directed \s-1I/O\s0 is a
                   1921: kind of free form input for sequential \s-1I/O\s0.
                   1922: It is invoked by using an asterisk as the
                   1923: format identifier, as in
                   1924: .DS
                   1925: read(6, \(**) a,b,c
                   1926: .DE
                   1927: .IP
                   1928: On input,
                   1929: values are separated by strings of blanks
                   1930: and possibly a comma.
                   1931: On \s-1UNIX\s0, tabs may be used
                   1932: interchangeably with blanks as separators.
                   1933: Values,
                   1934: except for character strings,
                   1935: cannot contain blanks.
                   1936: End of record counts as a blank,
                   1937: except in character strings,
                   1938: where it is ignored.
                   1939: Complex constants are given as two real constants
                   1940: separated by a comma and enclosed in parentheses.
                   1941: A null input field,
                   1942: such as between two consecutive commas,
                   1943: means the corresponding variable in the
                   1944: \s-1I/O\s0 list is not changed.
                   1945: Values may be preceded by repetition counts,
                   1946: as in
                   1947: .DS
                   1948: 4\(**(3.,2.)  2\(**, 4\(**\|\(fm\|hello\|\(fm
                   1949: .DE
                   1950: which stands for 4 complex constants, 2 null values,
                   1951: and 4 string constants.
                   1952: .IP
                   1953: The Fortran standard requires data being read into \fBcharacter\fP variables
                   1954: by a list-directed read to be enclosed in quotes.
                   1955: In our system, the quotes are optional for strings which do not start with
                   1956: a digit or quote and do not contain separators.
                   1957: .IP
                   1958: For output, suitable formats are chosen for
                   1959: each item.
                   1960: The values of character strings are printed;
                   1961: they are not enclosed in quotes.
                   1962: According to the standard,
                   1963: they could not be read back
                   1964: using list-directed input.
                   1965: However much of this data could be read back in with list-directed
                   1966: \s-1I/O\s0 on our system.
                   1967: .Nh 2 Direct\ \s-1I/O\s0
                   1968: A file connected for direct access consists of
                   1969: a set of equal-sized records each of which is
                   1970: uniquely identified by a positive integer.
                   1971: The records may be written or read in any order,
                   1972: using direct access \s-1I/O\s0 statements.
                   1973: .IP
                   1974: Direct access
                   1975: .B read
                   1976: and
                   1977: .B write
                   1978: statements
                   1979: have an extra argument,
                   1980: .B rec=,
                   1981: which gives the record number to be read or written.
                   1982: .DS
                   1983: read(2, rec=13, err=20) (a(i), i=1, 203)
                   1984: .DE
                   1985: reads the thirteenth record into the array
                   1986: .B a.
                   1987: .IP
                   1988: The size of the records must be given by an
                   1989: .B open
                   1990: statement
                   1991: (see below).
                   1992: Direct access files may be connected for either formatted
                   1993: or unformatted \s-1I/O\s0.
                   1994: .Nh 2 Internal\ Files
                   1995: Internal files are character string objects,
                   1996: such as variables or substrings,
                   1997: or arrays of type character.
                   1998: In the former cases there is only a single record
                   1999: in the file;
                   2000: in the latter case each array element is a record.
                   2001: The Standard includes only sequential
                   2002: formatted \s-1I/O\s0 on internal files.
                   2003: (\s-1I/O\s0 is not a very precise term to use here,
                   2004: but internal files are dealt with using
                   2005: .B read
                   2006: and
                   2007: .B write.)
                   2008: Internal files are used by giving the name of the
                   2009: character object in place of the unit number, as in
                   2010: .DS
                   2011: character\(**80 x
                   2012: read(5,\(fm(a)\(fm) x
                   2013: read(x,\(fm(i3,i4)\(fm) n1,n2
                   2014: .DE
                   2015: which reads a character string into
                   2016: .B x
                   2017: and then reads
                   2018: two integers from the front of it.
                   2019: A sequential
                   2020: .B read
                   2021: or
                   2022: .B write
                   2023: always starts at the beginning
                   2024: of an internal file.
                   2025: .IP
                   2026: We also support two extensions of the standard.  The first is
                   2027: direct \s-1I/O\s0 on internal files.
                   2028: This is like direct \s-1I/O\s0 on external files,
                   2029: except that the number of records in the file cannot be
                   2030: changed.
                   2031: In this case a record is a single element of an array of character strings.
                   2032: The second extension is list-directed \s-1I/O\s0 on internal files.
                   2033: .Nh 2 OPEN,\ CLOSE,\ and\ INQUIRE\ Statements
                   2034: These statements are used to connect and disconnect
                   2035: units and files,
                   2036: and to gather information about units and files.
                   2037: .NH 3
                   2038: OPEN
                   2039: .IP
                   2040: The
                   2041: .B open
                   2042: statement is used to connect a file with a
                   2043: unit,
                   2044: or to alter some properties of the connection.
                   2045: The following is a minimal example.
                   2046: .DS
                   2047: open(1, file=\(fmfort.junk\(fm)
                   2048: .DE
                   2049: .B open
                   2050: takes a variety of arguments with meanings described below.
                   2051: .EQ
                   2052: delim off
                   2053: .EN
                   2054: .      \" macros here
                   2055: .de HP
                   2056: .RT
                   2057: .if !\\(IP .nr IP +1
                   2058: .sp \\n(PDu
                   2059: .ne 3v
                   2060: .in +\\n(PIu
                   2061: .ti -\\n(PIu
                   2062: \fB\\$1\fR\ \c
                   2063: ..
                   2064: .de P1
                   2065: .KS
                   2066: .nf
                   2067: .in +.3i
                   2068: .ta .3i .6i .9i 1.2i 1.5i 1.8i
                   2069: .sp
                   2070: ..
                   2071: .de P2
                   2072: .fi
                   2073: .in -.3i
                   2074: .sp
                   2075: .KE
                   2076: ..
                   2077: .de TH
                   2078: .RT
                   2079: .sp \\n(PDu
                   2080: .ne 3v
                   2081: \fB\\$1\\$2\\$3\\$4\\$5\\$6\fR\ \c
                   2082: ..
                   2083: .      \" end of macros
                   2084: .RS
                   2085: .HP unit=
                   2086: an integer between 0 and 99 inclusive which is the unit to
                   2087: which the file is to be connected (see section 5.3 in the text).
                   2088: If this parameter is the first one in the
                   2089: .B open
                   2090: statement,
                   2091: the
                   2092: .B unit=
                   2093: can be omitted.
                   2094: .HP iostat=
                   2095: is the same as in
                   2096: .B read
                   2097: or
                   2098: .B write.
                   2099: .HP err=
                   2100: is the same as in
                   2101: .B read
                   2102: or
                   2103: .B write.
                   2104: .HP file=
                   2105: a character expression,
                   2106: which when stripped of trailing blanks,
                   2107: is the name of the file to be connected to the unit.
                   2108: The file name should not be given if the
                   2109: .B status=\(fmscratch\(fm.
                   2110: .HP status=
                   2111: one of
                   2112: .B \(fmold\(fm,
                   2113: .B \(fmnew\(fm,
                   2114: .B \(fmscratch\(fm,
                   2115: or
                   2116: .B \(fmunknown\(fm.
                   2117: If this parameter is not given,\p
                   2118: .B \(fmunknown\(fm
                   2119: is assumed.
                   2120: The meaning of
                   2121: .B \(fmunknown\(fm
                   2122: is processor dependent;
                   2123: our system will create the file if it doesn't exist.
                   2124: If
                   2125: .B \(fmscratch\(fm
                   2126: is given,
                   2127: a temporary file will be created.
                   2128: Temporary files are destroyed at the end of execution.
                   2129: If
                   2130: .B \(fmnew\(fm
                   2131: is given, the file must not exist.
                   2132: It will be created for both reading and writing.
                   2133: If
                   2134: .B \(fmold\(fm
                   2135: is given, it is an error for the file not to exist.
                   2136: .HP access=
                   2137: .B \(fmsequential\(fm
                   2138: or
                   2139: .B \(fmdirect\(fm,
                   2140: depending on whether the file is
                   2141: to be opened for sequential or direct \s-1I/O\s0.
                   2142: .HP form=
                   2143: .B \(fmformatted\(fm
                   2144: or
                   2145: .B \(fmunformatted\(fm.
                   2146: On
                   2147: \s-1UNIX\s0
                   2148: systems,
                   2149: .B form=\(fmprint\(fm
                   2150: implies
                   2151: .B \(fmformatted\(fm
                   2152: with vertical format control.
                   2153: (See section 3.4 of the text).
                   2154: .HP recl=
                   2155: a positive integer specifying the record length of
                   2156: the direct access file being opened.
                   2157: We measure all record lengths in bytes.
                   2158: On
                   2159: \s-1UNIX\s0
                   2160: systems a record length of 1 has the special meaning explained
                   2161: in section 5.1 of the text.
                   2162: .HP blank=
                   2163: .B \(fmnull\(fm
                   2164: or
                   2165: .B \(fmzero\(fm.
                   2166: This parameter has meaning only for formatted \s-1I/O\s0.
                   2167: The default value is
                   2168: .B \(fmnull\(fm.
                   2169: .B \(fmzero\(fm
                   2170: means that blanks,
                   2171: other than leading blanks,
                   2172: in numeric input fields are to be treated as zeros.
                   2173: .RE
                   2174: .IP
                   2175: Opening a new file on a unit which is already connected
                   2176: has the effect of first closing the old file.
                   2177: .NH 3
                   2178: CLOSE
                   2179: .IP
                   2180: .B close
                   2181: severs the connection between a unit and a file.
                   2182: The unit number must be given.
                   2183: The optional parameters are
                   2184: .B iostat=
                   2185: and
                   2186: .B err=
                   2187: with
                   2188: their usual meanings,
                   2189: and
                   2190: .B status=
                   2191: either
                   2192: .B \(fmkeep\(fm
                   2193: or
                   2194: .B \(fmdelete\(fm.
                   2195: For scratch files the default is
                   2196: .B \(fmdelete\(fm;
                   2197: otherwise
                   2198: .B \(fmkeep\(fm
                   2199: is the default.
                   2200: .B \(fmdelete\(fm
                   2201: means the file will be removed.
                   2202: A simple example is
                   2203: .DS
                   2204: close(3, err=17)
                   2205: .DE
                   2206: .NH 3
                   2207: INQUIRE
                   2208: .IP
                   2209: The
                   2210: .B inquire
                   2211: statement gives information about
                   2212: a unit
                   2213: (``inquire by unit'')
                   2214: or a file (``inquire by file'').
                   2215: Simple examples are:
                   2216: .DS
                   2217: inquire(unit=3, name=xx)
                   2218: inquire(file=\(fm\|junk\|\(fm, number=n, exist=l)
                   2219: .DE
                   2220: .RS
                   2221: .HP file=
                   2222: a character variable specifies the file the
                   2223: .B inquire
                   2224: is about.
                   2225: Trailing blanks in the file name are ignored.
                   2226: .HP unit=
                   2227: an integer variable specifies the unit the
                   2228: .B inquire
                   2229: is about.
                   2230: Exactly one of
                   2231: .B file=
                   2232: or
                   2233: .B unit=
                   2234: must be used.
                   2235: .HP "iostat=, err="
                   2236: are as before.
                   2237: .HP exist=
                   2238: a logical variable.
                   2239: The logical variable is set to
                   2240: .B ".true."
                   2241: if the file or unit
                   2242: exists and is set to
                   2243: .B ".false."
                   2244: otherwise.
                   2245: .HP opened=
                   2246: a logical variable.
                   2247: The logical variable is set to
                   2248: .B ".true."
                   2249: if the file
                   2250: is connected to a unit or if the unit is connected
                   2251: to a file,
                   2252: and it is set to
                   2253: .B ".false."
                   2254: otherwise.
                   2255: .HP number=
                   2256: an integer variable to which is assigned the
                   2257: number of the unit connected to the file,
                   2258: if any.
                   2259: .HP named=
                   2260: a logical variable to which is assigned
                   2261: .B ".true."
                   2262: if
                   2263: the file has a name,
                   2264: or
                   2265: .B ".false."
                   2266: otherwise.
                   2267: .HP name=
                   2268: a character variable to which is assigned the name
                   2269: of the file (inquire by file) or the name of the
                   2270: file connected to the unit (inquire by unit).
                   2271: .HP access=
                   2272: a character variable to which will be assigned
                   2273: the value
                   2274: .B \(fmsequential\(fm
                   2275: if the connection is for
                   2276: sequential \s-1I/O\s0,
                   2277: .B \(fmdirect\(fm
                   2278: if the connection is for direct \s-1I/O\s0,
                   2279: .B \(fmunknown\(fm
                   2280: if not connected.
                   2281: .HP sequential=
                   2282: a character variable to which is assigned the
                   2283: value
                   2284: .B \(fmyes\(fm
                   2285: if the file could be connected for
                   2286: sequential \s-1I/O\s0,
                   2287: .B \(fmno\(fm
                   2288: if the file could not be connected for sequential \s-1I/O\s0,
                   2289: and
                   2290: .B \(fmunknown\(fm
                   2291: if we can't tell.
                   2292: .HP direct=
                   2293: a character variable to which is assigned the value
                   2294: .B \(fmyes\(fm
                   2295: if the file could be connected for direct \s-1I/O\s0,
                   2296: .B \(fmno\(fm
                   2297: if the file could not be connected for direct
                   2298: \s-1I/O\s0, and
                   2299: .B \(fmunknown\(fm
                   2300: if we can't tell.
                   2301: .HP form=
                   2302: a character variable to which is assigned the value
                   2303: .B \(fmunformatted\(fm
                   2304: if the file is connected for unformatted \s-1I/O\s0,
                   2305: .B \(fmformatted\(fm
                   2306: if the file is connected for formatted \s-1I/O\s0,
                   2307: .B \(fmprint\(fm
                   2308: for formatted \s-1I/O\s0 with vertical format control, or
                   2309: .B \(fmunknown\(fm
                   2310: if not connected.
                   2311: .HP formatted=
                   2312: a character variable to which is assigned the value
                   2313: .B \(fmyes\(fm
                   2314: if the file could be connected for formatted \s-1I/O\s0,
                   2315: .B \(fmno\(fm
                   2316: if the file could not be connected for formatted \s-1I/O\s0,
                   2317: and
                   2318: .B \(fmunknown\(fm
                   2319: if we can't tell.
                   2320: .HP unformatted=
                   2321: a character variable to which is assigned the value
                   2322: .B \(fmyes\(fm
                   2323: if
                   2324: the file could be connected for unformatted \s-1I/O\s0,
                   2325: .B \(fmno\(fm
                   2326: if the file could not be connected for unformatted \s-1I/O\s0,
                   2327: and
                   2328: .B \(fmunknown\(fm
                   2329: if we can't tell.
                   2330: .HP recl=
                   2331: an integer variable to which is assigned the record length
                   2332: of the records in the file if the file is connected
                   2333: for direct access.
                   2334: .HP nextrec=
                   2335: an integer variable to which is assigned one more
                   2336: than the number of the the last record read from a file connected
                   2337: for direct access.
                   2338: .HP blank=
                   2339: a character variable to which is assigned the value
                   2340: .B \(fmnull\(fm
                   2341: if null blank control is in effect for the file
                   2342: connected for formatted \s-1I/O\s0,
                   2343: .B \(fmzero\(fm
                   2344: if blanks are being converted to zeros and
                   2345: the file is connected for formatted \s-1I/O\s0.
                   2346: .RE
                   2347: .IP
                   2348: For information on file permissions, ownership, etc.,
                   2349: use the Fortran library routines \fBstat\fP and \fBaccess\fP.
                   2350: .IP
                   2351: For further discussion of the \s-1UNIX\s0 Fortran \s-1I/O\s0 system
                   2352: see ``Introduction to the f77 I/O Library'' [9].
                   2353: .bp
                   2354: .SH
                   2355: APPENDIX B:  References and Bibliography
                   2356: .XS
                   2357: Appendix B.  References and Bibliography
                   2358: .XE
                   2359: .LP
                   2360: .sp
                   2361: .B
                   2362: References
                   2363: .R
                   2364: .IP 1. 3
                   2365: \f2American National Standard Programming Language \s-1FORTRAN\s0,
                   2366: \s-1ANSI\s0 X3.9-1978\f1.
                   2367: New York:  American National Standards Institute, 1978.
                   2368: .IP 2.
                   2369: \f2\s-1USA\s0 Standard \s-1FORTRAN\s0, \s-1USAS X\s03.9-1966\f1.
                   2370: New York:  United States of America Standards Institute, 1966.
                   2371: Clarified in \f2Comm. \s-1ACM\s0\f1 12:289 (1969)
                   2372: and \f2Comm. \s-1ACM\s0\f1 14:628 (1971).
                   2373: .IP 3.
                   2374: Kernighan, B. W., and D. M. Ritchie.  \f2The C Programming Language.\f1
                   2375: Englewood Cliffs:  Prentice-Hall, 1978.
                   2376: .IP 4.
                   2377: Ritchie, D. M.  Private communication.
                   2378: .IP 5.
                   2379: Johnson, S. C.  ``A Portable Compiler:  Theory and Practice,''
                   2380: \f2Proceedings of Fifth \s-1ACM\s0 Symposium on
                   2381: Principles of Programming Languages\f1.  1978.
                   2382: .IP 6.
                   2383: Feldman, S. I.  ``An Informal Description of \s-1EFL\s0,''
                   2384: internal memorandum.
                   2385: .IP 7.
                   2386: Kernighan, B. W.  ``\s-1RATFOR\s0\(emA Preprocessor for
                   2387: Rational Fortran,'' \f2Bell Laboratories Computing Science
                   2388: Technical Report #55\f1.  1977.
                   2389: .IP 8.
                   2390: Ritchie, D. M.  Private communication.
                   2391: .IP 9.
                   2392: Wasley, D. L. ``Introduction to the f77 I/O Library'',
                   2393: \fI\s-1UNIX\s0 Programmer's Manual, Volume 2c\fR.
                   2394: .sp
                   2395: .LP
                   2396: .B
                   2397: Bibliography
                   2398: .R
                   2399: .LP
                   2400: The following books or documents describe aspects of Fortran 77.
                   2401: This list cannot pretend to be complete.
                   2402: Certainly no particular endorsement is implied.
                   2403: .IP 1. 3
                   2404: Brainerd, Walter S., et al.  \f2Fortran 77 Programming.\f1
                   2405: Harper Row, 1978.
                   2406: .IP 2.
                   2407: Day, A. C.  \f2Compatible Fortran.\f1  Cambridge University Press, 1979.
                   2408: .IP 3.
                   2409: Dock, V. Thomas.  \f2Structured Fortran IV Programming.\f1  West, 1979.
                   2410: .IP 4.
                   2411: Feldman, S. I.  ``The Programming Language \s-1EFL\s0,''
                   2412: \f2Bell Laboratories Technical Report\f1.
                   2413: June 1979.
                   2414: .IP 5.
                   2415: Hume, J. N., and R. C. Holt.  \f2Programming Fortran 77.\f1
                   2416: Reston, 1979.
                   2417: .IP 6.
                   2418: Katzan, Harry, Jr.  \f2Fortran 77.\f1  Van Nostrand-Reinhold, 1978.
                   2419: .IP 7.
                   2420: Meissner, Loren P., and Organick, Elliott I.  \f2Fortran 77 Featuring
                   2421: Structured Programming\f1, Addison-Wesley, 1979.
                   2422: .IP 8.
                   2423: Merchant, Michael J.  \f2\s-1ABC\s0's of Fortran Programming.\f1
                   2424: Wadsworth, 1979.
                   2425: .IP 9.
                   2426: Page, Rex, and Richard Didday.  \f2Fortran 77 for Humans.\f1
                   2427: West, 1980.
                   2428: .IP 10.
                   2429: Wagener, Jerrold L.  \f2Principles of Fortran 77 Programming.\f1
                   2430: Wiley, 1980.
                   2431: .\" want Table of Contents to begin on page 2 hence must expand body
                   2432: .\" of .TC macro to enable us to get handle on page number.
                   2433: .pn 2
                   2434: .bp
                   2435: .PX

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.