Annotation of cci/usr/src/usr.lib/libI77/writeup.tx, revision 1.1

1.1     ! root        1: .ND
        !             2: .nr ll 7.0i
        !             3: .nr LL 7.0i
        !             4: .po 0.0i
        !             5: .rm PT
        !             6: .rm BT
        !             7: .LP
        !             8: .TL
        !             9: Introduction to the f77 I/O Library
        !            10:  September 1980
        !            11: .PP
        !            12: The fortran-77 I/O library, libI77.a,
        !            13: includes routines to perform all of the standard types of
        !            14: FORTRAN input and output.
        !            15: Several enhancements and extensions to FORTRAN I/O have been added.
        !            16: The f77 library routines use the C stdio library routines to provide
        !            17: efficient buffering for file I/O.
        !            18: .PP
        !            19: Some general concepts regarding f77 I/O deserve clarification. There are three
        !            20: forms of I/O:
        !            21: .B formatted,
        !            22: .B unformatted,
        !            23: and
        !            24: .B list-directed.
        !            25: The last is
        !            26: related to formatted but does not obey all the rules for formatted I/O.
        !            27: There are two modes of access to
        !            28: .B external
        !            29: and
        !            30: .B internal
        !            31: files:
        !            32: .B direct
        !            33: and
        !            34: .B sequential.
        !            35: The definition of a logical record depends upon the
        !            36: combination of I/O form and mode specified by the fortran I/O statement.
        !            37: .PP
        !            38: A logical record in a
        !            39: .B direct
        !            40: access
        !            41: .B external
        !            42: file is a string of bytes
        !            43: of a length specified when the file is opened.
        !            44: Read and write statements must not specify logical records longer than
        !            45: the original record size definition. Shorter logical records are allowed.
        !            46: .I Unformatted
        !            47: direct writes leave the unfilled part of the record undefined.
        !            48: .I Formatted
        !            49: direct writes cause the unfilled record to be padded with blanks.
        !            50: .PP
        !            51: Logical records in
        !            52: .B sequentially
        !            53: accessed
        !            54: .B external
        !            55: files may be of arbitrary
        !            56: and variable length.
        !            57: Logical record length for
        !            58: .I unformatted
        !            59: sequential files is determined by
        !            60: the size of items in the iolist.
        !            61: For
        !            62: .I formatted
        !            63: write statements, logical record length is determined by
        !            64: the format statement interacting with the iolist at execution time.
        !            65: Formatted sequential access causes one or more logical records
        !            66: ending with 'newline' characters to be read or written.
        !            67: .PP
        !            68: Logical record length for
        !            69: .B list-directed
        !            70: I/O is relatively meaningless.
        !            71: On output, the record length is dependent on the magnitude of the
        !            72: data items.
        !            73: On input, the record length is determined by the data types and the file
        !            74: contents.
        !            75: .PP
        !            76: The logical record length for an
        !            77: .B internal
        !            78: read or write is the length of the
        !            79: character variable or array element. Thus a simple character variable
        !            80: is a single logical record. A character variable array is similar to
        !            81: a fixed length direct access file, and obeys the same rules.
        !            82: .I Unformatted
        !            83: I/O is not allowed on "internal" files.
        !            84: .PP
        !            85: Note that each execution of a fortran unformatted I/O statement causes a single
        !            86: logical record to be read or written. Each execution of a fortran formatted
        !            87: I/O statement causes one or more logical records to be read or written.
        !            88: .PP
        !            89: Any error detected during I/O processing will cause the program to abort
        !            90: unless alternate action has been provided for specifically in the program.
        !            91: Any I/O statement may include an err= clause (and iostat= clause)
        !            92: to specify an
        !            93: alternate branch to be taken on errors (and return the specific error code).
        !            94: Read statements may include end= to branch on end-of-file.
        !            95: File position and the value of I/O list items is undefined following an error.
        !            96: 
        !            97: I. Implementation details.
        !            98: .PP
        !            99: The maximum number of logical units that a program may have open at one
        !           100: time has been set to correspond with the UNIX system limit, currently 20.
        !           101: However, the I/O library uses UNIX file access for internal purposes.
        !           102: Therefore fatal errors are possible if the maximum number of files are open.
        !           103: Specifically, 'close' or 'endfile' on an old file,
        !           104: and "'inquire' by file" may fail.
        !           105: .PP
        !           106: Vertical format control is implemented. The logical unit must be opened
        !           107: for sequential access and "form = 'print'" (see below).
        !           108: Control codes '0' and '1' are replaced in the output file
        !           109: with '\\n' and '\\f' respectively.
        !           110: The control character '+' isn't implemented and, like
        !           111: any other character in the first position of a record
        !           112: written to a "print" file, is dropped.
        !           113: No vertical format control is recognized for direct formatted output
        !           114: or list directed output.
        !           115: .PP
        !           116: By default, logical units 0, 5, and 6
        !           117: are opened to ``stderr'', ``stdin'', and ``stdout'' respectively.
        !           118: However they can be re-defined with an 'open' statement.
        !           119: To preserve error reporting, it is an error to close logical unit 0.
        !           120: If you want to open the default filename for any preconnected logical unit,
        !           121: remember to 'close' the unit first.
        !           122: Redefining the standard units may impair normal console I/O.
        !           123: An alternative is to
        !           124: use shell re-direction to externally re-define the above units.
        !           125: To re-define default blank control or format of the standard input or output
        !           126: files, use the 'open' statement specifying the unit number and no
        !           127: filename (see below).
        !           128: .PP
        !           129: An 'open' statement need not specify a filename. If it refers to a logical
        !           130: unit that is already open, the "blank= " and "form= " specifiers may be
        !           131: redefined without affecting the current file position.
        !           132: Otherwise, if "status='scratch'" is specified, a temporary file with a
        !           133: name of the form 'tmp.FXXXXXX' will be opened,
        !           134: and, by default, will be deleted when closed or during
        !           135: termination of program execution.
        !           136: Any other "status= " specifier without an associated filename results in
        !           137: opening a file named 'fort.N' where N is the specified logical unit number.
        !           138: It is an error to try to open an existing file with "status='new'".
        !           139: It is an error to try to open a nonexistent file with "status='old'".
        !           140: By default "status='unknown'" will be assumed, and a file will be created
        !           141: if necessary.
        !           142: Existing files are never truncated on opening but are positioned
        !           143: at the end-of-file.
        !           144: .PP
        !           145: Sequentially accessed external files are truncated to the current file
        !           146: position on 'close', 'backspace', or 'rewind' only if the last
        !           147: access to the file was a write.
        !           148: .PP
        !           149: Upper as well as lower case characters are recognized in format statements
        !           150: and all alphabetic arguments to the I/O library routines.
        !           151: This has always been true for statements that are
        !           152: part of the source code, but not for format statements
        !           153: or character arguments from a file.
        !           154: .PP
        !           155: If the external representation of a datum
        !           156: is too large for the field width specified, the specified
        !           157: field is filled with asterisks (*).
        !           158: On 'Ew.dEe' output, the e field will be filled with asterisks if the
        !           159: exponent representation is too large.
        !           160: (This will only happen if e==0)
        !           161: .PP
        !           162: List-directed output of complex values now includes an appropriate comma.
        !           163: List-directed output now distinguishes between real*4 and real*8 values
        !           164: and formats them differently.
        !           165: Output of a character string that includes '\\n' now works correctly.
        !           166: .PP
        !           167: If I/O errors are not trapped by the user's program an appropriate
        !           168: error message will be written to 'stderr' before aborting.
        !           169: An error number will be printed in [ ] along with a brief error message
        !           170: showing the logical unit and I/O state.
        !           171: Error numbers < 100 refer to UNIX errors, and are described in the
        !           172: introduction to chapter 2 of the UNIX Programmer's Manual.
        !           173: Error numbers >= 100 come from the I/O library, and are described
        !           174: further in the appendix to this writeup.
        !           175: For internal I/O, part of the string will be printed with '|' at the
        !           176: current position in the string.
        !           177: For external I/O, part of the current record will be displayed if
        !           178: the error was caused during reading from a file that can backspace.
        !           179: .PP
        !           180: Direct access list-directed I/O is not allowed.
        !           181: Unformatted internal I/O is not allowed.
        !           182: Both the above will be caught by the compiler.
        !           183: All other flavors of I/O are allowed, although some are not part of the ANSI
        !           184: standard.
        !           185: .PP
        !           186: The standard units, 0, 5, and 6, are now named internally 'stderr', 'stdin',
        !           187: and 'stdout' respectively.
        !           188: These are not actual filenames and can not be used for opening these units.
        !           189: \'inquire' will not return these names and will indicate
        !           190: that the above units are not named unless they have been opened to real files.
        !           191: The names are meant to make error reporting more meaningful.
        !           192: .PP
        !           193: On output, a real value that is truly zero will display as '0.' to
        !           194: distinguish it from a very small non-zero value.
        !           195: This occurs in 'F', 'E', 'D', and 'G' format conversions.
        !           196: .PP
        !           197: Non-destructive tabbing is implemented for both internal and external
        !           198: formatted I/O.
        !           199: Tabbing left or right on output
        !           200: does not affect previously written portions of a record.
        !           201: Tabbing right on output
        !           202: causes unwritten portions of a record to be filled with blanks.
        !           203: Tabbing left or right off the end of a logical record is an error.
        !           204: The format specifier 'T' must be followed by a positive non-zero number.
        !           205: If it is not, it will have a different meaning (See below).
        !           206: Note that spacing with 'X' always writes blanks in the output record.
        !           207: 
        !           208: II. Non-"ANSI Standard" Extensions
        !           209: .PP
        !           210: B is an acceptable edit control specifier. It causes return to the
        !           211: default mode of blank interpretation (NULL) and is identical to BN.
        !           212: This is consistent with S which returns to default sign control.
        !           213: .PP
        !           214: P by itself is equivalent to 0P. It resets the scale factor to the
        !           215: default value, 0.
        !           216: .PP
        !           217: The form of the 'Ew.dEe' format specifier has been extended to 'D' also.
        !           218: The form 'Ew.d.e' is allowed but is not standard.
        !           219: The 'e' field specifies the minimum number of digits or spaces in the
        !           220: exponent field on output.
        !           221: If the value of the exponent is too large, the exponent notation 'e'
        !           222: or 'd' will be dropped from the output to allow one
        !           223: more character position.
        !           224: If this is still not adequate, the 'e' field will be filled with
        !           225: asterisks (*). The default value for 'e' is 2.
        !           226: .PP
        !           227: An additional form of tab control specification has been added.
        !           228: The ANSI standard forms 'TRn', 'TLn', and 'Tn' are supported where n is
        !           229: a positive non-zero number. If 'T' or 'nT' is specified, tabbing will
        !           230: be to the next (or n-th) 8-column tab stop.
        !           231: Thus columns of alphanumerics can be lined up without counting.
        !           232: (See above for a description of the tabbing implementation.)
        !           233: .PP
        !           234: A format control specifier has been added to suppress the newline
        !           235: at the end of the last record of a formatted sequential write. The
        !           236: specifier is a dollar sign ($). It is constrained by the same rules
        !           237: as the colon (:). It is used typically for console prompts.
        !           238: For example:
        !           239: 
        !           240: .DS
        !           241: write (*, "('enter value for x: ',$)")
        !           242: read (*,*) x
        !           243: .DE
        !           244: .PP
        !           245: Radices other than 10 can be specified for formatted integer I/O
        !           246: conversion. The specifier is patterned after P, the pre-scale factor for
        !           247: floating point conversion. It remains in effect until another radix is
        !           248: specified or format interpretation is complete. The specifier is defined
        !           249: as [n]R where 2 <= n <= 36. If n is omitted,
        !           250: the default decimal radix is restored.
        !           251: .PP
        !           252: In conjunction with the above, a sign control specifier has been added
        !           253: to cause integer values to be interpreted as unsigned during output
        !           254: conversion. The specifier is SU and remains in effect until another
        !           255: sign control specifier is encountered, or format interpretation is
        !           256: complete. Radix and 'unsigned' specifiers could be used to format
        !           257: a hexadecimal dump, as follows:
        !           258: 
        !           259: .DS
        !           260: 2000   format( SU, 16R, 8I10.8)
        !           261: .DE
        !           262: 
        !           263: Note: Unsigned integer values greater than (2**30 - 1),
        !           264: i.e. any signed negative value, can not be read by FORTRAN input routines.
        !           265: All internal values will be output correctly.
        !           266: .PP
        !           267: The ANSI standard is ambiguous regarding the definition of a "print" file.
        !           268: Since UNIX has no default "print" file, an additional 'form' specifier
        !           269: is now recognized in the 'open' statement.
        !           270: Specifying "form='print'" implies 'formatted' and enables vertical format
        !           271: control for that logical unit (see above).
        !           272: Vertical format control is interpreted only on sequential formatted writes
        !           273: to a "print" file.
        !           274: .PP
        !           275: The 'inquire' statement will return 'print' in the 'FORM=' string variable
        !           276: for logical units opened as "print" files.
        !           277: It will return -1 for the unit number of an unconnected file.
        !           278: .PP
        !           279: If a logical unit is already open, an 'open' statement including the
        !           280: 'form=' option or the 'blank=' option will do nothing but
        !           281: re-define those options.
        !           282: This instance of the 'open' statement need not include the filename, and
        !           283: must not include a filename if 'unit=' refers to the standard input or outputs.
        !           284: Therefore, to re-define the standard output as a "print" file, use:
        !           285: 
        !           286: .DS
        !           287: open (unit=6, form='print')
        !           288: .DE
        !           289: .PP
        !           290: In a 'close' statement, "status='keep'" may be specified for temporary files.
        !           291: This is the default for all other files.
        !           292: Remember to get the file's real name,
        !           293: using 'inquire', if you want to re-open it later.
        !           294: .PP
        !           295: List directed read has been modified to allow input of a string not enclosed
        !           296: in quotes. The string must not start with a digit, and can not contain a
        !           297: separator (, or /) or blank (space or tab). A newline will terminate the
        !           298: string unless escaped with \\. Any string not meeting the above restrictions
        !           299: must be enclosed in quotes (" or ').
        !           300: .PP
        !           301: Internal list-directed I/O has been implemented. During internal list reads,
        !           302: bytes are consummed until the iolist is satisfied, or the 'end-of-file'
        !           303: is reached.
        !           304: During internal list writes, records are filled until the iolist is satisfied.
        !           305: The length of an internal array element should be at least 20 bytes to
        !           306: avoid logical record overflow when writing double precision values.
        !           307: Internal list read was implemented to make command line decoding easier.
        !           308: Internal list write should be avoided.
        !           309: .bp
        !           310: .ce 2
        !           311: Appendix A
        !           312: I/O Library Error Messages
        !           313: .PP
        !           314: The following error messages are generated by the I/O library.
        !           315: The error numbers are returned in the "iostat=" variable if the "err="
        !           316: return is taken. Error numbers < 100 are generated by UNIX. See the
        !           317: UNIX Programmers Manual, introduction to chapter 2.
        !           318: .DS
        !           319: /* 100 */      "error in format"
        !           320:                See error message output for the location
        !           321:                of the error in the format. Can be caused
        !           322:                by more than 10 levels of nested (), or
        !           323:                an extremely long format statement.
        !           324: 
        !           325: /* 101 */      "illegal unit number"
        !           326:                It is illegal to close logical unit 0.
        !           327:                Negative unit numbers are not allowed.
        !           328:                The upper limit is system dependent.
        !           329: 
        !           330: /* 102 */      "formatted io not allowed"
        !           331:                The logical unit was opened for
        !           332:                unformatted I/O.
        !           333: 
        !           334: /* 103 */      "unformatted io not allowed"
        !           335:                The logical unit was opened for
        !           336:                formatted I/O.
        !           337: 
        !           338: /* 104 */      "direct io not allowed"
        !           339:                The logical unit was opened for sequential
        !           340:                access, or the logical record length was
        !           341:                specified as 0.
        !           342: 
        !           343: /* 105 */      "sequential io not allowed"
        !           344:                The logical unit was opened for direct
        !           345:                access I/O.
        !           346: 
        !           347: /* 106 */      "can't backspace file"
        !           348:                The file associated with the logical unit
        !           349:                can't seek. May be a device or a pipe.
        !           350: 
        !           351: /* 107 */      "off beginning of record"
        !           352:                The format specified a left tab off the
        !           353:                beginning of the record.
        !           354: 
        !           355: /* 108 */      "can't stat file"
        !           356:                The system can't return status information
        !           357:                about the file. Perhaps the directory is
        !           358:                unreadable.
        !           359: 
        !           360: /* 109 */      "no * after repeat count"
        !           361:                Repeat counts in list-directed I/O must be
        !           362:                followed by an * with no blank spaces.
        !           363: 
        !           364: .DE
        !           365: .DS
        !           366: /* 110 */      "off end of record"
        !           367:                A formatted write tried to go beyond the
        !           368:                logical end-of-record. An unformatted read
        !           369:                or write will also cause this.
        !           370: 
        !           371: /* 111 */      "truncation failed"
        !           372:                The truncation of external sequential files
        !           373:                on 'close', 'backspace', or 'rewind' tries
        !           374:                to do a copy. It failed. Perhaps the temp
        !           375:                file couldn't be created.
        !           376: 
        !           377: /* 112 */      "incomprehensible list input"
        !           378:                List input has to be just right.
        !           379: 
        !           380: /* 113 */      "out of free space"
        !           381:                The library dynamically creates buffers for
        !           382:                internal use. You ran out of memory for this.
        !           383:                Your program is too big!
        !           384: 
        !           385: /* 114 */      "unit not connected"
        !           386:                The logical unit was not open.
        !           387: 
        !           388: /* 115 */      "read unexpected character"
        !           389:                Certain format conversions can't tolerate
        !           390:                non-numeric data. Logical data must be
        !           391:                T or F.
        !           392: 
        !           393: /* 116 */      "blank logical input field"
        !           394: 
        !           395: /* 117 */      "'new' file exists"
        !           396:                You tried to open an existing file with
        !           397:                "status='new'".
        !           398: 
        !           399: /* 118 */      "can't find 'old' file"
        !           400:                You tried to open a non-existent file
        !           401:                with "status='old'".
        !           402: 
        !           403: /* 119 */      "unknown system error"
        !           404:                Shouldn't happen, but .....
        !           405:                (Send me a documented example.)
        !           406: 
        !           407: /* 120 */      "requires seek ability"
        !           408:                Direct access requires seek ability.
        !           409:                Sequential unformatted I/O requires seek
        !           410:                ability on the file due to the special
        !           411:                data structure required. Tabbing left
        !           412:                also requires seek ability.
        !           413: 
        !           414: /* 121 */      "illegal argument"
        !           415:                Certain arguments to 'open', etc. will be
        !           416:                checked for legitimacy. Often only non-
        !           417:                default forms are looked for.
        !           418: 
        !           419: /* 122 */      "negative repeat count"
        !           420:                The repeat count for list directed input
        !           421:                must be a positive integer.
        !           422: .DE

unix.superglobalmegacorp.com

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