Annotation of 3BSD/new/libI77uc/writeup, revision 1.1

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

unix.superglobalmegacorp.com

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