|
|
1.1 ! root 1: . \" this is the same as /usr/doc/f77/f77IO.ms, 4.3 version ! 2: . \" I/O errors split into "help f77 io_err_msgs" ! 3: . \" LOTS of other formatting changes to get this to work. ! 4: .de UX ! 5: UNIX ! 6: .. ! 7: . \" .I and .B - put in quotes instead of bold and italic ! 8: .de B ! 9: \&\'\\$1\'\\$2 ! 10: .. ! 11: .de I ! 12: \&\'\\$1\' ! 13: .. ! 14: . \" Sm - in original, made it smaller ! 15: .de Sm ! 16: \\$1 ! 17: .. ! 18: .de Nh ! 19: .NH \\$1 ! 20: \\$2 ! 21: .PP ! 22: .. ! 23: . \" NH - numbered header - borrowed from -ms ! 24: .de NH ! 25: .SH ! 26: .nr NS \\$1 ! 27: .if !\\n(.$ .nr NS 1 ! 28: .if !\\n(NS .nr NS 1 ! 29: .nr H\\n(NS +1 ! 30: .if !\\n(NS-4 .nr H5 0 ! 31: .if !\\n(NS-3 .nr H4 0 ! 32: .if !\\n(NS-2 .nr H3 0 ! 33: .if !\\n(NS-1 .nr H2 0 ! 34: .if !\\$1 .if \\n(.$ .nr H1 1 ! 35: .ds SN \\n(H1. ! 36: .if \\n(NS-1 .as SN \\n(H2. ! 37: .if \\n(NS-2 .as SN \\n(H3. ! 38: .if \\n(NS-3 .as SN \\n(H4. ! 39: .if \\n(NS-4 .as SN \\n(H5. ! 40: \\*(SN ! 41: .. ! 42: .de Fo ! 43: Fortran\\$1 ! 44: .. ! 45: .TI F77/IO_DETAILS "June 15, 1985" ! 46: Introduction to the f77 I/O Library ! 47: .na ! 48: .ce ! 49: David L. Wasley ! 50: .PP ! 51: The f77 I/O library, libI77.a, ! 52: includes routines to perform all of the standard types of ! 53: .Fo ! 54: input and output. ! 55: Several enhancements and extensions to ! 56: .Fo ! 57: I/O have been added. ! 58: The f77 library routines use the C stdio library routines to provide ! 59: efficient buffering for file I/O. ! 60: .sp 1 ! 61: .Nh 1 "Fortran I/O" ! 62: The requirements of the ! 63: .Sm ANSI ! 64: standard impose significant overhead ! 65: on programs that do large amounts of I/O. Formatted I/O can be ! 66: very ``expensive'' while direct access binary I/O is usually very efficient. ! 67: Because of the complexity of ! 68: .Fo ! 69: I/O, ! 70: some general concepts deserve clarification. ! 71: .Nh 2 "Types of I/O" ! 72: There are three forms of I/O: ! 73: .B formatted , ! 74: .B unformatted , ! 75: and ! 76: .B list-directed . ! 77: The last is ! 78: related to formatted but does not obey all the rules for formatted I/O. ! 79: There are two modes of access to ! 80: .B external ! 81: and ! 82: .B internal ! 83: files: ! 84: .B direct ! 85: and ! 86: .B sequential . ! 87: The definition of a logical record depends upon the ! 88: combination of I/O form and mode specified by the ! 89: .Fo ! 90: I/O statement. ! 91: .Nh 3 "Direct access" ! 92: A logical record in a ! 93: .B direct ! 94: access ! 95: .B external ! 96: file is a string of bytes ! 97: of a length specified when the file is opened. ! 98: Read and write statements must not specify logical records longer than ! 99: the original record size definition. Shorter logical records are allowed. ! 100: .B Unformatted ! 101: direct writes leave the unfilled part of the record undefined. ! 102: .B Formatted ! 103: direct writes cause the unfilled record to be padded with blanks. ! 104: .Nh 3 "Sequential access" ! 105: Logical records in ! 106: .B sequentially ! 107: accessed ! 108: .B external ! 109: files may be of arbitrary ! 110: and variable length. ! 111: Logical record length for ! 112: .B unformatted ! 113: sequential files is determined by ! 114: the size of items in the iolist. ! 115: The requirements of this form of I/O cause the external physical ! 116: record size to be somewhat larger than the logical record size. ! 117: For ! 118: .B formatted ! 119: write statements, logical record length is determined by ! 120: the format statement interacting with the iolist at execution time. ! 121: The ``newline'' character is the logical record delimiter. ! 122: Formatted sequential access causes one or more logical records ! 123: ending with ``newline'' characters to be read or written. ! 124: .Nh 3 "List directed I/O" ! 125: Logical record length for ! 126: .B list-directed ! 127: I/O is relatively meaningless. ! 128: On output, the record length is dependent on the magnitude of the ! 129: data items. ! 130: On input, the record length is determined by the data types and the file ! 131: contents. ! 132: By ANSI definition, a slash, ``/'', terminates execution of a ! 133: list-directed input operation. ! 134: .Nh 3 "Internal I/O" ! 135: The logical record length for an ! 136: .B internal ! 137: read or write is the length of the ! 138: character variable or array element. Thus a simple character variable ! 139: is a single logical record. A character variable array is similar to ! 140: a fixed length direct access file, and obeys the same rules. ! 141: .B Unformatted ! 142: I/O is not allowed on "internal" files. ! 143: .Nh 2 "I/O execution" ! 144: Note that each execution of a ! 145: .Fo ! 146: .B unformatted ! 147: I/O statement causes a single ! 148: logical record to be read or written. Each execution of a ! 149: .Fo ! 150: .B formatted ! 151: I/O statement causes one or more logical records to be read or written. ! 152: .PP ! 153: A slash, ``/'', will terminate assignment of ! 154: values to the input list during ! 155: .B list-directed ! 156: input and the remainder of the current input line is skipped. ! 157: The standard is rather vague on this point but seems to require that ! 158: a new external logical record be found at the start of any formatted ! 159: input. Therefore data following the slash is ignored and may be used ! 160: to comment the data file. ! 161: .PP ! 162: .B "Direct access list-directed" ! 163: I/O is not allowed. ! 164: .B "Unformatted internal" ! 165: I/O is not allowed. ! 166: Both the above will be caught by the compiler. ! 167: All other flavors of I/O are allowed, although some are not part of the ! 168: .Sm ANSI ! 169: standard. ! 170: .PP ! 171: Any I/O statement may include an ! 172: .B err= ! 173: clause to specify an alternative branch to be taken on errors ! 174: and/or an ! 175: .B iostat= ! 176: clause to return the specific error code. ! 177: Any error detected during I/O processing will cause the program to abort ! 178: unless either ! 179: .B err= ! 180: or ! 181: .B iostat= ! 182: has been specificed in the program. ! 183: Read statements may include ! 184: .B end= ! 185: to branch on end-of-file. ! 186: The end-of-file indication for that logical unit may be reset with a ! 187: .B backspace ! 188: statement. ! 189: File position and the value of I/O list items is undefined following an error. ! 190: .sp 1 ! 191: .Nh 1 "Implementation details" ! 192: Some details of the current implementation may be useful in understanding ! 193: constraints on ! 194: .Fo ! 195: I/O. ! 196: .Nh 2 "Number of logical units" ! 197: Unit numbers must be in the range 0 \- 99. ! 198: The maximum number of logical units that a program may have open at one ! 199: time is the same as the ! 200: .UX ! 201: system limit, currently 48. ! 202: .Nh 2 "Standard logical units" ! 203: By default, logical units 0, 5, and 6 ! 204: are opened to ``stderr'', ``stdin'', and ``stdout'' respectively. ! 205: However they can be re-defined with an ! 206: .B open ! 207: statement. ! 208: To preserve error reporting, it is an error to close logical unit 0 ! 209: although it may be reopened to another file. ! 210: .PP ! 211: If you want to open the default file name for any preconnected logical unit, ! 212: remember to ! 213: .B close ! 214: the unit first. ! 215: Redefining the standard units may impair normal console I/O. ! 216: An alternative is to ! 217: use shell re-direction to externally re-define the above units. ! 218: To re-define default blank control or format of the standard input or output ! 219: files, use the ! 220: .B open ! 221: statement specifying the unit number and no ! 222: file name (see section 2.4). ! 223: .PP ! 224: The standard units, 0, 5, and 6, are named internally ``stderr'', ``stdin'', ! 225: and ``stdout'' respectively. ! 226: These are not actual file names and can not be used for opening these units. ! 227: .B Inquire ! 228: will not return these names and will indicate ! 229: that the above units are not named unless they have been opened to real files. ! 230: The names are meant to make error reporting more meaningful. ! 231: .Nh 2 "Vertical format control" ! 232: Simple vertical format control is implemented. The logical unit must be opened ! 233: for sequential access with "form = 'print'" ! 234: (see section 3.2). ! 235: Control codes ``0'' and ``1'' are replaced in the output file ! 236: with ``\\n'' and ``\\f'' respectively. ! 237: The control character ``+'' is not implemented and, like ! 238: any other character in the first position of a record ! 239: written to a ``print'' file, is dropped. ! 240: .PP ! 241: An alternative is to use ! 242: the filter 'fpr'(1) for vertical format control. ! 243: It replaces ``0'' and ``1'' by ! 244: ``\\n'' and ``\\f'' respectively, and implements the ``+'' control code. ! 245: Unlike "form = 'print'" ! 246: which drops unrecognized form control characters, 'fpr' copies those ! 247: characters to the output file. ! 248: .PP ! 249: No vertical format control is recognized for ! 250: .B "direct formatted" ! 251: output or ! 252: .B "list directed" ! 253: output. ! 254: .Nh 2 "File names and the open statement" ! 255: A file name may be specified in an ! 256: .B open ! 257: statement for the ! 258: logical unit. ! 259: If a logical unit is opened by an ! 260: .B open ! 261: statement which does ! 262: not specify a file name, or it is opened implicitly by the execution ! 263: of a ! 264: .B read , ! 265: .B write , ! 266: .B backspace ! 267: or ! 268: .B rewind ! 269: statement, then the default file name is ``fort.N'' where N is ! 270: the logical unit number. ! 271: Before opening the file, the library checks for an environment ! 272: variable with a name identical to the tail of the ! 273: file name with periods removed. ! 274: If it finds such an environment variable, it uses its value ! 275: as the actual name of the file. ! 276: For example, a program containing: ! 277: .nf ! 278: ! 279: open(32,file="/usr/guest/census/data.d") ! 280: read(32,100) vec ! 281: write(44) vec ! 282: ! 283: .fi ! 284: normally will read from '/usr/guest/census/data.d' and write to ! 285: .B fort.44 ! 286: in the current directory. ! 287: If the environment variables 'datad' and 'fort44' are set, ! 288: e.g.: ! 289: .nf ! 290: ! 291: % setenv datad mydata ! 292: % setenv fort44 myout ! 293: ! 294: .fi ! 295: in the C shell or: ! 296: .nf ! 297: ! 298: $ datad=mydata ! 299: $ fort44=myout ! 300: $ export datad fort44 ! 301: ! 302: .fi ! 303: in the Bourne shell, then the program will read from 'mydata' and ! 304: write to 'myout'. ! 305: .PP ! 306: An ! 307: .B open ! 308: statement need not specify a file name. If it refers to a logical ! 309: unit that is already open, the ! 310: .B blank= ! 311: and ! 312: .B form= ! 313: specifiers may be ! 314: redefined without affecting the current file position. ! 315: Otherwise, if 'status = "scratch"' ! 316: is specified, a temporary file with a ! 317: name of the form ``tmp.FXXXXXX'' will be opened, ! 318: and, by default, will be deleted when closed or during ! 319: termination of program execution. ! 320: .PP ! 321: It is an error to try to open an existing file with 'status = "new"'. ! 322: It is an error to try to open a nonexistent file with 'status = "old"'. ! 323: By default, 'status = "unknown"' ! 324: will be assumed, and a file will be created if necessary. ! 325: .PP ! 326: By default, files are positioned ! 327: at their beginning upon opening, but see 'fseek'(3f) ! 328: and 'ioinit'(3f) for alternatives. ! 329: Existing files are never truncated on opening. ! 330: Sequentially accessed external files are truncated to the current file ! 331: position on ! 332: .B close , ! 333: .B backspace ! 334: , or ! 335: .B rewind ! 336: only if the last ! 337: access to the file was a write. ! 338: An ! 339: .B endfile ! 340: always causes such files to be truncated to the current ! 341: file position. ! 342: .Nh 2 "Format interpretation" ! 343: Formats which are in format statements are parsed by the compiler; ! 344: formats in ! 345: .B read , ! 346: .B write ! 347: , and ! 348: .B print ! 349: statements ! 350: are parsed during execution by the ! 351: .Sm I/O ! 352: library. ! 353: Upper as well as lower case characters are recognized in format statements ! 354: and all the alphabetic arguments to the I/O library routines. ! 355: .PP ! 356: If the external representation of a datum ! 357: is too large for the field width specified, the specified ! 358: field is filled with asterisks (\(**). ! 359: On ! 360: .B Ew.dEe ! 361: output, ! 362: the exponent field will be filled with asterisks if the ! 363: exponent representation is too large. ! 364: This will only happen if ``e'' is zero. ! 365: .PP ! 366: On output, a real value that is truly zero will display as ``0.'' to ! 367: distinguish it from a very small non-zero value. ! 368: If this causes problems for other input systems, the ! 369: .B BZ ! 370: edit descriptor may be used to cause the field ! 371: following the decimal point to be filled with zero's. ! 372: .PP ! 373: Non-destructive tabbing is implemented for both internal and external ! 374: formatted I/O. ! 375: Tabbing left or right on output ! 376: does not affect previously written portions of a record. ! 377: Tabbing right on output ! 378: causes unwritten portions of a record to be filled with blanks. ! 379: Tabbing right off the end of an input logical record is an error. ! 380: Tabbing left beyond the beginning of an input logical record leaves ! 381: the input pointer at the beginning of the record. ! 382: The format specifier ! 383: .B T ! 384: must be followed by a positive non-zero number. ! 385: If it is not, it will have a different meaning (see section 3.1). ! 386: .PP ! 387: Tabbing left requires seek ability on the logical unit. ! 388: Therefore it is not allowed in I/O to a terminal or pipe. ! 389: Likewise, nondestructive tabbing in either direction is possible ! 390: only on a unit that can seek. Otherwise tabbing right or spacing with ! 391: .B X ! 392: will write blanks on the output. ! 393: .Nh 2 "List directed output" ! 394: In formatting list directed output, the I/O system tries to prevent ! 395: output lines longer than 80 characters. ! 396: Each external datum will be separated by two spaces. ! 397: List-directed output of ! 398: .B complex ! 399: values includes an appropriate comma. ! 400: List-directed output distinguishes between ! 401: .B real ! 402: and ! 403: .B "double precision" ! 404: values and formats them differently. ! 405: Output of a character string that includes ``\\n'' ! 406: is interpreted reasonably by the output system. ! 407: .Nh 2 "I/O errors" ! 408: If I/O errors are not trapped by the user's program an appropriate ! 409: error message will be written to ``stderr'' before aborting. ! 410: An error number will be printed in ``[ ]'' along with a brief error message ! 411: showing the logical unit and I/O state. ! 412: Error numbers < 100 refer to ! 413: .UX ! 414: errors, and are described in the ! 415: introduction to chapter 2 of the ! 416: .UX ! 417: Programmer's Manual. ! 418: Error numbers \(>= 100 come from the I/O library, and are described ! 419: on-line in "help f77 io_err_msgs". ! 420: For internal I/O, part of the string will be printed with ``|'' at the ! 421: current position in the string. ! 422: For external I/O, part of the current record will be displayed if ! 423: the error was caused during reading from a file that can backspace. ! 424: .sp 1 ! 425: .Nh 1 "Non-``ANSI Standard'' extensions" ! 426: Several extensions have been added to the I/O system to provide ! 427: for functions omitted or poorly defined in the standard. ! 428: Programmers should be aware that these are non-portable. ! 429: .Nh 2 "Format specifiers" ! 430: .B B ! 431: is an acceptable edit control specifier. It causes return to the ! 432: default mode of blank interpretation. ! 433: This is consistent with ! 434: .B S ! 435: which returns to default sign control. ! 436: .PP ! 437: .B P ! 438: by itself is equivalent to ! 439: .B 0P . ! 440: It resets the scale factor to the ! 441: default value, 0. ! 442: .PP ! 443: The form of the ! 444: .B Ew.dEe ! 445: format specifier has been extended to ! 446: .B D ! 447: also. ! 448: The form ! 449: .B Ew.d.e ! 450: is allowed but is not standard. ! 451: The ``e'' field specifies the minimum number of digits or spaces in the ! 452: exponent field on output. ! 453: If the value of the exponent is too large, the exponent notation ! 454: .B e ! 455: or ! 456: .B d ! 457: will be dropped from the output to allow one ! 458: more character position. ! 459: If this is still not adequate, the ``e'' field will be filled with ! 460: asterisks (\(**). ! 461: The default value for ``e'' is 2. ! 462: .PP ! 463: An additional form of tab control specification has been added. ! 464: The ! 465: .Sm ANSI ! 466: standard forms 'TRn', 'TLn', and 'Tn' are supported ! 467: where 'n' ! 468: is a positive non-zero number. ! 469: If 'T' or 'nT' is specified, tabbing will ! 470: be to the next (or n-th) 8-column tab stop. ! 471: Thus columns of alphanumerics can be lined up without counting. ! 472: .PP ! 473: A format control specifier has been added to suppress the newline ! 474: at the end of the last record of a formatted sequential write. The ! 475: specifier is a dollar sign ($). It is constrained by the same rules ! 476: as the colon (:). It is used typically for console prompts. ! 477: For example: ! 478: .nf ! 479: ! 480: write (\(**, "(\(fmenter value for x: \(fm,$)") ! 481: read (\(**,\(**) x ! 482: .fi ! 483: .PP ! 484: Radices other than 10 can be specified for formatted integer I/O ! 485: conversion. The specifier is patterned after ! 486: .B P , ! 487: the scale factor for ! 488: floating point conversion. It remains in effect until another radix is ! 489: specified or format interpretation is complete. The specifier is defined ! 490: as '[n]R' where 2 \(<= n \(<= 36. If ! 491: .I n ! 492: is omitted, ! 493: the default decimal radix is restored. ! 494: .PP ! 495: The format specifier 'Om.n' may be used for an octal conversion; ! 496: it is equivalent to '8R,Im.n,10R'. ! 497: Similarly, 'Zm.n' is equivalent to '16R,Im.n,10R' and ! 498: may be used for an hexadecimal conversion; ! 499: .PP ! 500: In conjunction with the above, a sign control specifier has been added ! 501: to cause integer values to be interpreted as unsigned during output ! 502: conversion. The specifier is ! 503: .B SU ! 504: and remains in effect until another ! 505: sign control specifier is encountered, or format interpretation is ! 506: complete. ! 507: Radix and ``unsigned'' specifiers could be used to format ! 508: a hexadecimal dump, as follows: ! 509: ! 510: .nf ! 511: 2000 format ( SU, 8Z10.8 ) ! 512: .fi ! 513: ! 514: (Note: Unsigned integer values greater than (2\(**\(**31 - 1), ! 515: can be read and written using \fBSU\fP. ! 516: However they can not be used in ! 517: computations because ! 518: .Fo ! 519: uses signed arithmetic and such values appear to the arithmetic unit ! 520: as negative numbers.) ! 521: .Nh 2 "Print files" ! 522: The ! 523: .Sm ANSI ! 524: standard is ambiguous regarding the definition of a ``print'' file. ! 525: Since ! 526: .UX ! 527: has no default ``print'' file, an additional ! 528: .B form= ! 529: specifier ! 530: is now recognized in the ! 531: .B open ! 532: statement. ! 533: Specifying ! 534: .B "form = \(fmprint\(fm" ! 535: implies ! 536: .B formatted ! 537: and enables vertical format ! 538: control for that logical unit (see section 2.3). ! 539: Vertical format control is interpreted only on sequential formatted writes ! 540: to a ``print'' file. ! 541: .PP ! 542: The ! 543: .B inquire ! 544: statement will return ! 545: .B print ! 546: in the ! 547: .B form= ! 548: string variable ! 549: for logical units opened as ``print'' files. ! 550: It will return -1 for the unit number of an unconnected file. ! 551: .PP ! 552: If a logical unit is already open, an ! 553: .B open ! 554: statement including the ! 555: .B form= ! 556: option or the ! 557: .B blank= ! 558: option will do nothing but re-define those options. ! 559: This instance of the ! 560: .B open ! 561: statement need not include the file name, and ! 562: must not include a file name if ! 563: .B unit= ! 564: refers to a standard input or output. ! 565: Therefore, to re-define the standard output as a ``print'' file, use: ! 566: .nf ! 567: ! 568: open (unit=6, form=\(fmprint\(fm) ! 569: .fi ! 570: .Nh 2 "Scratch files" ! 571: A ! 572: .B close ! 573: statement with 'status = "keep"' ! 574: may be specified for temporary files. ! 575: This is the default for all other files. ! 576: Remember to get the scratch file's real name, ! 577: using ! 578: .B inquire , ! 579: if you want to re-open it later. ! 580: .Nh 2 "List directed I/O" ! 581: List directed read has been modified to allow ! 582: tab characters wherever blanks are allowed. ! 583: It also allows input of a string not enclosed in quotes. ! 584: The string must not start with a digit or quote, ! 585: and can not contain any separators ( ``,'', ``/'', blank or tab ). ! 586: A newline will terminate the string unless escaped with \\. ! 587: Any string not meeting the above restrictions ! 588: must be enclosed in quotes (`` " '' or `` \(fm ''). ! 589: .PP ! 590: Internal list-directed I/O has been implemented. During internal list reads, ! 591: bytes are consumed until the iolist is satisfied, or the ``end-of-file'' ! 592: is reached. ! 593: During internal list writes, records are filled until the iolist is satisfied. ! 594: The length of an internal array element should be at least 20 bytes to ! 595: avoid logical record overflow when writing double precision values. ! 596: Internal list read was implemented to make command line decoding easier. ! 597: Internal list write should be avoided. ! 598: .sp 1 ! 599: .Nh 1 "Running older programs" ! 600: Traditional ! 601: .Fo ! 602: environments usually assume carriage control on all logical units, ! 603: usually interpret blank spaces on input as ``0''s, and often provide ! 604: attachment of global file names to logical units at run time. ! 605: There are several routines in the I/O library to provide these functions. ! 606: .Nh 2 "Traditional unit control parameters" ! 607: If a program reads and writes only units 5 and 6, then including ! 608: .B \-lI66 ! 609: in the f77 command will cause carriage control to be interpreted on ! 610: output and cause blanks to be zeros on input without further ! 611: modification of the program. ! 612: If this is not adequate, ! 613: the routine 'ioinit'(3f) can be called to specify control parameters ! 614: separately, including whether files should be positioned at their ! 615: beginning or end upon opening. ! 616: .Nh 2 "Ioinit()" ! 617: \&'Ioinit'(3f) can be used to attach logical units ! 618: to specific files at run time, and to set global parameters for the ! 619: .Sm I/O ! 620: system. ! 621: It will look for names of a user specified form in the environment ! 622: and open the corresponding logical unit for ! 623: .B "sequential formatted" ! 624: I/O. ! 625: Names must be of the form ! 626: .B PREFIXnn ! 627: where ! 628: .B PREFIX ! 629: is specified in the call to ! 630: .I ioinit ! 631: and ! 632: .I nn ! 633: is the logical unit to be opened. Unit numbers < 10 must include ! 634: the leading ``0''. ! 635: .PP ! 636: .I Ioinit ! 637: should prove adequate for most programs as written. ! 638: However, it ! 639: is written in ! 640: .Fo \-77 ! 641: specifically so that it may serve as an example for similar ! 642: user-supplied routines. ! 643: A copy may be retrieved by ``ar x /usr/lib/libU77.a ioinit.f''. ! 644: See section 2.4 for another way to override program file names ! 645: through environment variables. ! 646: .sp 1 ! 647: .Nh 1 "Magnetic tape I/O" ! 648: Because the I/O library uses stdio buffering, reading or writing ! 649: magnetic tapes should be done with great caution, or avoided if possible. ! 650: A set of routines has been provided to read and write arbitrary sized buffers ! 651: to or from tape directly. The buffer must be a ! 652: .B character ! 653: object. ! 654: .B Internal ! 655: I/O can be used to fill or interpret the buffer. ! 656: These routines do not use normal ! 657: .Fo ! 658: I/O processing and do not obey ! 659: .Fo ! 660: I/O rules. ! 661: See 'topen'(3f). ! 662: .sp 1 ! 663: .Nh 1 "Caveat Programmer" ! 664: The I/O library is extremely complex yet we believe there are few bugs left. ! 665: We've tried to make the system as correct as possible according to ! 666: the ! 667: .Sm ANSI ! 668: X3.9\-1978 document and keep it compatible with the ! 669: .UX ! 670: file system. ! 671: .LP ! 672: .ce 1 ! 673: Exceptions to the ANSI Standard ! 674: .sp 1 ! 675: .PP ! 676: A few exceptions to the ! 677: .Sm ANSI ! 678: standard remain. ! 679: .LP ! 680: 1) Vertical format control ! 681: .PP ! 682: The ``+'' carriage control specifier is not fully implemented ! 683: (see section 2.3). ! 684: It would be difficult to implement it correctly and still ! 685: provide ! 686: .UX -like ! 687: file I/O. ! 688: .PP ! 689: Furthermore, the carriage control implementation is asymmetrical. ! 690: A file written with carriage control interpretation can not be ! 691: read again with the same characters in column 1. ! 692: .PP ! 693: An alternative to interpreting carriage control internally is to ! 694: run the output file through a ``Fortran output filter'' ! 695: before printing. This filter could recognize a much broader range ! 696: of carriage control and include terminal dependent processing. ! 697: One such filter is 'fpr'(1). ! 698: .sp 1 ! 699: .LP ! 700: 2) Default files ! 701: .PP ! 702: Files created by default use of ! 703: .B rewind ! 704: or ! 705: .B endfile ! 706: statements are opened for ! 707: .B "sequential formatted" ! 708: access. There is no way to redefine such a file to allow ! 709: .B direct ! 710: or ! 711: .B unformatted ! 712: access. ! 713: .sp 1 ! 714: .LP ! 715: 3) Lower case strings ! 716: .PP ! 717: It is not clear if the ! 718: .Sm ANSI ! 719: standard requires internally generated strings to be upper case or not. ! 720: As currently written, the ! 721: .B inquire ! 722: statement will return lower case strings for any alphanumeric data. ! 723: .sp 1 ! 724: .LP ! 725: 4) Exponent representation on Ew.dEe output ! 726: .PP ! 727: If the field width for the exponent is too small, the standard ! 728: allows dropping the exponent character but only if the exponent ! 729: is > 99. This system does not enforce that restriction. ! 730: Further, the standard implies that the entire field, `w', should be ! 731: filled with asterisks if the exponent can not be displayed. ! 732: This system fills only the exponent field in the above case since ! 733: that is more diagnostic.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.