| 1 | If your compiler does not recognize ANSI C headers, | 
|---|
| 2 | compile with KR_headers defined:  either add -DKR_headers | 
|---|
| 3 | to the definition of CFLAGS in the makefile, or insert | 
|---|
| 4 |  | 
|---|
| 5 | #define KR_headers | 
|---|
| 6 |  | 
|---|
| 7 | at the top of f2c.h and fmtlib.c . | 
|---|
| 8 |  | 
|---|
| 9 |  | 
|---|
| 10 | If you have a really ancient K&R C compiler that does not understand | 
|---|
| 11 | void, add -Dvoid=int to the definition of CFLAGS in the makefile. | 
|---|
| 12 |  | 
|---|
| 13 | If you use a C++ compiler, first create a local f2c.h by appending | 
|---|
| 14 | f2ch.add to the usual f2c.h, e.g., by issuing the command | 
|---|
| 15 | make f2c.h | 
|---|
| 16 | which assumes f2c.h is installed in /usr/include . | 
|---|
| 17 |  | 
|---|
| 18 | If your system lacks /usr/include/fcntl.h , then you | 
|---|
| 19 | should simply create an empty fcntl.h in this directory. | 
|---|
| 20 | If your compiler then complains about creat and open not | 
|---|
| 21 | having a prototype, compile with OPEN_DECL defined. | 
|---|
| 22 | On many systems, open and creat are declared in fcntl.h . | 
|---|
| 23 |  | 
|---|
| 24 | If your system has /usr/include/fcntl.h, you may need to add | 
|---|
| 25 | -D_POSIX_SOURCE to the makefile's definition of CFLAGS. | 
|---|
| 26 |  | 
|---|
| 27 | If your system's sprintf does not work the way ANSI C | 
|---|
| 28 | specifies -- specifically, if it does not return the | 
|---|
| 29 | number of characters transmitted -- then insert the line | 
|---|
| 30 |  | 
|---|
| 31 | #define USE_STRLEN | 
|---|
| 32 |  | 
|---|
| 33 | at the end of fmt.h .  This is necessary with | 
|---|
| 34 | at least some versions of Sun and DEC software. | 
|---|
| 35 | In particular, if you get a warning about an improper | 
|---|
| 36 | pointer/integer combination in compiling wref.c, then | 
|---|
| 37 | you need to compile with -DUSE_STRLEN . | 
|---|
| 38 |  | 
|---|
| 39 | If your system's fopen does not like the ANSI binary | 
|---|
| 40 | reading and writing modes "rb" and "wb", then you should | 
|---|
| 41 | compile open.c with NON_ANSI_RW_MODES #defined. | 
|---|
| 42 |  | 
|---|
| 43 | If you get error messages about references to cf->_ptr | 
|---|
| 44 | and cf->_base when compiling wrtfmt.c and wsfe.c or to | 
|---|
| 45 | stderr->_flag when compiling err.c, then insert the line | 
|---|
| 46 |  | 
|---|
| 47 | #define NON_UNIX_STDIO | 
|---|
| 48 |  | 
|---|
| 49 | at the beginning of fio.h, and recompile everything (or | 
|---|
| 50 | at least those modules that contain NON_UNIX_STDIO). | 
|---|
| 51 |  | 
|---|
| 52 | Unformatted sequential records consist of a length of record | 
|---|
| 53 | contents, the record contents themselves, and the length of | 
|---|
| 54 | record contents again (for backspace).  Prior to 17 Oct. 1991, | 
|---|
| 55 | the length was of type int; now it is of type long, but you | 
|---|
| 56 | can change it back to int by inserting | 
|---|
| 57 |  | 
|---|
| 58 | #define UIOLEN_int | 
|---|
| 59 |  | 
|---|
| 60 | at the beginning of fio.h.  This affects only sue.c and uio.c . | 
|---|
| 61 |  | 
|---|
| 62 | On VAX, Cray, or Research Tenth-Edition Unix systems, you may | 
|---|
| 63 | need to add -DVAX, -DCRAY, or -DV10 (respectively) to CFLAGS | 
|---|
| 64 | to make fp.h work correctly.  Alternatively, you may need to | 
|---|
| 65 | edit fp.h to suit your machine. | 
|---|
| 66 |  | 
|---|
| 67 | You may need to supply the following non-ANSI routines: | 
|---|
| 68 |  | 
|---|
| 69 | fstat(int fileds, struct stat *buf) is similar | 
|---|
| 70 | to stat(char *name, struct stat *buf), except that | 
|---|
| 71 | the first argument, fileds, is the file descriptor | 
|---|
| 72 | returned by open rather than the name of the file. | 
|---|
| 73 | fstat is used in the system-dependent routine | 
|---|
| 74 | canseek (in the libI77 source file err.c), which | 
|---|
| 75 | is supposed to return 1 if it's possible to issue | 
|---|
| 76 | seeks on the file in question, 0 if it's not; you may | 
|---|
| 77 | need to suitably modify err.c .  On non-UNIX systems, | 
|---|
| 78 | you can avoid references to fstat and stat by compiling | 
|---|
| 79 | with NON_UNIX_STDIO defined; in that case, you may need | 
|---|
| 80 | to supply access(char *Name,0), which is supposed to | 
|---|
| 81 | return 0 if file Name exists, nonzero otherwise. | 
|---|
| 82 |  | 
|---|
| 83 | char * mktemp(char *buf) is supposed to replace the | 
|---|
| 84 | 6 trailing X's in buf with a unique number and then | 
|---|
| 85 | return buf.  The idea is to get a unique name for | 
|---|
| 86 | a temporary file. | 
|---|
| 87 |  | 
|---|
| 88 | On non-UNIX systems, you may need to change a few other, | 
|---|
| 89 | e.g.: the form of name computed by mktemp() in endfile.c and | 
|---|
| 90 | open.c; the use of the open(), close(), and creat() system | 
|---|
| 91 | calls in endfile.c, err.c, open.c; and the modes in calls on | 
|---|
| 92 | fopen() and fdopen() (and perhaps the use of fdopen() itself | 
|---|
| 93 | -- it's supposed to return a FILE* corresponding to a given | 
|---|
| 94 | an integer file descriptor) in err.c and open.c (component ufmt | 
|---|
| 95 | of struct unit is 1 for formatted I/O -- text mode on some systems | 
|---|
| 96 | -- and 0 for unformatted I/O -- binary mode on some systems). | 
|---|
| 97 | Compiling with -DNON_UNIX_STDIO omits all references to creat() | 
|---|
| 98 | and almost all references to open() and close(), the exception | 
|---|
| 99 | being in the function f__isdev() (in open.c). | 
|---|
| 100 |  | 
|---|
| 101 | For MS-DOS, compile all of libI77 with -DMSDOS (which implies | 
|---|
| 102 | -DNON_UNIX_STDIO).  You may need to make other compiler-dependent | 
|---|
| 103 | adjustments; for example, for Turbo C++ you need to adjust the mktemp | 
|---|
| 104 | invocations and to #undef ungetc in lread.c and rsne.c . | 
|---|
| 105 |  | 
|---|
| 106 | If you want to be able to load against libI77 but not libF77, | 
|---|
| 107 | then you will need to add sig_die.o (from libF77) to libI77. | 
|---|
| 108 |  | 
|---|
| 109 | If you wish to use translated Fortran that has funny notions | 
|---|
| 110 | of record length for direct unformatted I/O (i.e., that assumes | 
|---|
| 111 | RECL= values in OPEN statements are not bytes but rather counts | 
|---|
| 112 | of some other units -- e.g., 4-character words for VMS), then you | 
|---|
| 113 | should insert an appropriate #define for url_Adjust at the | 
|---|
| 114 | beginning of open.c .  For VMS Fortran, for example, | 
|---|
| 115 | #define url_Adjust(x) x *= 4 | 
|---|
| 116 | would suffice. | 
|---|
| 117 |  | 
|---|
| 118 | To check for transmission errors, issue the command | 
|---|
| 119 | make check | 
|---|
| 120 | This assumes you have the xsum program whose source, xsum.c, | 
|---|
| 121 | is distributed as part of "all from f2c/src".  If you do not | 
|---|
| 122 | have xsum, you can obtain xsum.c by sending the following E-mail | 
|---|
| 123 | message to netlib@netlib.bell-labs.com | 
|---|
| 124 | send xsum.c from f2c/src | 
|---|
| 125 |  | 
|---|
| 126 | The makefile assumes you have installed f2c.h in a standard | 
|---|
| 127 | place (and does not cause recompilation when f2c.h is changed); | 
|---|
| 128 | f2c.h comes with "all from f2c" (the source for f2c) and is | 
|---|
| 129 | available separately ("f2c.h from f2c"). | 
|---|
| 130 |  | 
|---|
| 131 | By default, Fortran I/O units 5, 6, and 0 are pre-connected to | 
|---|
| 132 | stdin, stdout, and stderr, respectively.  You can change this | 
|---|
| 133 | behavior by changing f_init() in err.c to suit your needs. | 
|---|
| 134 | Note that f2c assumes READ(*... means READ(5... and WRITE(*... | 
|---|
| 135 | means WRITE(6... .  Moreover, an OPEN(n,... statement that does | 
|---|
| 136 | not specify a file name (and does not specify STATUS='SCRATCH') | 
|---|
| 137 | assumes FILE='fort.n' .  You can change this by editing open.c | 
|---|
| 138 | and endfile.c suitably. | 
|---|
| 139 |  | 
|---|
| 140 | Unless you adjust the "#define MXUNIT" line in fio.h, Fortran units | 
|---|
| 141 | 0, 1, ..., 99 are available, i.e., the highest allowed unit number | 
|---|
| 142 | is MXUNIT - 1. | 
|---|
| 143 |  | 
|---|
| 144 | Lines protected from compilation by #ifdef Allow_TYQUAD | 
|---|
| 145 | are for a possible extension to 64-bit integers in which | 
|---|
| 146 | integer = int = 32 bits and longint = long = 64 bits. | 
|---|
| 147 |  | 
|---|
| 148 | Extensions (Feb. 1993) to NAMELIST processing: | 
|---|
| 149 | 1. Reading a ? instead of &name (the start of a namelist) causes | 
|---|
| 150 | the namelist being sought to be written to stdout (unit 6); | 
|---|
| 151 | to omit this feature, compile rsne.c with -DNo_Namelist_Questions. | 
|---|
| 152 | 2. Reading the wrong namelist name now leads to an error message | 
|---|
| 153 | and an attempt to skip input until the right namelist name is found; | 
|---|
| 154 | to omit this feature, compile rsne.c with -DNo_Bad_Namelist_Skip. | 
|---|
| 155 | 3. Namelist writes now insert newlines before each variable; to omit | 
|---|
| 156 | this feature, compile xwsne.c with -DNo_Extra_Namelist_Newlines. | 
|---|
| 157 | 4. (Sept. 1995) When looking for the &name that starts namelist | 
|---|
| 158 | input, lines whose first non-blank character is something other | 
|---|
| 159 | than &, $, or ? are treated as comment lines and ignored, unless | 
|---|
| 160 | rsne.c is compiled with -DNo_Namelist_Comments. | 
|---|
| 161 |  | 
|---|
| 162 | Nonstandard extension (Feb. 1993) to open: for sequential files, | 
|---|
| 163 | ACCESS='APPEND' (or access='anything else starting with "A" or "a"') | 
|---|
| 164 | causes the file to be positioned at end-of-file, so a write will | 
|---|
| 165 | append to the file. | 
|---|
| 166 |  | 
|---|
| 167 | Some buggy Fortran programs use unformatted direct I/O to write | 
|---|
| 168 | an incomplete record and later read more from that record than | 
|---|
| 169 | they have written.  For records other than the last, the unwritten | 
|---|
| 170 | portion of the record reads as binary zeros.  The last record is | 
|---|
| 171 | a special case: attempting to read more from it than was written | 
|---|
| 172 | gives end-of-file -- which may help one find a bug.  Some other | 
|---|
| 173 | Fortran I/O libraries treat the last record no differently than | 
|---|
| 174 | others and thus give no help in finding the bug of reading more | 
|---|
| 175 | than was written.  If you wish to have this behavior, compile | 
|---|
| 176 | uio.c with -DPad_UDread . | 
|---|
| 177 |  | 
|---|
| 178 | If you want to be able to catch write failures (e.g., due to a | 
|---|
| 179 | disk being full) with an ERR= specifier, compile dfe.c, due.c, | 
|---|
| 180 | sfe.c, sue.c, and wsle.c with -DALWAYS_FLUSH.  This will lead to | 
|---|
| 181 | slower execution and more I/O, but should make ERR= work as | 
|---|
| 182 | expected, provided fflush returns an error return when its | 
|---|
| 183 | physical write fails. | 
|---|
| 184 |  | 
|---|
| 185 | Carriage controls are meant to be interpreted by the UNIX col | 
|---|
| 186 | program (or a similar program).  Sometimes it's convenient to use | 
|---|
| 187 | only ' ' as the carriage control character (normal single spacing). | 
|---|
| 188 | If you compile lwrite.c and wsfe.c with -DOMIT_BLANK_CC, formatted | 
|---|
| 189 | external output lines will have an initial ' ' quietly omitted, | 
|---|
| 190 | making use of the col program unnecessary with output that only | 
|---|
| 191 | has ' ' for carriage control. | 
|---|
| 192 |  | 
|---|
| 193 | The Fortran 77 Standard leaves it up to the implementation whether | 
|---|
| 194 | formatted writes of floating-point numbers of absolute value < 1 have | 
|---|
| 195 | a zero before the decimal point.  By default, libI77 omits such | 
|---|
| 196 | superfluous zeros, but you can cause them to appear by compiling | 
|---|
| 197 | lwrite.c, wref.c, and wrtfmt.c with -DWANT_LEAD_0 . | 
|---|
| 198 |  | 
|---|
| 199 | If your system lacks a ranlib command, you don't need it. | 
|---|
| 200 | Either comment out the makefile's ranlib invocation, or install | 
|---|
| 201 | a harmless "ranlib" command somewhere in your PATH, such as the | 
|---|
| 202 | one-line shell script | 
|---|
| 203 |  | 
|---|
| 204 | exit 0 | 
|---|
| 205 |  | 
|---|
| 206 | or (on some systems) | 
|---|
| 207 |  | 
|---|
| 208 | exec /usr/bin/ar lts $1 >/dev/null | 
|---|
| 209 |  | 
|---|
| 210 | Most of the routines in libI77 are support routines for Fortran | 
|---|
| 211 | I/O.  There are a few exceptions, summarized below -- I/O related | 
|---|
| 212 | functions and subroutines that appear to your program as ordinary | 
|---|
| 213 | external Fortran routines. | 
|---|
| 214 |  | 
|---|
| 215 | 1.      CALL FLUSH flushes all buffers. | 
|---|
| 216 |  | 
|---|
| 217 | 2.      FTELL(i) is an INTEGER function that returns the current | 
|---|
| 218 | offset of Fortran unit i (or -1 if unit i is not open). | 
|---|
| 219 |  | 
|---|
| 220 | 3.      CALL FSEEK(i, offset, whence, *errlab) attemps to move | 
|---|
| 221 | Fortran unit i to the specified offset: absolute offset | 
|---|
| 222 | if whence = 0; relative to the current offset if whence = 1; | 
|---|
| 223 | relative to the end of the file if whence = 2.  It branches | 
|---|
| 224 | to label errlab if unit i is not open or if the call | 
|---|
| 225 | otherwise fails. | 
|---|