Annotation of researchv10no/cmd/f2c/doc/revs, revision 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.