|
|
1.1 root 1: .so ../ADM/mac
2: .XX f77 315 "A Portable Fortran 77 Compiler"
3: .de XX
4: .IP "\f(CW\\$1\f1" 5
5: ..
6: .EQ
7: delim $$
8: .EN
9: . \".ND "1 August 1978"
10: .ND "30 June 1989"
11: .TL
12: A Portable Fortran 77 Compiler\(dg
13: .AU
14: S. I. Feldman
15: P. J. Weinberger
16: .AI
17: .MH
18: .AB
19: .PP
20: We report here on the first complete implementation of a compiler and run-time system for
21: the current Fortran language, known as Fortran 77.
22: The compiler is designed to be portable,
23: to be correct and complete,
24: and to generate code compatible with calling sequences produced by C compilers.
25: In particular, this Fortran is quite usable on
26: .UX
27: systems.
28: In this paper, we describe the language compiled,
29: interfaces between procedures,
30: and file formats assumed by the I/O system.
31: An appendix describes the Fortran 77 language.
32: .AE
33: .2C
34: .FS
35: \(dg This is a version of |reference(f77 v7man) revised by D. M. Gay.
36: .FE
37: .NH 1
38: Introduction
39: .PP
40: The current Fortran language, known as Fortran 77,
41: became an official American National Standard|reference(standard f77)
42: on April 3, 1978.
43: Fortran 77 supplants 1966 Standard Fortran|reference(standard f66).
44: We report here on a compiler and run-time system for Fortran 77.
45: The compiler and computation library were written by SIF, the I/O system by PJW.
46: We believe ours to be the first complete Fortran 77 system
47: to have been implemented.
48: This compiler is designed to be portable to a number of different machines,
49: to be correct and complete,
50: and to generate code compatible with calling sequences produced
51: by compilers for the C language|reference(cbook).
52: In particular,
53: it is in use on
54: .UX
55: systems.
56: The C compilers in use at Bell Labs include two families,
57: one based on D. M. Ritchie's PDP-11 compiler|reference(%type pamphlet
58: %author D. M. Ritchie
59: %title private communication), another
60: based on S. C. Johnson's portable C compiler|reference(pcc).
61: This Fortran compiler can drive the second passes of either family.
62: In this paper, we describe the language compiled,
63: interfaces between procedures,
64: and file formats assumed by the I/O system.
65: .NH 2
66: Usage
67: .PP
68: .I F77
69: is a general-purpose command for compiling and loading Fortran and Fortran-related files.
70: The command to run the compiler is
71: .P1
72: f77 \fIflags file . . .\fR
73: .P2
74: EFL|reference(efl) and Ratfor|reference(ratfor)
75: source files will be preprocessed before
76: being presented to the Fortran compiler.
77: C and assembler source files will be compiled by the appropriate programs.
78: Object files will be loaded.
79: (The
80: .I f77
81: and
82: .I cc
83: commands cause slightly different loading sequences to be generated,
84: since Fortran programs need a few extra libraries and a different startup routine
85: than do C programs.)
86: The following file name suffixes are understood:
87: .TS
88: center;
89: aFCW a.
90: \&.f Fortran source file
91: \&.e EFL source file
92: \&.r Ratfor source file
93: \&.c C source file
94: \&.s Assembler source file
95: \&.o Object file
96: .TE
97: .Tm Options s
98: The following flags are understood:
99: .XX -S
100: Generate assembler output for each source file, but do not assemble it.
101: Assembler output for a source file
102: .CW x.f ,
103: .CW x.e ,
104: .CW x.r ,
105: or
106: .CW x.c
107: is put on file
108: .CW x.s .
109: .XX -c
110: Compile but do not load.
111: Output for
112: .CW x.f ,
113: .CW x.e ,
114: .CW x.r ,
115: .CW x.c ,
116: or
117: .CW x.s
118: is put on file
119: .CW x.o .
120: .XX -m
121: Apply the M4 macro preprocessor to each EFL or Ratfor source file before using the appropriate compiler.
122: .XX -p
123: Generate code to produce usage profiles.
124: .XX "-o \fIf\fR"
125: Put executable module on file
126: .I f.
127: (Default is
128: .CW a.out ).
129: .XX -w
130: Suppress all warning messages.
131: .XX -w66\
132: Suppress warnings about Fortran 66 features used.
133: .XX -O
134: Invoke the C object code optimizer.
135: .XX -C
136: Compile code the checks that subscripts are within array bounds.
137: .XX -onetrip\ \
138: Compile code that performs every
139: .CW do
140: loop at least once.
141: (See Section 2.12).
142: .XX -U
143: Do not convert upper case letters to lower case.
144: The default is to convert Fortran programs to lower case.
145: .XX -u
146: Make the default type of a variable
147: .CW undefined.
148: (See Section 2.3).
149: .XX -I2
150: On machines which support short integers,
151: make the default integer constants and variables short.
152: (\f(CW-I4\fR is the standard value of this option). (See Section 2.14).
153: All logical quantities will be short.
154: .XX -E
155: The remaining characters in the argument are used as an EFL flag argument.
156: .XX -R
157: The remaining characters in the argument are used as a Ratfor flag argument.
158: .XX -F
159: Ratfor and EFL source programs are pre-processed into Fortran files,
160: but those files are not compiled or removed.
161: .in -1i
162: .LP
163: Other flags,
164: all library names (arguments beginning \f(CW-l\fR),
165: and any names not ending with one of the understood suffixes are passed to the loader.
166: .NH 2
167: Documentation Conventions
168: .PP
169: In running text, we write Fortran keywords and other literal strings in boldface lower case.
170: Examples will be presented in lightface lower case.
171: Names representing a class of values will be printed in italics.
172: .NH 2
173: Implementation Strategy
174: .PP
175: The compiler and library are written entirely in C.
176: The compiler generates C compiler intermediate code.
177: Since there are C compilers running on a variety of machines,
178: relatively small changes will make this Fortran compiler generate code for any of them.
179: Furthermore, this approach guarantees that the resulting programs are compatible with C usage.
180: The runtime computational library is complete.
181: The mathematical functions rely on the functions in C's \fIlibm\fR.
182: The runtime I/O library makes use of D. M. Ritchie's Standard C I/O package
183: |reference(stdio)
184: for transferring data.
185: With the exception described below, only documented calls are used,
186: so it should be relatively easy to modify the I/O library
187: to run on other operating
188: systems.
189: .NH 1
190: Language Extensions
191: .PP
192: Fortran 77 includes almost all of Fortran 66 as a subset.
193: We describe the differences briefly in the Appendix.
194: The most important additions are a character string data type,
195: file-oriented input/output statements, and random access I/O.
196: Also, the language has been cleaned up considerably.
197: .PP
198: In addition to implementing the language specified in the Fortran 77 Standard,
199: our compiler implements a few extensions described in this section.
200: Most are useful additions to the language.
201: The remainder are extensions
202: to make it easier to communicate with C procedures
203: or to permit compilation of
204: old (1966 Standard) programs.
205: .NH 2
206: Double Complex Data Type
207: .PP
208: The new type
209: .CW "double complex"
210: is defined.
211: Each datum is represented by a pair of double precision real variables.
212: A double complex version of every
213: .CW complex
214: built-in function is provided.
215: The specific function names begin with \f(CWz\fR instead of \f(CWc\fR.
216: .NH 2
217: Internal Files
218: .PP
219: The Fortran 77 standard introduces ``internal files'' (memory arrays), but
220: restricts their use to formatted sequential I/O statements.
221: Our I/O system also permits internal files to be used
222: in direct and unformatted reads and writes.
223: .NH 2
224: Implicit Undefined statement
225: .PP
226: Fortran 66 has a fixed rule that the type of a variable that does not appear in a type statement
227: is
228: .CW integer
229: if its first letter is one of
230: .CW ijklmn
231: and
232: .CW real
233: otherwise.
234: Fortran 77 has an
235: .CW implicit
236: statement for overriding this rule.
237: As an aid to good programming practice, we permit an additional type,
238: .CW undefined .
239: The statement
240: .P1
241: implicit undefined(a-z)
242: .P2
243: turns off the automatic data typing mechanism,
244: and the compiler will issue a diagnostic for each variable that is used but does
245: not appear in a type statement.
246: Specifying the
247: .CW -u
248: compiler flag is equivalent to beginning each procedure with this statement.
249: .NH 2
250: Recursion
251: .PP
252: Procedures may call themselves, directly or through a chain of other procedures.
253: .NH 2
254: Automatic Storage
255: .PP
256: Two new keywords are recognized,
257: .CW static
258: and
259: .CW automatic .
260: These keywords may appear as ``types'' in type statements and in
261: .CW implicit
262: statements.
263: Local variables are static by default;
264: there is exactly one copy of the datum, and its value is retained between calls.
265: There is one copy of each variable declared
266: .CW automatic
267: for each invocation of the procedure.
268: Automatic variables may not appear in
269: .CW equivalence ,
270: .CW data ,
271: or
272: .CW save
273: statements.
274: .NH 2
275: Source Input Format
276: .PP
277: The Standard expects input to the compiler to be in 72 column format:
278: except in comment lines,
279: the first five characters are the statement number, the next is the continuation character,
280: and the next sixty-six are the body of the line.
281: (If there are fewer than seventy-two characters on a line, the compiler pads it with blanks;
282: characters after the seventy-second are ignored).
283: .PP
284: To make typing Fortran programs easier,
285: our compiler also accepts input in variable length lines.
286: An ampersand
287: .CW &
288: in the first position of a line indicates a continuation
289: line; the remaining characters form the body of the line.
290: A tab character in one of the first six positions of a line signals the
291: end of the statement number and continuation part of the line;
292: the remaining characters form the body of the line.
293: A tab elsewhere on the line is treated as another kind of blank by the
294: compiler.
295: .PP
296: In the Standard, there are only 26 letters \(em Fortran is a one-case language.
297: Consistent with ordinary
298: .UX
299: system usage, our compiler expects lower case input.
300: By default, the compiler converts all upper case characters to lower case except those inside character constants.
301: However, if the
302: .CW -U
303: compiler flag is specified, upper case letters are not transformed.
304: In this mode, it is possible to specify external names with upper case letters in them,
305: and to have distinct variables differing only in case,
306: but then all Fortran keywords must be in lower case.
307: .NH 2
308: \f(CWinclude\fR Statement
309: .PP
310: The statement
311: .P1
312: include 'stuff'
313: .P2
314: is replaced by the contents of the file
315: .CW stuff .
316: .CW include s
317: may be nested to a reasonable depth, currently ten.
318: .NH 2
319: Binary Initialization Constants
320: .PP
321: A
322: .CW logical ,
323: .CW real ,
324: or
325: .CW integer
326: variable may be initialized in a
327: .CW data
328: statement
329: by a binary constant, denoted by a letter followed by a quoted string.
330: If the letter is
331: .CW b ,
332: the string is binary, and only zeros and ones are permitted.
333: If the letter is
334: .CW o ,
335: the string is octal, with digits
336: .CW 0-7 .
337: If the letter is
338: .CW z
339: or
340: .CW x ,
341: the string is hexadecimal, with digits
342: .CW 0-9a-f .
343: Thus, the statements
344: .P1
345: integer a(3)
346: data a / b'1010', o'12', z'a' /
347: .P2
348: initialize all three elements of
349: .I a
350: to ten.
351: .NH 2
352: Character Strings
353: .PP
354: For compatibility with C usage, the following backslash escapes are recognized:
355: .TS
356: center;
357: aFCW a.
358: \en newline
359: \et tab
360: \eb backspace
361: \ef form feed
362: \e0 null
363: \e' apostrophe (does not terminate a string)
364: \e" quotation mark (does not terminate a string)
365: \e\e \e
366: \e\fIx\fP \fIx\fR, where \fIx\fR is any other character
367: .TE
368: Fortran 77 only has one quoting character, the apostrophe.
369: Our compiler and I/O system recognize
370: both the apostrophe
371: .CW '
372: and the double-quote
373: .CW \" .
374: If a string begins with one variety of quote mark, the other may be embedded within it
375: without using the repeated quote or backslash escapes.
376: .PP
377: Every unequivalenced scalar local character variable and every character string constant is aligned
378: on an
379: .CW integer
380: word boundary.
381: Each character string constant appearing outside a
382: .CW data
383: statement is followed by a
384: null character to ease communication with C routines.
385: .NH 2
386: Hollerith
387: .PP
388: Fortran 77 does not have the old Hollerith (\fIn\|\f(CWh\fR)
389: notation,
390: though the new Standard recommends implementing the old Hollerith feature
391: in order to improve compatibility with old programs.
392: In our compiler, Hollerith data may be used in place of character string constants,
393: and may also be used to initialize non-character variables in
394: .CW data
395: statements.
396: .NH 2
397: Equivalence Statements
398: .PP
399: As a very special and peculiar case,
400: Fortran 66 permits an element of a multiply-dimensioned array to be represented by
401: a singly-subscripted reference in
402: .CW equivalence
403: statements.
404: Fortran 77 does not permit this usage, since
405: subscript lower bounds may now be different from 1.
406: Our compiler permits single subscripts in
407: .CW equivalence
408: statements,
409: under the interpretation that all missing subscripts are equal to 1.
410: A warning message is printed for each such incomplete subscript.
411: .NH 2
412: One-Trip \f(CWdo\fP Loops
413: .PP
414: The Fortran 77 Standard requires that the range of a
415: .CW do
416: loop not be performed
417: if the initial value is already past the limit value,
418: as in
419: .P1
420: do 10 i = 2, 1
421: .P2
422: The 1966 Standard stated that the effect of such a statement was undefined,
423: but it was common practice that the range of a
424: .CW do
425: loop would be performed
426: at least once.
427: In order to accommodate old programs, though they were in violation of the 1966 Standard,
428: the
429: .CW -onetrip
430: compiler flag causes non-standard loops to be generated.
431: .NH 2
432: Commas in Formatted Input
433: .PP
434: The I/O system attempts to be more lenient than the
435: Standard when it seems worthwhile.
436: In a formatted read of non-character variables,
437: commas may be used as value separators in the input record,
438: overriding the field lengths given in the format statement.
439: Thus,
440: the format
441: .P1
442: (i10, f20.10, i4)
443: .P2
444: will read the record
445: .P1
446: -345,.05e-3,12
447: .P2
448: correctly.
449: .NH 2
450: Short Integers
451: .PP
452: On machines that support halfword integers,
453: the compiler accepts declarations of type
454: .CW integer\(**2 .
455: (Ordinary integers follow the Fortran rules about occupying the same
456: space as a
457: .CW real
458: variable; they are assumed to be of C type
459: .CW "long int" ;
460: halfword integers are of C type
461: .CW "short int" .)
462: An expression involving only objects of type
463: .CW integer\(**2
464: is of that type.
465: Generic functions return short or long integers depending on the actual types of their arguments.
466: If a procedure is compiled using the
467: .CW -I2
468: flag, all small integer constants will be
469: of type
470: .CW integer\(**2 .
471: If the precision of an integer-valued intrinsic function is not determined by the generic function rules,
472: one will be chosen that returns the prevailing length
473: (\f(CWinteger\(**2\fR when the \f(CW-I2\fR command flag is in effect).
474: When the
475: .CW -I2
476: option is in effect, all quantities of type
477: .CW logical
478: will be short.
479: Note that these short integer and logical quantities do not obey the standard rules for storage association.
480: .NH 2
481: Additional Intrinsic Functions
482: .PP
483: This compiler supports all of the intrinsic functions specified in the Fortran 77 Standard.
484: In addition, there are functions for performing bitwise Boolean operations
485: (\fIor\fR, \fIand\fR, \fIxor\fR, and \fInot\fR)
486: and for accessing the
487: .UX
488: command arguments
489: (\fIgetarg\fR and \fIiargc\fR).
490: .NH 1
491: Violations of the Standard
492: .PP
493: We know only two ways in which our Fortran system violates
494: the Fortran 77 standard:
495: .NH 2
496: Double Precision Alignment
497: .PP
498: The Fortran standards (both 1966 and 1977)
499: permit
500: .CW common
501: or
502: .CW equivalence
503: statements to force a double precision quantity onto an odd word boundary,
504: as in the following example:
505: .P1 I
506: real a(4)
507: double precision b,c
508: .sp .5
509: equivalence (a(1),b), (a(4),c)
510: .P2
511: Some machines (e.g., Honeywell 6000, IBM 360) require that double precision quantities be on double word boundaries;
512: other machines (e.g., IBM 370), run inefficiently if this alignment rule is not observed.
513: It is possible to tell which equivalenced and common variables suffer from a forced odd
514: alignment, but every double precision argument would have to be assumed on a bad boundary.
515: To load such a quantity on some machines,
516: it would be necessary to use separate operations to move the upper and lower halves
517: into the halves of an aligned temporary, then to load that double precision temporary; the reverse would be
518: needed to store a result.
519: We have chosen to require that all double precision real and complex quantities
520: fall on even word boundaries on machines with corresponding hardware requirements,
521: and to issue a diagnostic if the source code demands a violation of the rule.
522: .NH 2
523: \f(CWt\fR and \f(CWtl\fR Formats
524: .PP
525: The implementation of the
526: .CW t
527: (absolute tab)
528: and
529: .CW tl
530: (leftward tab)
531: format codes
532: is defective.
533: These codes allow rereading or rewriting part of the
534: record which has already been processed.
535: (See Section 6.3.2 in the Appendix.)
536: The implementation uses seeks,
537: so if the unit is not one which allows seeks,
538: such as a terminal,
539: the program is in error.
540: (People who can make a case for using
541: .CW tl
542: should let us know.)
543: A benefit of the implementation chosen is
544: that there is no upper limit on the length of
545: a record,
546: nor is it necessary to predeclare any record
547: lengths except where specifically required
548: by Fortran or the operating system.
549: .NH 1
550: Inter-Procedure Interface
551: .PP
552: To be able to write C procedures that call or are called by Fortran procedures,
553: it is necessary to know the conventions for procedure names,
554: data representation,
555: return values,
556: and argument lists that the compiled code obeys.
557: .NH 2
558: Procedure Names
559: .PP
560: On
561: .UX
562: systems,
563: the name of a common block or a Fortran procedure
564: has an underscore appended to it by the compiler
565: to distinguish it from a C procedure or external variable
566: with the same user-assigned name.
567: Fortran library procedure names have embedded underscores to avoid clashes
568: with user-assigned subroutine names.
569: .KF
570: .TS
571: center;
572: c c
573: l l.
574: Fortran C
575: .sp .5
576: integer\(**2 x short int x;
577: integer x long int x;
578: logical x long int x;
579: real x float x;
580: double precision x double x;
581: complex x struct { float r, i; } x;
582: double complex x struct { double dr, di; } x;
583: character\(**6 x char x[6];
584: .TE
585: .ce
586: \fBTable 1. Fortran and C declarations
587: .KE
588: .NH 2
589: Data Representations
590: .PP
591: Table 1 shows corresponding Fortran and C declarations:
592: (By the rules of Fortran,
593: .CW integer,
594: .CW logical,
595: and
596: .CW real
597: data occupy the same amount of memory).
598: .NH 2
599: Return Values
600: .PP
601: A function of type
602: .CW integer ,
603: .CW logical ,
604: .CW real ,
605: or
606: .CW "double precision"
607: must be declared as a C function that returns the corresponding type.
608: A
609: .CW complex
610: or
611: .CW "double complex"
612: function is equivalent to a C routine
613: with an additional
614: initial argument that points to the place where the return value is to be stored.
615: Thus,
616: .P1
617: complex function f( . . . )
618: .P2
619: is equivalent to
620: .P1
621: f_(temp, . . .)
622: struct { float r, i; } \(**temp;
623: . . .
624: .P2
625: A character-valued function is equivalent to a C routine with
626: two extra initial arguments:
627: a data address and a length.
628: Thus,
629: .P1
630: character\(**15 function g( . . . )
631: .P2
632: is equivalent to
633: .P1
634: g_(result, length, . . .)
635: char result[ ];
636: long int length;
637: . . .
638: .P2
639: and could be invoked in C by
640: .P1
641: char chars[15];
642: . . .
643: g_(chars, 15L, . . . );
644: .P2
645: Subroutines are invoked as if they were
646: .CW integer -valued
647: functions
648: whose value specifies which alternate return to use.
649: Alternate return arguments (statement labels) are not passed to the function,
650: but are used to do an indexed branch in the calling procedure.
651: (If the subroutine has no entry points with alternate return arguments,
652: the returned value is undefined.)
653: The statement
654: .P1
655: call nret(\(**1, \(**2, \(**3)
656: .P2
657: is treated exactly as if it were the computed
658: .CW goto
659: .P1
660: goto (1, 2, 3), nret( )
661: .P2
662: .NH 2
663: Argument Lists
664: .PP
665: All Fortran arguments are passed by address.
666: In addition,
667: for every non-function argument that is of type character,
668: an argument giving the length of the value is passed.
669: (The string lengths are
670: .CW "long int"
671: quantities passed by value).
672: The order of arguments is then:
673: extra arguments for complex and character functions,
674: address for each datum or function,
675: a \f(CWlong int\fR for each character argument (other than character-valued functions).
676: Thus, the call in
677: .P1
678: external f
679: character\(**7 s
680: integer b(3)
681: . . .
682: call sam(f, b(2), s)
683: .P2
684: is equivalent to that in
685: .P1
686: int f();
687: char s[7];
688: long int b[3];
689: . . .
690: sam_(f, &b[1], s, 7L);
691: .P2
692: Note that the first element of a C array always has subscript zero,
693: but Fortran arrays begin at 1 by default.
694: Fortran arrays are stored in column-major order, C arrays are stored in row-major order.
695: .NH 1
696: File Formats
697: .NH 2
698: Structure of Fortran Files
699: .PP
700: Fortran requires four kinds of external files:
701: sequential formatted and unformatted,
702: and direct formatted and unformatted.
703: On
704: .UX
705: systems,
706: these are all implemented as ordinary files
707: which are assumed to have the proper
708: internal structure.
709: .PP
710: Fortran I/O is based on ``records''.
711: When a direct file is opened in a Fortran program,
712: the record length of the records must be given,
713: and this is used by the Fortran I/O system to
714: make the file look as if it is made up of records
715: of the given length.
716: In the special case that the record length is given
717: as 1,
718: the files are not considered to be divided into records,
719: but are treated as byte-addressable byte strings;
720: that is,
721: as ordinary
722: .UX
723: file system files.
724: (A read or write request on such a file keeps consuming bytes until
725: satisfied, rather than being restricted to a single record.)
726: .PP
727: The peculiar requirements on sequential unformatted files
728: make it unlikely that they will ever be read or written by any means except Fortran I/O statements.
729: Each record is preceded and followed by
730: an integer containing the record's length in bytes.
731: .PP
732: The Fortran I/O system breaks sequential formatted files
733: into records while reading by using each newline
734: as a record separator.
735: The result of reading off the end of a record is undefined according to the Standard.
736: The I/O system is permissive and
737: treats the record as being extended by blanks.
738: On output,
739: the I/O system will write a newline at the end of each
740: record.
741: It is also possible for programs to write newlines
742: for themselves.
743: This is an error,
744: but the only effect will be that the single record
745: the user thought he wrote will be treated as
746: more than one record when being read or
747: backspaced over.
748: .NH 2
749: Portability Considerations
750: .PP
751: The Fortran I/O system uses only the facilities of the
752: standard C I/O library,
753: a widely available and fairly portable package,
754: with the following exceptions.
755: The I/O system needs to know whether a file
756: can be used for direct I/O,
757: and whether or not it is possible to backspace.
758: Both of these facilities are implemented
759: using the
760: .I fseek
761: routine,
762: so there is a routine
763: .I canseek
764: which determines if
765: .I fseek
766: will have the desired effect.
767: Combinations of the
768: \f(CWbackspace\fR, \f(CWwrite\fR, \f(CWendfile\fR, and
769: .CW close
770: statements may require that a file be shortened.
771: For efficiency, the \fIcopy\fR routine
772: that does this job uses the
773: .UX
774: system calls \fIcreat\fR, \fIread\fR, \fIwrite\fR, and \fIclose\fR.
775: Finally, to open write-only files, the I/O system must resort to the
776: \fIcreat\fR and \fIopen\fR system calls.
777: .NH 2
778: Pre-Connected Files and File Positions
779: .PP
780: Units 5, 6, and 0 are preconnected when the program starts.
781: Unit 5 is connected to the standard input,
782: unit 6 is connected to the standard output,
783: and unit 0 is connected to the standard error unit.
784: All are connected for sequential formatted I/O.
785: .PP
786: All the other units are also preconnected when execution
787: begins.
788: Unit
789: .I n
790: is connected to a file named \f(CWfort.\fIn\fR.
791: These files need not exist,
792: nor will they be created unless their units are used
793: without first executing an
794: .CW open .
795: The default connection is for sequential formatted I/O.
796: .PP
797: The Standard does not specify where a file which has been explicitly \f(CWopen\fRed
798: for sequential I/O is initially positioned.
799: Following common practice, the I/O system positions the file
800: at its beginning (and has done so for several years).
801: Originally it attempted to position the file
802: at the end, but this was a frequent source of confusion, and it
803: limited portability.
804: . \"In fact,
805: . \"the I/O system attempts to position the file at the end,
806: . \"so a
807: . \".B write
808: . \"will append to the file and a
809: . \".B read
810: . \"will result in an end-of-file indication.
811: . \"To position a file to its beginning,
812: . \"use a
813: . \".B rewind
814: . \"statement.
815: The preconnected units
816: 0, 5, and 6 are positioned as they come
817: from the program's parent process.
818: .NH
819: References
820: .LP
821: |reference_placement
822: .NH
823: Appendix. Differences Between Fortran 66 and Fortran 77
824: .PP
825: The following is a very brief description of the differences
826: between the 1966 and the 1977 Standard languages.
827: We assume that the reader is familiar with Fortran 66.
828: We do not pretend to be complete, precise,
829: or unbiased,
830: but plan to describe what we feel are the most important aspects of the new language.
831: .NH 0
832: Features Deleted from Fortran 66
833: .NH 2
834: Hollerith
835: .PP
836: All notions of ``Hollerith''
837: (\fIn\|\f(CWh\fR)
838: as data
839: have been officially removed, although our compiler, like almost all in the foreseeable future,
840: will continue to support this archaism.
841: .NH 2
842: Extended Range
843: .PP
844: In Fortran 66, under a set of very restrictive and rarely understood conditions, it is permissible
845: to jump out of the range of a
846: .CW do
847: loop, then jump back into it.
848: Extended range has been removed in the Fortran 77 language.
849: The restrictions are so special, and the implementation of extended range is so unreliable in many compilers,
850: that this change really counts as no loss.
851: .NH 1
852: Program Form
853: .NH 2
854: Blank Lines
855: .PP
856: Completely blank lines are now legal comment lines.
857: .NH 2
858: Program and Block Data Statements
859: .PP
860: A main program may now begin with a statement that gives that program an external name:
861: .P1
862: program work
863: .P2
864: Block data procedures may also have names.
865: .P1
866: block data stuff
867: .P2
868: There is now a rule that only
869: .I one
870: unnamed
871: block data procedure may appear in a program.
872: (This rule is not enforced by our system.)
873: The Standard does not specify the effect of the program and block data names,
874: but they are clearly intended to aid conventional loaders.
875: .NH 2
876: ENTRY Statement
877: .PP
878: Multiple entry points are now legal.
879: Subroutine and function subprograms may have additional entry points,
880: declared by an
881: .CW entry
882: statement with an optional argument list.
883: .P1
884: entry extra(a, b, c)
885: .P2
886: Execution begins at the first statement following the
887: .CW entry
888: line.
889: All variable declarations must precede all executable statements in the procedure.
890: If the procedure begins with a
891: .CW subroutine
892: statement,
893: all entry points are subroutine names.
894: If it begins with a
895: .CW function
896: statement, each entry is a function entry point,
897: with type determined by the type declared for the entry name.
898: If any entry is a character-valued function,
899: then all entries must be.
900: In a function, an entry name of the same type as that where control entered
901: must be assigned a value.
902: Arguments do not retain their values between calls.
903: (The ancient trick of calling one entry point with a large number of arguments
904: to cause the procedure to ``remember'' the locations of those arguments,
905: then invoking an entry with just a few arguments for later calculation,
906: is still illegal.
907: Furthermore, the trick doesn't work in our implementation,
908: since arguments are not kept in static storage.)
909: .NH 2
910: \f(CWdo\fP Loops
911: .PP
912: .CW do
913: variables and range parameters may now be of integer, real, or double precision types.
914: (The use of floating point
915: .CW do
916: variables is very dangerous
917: because of the possibility of unexpected roundoff,
918: and we strongly recommend against their use).
919: The action of the
920: .CW do
921: statement is now defined for all values of the
922: .CW do
923: parameters.
924: The statement
925: .P1
926: do 10 i = l, u, d
927: .P2
928: performs one iteration if $l ~=~ u$ and
929: $ max (0^,^ left floor ( u - l ) / d^ right floor )$
930: iterations otherwise.
931: The
932: .CW do
933: variable has a predictable value when exiting a loop:
934: the value at the time a
935: .CW goto
936: or
937: .CW return
938: terminates the loop;
939: otherwise
940: the value that failed the limit test.
941: .NH 2
942: Alternate Returns
943: .PP
944: In a
945: .CW subroutine
946: or subroutine
947: .CW entry
948: statement,
949: some of the arguments may be noted by an asterisk, as in
950: .P1
951: subroutine s(a, \(**, b, \(**)
952: .P2
953: The meaning of the ``alternate returns'' is described in section 5.2 of the Appendix.
954: .NH 1
955: Declarations
956: .NH 2
957: \f(CWcharacter\fP Data Type
958: .PP
959: One of the biggest improvements to the language is the addition of a character-string data type.
960: Local and
961: common character variables must have a length denoted by a constant expression:
962: .P1
963: character\(**17 a, b(3,4)
964: character\(**(6+3) c
965: .P2
966: If the length is omitted entirely, it is assumed equal to 1.
967: A character string argument may have a constant length,
968: or the length may be declared to be the same as that of the corresponding actual argument at run time
969: by a statement like
970: .P1
971: character\(**(\(**) a
972: .P2
973: (There is an intrinsic function
974: .CW len
975: that returns the actual length of a character string).
976: Character arrays and common blocks containing character variables must be packed:
977: in an array of character variables, the first character of one element must follow the last character of
978: the preceding element, without holes.
979: .NH 2
980: \f(CWimplicit\fP Statement
981: .PP
982: The traditional implied declaration rules still hold:
983: a variable whose name begins with one of
984: .CW ijklmn
985: is of type
986: .CW integer .
987: Other variables are of type
988: .CW real
989: unless otherwise declared.
990: This general rule may be overridden with an
991: .CW implicit
992: statement:
993: .P1 0
994: implicit real(a-c,g), complex(w-z)
995: implicit character*(17) (s)
996: .P2
997: declares that variables whose name begins with one of
998: .CW abcg
999: are
1000: .CW real ;
1001: those beginning with
1002: .CW wxyz
1003: are assumed
1004: .CW complex ,
1005: and so on.
1006: It is still poor practice to depend on implicit typing,
1007: but this statement is an industry standard.
1008: .NH 2
1009: \f(CWparameter\fP Statement
1010: .PP
1011: It is now possible to give a constant a symbolic name, as in
1012: .P1 0
1013: parameter (pi=3.1415d0,y=pi/3,s='hello')
1014: .P2
1015: The type of each parameter name is governed by the same implicit and explicit rules as for a variable.
1016: The right side of each equal sign must be a constant expression
1017: (an expression made up of constants, operators, and already defined parameters).
1018: .NH 2
1019: Array Declarations
1020: .PP
1021: Arrays may now have as many as seven dimensions.
1022: (Only three were permitted in 1966).
1023: The lower bound of each dimension may be declared
1024: to be other than 1 by
1025: using a colon.
1026: Furthermore, an adjustable array bound may be an integer expression involving constants,
1027: arguments, and variables in
1028: .CW common .
1029: .P1 0
1030: real a(-5:3, 7, m:n), b(n+1:2\(**n)
1031: .P2
1032: The upper bound on the last dimension of an array argument may be denoted by an asterisk
1033: to indicate that the upper bound is not specified:
1034: .P1 0
1035: integer a(5, \(**), b(\(**), c(0:1, -2:\(**)
1036: .P2
1037: .NH 2
1038: \f(CWsave\fP Statement
1039: .PP
1040: A poorly known rule of Fortran 66 is that local variables in a procedure do not necessarily retain their values between
1041: invocations of that procedure.
1042: At any instant in the execution of a program,
1043: if a common block is declared neither in the currently executing procedure
1044: nor in any of the procedures in the chain of callers,
1045: all of the variables in that common block also become undefined.
1046: (The only exceptions are variables that have been defined in a
1047: .CW data
1048: statement and never changed).
1049: These rules permit overlay and stack implementations for the affected variables.
1050: Fortran 77 permits one to specify that certain variables and common blocks are to retain their
1051: values between invocations.
1052: The declaration
1053: .P1
1054: save a, /b/, c
1055: .P2
1056: leaves the values of the variables
1057: .CW a
1058: and
1059: .CW c
1060: and all of the contents of common block
1061: .CW b
1062: unaffected by a return.
1063: The simple declaration
1064: .P1
1065: save
1066: .P2
1067: has this effect on all variables and common blocks in the procedure.
1068: A common block must be
1069: .CW save d
1070: in every procedure in which it is declared if the desired effect is to occur.
1071: .NH 2
1072: \f(CWintrinsic\fP Statement
1073: .PP
1074: All of the functions specified in the Standard
1075: are in the single category ``intrinsic functions'',
1076: rather than being divided into ``intrinsic'' and ``basic external'' functions.
1077: If an intrinsic function is to be passed to another procedure, it must be declared
1078: .CW intrinsic .
1079: Declaring it
1080: .CW external
1081: (as in Fortran 66) causes a function other than the built-in one to be passed.
1082: .NH 1
1083: Expressions
1084: .NH 2
1085: Character Constants
1086: .PP
1087: Character string constants are marked by strings surrounded by apostrophes.
1088: If an apostrophe is to be included in a constant, it is repeated:
1089: .P1
1090: 'abc'
1091: 'ain''t'
1092: .P2
1093: There are no null (zero-length) character strings in Fortran 77.
1094: Our compiler has two different quotation marks,
1095: .CW '
1096: and
1097: .CW \" .
1098: (See Section 2.9 in the main text.)
1099: .NH 2
1100: Concatenation
1101: .PP
1102: One new operator has been added, character string concatenation, marked by a double slash
1103: .CW // .
1104: The result of a concatenation is the string containing the characters of the left operand followed by the characters of
1105: the right operand.
1106: The strings
1107: .P1
1108: 'ab' // 'cd'
1109: 'abcd'
1110: .P2
1111: are equal.
1112: The strings being concatenated must be of constant length in all concatenations
1113: that are not the right sides of assignments.
1114: (The only concatenation expressions in which a
1115: character string declared adjustable with a
1116: .CW *(*)
1117: modifier
1118: or a substring denotation with nonconstant position values may appear
1119: are the right sides of assignments).
1120: .NH 2
1121: Character String Assignment
1122: .PP
1123: The left and right sides of a character assignment may not share storage.
1124: (The assumed implementation of character assignment is to copy characters from the right to the left side.)
1125: If the left side is longer than the right, it is padded with blanks.
1126: If the left side is shorter than the right, trailing characters are discarded.
1127: .NH 2
1128: Substrings
1129: .PP
1130: It is possible to extract a substring of a character variable or character array element, using the colon notation:
1131: .P1
1132: a(i,\|j) (m:n)
1133: .P2
1134: is the string of $(n-m+1)$ characters beginning at the
1135: $m sup th$ character of the character array element $a sub ij$.
1136: Results are undefined unless $m<=n$.
1137: Substrings may be used on the left sides of assignments and as procedure actual arguments.
1138: .NH 2
1139: Exponentiation
1140: .PP
1141: It is now permissible to raise real quantities to complex powers,
1142: or complex quantities to real or complex powers.
1143: (The principal part of the logarithm is used).
1144: Also, multiple exponentiation is now defined:
1145: .P1
1146: a\(**\(**b\(**\(**c = a \(**\(** (b\(**\(**c)
1147: .P2
1148: .NH 2
1149: Relaxation of Restrictions
1150: .PP
1151: Mixed mode expressions are now permitted.
1152: (For instance,
1153: it is permissible to combine integer and complex quantities in an expression.)
1154: .PP
1155: Constant expressions are permitted where a constant is allowed,
1156: except in
1157: .CW data
1158: statements.
1159: (A constant expression is made up of explicit constants and
1160: .CW parameter s
1161: and the Fortran operators,
1162: except for exponentiation to a floating-point power).
1163: An adjustable dimension may now be an integer expression involving constants,
1164: arguments, and variables in
1165: .CW common .
1166: .PP
1167: Subscripts may now be general integer expressions;
1168: the old
1169: $c v +- c'$
1170: rules have been removed.
1171: .CW do
1172: loop bounds may be general integer, real, or double precision expressions.
1173: Computed
1174: .CW goto
1175: expressions and I/O unit numbers may be general integer expressions.
1176: .NH 1
1177: Executable Statements
1178: .NH 2
1179: Block If
1180: .PP
1181: At last, an
1182: if-then-else
1183: branching structure (``Block If'') has been added to Fortran.
1184: A Block If begins with a statement of the form
1185: .P1
1186: if ( . . . ) then
1187: .P2
1188: and ends with an
1189: .P1
1190: end if
1191: .P2
1192: statement.
1193: Two other new statements may appear in a Block If.
1194: There may be several
1195: .P1
1196: else if(. . .) then
1197: .P2
1198: statements,
1199: followed by at most one
1200: .P1
1201: else
1202: .P2
1203: statement.
1204: If the logical expression in the Block If statement is true,
1205: the statements following it up to the
1206: next
1207: .CW elseif ,
1208: .CW else ,
1209: or
1210: .CW endif
1211: are executed.
1212: Otherwise, the next
1213: .CW elseif
1214: statement in the group is executed.
1215: If none of the
1216: .CW elseif
1217: conditions are true, control passes to the statements following the
1218: .CW else
1219: statement, if any.
1220: (The
1221: .CW else
1222: must follow all
1223: .CW elseif s
1224: in a Block If.
1225: Of course, there may be Block Ifs embedded inside of other Block If structures).
1226: A case construct may be rendered
1227: .P1
1228: if (s .eq. 'ab') then
1229: . . .
1230: else if (s .eq. 'cd') then
1231: . . .
1232: else
1233: . . .
1234: end if
1235: .P2
1236: .NH 2
1237: Alternate Returns
1238: .PP
1239: Some of the arguments of a subroutine call may be statement labels preceded by an asterisk, as in
1240: .P1
1241: call joe(j, \(**10, m, \(**2)
1242: .P2
1243: A
1244: .CW return
1245: statement may have an integer expression, such as
1246: .P1
1247: return k
1248: .P2
1249: If the entry point has
1250: $n$
1251: alternate return (asterisk) arguments
1252: and if $1<=k<=n$, the return is followed by a branch to the corresponding statement label;
1253: otherwise the usual return to the statement following the
1254: .CW call
1255: is executed.
1256: .NH 1
1257: Input/Output
1258: .NH 2
1259: Format Variables
1260: .PP
1261: A format may be the value of a character expression (constant or otherwise),
1262: or be stored in a character array, as in
1263: .P1
1264: write(6, '(i5)') x
1265: .P2
1266: .NH 2
1267: \f(CWend=\fP, \f(CWerr=\fP, and \f(CWiostat=\fP Clauses
1268: .PP
1269: A
1270: .CW read
1271: or
1272: .CW write
1273: statement may contain
1274: .CW end= ,
1275: .CW err= ,
1276: and
1277: .CW iostat=
1278: clauses, as in
1279: .P1 0
1280: write(6, 101, err=20, iostat=a(4))
1281: read(5, 101, err=20, end=30, iostat=x)
1282: .P2
1283: Here 5 and 6 are the
1284: .I unit s
1285: on which the I/O is done,
1286: 101 is the statement number of the associated format,
1287: 20 and 30 are statement numbers,
1288: and
1289: .CW a
1290: and
1291: .CW x
1292: are integers.
1293: If an error occurs during I/O,
1294: control returns to the program at statement 20.
1295: If the end of the file is reached,
1296: control returns to the program at statement 30.
1297: In any case, the variable referred to in
1298: the
1299: .CW iostat=
1300: clause is given a value when
1301: the I/O statement finishes.
1302: (Yes, the value is assigned to the name on the right side of the equal sign.)
1303: This value is zero if all went well,
1304: negative for end of file,
1305: and some positive value for errors.
1306: .NH 2
1307: Formatted I/O
1308: .NH 3
1309: Character Constants
1310: .PP
1311: Character constants in formats are copied literally to the output.
1312: Character constants cannot be read into.
1313: .P1 0
1314: write(6,'(i2,'' isn''''t '',i1)') 7, 4
1315: .P2
1316: produces
1317: .P1
1318: 7 isn't 4
1319: .P2
1320: Here the format is the character constant
1321: .P1
1322: (i2,' isn''t ',i1)
1323: .P2
1324: and the character constant
1325: .P1
1326: isn't
1327: .P2
1328: is copied into the output.
1329: .NH 3
1330: Positional Editing Codes
1331: .PP
1332: .CW t ,
1333: .CW tl ,
1334: .CW tr ,
1335: and
1336: .CW x
1337: codes
1338: control where the
1339: next character is in the record.
1340: .CW tr\fIn
1341: or \fIn\f(CWx\fR
1342: specifies that the next character is
1343: $n$ to the right of the current position.
1344: .CW tl\fIn
1345: specifies that the next character is
1346: $n$ to the left of the current position,
1347: allowing parts of the record to be reconsidered.
1348: .CW t\fIn
1349: says that the next character is to be character
1350: number $n$ in the record.
1351: (See section 3.2 in the main text.)
1352: .NH 3
1353: Colon
1354: .PP
1355: A colon in the format terminates the I/O operation
1356: if there are no more data items in the I/O list,
1357: otherwise it has no effect.
1358: In the fragment
1359: .P1
1360: x='("hello", :, " there", i4)'
1361: write(6, x) 12
1362: write(6, x)
1363: .P2
1364: the first
1365: .CW write
1366: statement prints
1367: .CW "hello there 12" ,
1368: while the second only prints
1369: .CW hello .
1370: .NH 3
1371: Optional Plus Signs
1372: .PP
1373: According to the Standard,
1374: each implementation has the option of putting
1375: plus signs in front of non-negative
1376: numeric output.
1377: The
1378: .CW sp
1379: format code may be used to make the optional plus
1380: signs actually appear for all subsequent items
1381: while the format is active.
1382: The
1383: .CW ss
1384: format code guarantees that the I/O system will not
1385: insert the optional plus signs,
1386: and the
1387: .CW s
1388: format code restores the default behavior of
1389: the I/O system.
1390: (Since we never put out optional plus signs,
1391: .CW ss
1392: and
1393: .CW s
1394: codes have the same effect in our implementation.)
1395: .NH 3
1396: Blanks on Input
1397: .PP
1398: Blanks in numeric input fields,
1399: other than leading blanks
1400: will be ignored following a
1401: .CW bn
1402: code in a format
1403: statement,
1404: and will be treated as zeros following a
1405: .CW bz
1406: code in a format statement.
1407: The default for a unit may be changed by using
1408: the
1409: .CW open
1410: statement.
1411: (Blanks are ignored by default.)
1412: .NH 3
1413: Unrepresentable Values
1414: .PP
1415: The Standard requires that if a numeric item
1416: cannot be represented in the form required by a format code,
1417: the output field must be filled with asterisks.
1418: (We think this should have been an option.)
1419: .NH 3
1420: \f(CWI\fIw.m\fR Format
1421: .PP
1422: There is a new integer output code
1423: .CW i\fIw.m
1424: which is the same as
1425: .CW i\fIw ,
1426: except that there will be at least $m$
1427: digits in the output field,
1428: including,
1429: if necessary,
1430: leading zeros.
1431: The case
1432: .CW i\fIw\fP.0
1433: is special,
1434: in that if the value being printed is 0,
1435: the output field is
1436: entirely blank.
1437: .CW i\fIw\fP.1
1438: is the same as
1439: .CW i\fIw .
1440: .NH 3
1441: Floating Point
1442: .PP
1443: On input, exponents may start with one of
1444: .CW EeDd .
1445: All have the same meaning.
1446: On output we always use
1447: .CW E .
1448: The
1449: .CW e
1450: and
1451: .CW d
1452: format codes also have identical meanings.
1453: A leading zero before the decimal point in
1454: .CW e
1455: output
1456: without a scale factor is optional with the
1457: implementation.
1458: (We do not print it.)
1459: There is a
1460: .CW g\fIw.d
1461: format code which is the same as
1462: .CW e\fIw.d
1463: and
1464: .CW f\fIw.d
1465: on input,
1466: but which chooses
1467: .CW f
1468: or
1469: .CW e
1470: formats for output depending
1471: on the size of the number and of $d$.
1472: .NH 3
1473: \f(CWa\fP Format
1474: .PP
1475: A codes are used for character values.
1476: .CW a\fIw
1477: use a field width of $w$,
1478: while a plain
1479: .CW a
1480: uses the length of the character item.
1481: .NH 2
1482: Standard Units
1483: .PP
1484: There are default formatted input and output units.
1485: The statement
1486: .P1
1487: read 10, a, b
1488: .P2
1489: reads from the standard unit using format statement 10.
1490: The default unit may be explicitly specified by an asterisk, as in
1491: .P1
1492: read(*, 10) a,b
1493: .P2
1494: Similarly, the standard output units is specified by a
1495: .CW print
1496: statement or an asterisk unit:
1497: .P1
1498: print 10
1499: write(*, 10)
1500: .P2
1501: .NH 2
1502: List-Directed Formatting
1503: .PP
1504: List-directed I/O is a
1505: kind of free form input for sequential I/O.
1506: It is invoked by using an asterisk as the
1507: format identifier, as in
1508: .P1
1509: read(6, *) a,b,c
1510: .P2
1511: .PP
1512: On input,
1513: values are separated by strings of blanks
1514: and possibly a comma.
1515: Values,
1516: except for character strings,
1517: cannot contain blanks.
1518: End of record counts as a blank,
1519: except in character strings,
1520: where it is ignored.
1521: Complex constants are given as two real constants
1522: separated by a comma and enclosed in parentheses.
1523: A null input field,
1524: such as between two consecutive commas,
1525: means the corresponding variable in the
1526: I/O list is not changed.
1527: Values may be preceded by repetition counts,
1528: as in
1529: .P1
1530: 4*(3.,2.) 2*, 4*'hello'
1531: .P2
1532: which stands for 4 complex constants, 2 null values,
1533: and 4 string constants.
1534: .PP
1535: For output, suitable formats are chosen for
1536: each item.
1537: The values of character strings are printed;
1538: they are not enclosed in quotes, so they cannot be read back
1539: using list-directed input.
1540: .NH 2
1541: Direct I/O
1542: .PP
1543: A file connected for direct access consists of
1544: a set of equal-sized records each of which is
1545: uniquely identified by a positive integer.
1546: The records may be written or read in any order,
1547: using direct access I/O statements.
1548: .PP
1549: Direct access
1550: .CW read
1551: and
1552: .CW write
1553: statements
1554: have an extra argument,
1555: .CW rec=,
1556: which gives the record number to be read or written.
1557: .P1 0
1558: read(2, rec=13, err=20) (a(i), i=1, 203)
1559: .P2
1560: reads the thirteenth record into the array
1561: .CW a.
1562: .PP
1563: The size of the records must be given by an
1564: .CW open
1565: statement
1566: (see below).
1567: Direct access files may be connected for either formatted
1568: or unformatted I/O.
1569: .NH 2
1570: Internal Files
1571: .PP
1572: Internal files are character string objects,
1573: such as variables or substrings,
1574: or arrays of type character.
1575: In the former cases there is only a single record
1576: in the file,
1577: in the latter case each array element is a record.
1578: The Standard includes only sequential
1579: formatted I/O on internal files.
1580: (I/O is not a very precise term to use here,
1581: but internal files are dealt with using
1582: .CW read
1583: and
1584: .CW write ).
1585: There is no list-directed I/O on internal files.
1586: Internal files are used by giving the name of the
1587: character object in place of the unit number, as in
1588: .P1
1589: character\(**80 x
1590: read(5,"(a)") x
1591: read(x,"(i3,i4)") n1,n2
1592: .P2
1593: which reads a card image into
1594: .CW x
1595: and then reads
1596: two integers from the front of it.
1597: A sequential
1598: .CW read
1599: or
1600: .CW write
1601: always starts at the beginning
1602: of an internal file.
1603: .PP
1604: (We also support a compatible extension, direct I/O on internal files.
1605: This is like direct I/O on external files,
1606: except that the number of records in the file cannot be
1607: changed.)
1608: .NH 2
1609: File Control Statements
1610: .PP
1611: These statements are used to connect and disconnect
1612: units and files,
1613: and to gather information about units and files.
1614: .NH 3
1615: \f(CWopen\fP Statement
1616: .PP
1617: The
1618: .CW open
1619: statement is used to connect a file with a
1620: unit,
1621: or to alter some properties of the connection.
1622: The following is a minimal example.
1623: .P1
1624: open(1, file='fort.junk')
1625: .P2
1626: .CW open
1627: takes a variety of arguments with meanings described below.
1628: .RS
1629: . \" macros here
1630: .EQ
1631: delim off
1632: .EN
1633: .de HP
1634: .RT
1635: .if !\\(IP .nr IP +1
1636: .sp \\n(PDu
1637: .ne 3v
1638: .in +\\n(PIu
1639: .ti -\\n(PIu
1640: \f(CW\\$1\fR\ \c
1641: ..
1642: .de TH
1643: .RT
1644: .sp \\n(PDu
1645: .ne 3v
1646: \f(CW\\$1\\$2\\$3\\$4\\$5\\$6\fR\ \c
1647: ..
1648: . \" end of macros
1649: .EQ
1650: delim $$
1651: .EN
1652: .HP unit=
1653: a small non-negative integer which is the unit to
1654: which the file is to be connected.
1655: We allow,
1656: at the time of this writing,
1657: 0 through 99.
1658: If this parameter is the first one in the
1659: .CW open
1660: statement,
1661: the
1662: .CW unit=
1663: can be omitted.
1664: .HP iostat=
1665: is the same as in
1666: .CW read
1667: or
1668: .CW write.
1669: .HP err=
1670: is the same as in
1671: .CW read
1672: or
1673: .CW write.
1674: .HP file=
1675: a character expression,
1676: which when stripped of trailing blanks,
1677: is the name of the file to be connected to the unit.
1678: The filename should not be given if the
1679: .CW status='scratch' .
1680: .HP status=
1681: one of
1682: .CW 'old' ,
1683: .CW 'new' ,
1684: .CW 'scratch' ,
1685: or
1686: .CW 'unknown' .
1687: If this parameter is not given,
1688: .CW 'unknown'
1689: is assumed.
1690: If
1691: .CW 'scratch'
1692: is given,
1693: a temporary file will be created.
1694: Temporary files are destroyed at the end of execution.
1695: If
1696: .CW 'new'
1697: is given,
1698: the file will be created if it doesn't exist,
1699: or truncated if it does.
1700: The meaning of
1701: .CW 'unknown'
1702: is processor dependent;
1703: our system complains if an
1704: .CW 'old'
1705: file does not exist,
1706: and creates a nonexistent file
1707: if it is
1708: .CW 'unknown' .
1709: .HP access=
1710: .CW 'sequential'
1711: or
1712: .CW 'direct' ,
1713: depending on whether the file is
1714: to be opened for sequential or direct I/O.
1715: .HP form=
1716: .CW 'formatted'
1717: or
1718: .CW 'unformatted' .
1719: .HP recl=
1720: a positive integer specifying the record length of
1721: the direct access file being opened.
1722: We measure all record lengths in bytes.
1723: On
1724: .UX
1725: systems a record length of 1 has the special meaning explained
1726: in section 5.1 of the text.
1727: .HP blank=
1728: .CW 'null'
1729: or
1730: .CW 'zero' .
1731: This parameter has meaning only for formatted I/O.
1732: The default value is
1733: .CW 'null' .
1734: .CW 'zero'
1735: means that blanks,
1736: other than leading blanks,
1737: in numeric input fields are to be treated as zeros.
1738: .RE
1739: .PP
1740: Opening a new file on a unit which is already connected
1741: has the effect of first closing the old file.
1742: .NH 3
1743: \f(CWclose\fP Statement
1744: .PP
1745: .CW close
1746: severs the connection between a unit and a file.
1747: The unit number must be given.
1748: The optional parameters are
1749: .CW iostat=
1750: and
1751: .CW err=
1752: with
1753: their usual meanings,
1754: and
1755: .CW status=
1756: either
1757: .CW 'keep'
1758: or
1759: .CW 'delete' .
1760: Scratch files cannot be kept,
1761: otherwise
1762: .CW 'keep'
1763: is the default.
1764: .CW 'delete'
1765: means the file will be removed.
1766: A simple example is
1767: .P1
1768: close(3, err=17)
1769: .P2
1770: .NH 3
1771: \f(CWinquire\fP Statement
1772: .PP
1773: The
1774: .CW inquire
1775: statement gives information about
1776: a unit
1777: (``inquire by unit'')
1778: or a file (``inquire by file'').
1779: Simple examples are:
1780: .P1 0
1781: inquire(unit=3, namexx)
1782: inquire(file='junk', number=n, exist=l)
1783: .P2
1784: .RS
1785: .HP file=
1786: a character variable specifies the file the
1787: .CW inquire
1788: is about.
1789: Trailing blanks in the file name are ignored.
1790: .HP unit=
1791: an integer variable specifies the unit the
1792: .CW inquire
1793: is about.
1794: Exactly one of
1795: .CW file=
1796: or
1797: .CW unit=
1798: must be used.
1799: .HP "iostat=, err="
1800: are as before.
1801: .HP exist=
1802: a logical variable.
1803: The logical variable is set to
1804: .CW ".true."
1805: if the file or unit
1806: exists and is set to
1807: .CW ".false."
1808: otherwise.
1809: .HP opened=
1810: a logical variable.
1811: The logical variable is set to
1812: .CW ".true."
1813: if the file
1814: is connected to a unit or if the unit is connected
1815: to a file,
1816: and it is set to
1817: .CW ".false."
1818: otherwise.
1819: .HP number=
1820: an integer variable to which is assigned the
1821: number of the unit connected to the file,
1822: if any.
1823: .HP named=
1824: a logical variable to which is assigned
1825: .CW ".true."
1826: if the file has a name, or
1827: .CW ".false."
1828: otherwise.
1829: .HP name=
1830: a character variable to which is assigned the name
1831: of the file (inquire by file) or, if known, the name of the
1832: file connected to the unit (inquire by unit).
1833: .HP access=
1834: a character variable to which will be assigned
1835: the value
1836: .CW 'sequential'
1837: if the connection is for
1838: sequential I/O,
1839: .CW 'direct'
1840: if the connection is for direct I/O.
1841: The value becomes undefined if there is no connection.
1842: .HP sequential=
1843: a character variable to which is assigned the
1844: value
1845: .CW 'yes'
1846: if the file could be connected for
1847: sequential I/O,
1848: .CW 'no'
1849: if the file could not be connected for sequential I/O,
1850: and
1851: .CW 'unknown'
1852: if we can't tell.
1853: .HP direct=
1854: a character variable to which is assigned the value
1855: .CW 'yes'
1856: if the file could be connected for direct I/O,
1857: .CW'no'
1858: if the file could not be connected for direct
1859: I/O,
1860: and
1861: .CW 'unknown'
1862: if we can't tell.
1863: .HP form=
1864: a character variable to which is assigned the value
1865: .CW 'formatted'
1866: if the file is connected for formatted I/O,
1867: or
1868: .CW 'unformatted'
1869: if the file is connected for unformatted
1870: I/O.
1871: .HP formatted=
1872: a character variable to which is assigned the value
1873: .CW 'yes'
1874: if the file could be connected for formatted I/O,
1875: .CW 'no'
1876: if the file could not be connected for formatted I/O,
1877: and
1878: .CW 'unknown'
1879: if we can't tell.
1880: .HP unformatted=
1881: a character variable to which is assigned the value
1882: .CW 'yes'
1883: if
1884: the file could be connected for unformatted I/O,
1885: .CW 'no'
1886: if the file could not be connected for unformatted I/O,
1887: and
1888: .CW 'unknown'
1889: if we can't tell.
1890: .HP recl=
1891: an integer variable to which is assigned the record length
1892: of the records in the file if the file is connected
1893: for direct access.
1894: .HP nextrec=
1895: an integer variable to which is assigned one more
1896: than the number of the last record read from a file connected
1897: for direct access.
1898: .HP blank=
1899: a character variable to which is assigned the value
1900: .CW 'null'
1901: if null blank control is in effect for the file
1902: connected for formatted I/O,
1903: .CW 'zero'
1904: if blanks are being converted to zeros and
1905: the file is connected for formatted I/O.
1906: .RE
1907: .PP
1908: The gentle reader
1909: will remember that the people who wrote the standard
1910: probably weren't thinking of his needs.
1911: Here is an example.
1912: The declarations are omitted.
1913: .P1
1914: open(1, file="/dev/console")
1915: .P2
1916: On a
1917: .UX
1918: system this statement opens the console for formatted sequential
1919: I/O.
1920: An
1921: .CW inquire
1922: statement for either unit 1 or file
1923: .CW "/dev/console"
1924: would reveal that the file exists, is connected to unit 1,
1925: has a name, namely
1926: .CW "/dev/console" ,
1927: is opened for sequential I/O,
1928: could be connected for sequential I/O,
1929: could not be connected for direct I/O (can't seek),
1930: is connected for formatted I/O,
1931: could be connected for formatted I/O,
1932: could not be connected for unformatted I/O
1933: (can't seek),
1934: has neither a record length nor a next record number,
1935: and is ignoring blanks in numeric fields.
1936: .PP
1937: In the
1938: .UX
1939: system environment,
1940: the only way to discover what permissions you have
1941: for a file is to open it and try to read and write it.
1942: The
1943: .CW err=
1944: parameter will return system error numbers.
1945: The
1946: .CW inquire
1947: statement does not give a way of determining permissions.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.