Annotation of researchv10no/cmd/f2c/doc/revs, revision 1.1.1.1

1.1       root        1: .EQ
                      2: define f2c % "f\|2c" %
                      3: define F2c % "F\^2c" %
                      4: define libF77 % "libF77" %
                      5: define libI77 % "libI77" %
                      6: .EN
                      7: .SH
                      8: Suggested rewordings...
                      9: 
                     10: Bottom of p. 4:
                     11: .PP
                     12: A Fortran routine containing $n$ \f(CWentry\fR statements
                     13: is turned into $n^+^2$ C functions, a big one containing
                     14: the translation of everything but the \f(CWentry\fR statements,
                     15: and $n^+^1$ little ones that invoke the big one.  Each little
                     16: one passes a different integer to the big one to tell
                     17: it where to begin; the big one starts with a switch
                     18: that branches to the code for the appropriate entry.
                     19: The Fortran program
                     20: 
                     21: .SH
                     22: Add to end of \(sc3:
                     23: .PP
                     24: $F2c$ assumes the services of the support libraries $libF77$ and $libI77$.
                     25: Among other things, libF77 contains a C main routine that arranges
                     26: for files to be closed automatically when the Fortran program stops
                     27: and arranges for an error message to be printed if a floating-point
                     28: exception occurs.  The C main routine invokes the Fortran main program,
                     29: which is called
                     30: .CW MAIN_\|_ .
                     31: 
                     32: 
                     33: .SH
                     34: Revision of \(sc 4:
                     35: 
                     36: 
                     37: .SH
                     38: 4. MAINTENANCE and PORTABILITY
                     39: .PP
                     40: Although we have tried to make $f2c$'s output reasonably readable,
                     41: our goal of strict compatibility with $f77$ implies some nasty
                     42: looking conversions.  Input/output statements, in particular,
                     43: generally get expanded into
                     44: a series of calls on routines in $libI77$, $f77$'s I/O library.
                     45: Thus the C output of $f2c$ would probably be something of a nightmare
                     46: to maintain as C; it would be much more sensible to maintain the original
                     47: Fortran, translating it anew each time it changed.  Some commercial
                     48: vendors seek to perform translations yielding C that one
                     49: might reasonably maintain directly; these translations generally
                     50: require some manual intervention.
                     51: . \"Appendix B lists the vendors
                     52: . \"of whom we are aware; omitted vendors are invited to inform us of
                     53: . \"their existence, so we may include them in updated versions of
                     54: . \"Appendix B.
                     55: .PP
                     56: The Pfort Verifier
                     57: .[ [
                     58: Ryder 1974
                     59: .]]
                     60: was a useful tool for catching errors in calling sequences
                     61: of Fortran 66 programs.  $F2c$ combined with $cyntax(1)$ or $lint(1)$
                     62: .[ [
                     63: UNIX ninth edition manual
                     64: .]]
                     65: provides a similar capability for Fortran 77 programs.
                     66: .PP
                     67: There are two portability issues in using $f2c$:
                     68: the portability of the converter $f2c$ itself
                     69: and that of the C programs it creates.
                     70: .PP
                     71: The converter itself is reasonably portable and has run successfully on Apollo,
                     72: Cray, IBM, MIPS, SGI, Sun and DEC VAX equipment.
                     73: However, we shall see that the C it produces may not be portable due to
                     74: subtle storage management issues in Fortran 77.
                     75: In any case, the C output of $f2c$ will run fine, at least if
                     76: the \f(CW\(miW\fIn\fR option (see the Appendix) is used to set the
                     77: number of characters per word correctly, and if C
                     78: .CW double
                     79: values may fall on an odd-word boundary.
                     80: .PP
                     81: The Fortran 77 standard says that \f(CWComplex\fP and \f(CWDouble Precision\fP
                     82: objects occupy two ``units'' of space while other non-character data types
                     83: occupy one ``unit.''
                     84: It may be necessary to edit the header file
                     85: .CW f2c.h
                     86: to make these assumptions hold, if possible.
                     87: On the Cray, for example,
                     88: .CW float
                     89: and
                     90: .CW double
                     91: are the same C types, and Fortran double precision, if
                     92: available, would correspond to the C type
                     93: .CW "long double" .
                     94: In this case, changing the definition of
                     95: .CW doublereal
                     96: in
                     97: .CW f2c.h
                     98: from
                     99: .P1
                    100: typedef double doublereal;
                    101: .P2
                    102: to
                    103: .P1
                    104: typedef long double doublereal;
                    105: .P2
                    106: would be appropriate.  For the Think C compiler on the
                    107: Macintosh, on the other hand, this line would need to become
                    108: .P1
                    109: typedef short double doublereal;
                    110: .P2
                    111: .PP
                    112: If your C compiler predefines symbols that could clash with
                    113: translated Fortran variable names, then you should also
                    114: add appropriate
                    115: .CW #undef
                    116: lines to
                    117: .CW f2c.h .
                    118: The current default
                    119: .CW f2c.h
                    120: provides the following
                    121: .CW #undef
                    122: lines:
                    123: .P1
                    124: #undef cray
                    125: #undef gcos
                    126: #undef mc68010
                    127: #undef mc68020
                    128: #undef mips
                    129: #undef pdp11
                    130: #undef sgi
                    131: #undef sparc
                    132: #undef sun
                    133: #undef sun2
                    134: #undef sun3
                    135: #undef sun4
                    136: #undef u370
                    137: #undef u3b
                    138: #undef u3b2
                    139: #undef u3b5
                    140: #undef unix
                    141: #undef vax
                    142: .P2
                    143: .PP
                    144: As an extension to the Fortran 77 Standard, $f2c$
                    145: allows noncharacter variables to be initialized with character
                    146: data.  This extension is inherently nonportable, as the number
                    147: of characters storable per ``unit'' varies from machine to machine.
                    148: Since 32 bit machines are the most plentiful, $f2c$
                    149: assumes 4 characters per Fortran ``unit'', but this assumption
                    150: can be overridden by the \f(CW\(miW\fIn\fR command-line option.
                    151: For example,
                    152: .CW \(miW8
                    153: is appropriate for C that is to be run on Cray computers,
                    154: since Crays store 8 characters per word.
                    155: An example is helpful here:  the Fortran
                    156: .P1
                    157: .so /n/pipe/z7/nlsw7/f77.c/doc/tm/data.holl.f
                    158: .P2
                    159: turns into
                    160: .P1
                    161: .so /n/pipe/z7/nlsw7/f77.c/doc/tm/data.holl.c
                    162: .P2
                    163: (Some use of
                    164: .CW i ,
                    165: e.g. ``\(CWi=1\fR'', is necessary or $f2c$
                    166: will see that
                    167: .CW i
                    168: is not used and will not initialize it.)  If the target
                    169: machine were a Cray and the string were
                    170: .CW 'abcdefgh'
                    171: or \f(CW"abcdefhg"\fR,
                    172: then the Fortran would run fine, but the C produced by $f2c$ would only
                    173: store \f(CW"abcd"\fR
                    174: in i, $4$ being the default number of characters per word.
                    175: The $f2c$ command-line option
                    176: .CW \(miW8
                    177: gives the correct initialization for a Cray.
                    178: .PP
                    179: The initialization above is clumsy, using $4$ separate characters.
                    180: Using the option
                    181: .CW -A ,
                    182: for ANSI, produces
                    183: .CW "abcd" ;
                    184: see the Appendix.
                    185: .PP
                    186: The above examples explain why the Fortran 77 standard excludes
                    187: Hollerith data statements: the number of characters per word is
                    188: not specified and hence such code is not portable even in Fortran.
                    189: (Fortran that conservatively assumes only $1$ or $2$ characters per word is
                    190: portable but messy).
                    191: .PP
                    192: Some systems require that C values of type
                    193: .CW double
                    194: be aligned on a double-word boundary.  Fortran
                    195: .CW common
                    196: and
                    197: .CW equivalence
                    198: statements may require some C
                    199: .CW double
                    200: values to be aligned on an odd-word boundary.
                    201: On systems where double-word alignment is required,
                    202: C compilers pad structures, if necessary, to arrange
                    203: for the right alignment.  Often such padding has no effect on
                    204: the validity of $f2c$'s
                    205: translation, but using
                    206: .CW common
                    207: or
                    208: .CW equivalence ,
                    209: it is easy to contrive examples in which
                    210: the translated C works incorrectly.
                    211: $F2c$ issues a warning message when double-word alignment may
                    212: cause trouble, but it makes no attempt to circumvent this trouble.
                    213: .PP
                    214: Long decimal strings in \f(CWdata\fP statements are passed to C unaltered.
                    215: However, expressions involving long decimal strings are rounded
                    216: in a machine dependent manner.
                    217: The Fortran
                    218: .P1
                    219: .so /n/pipe/z7/nlsw7/f77.c/doc/tm/longpow.f
                    220: .P2
                    221: yields the C
                    222: .P1
                    223: .so /n/pipe/z7/nlsw7/f77.c/doc/tm/longpow.c
                    224: .P2
                    225: when $f2c$ runs on a VAX 8550.
                    226: .PP
                    227: ANSI C compilers require that all but one instance of any entity with external scope,
                    228: such as the \f(CWstruct\fPs into which $f2c$ translates \f(CWcommon\fP,
                    229: be declared \f(CWextern\fP and that exactly one declaration should define the entity,
                    230: i.e., not be declared \f(CWextern\fP.
                    231: Older C compilers have no such restriction.
                    232: To be compatible with ANSI usage, the $f2c$
                    233: command-line option
                    234: .CW -ec
                    235: causes the \f(CWstruct\fP corresponding
                    236: to an uninitialized \f(CWcommon\fP region to be declared \f(CWextern\fP
                    237: and makes a
                    238: .CW union
                    239: of all successive declarations of that
                    240: \f(CWcommon\fP region into a defining declaration placed in a file with the
                    241: name \f(CWcname_com.c\fR, where
                    242: .CW cname
                    243: is the name of the \f(CWcommon\fP region.
                    244: For example, the Fortran
                    245: .P1
                    246: .so /n/pipe/z7/nlsw7/f77.c/doc/tm/mainsam.f
                    247: .P2
                    248: when converted by \f(CWf2c -ec\fP produces
                    249: .P1
                    250: .so /n/pipe/z7/nlsw7/f77.c/doc/tm/mainsam.c
                    251: .P2
                    252: as well as the file \f(CWcmname_com.c\fR:
                    253: .P1
                    254: .so /n/pipe/z7/nlsw7/f77.c/doc/tm/cmname_com.c
                    255: .P2
                    256: The files
                    257: .CW *_com.c
                    258: may be compiled into a library
                    259: against which one can load to satisfy overly fastidious ANSI C compilers.
                    260: 
                    261: 
                    262: .[
                    263: $LIST$
                    264: .]
                    265: 
                    266: 
                    267: \fISource for the above is
                    268:    \f(CW/n/pipe/usr/dmg/f2c/doc/revs\fR

unix.superglobalmegacorp.com

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