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