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

1.1       root        1: . \"define f2c % "\f(CWf2c\fP" %
                      2: . \"define F2c % "\f(CWF2c\fP" %
                      3: .de Bp
                      4: .ft R
                      5: .sp .5
                      6: .in \w'\(bu\ 'u
                      7: .ti 0
                      8: \(bu\ \c
                      9: ..
                     10: .EQ
                     11: define dollar % "\f(CW$\fP" %
                     12: delim $$
                     13: define f2c % "f\|2c" %
                     14: define F2c % "F\^2c" %
                     15: define libF77 % "libF77" %
                     16: define libI77 % "libI77" %
                     17: define LibF77 % "LibF77" %
                     18: define LibI77 % "LibI77" %
                     19: .EN
                     20: .TL
                     21: A Fortran to C Converter
                     22: .AU
                     23: S. I. Feldman
                     24: .AI
                     25: Bellcore
                     26: Morristown, NJ 07960
                     27: .AU
                     28: David M. Gay
                     29: .AI
                     30: .MH
                     31: .AU
                     32: Mark W. Maimone
                     33: .AI
                     34: Carnegie-Mellon University
                     35: Pittsburgh, PA 15213
                     36: .AU
                     37: N. L. Schryer
                     38: .AI
                     39: .MH
                     40: .AB
                     41: We describe $f2c$, a program that translates Fortran 77
                     42: into C or C++.  $F2c$ lets one portably mix C and Fortran
                     43: and makes a large body of well-tested Fortran
                     44: source code available to C environments.
                     45: .AE
                     46: .SH
                     47: 1. INTRODUCTION
                     48: .PP
                     49: Automatic conversion of Fortran 77
                     50: .[ [
                     51: ANSI FORTRAN 1978
                     52: .]]
                     53: to C
                     54: .[ [
                     55: Kernighan Ritchie 1978
                     56: .]
                     57: .[
                     58: Kernighan Ritchie 1988
                     59: .]]
                     60: is desirable for
                     61: several reasons.  Sometimes it is useful to run a
                     62: well-tested Fortran program on a machine that has a C
                     63: compiler but no Fortran compiler.  At other times, it
                     64: is convenient to mix C and Fortran.  Some things are
                     65: impossible to express in Fortran 77 or are harder
                     66: to express in Fortran than in C
                     67: (e.g. storage management, some character operations,
                     68: arrays of functions, heterogeneous data structures,
                     69: and calls that depend on the operating system),
                     70: and some programmers simply prefer C to Fortran.
                     71: There is a large body of well tested
                     72: Fortran source code for carrying out a wide variety of
                     73: useful calculations, and it is sometimes desirable to
                     74: exploit some of this Fortran source in a C environment.
                     75: Many vendors provide some way of mixing C and Fortran, but
                     76: the details vary from system to system.
                     77: Automatic Fortran to C conversion lets one create a
                     78: .I portable
                     79: C program that exploits Fortran source code.
                     80: .PP
                     81: A side benefit of automatic Fortran 77 to C conversion is that
                     82: it allows such tools as
                     83: .I cyntax (1)
                     84: and
                     85: .I lint (1)
                     86: \ 
                     87: .[[
                     88: v101
                     89: .]]
                     90: to provide Fortran 77 programs with some of the consistency
                     91: and portability checks that the Pfort Verifier
                     92: .[ [
                     93: Ryder 1974
                     94: .]]
                     95: provided to Fortran 66 programs.
                     96: The consistency checks
                     97: detect errors in calling sequences
                     98: and are thus a boon to debugging.
                     99: .PP
                    100: This paper describes $f2c$, a Fortran 77 to C converter
                    101: based on Feldman's original $f77$ compiler
                    102: .[ [
                    103: Feldman Weinberger Portable Fortran
                    104: .]].
                    105: We have used $f2c$ to convert various large programs and
                    106: subroutine libraries to C automatically (i.e., with no manual intervention);
                    107: these include the \s-2PORT3\s+2 subroutine library (\s-2PORT1\s+2
                    108: is described in
                    109: .[ [
                    110: Fox Hall Schryer Algorithm 1978
                    111: .]
                    112: .[
                    113: Fox Hall Schryer port 1978
                    114: .]]),
                    115: MINOS
                    116: .[ [
                    117: Murtagh Saunders 1987
                    118: .]],
                    119: and Schryer's floating-point test
                    120: .[ [
                    121: Schryer floating
                    122: .]].
                    123: The floating-point test is of particular interest, as it relies
                    124: heavily on correct evaluation of parenthesized expressions and
                    125: is bit-level self-testing.
                    126: .PP
                    127: As a debugging aid, we sought bit-level compatibility between
                    128: objects compiled from the C produced by $f2c$ and objects
                    129: produced by our local $f77$ compiler.  That is, on the VAX
                    130: where we developed $f2c$, we sought to make it impossible to
                    131: tell by running a Fortran program whether some of its
                    132: modules had been compiled by $f2c$ or
                    133: all had been compiled by $f77$.  This meant that $f2c$
                    134: should follow the same calling conventions as $f77$
                    135: .[ [
                    136: Feldman Weinberger Portable Fortran
                    137: .]]
                    138: and should use $f77$'s support libraries, $libF77$ and $libI77$.
                    139: .PP
                    140: Although we have tried to make $f2c$'s output reasonably readable,
                    141: our goal of strict compatibility with $f77$ implies some nasty
                    142: looking conversions.  Input/output statements, in particular,
                    143: generally get expanded into
                    144: a series of calls on routines in $libI77$, $f77$'s I/O library.
                    145: Thus the C output of $f2c$ would probably be something of a nightmare
                    146: to maintain as C; it would be much more sensible to maintain the original
                    147: Fortran, translating it anew each time it changed.  Some commercial
                    148: vendors, e.g., those listed in Appendix A,
                    149: seek to perform translations yielding C that one
                    150: might reasonably maintain directly; these translations generally
                    151: require some manual intervention.
                    152: .PP
                    153: The rest of this paper is organized as follows.
                    154: Section 2 describes the interlanguage conventions used by $f2c$ (and $f77$).
                    155: \(sc3 summarizes some extensions to Fortran 77 that $f2c$ recognizes.
                    156: . \"The extensions to Fortran 77 that $f2c$ recognizes are summarized in \(sc3.
                    157: Example invocations of $f2c$ appear in \(sc4.
                    158: \(sc5 illustrates various details of $f2c$'s translations, and
                    159: \(sc6 considers portability issues.
                    160: \(sc7 discusses the generation and use of
                    161: .I prototypes ,
                    162: which can be used both by C++ and ANSI C compilers and by
                    163: $f2c$ to check consistency of calling sequences.
                    164: \(sc8 describes our experience with
                    165: an experimental $f2c$ service provided by $netlib$
                    166: .[ [
                    167: Dongarra Grosse 1987
                    168: .]],
                    169: and \(sc9 considers possible extensions.
                    170: Appendix A lists some vendors who offer
                    171: conversion of Fortran to C that one might maintain as C.
                    172: Finally, Appendix B contains a $man$ page telling how to use $f2c$.
                    173: .SH
                    174: 2. INTERLANGUAGE CONVENTIONS
                    175: .PP
                    176: Much of the material in this section is taken from
                    177: .[ [
                    178: Feldman Weinberger Portable Fortran
                    179: .]].
                    180: .SH
                    181: Names
                    182: .PP
                    183: An $f2c$ extension
                    184: inspired by Fortran 90 (until recently called Fortran 8x
                    185: .[ [
                    186: Fort8x
                    187: .]])
                    188: is that long names are allowed ($f2c$ truncates names that are longer
                    189: than 50 characters), and names may contain underscores.  To avoid conflict
                    190: with the names of library routines and with names that $f2c$ generates,
                    191: Fortran names may have one or two underscores appended.
                    192: Fortran names are forced to lower case (unless the
                    193: .CW \%-U
                    194: option described in Appendix B is in effect); external names, i.e., the names
                    195: of Fortran procedures and common blocks, have a single underscore appended
                    196: if they do not contain any underscores and have a pair of underscores
                    197: appended if they do contain underscores.
                    198: Thus Fortran subroutines named
                    199: .CW ABC ,
                    200: .CW A_B_C ,
                    201: and
                    202: .CW A_B_C_
                    203: result in C functions named
                    204: .CW abc_ ,
                    205: .CW a_b_c_\|\^_ ,
                    206: and
                    207: .CW a_b_c_\|\^_\|\^_ .
                    208: .SH
                    209: Types
                    210: .PP
                    211: The table below shows
                    212: corresponding Fortran and C declarations;
                    213: the C declarations use types defined in
                    214: .CW f2c.h ,
                    215: a header file upon which $f2c$'s translations rely.
                    216: The table also shows the C types defined in the standard
                    217: version of
                    218: .CW f2c.h .
                    219: .KS
                    220: .TS
                    221: center box;
                    222: c c c
                    223: l l l.
                    224: Fortran        C       standard \f(CWf2c.h\fP
                    225: .sp .5
                    226: integer\(**2 x shortint x;     short int x;
                    227: integer x      integer x;      long int x;
                    228: logical x      long int x;     long int x;
                    229: real x real x; float x;
                    230: double precision x     doublereal x;   double x;
                    231: complex x      complex x;      struct { float r, i; } x;
                    232: double complex x       doublecomplex x;        struct { double r, i; } x;
                    233: character\(**6 x       char x[6];      char x[6];
                    234: .TE
                    235: .KE
                    236: By the rules of Fortran,
                    237: .CW integer,
                    238: .CW logical,
                    239: and
                    240: .CW real
                    241: data occupy the same amount of memory, and
                    242: .CW "double precision"
                    243: and
                    244: .CW complex
                    245: occupy twice this amount; $f2c$
                    246: assumes that the types in the C column above are
                    247: chosen (in
                    248: .CW f2c.h )
                    249: so that these assumptions are valid.
                    250: The translations of the Fortran
                    251: .CW equivalence
                    252: and
                    253: .CW data
                    254: statements depend on these assumptions.
                    255: On some machines, one must modify
                    256: .CW f2c.h
                    257: to make these assumptions hold.  See \(sc6 for examples
                    258: and further discussion.
                    259: .SH
                    260: Return Values
                    261: .PP
                    262: A function of type
                    263: .CW integer ,
                    264: .CW logical ,
                    265: or
                    266: .CW "double precision"
                    267: must be declared as a C function that returns the corresponding type.
                    268: If the
                    269: .CW \%-R
                    270: option is in effect (see Appendix B), the same is true
                    271: of a function of type
                    272: .CW real ;
                    273: otherwise, a
                    274: .CW real
                    275: function must be declared as a C function that returns
                    276: .CW doublereal ;
                    277: this hack facilitates our VAX regression testing, as it
                    278: duplicates the behavior of our local Fortran compiler ($f77$).
                    279: A
                    280: .CW complex
                    281: or
                    282: .CW "double complex"
                    283: function is equivalent to a C routine
                    284: with an additional
                    285: initial argument that points to the place where the return value is to be stored.
                    286: Thus,
                    287: .P1
                    288: complex function f( . . . )
                    289: .P2
                    290: is equivalent to
                    291: .P1
                    292: void f_(temp, . . .)
                    293: complex \(**temp;
                    294:  . . .
                    295: .P2
                    296: A character-valued function is equivalent to a C routine with
                    297: two extra initial arguments:
                    298: a data address and a length.
                    299: Thus,
                    300: .P1
                    301: character\(**15 function g( . . . )
                    302: .P2
                    303: is equivalent to
                    304: .P1
                    305: g_(result, length, . . .)
                    306: char \(**result;
                    307: ftnlen length;
                    308:  . . .
                    309: .P2
                    310: and could be invoked in C by
                    311: .P1
                    312: char chars[15];
                    313:  . . .
                    314: g_(chars, 15L, . . . );
                    315: .P2
                    316: Subroutines are invoked as if they were
                    317: .CW int -valued
                    318: functions whose value specifies which alternate return to use.
                    319: Alternate return arguments (statement labels) are not passed to the function,
                    320: but are used to do an indexed branch in the calling procedure.
                    321: (If the subroutine has no entry points with alternate return arguments,
                    322: the returned value is undefined.)
                    323: The statement
                    324: .P1
                    325: call nret(\(**1, \(**2, \(**3)
                    326: .P2
                    327: is treated exactly as if it were the Fortran computed
                    328: .CW goto
                    329: .P1
                    330: goto (1, 2, 3),  nret( )
                    331: .P2
                    332: .SH
                    333: Argument Lists
                    334: .PP
                    335: All Fortran arguments are passed by address.
                    336: In addition,
                    337: for every non-function argument that is of type character,
                    338: an argument giving the length of the value is passed.
                    339: (The string lengths are
                    340: .CW ftnlen
                    341: values, i.e.,
                    342: .CW "long int"
                    343: quantities passed by value).  In summary, the order of arguments is:
                    344: extra arguments for complex and character functions,
                    345: an address for each datum or function, and a
                    346: .CW ftnlen
                    347: for each character argument (other than character-valued functions).
                    348: Thus, the call in
                    349: .P1
                    350: external f
                    351: character\(**7 s
                    352: integer b(3)
                    353:  . . .
                    354: call sam(f, b(2), s)
                    355: .P2
                    356: is equivalent to that in
                    357: .P1
                    358: int f();
                    359: char s[7];
                    360: long int b[3];
                    361:  . . .
                    362: sam_(f, &b[1], s, 7L);
                    363: .P2
                    364: Note that the first element of a C array always has subscript zero,
                    365: but Fortran arrays begin at 1 by default.
                    366: Because Fortran arrays are stored in column-major order, whereas
                    367: C arrays are stored in row-major order,
                    368: $f2c$ translates multi-dimensional Fortran arrays into one-dimensional
                    369: C arrays and issues appropriate subscripting expressions.
                    370: .SH
                    371: 3. EXTENSIONS TO FORTRAN 77
                    372: .PP
                    373: Since it is derived from $f77$, $f2c$ supports all of the $f77$ extensions
                    374: described in
                    375: .[ [
                    376: Feldman Weinberger Portable Fortran
                    377: .]].
                    378: $F2c$'s extensions include the following.
                    379: .Bp
                    380: Type
                    381: .CW "double complex"
                    382: (alias
                    383: .CW "complex*16" )
                    384: is a double-precision version of
                    385: .CW complex .
                    386: Specific intrinsic functions for
                    387: .CW "double complex"
                    388: have names that start with
                    389: .CW z
                    390: rather than
                    391: .CW c .
                    392: An exception to this rule is
                    393: .CW dimag ,
                    394: which returns the imaginary part of a
                    395: .CW "double complex"
                    396: value;
                    397: .CW imag
                    398: is the corresponding generic intrinsic function.
                    399: The generic intrinsic function
                    400: .CW real
                    401: is extended so that it returns the real part of a
                    402: .CW "double complex"
                    403: value as a
                    404: .CW "double precision"
                    405: value;
                    406: .CW dble
                    407: is the specific intrinsic function that does this job.
                    408: .Bp
                    409: The ``types'' that may appear in an
                    410: .CW implicit
                    411: statement include
                    412: .CW undefined ,
                    413: which implies that variables
                    414: whose names begin with the associated letters
                    415: must be explicitly declared in a type statement.  $F2c$ also
                    416: recognizes the Fortran 90 statement
                    417: .P1
                    418: implicit none
                    419: .P2
                    420: as equivalent to
                    421: .P1
                    422: implicit undefined(a-z)
                    423: .P2
                    424: The command-line option
                    425: .CW \%-u
                    426: has the effect of inserting
                    427: .P1
                    428: implicit none
                    429: .P2
                    430: at the beginning of each Fortran procedure.
                    431: .Bp
                    432: Procedures may call themselves recursively, i.e.,
                    433: may call themselves either directly or indirectly
                    434: through a chain of other calls.
                    435: .Bp
                    436: The keywords
                    437: .CW static
                    438: and
                    439: .CW automatic
                    440: act as ``types'' in type and implicit statements;
                    441: they specify storage classes.
                    442: There is exactly one copy of each
                    443: .CW static
                    444: variable, and such variables retain their values between
                    445: invocations of the procedure in which they appear.
                    446: On the other hand, each invocation of a procedure gets
                    447: new copies of the procedure's
                    448: .CW automatic
                    449: variables.
                    450: .CW Automatic
                    451: variables may not appear in
                    452: .CW equivalence ,
                    453: .CW data ,
                    454: .CW namelist ,
                    455: or
                    456: .CW save
                    457: statements.  The command-line option
                    458: .CW \%-a
                    459: changes the default storage class from
                    460: .CW static
                    461: to
                    462: .CW automatic
                    463: (for all variables except those that appear in
                    464: .CW common ,
                    465: .CW data ,
                    466: .CW equivalence ,
                    467: .CW namelist ,
                    468: or
                    469: .CW save
                    470: statements).
                    471: .Bp
                    472: A tab in the first 6 columns signifies that the current line is
                    473: a free-format line, which may extend beyond column 72.
                    474: An ampersand
                    475: .CW &
                    476: in column 1 indicates that the current line is a free-format
                    477: continuation line.  Lines that have neither an ampersand in column 1
                    478: nor a tab in the first 6 columns are treated as Fortran 77 fixed-format
                    479: lines:  if shorter than 72 characters, they are padded on the right
                    480: with blanks until they are 72 characters long; if longer than 72
                    481: characters, the characters beyond column 72 are discarded.
                    482: After taking continuations into account,
                    483: statements may be up to 1320 characters long; this is the only
                    484: constraint on the length of free-format lines.  (This limit is
                    485: implied by the Fortran 77 standard, which allows at most 19 continuation lines;
                    486: $1320 ~=~ (1^+^19) ~times~ 66$.)
                    487: .Bp
                    488: Aside from quoted strings, $f2c$ ignores case (unless the
                    489: .CW \%-U
                    490: option is in effect).
                    491: .Bp
                    492: The statement
                    493: .P1
                    494: include 'stuff'
                    495: .P2
                    496: is replaced by the contents of the file
                    497: .CW stuff.
                    498: .CW Include s
                    499: may be nested to a reasonable depth, currently ten.
                    500: The command-line option
                    501: .CW \%-!I
                    502: disables
                    503: .CW include s;
                    504: this option is used by the $netlib$ $f2c$
                    505: service described in \(sc8 (for which
                    506: .CW include
                    507: obviously makes no sense).
                    508: .Bp
                    509: $F77$ allows binary, octal, and hexadecimal constants
                    510: to appear in
                    511: .CW data
                    512: statements; $f2c$ goes somewhat further, allowing
                    513: such constants to appear anywhere; they are treated just
                    514: like a decimal integer constant having the equivalent value.
                    515: Binary, octal, and hexadecimal constants may assume one of
                    516: two forms: a letter followed by a quoted string of digits,
                    517: or a decimal base, followed by a sharp sign
                    518: .CW # ,
                    519: followed by a string of digits (not quoted).  The letter is
                    520: .CW b
                    521: or
                    522: .CW B
                    523: for binary constants,
                    524: .CW o
                    525: or
                    526: .CW O
                    527: for octal constants, and
                    528: .CW x ,
                    529: .CW X ,
                    530: .CW z ,
                    531: or
                    532: .CW Z
                    533: for hexadecimal constants.  Thus, for example,
                    534: .CW z'a7' ,
                    535: .CW 16#a7 ,
                    536: .CW o'247' ,
                    537: .CW 8#247 ,
                    538: .CW b'10100111'
                    539: and
                    540: .CW 2#10100111
                    541: are all treated just like the integer
                    542: .CW 167 .
                    543: .Bp
                    544: For compatibility with C, quoted strings may contain the following
                    545: escapes:
                    546: .TS
                    547: center box;
                    548: lFCW l a lFCW l.
                    549: \e0    null    \       \en     newline
                    550: \e\e   \e      \       \er     carriage return
                    551: \eb    backspace       \       \et     tab
                    552: \ef    form feed       \       \ev     vertical tab
                    553: .sp .5
                    554: .T&
                    555: aFCW l s s s.
                    556:  \e'   apostrophe (does not terminate a string)
                    557:  \e"   quotation mark (does not terminate a string)
                    558:  \e\fIx\fP     \fIx\fR, where \fIx\fR is any other character
                    559: .TE
                    560: The
                    561: .CW \%-!bs
                    562: option tells $f2c$ not to recognize these escapes.
                    563: Quoted strings may be delimited either by double quotes (\ \f(CW"\fR\ )
                    564: or by single quotes (\ \f(CW\(fm\fR\ ); if a string starts with
                    565: one kind of quote, the other kind may be embedded in the string
                    566: without being repeated or quoted by a backslash escape.
                    567: Where possible, translated strings are null-terminated.
                    568: .Bp
                    569: Hollerith strings are treated as character strings.
                    570: .Bp
                    571: In
                    572: .CW equivalence
                    573: statements, a multiply-dimensioned array may be given a single
                    574: subscript, in which case the missing subscripts are taken to be 1
                    575: (for backward compatibility with Fortran 66)
                    576: and a warning message is issued.
                    577: .Bp
                    578: In a formatted read of non-character variables, the I/O
                    579: library ($libI77$) allows a field to be terminated by a comma.
                    580: .Bp
                    581: Type
                    582: .CW real*4
                    583: is equivalent to
                    584: .CW real ,
                    585: .CW integer*4
                    586: to
                    587: .CW integer ,
                    588: .CW real*8
                    589: to
                    590: .CW "double precision" ,
                    591: .CW complex*8
                    592: to
                    593: .CW complex ,
                    594: and, as stated before,
                    595: .CW complex*16
                    596: to
                    597: .CW "double complex" .
                    598: .Bp
                    599: The type
                    600: .CW integer*2
                    601: designates short integers (translated to type
                    602: .CW shortint ,
                    603: which by default is
                    604: .CW "short int" ).
                    605: Such integers are expected to occupy half a ``unit'' of storage.
                    606: The command-line options
                    607: .CW \%-I2
                    608: and
                    609: .CW \%-i2
                    610: turn type
                    611: .CW integer
                    612: into
                    613: .CW integer*2 ;
                    614: see the $man$ page (appendix B) for more details.
                    615: .Bp
                    616: The binary intrinsic functions
                    617: .CW and ,
                    618: .CW or ,
                    619: .CW xor ,
                    620: .CW lshift ,
                    621: and
                    622: .CW rshift
                    623: and the unary intrinsic function
                    624: .CW not
                    625: perform bitwise operations on
                    626: .CW integer
                    627: or
                    628: .CW logical
                    629: operands.  For
                    630: .CW lshift
                    631: and
                    632: .CW rshift ,
                    633: the second operand tells how many bits to
                    634: shift the first operand.
                    635: .Bp
                    636: $LibF77$ provides two functions for accessing command-line arguments:
                    637: .CW iargc(dummy)
                    638: returns the number of command-line arguments (and ignores its argument);
                    639: .CW getarg(k,c)
                    640: sets the character string
                    641: .CW c
                    642: to the $k$th command-line argument (or to blanks if $k$ is out of range).
                    643: .Bp
                    644: Variable,
                    645: .CW common ,
                    646: and procedure names may be arbitrarily long, but they
                    647: are truncated after the 50th character.  These names may
                    648: contain underscores (in which case their translations will
                    649: have a pair of underscores appended).
                    650: .Bp
                    651: MAIN programs may have arguments, which are ignored.
                    652: .Bp
                    653: .CW Common
                    654: variables may be initialized by a
                    655: .CW data
                    656: statement in any module, not just in a
                    657: .CW "block data"
                    658: subprogram.
                    659: .Bp
                    660: The label may be omitted from a
                    661: .CW do
                    662: loop if the loop
                    663: is terminated by an
                    664: .CW enddo
                    665: statement.
                    666: .Bp
                    667: Unnamed Fortran 90
                    668: .CW "do while"
                    669: loops are allowed.
                    670: Such a loop begins with a statement of the form
                    671: .ce
                    672: \f(CWdo \fR[\fIlabel\^\fR] [\f(CW,\fR] \f(CWwhile(\fIlogical expression\f(CW)\fR
                    673: and ends either after the statement labelled by $label$ or after a matching
                    674: .CW enddo .
                    675: .Bp
                    676: $F2c$ recognizes the Fortran 90 synonyms
                    677: .CW < ,
                    678: .CW <= ,
                    679: .CW == ,
                    680: .CW >= ,
                    681: .CW > ,
                    682: and
                    683: .CW <>
                    684: for the Fortran comparison operators
                    685: .CW .LT. ,
                    686: .CW .LE. ,
                    687: .CW .EQ. ,
                    688: .CW .GE. ,
                    689: .CW .GT. ,
                    690: and
                    691: .CW .NE.
                    692: .Bp
                    693: \f(CWNamelist\fR
                    694: works as in Fortran 90
                    695: .[ [
                    696: Fort8x
                    697: .]],
                    698: with a minor restriction on
                    699: .CW namelist
                    700: input:  subscripts must have the form
                    701: .ce
                    702: $subscript$ [ : $subscript$ [ : $stride$ ] ]
                    703: For example, the Fortran
                    704: .P1
                    705: integer m(8)
                    706: real x(10,10)
                    707: namelist /xx/ m, x
                    708: \&. . .
                    709: read(*,xx)
                    710: .P2
                    711: could read
                    712: .P1
                    713: &xx x(1,1) = 2, x(1:3,8:10:2) = 1,2,3,4,5,6  m(7:8) = 9,10/
                    714: .P2
                    715: but would elicit error messages on the inputs
                    716: .P1
                    717: &xx x(:3,8:10:2) = 1,2,3,4,5,6/
                    718: &xx x(1:3,8::2)  = 1,2,3,4,5,6/
                    719: &xx m(7:) = 9,10/
                    720: .P2
                    721: (which inputs would be legal in Fortran 90).
                    722: For compatibility with the
                    723: .CW namelist
                    724: variants supplied by several vendors as Fortran 77 extensions,
                    725: $f2c$'s version of $libI77$ permits $dollar$ to be used instead of
                    726: .CW &
                    727: and
                    728: .CW /
                    729: in
                    730: .CW namelist
                    731: input.  Thus the Fortran shown above could read
                    732: .P1
                    733: $dollar$xx x(1,1) = 2, x(1:3,8:10:2) = 1,2,3,4,5,6  m(7:8) = 9,10$dollar$end
                    734: .P2
                    735: .in 0
                    736: .Bp
                    737: Internal list-directed and namelist I/O are allowed.
                    738: .Bp
                    739: In an
                    740: .CW open
                    741: statement,
                    742: .CW name=
                    743: is treated as
                    744: .CW file= .
                    745: .Bp
                    746: Fortran 90 inline comments are allowed.
                    747: They start with a
                    748: .CW !
                    749: anywhere but column 6.
                    750: .in 0
                    751: .SH
                    752: 4. INVOCATION EXAMPLES
                    753: .PP
                    754: To convert the Fortran files
                    755: .CW main.f
                    756: and
                    757: .CW subs.f ,
                    758: one might use the UNIX\u\(rg\d command:
                    759: .P1
                    760: f2c main.f subs.f
                    761: .P2
                    762: This results in translated files suffixed with
                    763: .CW .c ,
                    764: i.e., the resulting C files are
                    765: .CW main.c
                    766: and
                    767: .CW subs.c .
                    768: To translate all the Fortran files in the current
                    769: directory, compile the resulting C,
                    770: and create an executable program named
                    771: .CW myprog ,
                    772: one might use the following pair of UNIX commands:
                    773: .P1
                    774: f2c *.f
                    775: cc -o myprog *.c -lF77 -lI77 -lm
                    776: .P2
                    777: The above
                    778: .CW -lF77
                    779: and
                    780: .CW -lI77
                    781: options assume that the ``standard'' Fortran support libraries
                    782: $libF77$ and $libI77$
                    783: are appropriate for use with $f2c$.  On some systems this is
                    784: not the case (as further discussed in \(sc6); if one had
                    785: installed a combination of the appropriate $libF77$ and $libI77$
                    786: in the appropriate place, then the above example might become
                    787: .P1
                    788: f2c *.f
                    789: cc -o myprog *.c -lf2c -lm
                    790: .P2
                    791: Sometimes it is desirable to use $f2c$'s
                    792: .CW -R
                    793: option, which tells $f2c$ not to force all floating-point operations
                    794: to be done in double precision.  (One might argue that
                    795: .CW -R
                    796: should be the default, but we find the current arrangement
                    797: more convenient for testing $f2c$.)  With
                    798: .CW -R
                    799: specified, the previous example becomes
                    800: .P1
                    801: f2c -R *.f
                    802: cc -o myprog *.c -lf2c -lm
                    803: .P2
                    804: Sometimes it is desirable to translate several Fortran source
                    805: files into a single C file.  This is easily done by using $f2c$
                    806: as a filter:
                    807: .P1
                    808: cat *.f | f2c >mystuff.c
                    809: .P2
                    810: The
                    811: .CW -A
                    812: option lets $f2c$ use ANSI C constructs
                    813: .[ [
                    814: ANSIC
                    815: .]],
                    816: which yields more readable C when
                    817: .CW character
                    818: variables are initialized.  With both
                    819: .CW -A
                    820: and
                    821: .CW -R
                    822: specified, the last example becomes
                    823: .P1
                    824: cat *.f | f2c -A -R >mystuff.c
                    825: .P2
                    826: For use with C++
                    827: .[ [
                    828: Stroustrup C++ Programming Language 1986
                    829: .]],
                    830: one would specify
                    831: .CW -C++
                    832: rather than
                    833: .CW -A ;
                    834: the last example would then become
                    835: .P1
                    836: cat *.f | f2c -C++ -R >mystuff.c
                    837: .P2
                    838: The
                    839: .CW -C++
                    840: option gives ANSI-style headers and old-style C formatting
                    841: of character strings and
                    842: .CW float
                    843: constants (since some C++ compilers reject the ANSI versions
                    844: of these constructs).
                    845: .LP
                    846: With ANSI C, one can use
                    847: .I prototypes ,
                    848: i.e., a special syntax describing the calling sequences
                    849: of procedures, to help catch errors in argument passing.  To
                    850: make using prototypes convenient, the
                    851: .CW -P
                    852: option causes $f2c$ to create a \fIfile\f(CW.P\fR of prototypes
                    853: for the procedures defined in
                    854: each input \fIfile\f(CW.f\fR (or \fIfile\f(CW.F\fR, i.e., the
                    855: suffix
                    856: .CW .f '' ``
                    857: or
                    858: .CW .F '' ``
                    859: is replaced by
                    860: .CW .P ''). ``
                    861: One could concatenate all relevant prototype files into
                    862: a header file and arrange for the header to be
                    863: .CW #include d
                    864: with each C file compiled.
                    865: Since
                    866: .CW -P
                    867: implies
                    868: .CW -A
                    869: unless
                    870: .CW -C++
                    871: is specified, one could
                    872: convert all the Fortran files in the current directory
                    873: to ANSI C
                    874: and get corresponding prototype files by issuing the command
                    875: .P1
                    876: f2c -P *.f
                    877: .P2
                    878: Several command options may be combined if none but perhaps the
                    879: last takes an argument; thus to specify
                    880: .CW -R
                    881: and get C++ prototypes for all the
                    882: files in the current directory, one could say either
                    883: .P1
                    884: f2c -C++ -P -R *.f
                    885: .P2
                    886: or
                    887: .P1
                    888: f2c -C++PR *.f
                    889: .P2
                    890: or
                    891: .P1
                    892: f2c -RPC++ *.f
                    893: .P2
                    894: \(em options can come in any order.
                    895: .LP
                    896: For numeric variables initialized by character data, the
                    897: .CW -W
                    898: option specifies the (machine-dependent!)
                    899: number of characters per word and is further discussed
                    900: in \(sc6.  This option takes a numeric argument, as in
                    901: .CW -W8 ;
                    902: such an option must be listed either separately or at the end
                    903: of a string of other options, as in
                    904: .P1
                    905: f2c -C++RPW8 *.f
                    906: .P2
                    907: .SH
                    908: 5. TRANSLATION DETAILS
                    909: .PP
                    910: $F2c$ is based on the ancient $f77$ Fortran compiler of
                    911: .[ [
                    912: Feldman Weinberger Portable Fortran
                    913: .]].
                    914: That compiler produced a C parse-tree,
                    915: which it converted into input for the second pass of the
                    916: portable C compiler (PCC)
                    917: .[ [
                    918: Johnson portable compiler
                    919: .]].
                    920: The compiler has been used for many years and is the
                    921: direct ancestor of many current Fortran compilers.
                    922: Thus, it provided us with a solid base of Fortran knowledge
                    923: and a nearly complete C representation.
                    924: The converter $f2c$ is a copy of the $f77$ Fortran compiler
                    925: which has been altered to print out a C representation
                    926: of the program being converted.
                    927: The program $f2c$ is a \fIhorror\fP, based on ancient code and
                    928: hacked unmercifully.
                    929: Users are only supposed to look at its C output,
                    930: not at its appalling inner workings.
                    931: .PP
                    932: Here are some examples that illustrate $f2c$'s translations.
                    933: For starters, it is helpful to see a short but complete
                    934: example: $f2c$ turns the
                    935: Fortran inner product routine
                    936: .P1
                    937: .so dot.f
                    938: .P2
                    939: into
                    940: .P1
                    941: .so dot.c
                    942: .P2
                    943: The translated C always starts with a ``translated by f2c'' comment
                    944: and a
                    945: .CW #include
                    946: of
                    947: .CW f2c.h .
                    948: $F2c$ forces the variable and procedure names to lower-case and
                    949: appends an underscore to the external name
                    950: .CW dot
                    951: (to avoid possible conflicts with library names).
                    952: The parameter adjustments
                    953: .CW --x '' ``
                    954: and
                    955: .CW --y '' ``
                    956: account for the fact that C arrays start at index 0.
                    957: Unused labels are retained in comments for orienteering purposes.
                    958: Within a function, Fortran references to the function name are turned into
                    959: references to the local variable
                    960: .CW ret_val ,
                    961: which holds the value to be returned.  Unless the
                    962: .CW -R
                    963: option is specified, $f2c$ converts the return type of
                    964: .CW real
                    965: function values to
                    966: .CW doublereal .
                    967: Because using the C ``op='' operators
                    968: leads to greater efficiency on some machines, $f2c$ looks for opportunities
                    969: to use these operators, as in the line
                    970: .CW "ret_val += ..." '' ``
                    971: above.
                    972: .PP
                    973: $F2c$ generally dispenses with superfluous parentheses: ANSI C
                    974: specifies a clear order of evaluation for floating-point expressions,
                    975: and $f2c$ uses the ANSI C rules to decide when parentheses are required
                    976: to faithfully translate a parenthesized Fortran expression.
                    977: Non-ANSI compilers are free to violate parentheses; by default, $f2c$ does
                    978: not attempt to break an expression into several statements to
                    979: foil pernicious non-ANSI C compilers.  Thus, for example, the Fortran
                    980: .P1
                    981:      x = a*(b*c)
                    982:      y = (a*b)*c
                    983: .P2
                    984: becomes
                    985: .P1
                    986:     x = a * (b * c);
                    987:     y = a * b * c;
                    988: .P2
                    989: The
                    990: .CW \%-kr
                    991: and
                    992: .CW \%-krd
                    993: options cause $f2c$ to use temporary variables to force correct
                    994: evaluation order with non-ANSI C compilers.
                    995: .ig
                    996: If, for instance,
                    997: .CW a ,
                    998: .CW b ,
                    999: and
                   1000: .CW c ,
                   1001: are
                   1002: .CW real
                   1003: variables, then under
                   1004: .CW \%-kr
                   1005: the above Fortran results in
                   1006: .P1
                   1007:     /* System generated locals */
                   1008:     real r_1;
                   1009: \&. . .
                   1010:     r_1 = b * c;
                   1011:     x = a * r_1;
                   1012:     r_1 = a * b;
                   1013:     y = r_1 * c;
                   1014: .P2
                   1015: ..
                   1016: .PP
                   1017: Fortran I/O is complicated; like $f77$, $f2c$ converts
                   1018: a Fortran I/O statement into calls on the Fortran I/O library $libI77$.
                   1019: For Fortran
                   1020: .CW read s
                   1021: and
                   1022: .CW write s,
                   1023: there is generally one call to start the statement, one to end it,
                   1024: and one for each item read or written.  Given the Fortran declarations
                   1025: .P1
                   1026:       integer count(10)
                   1027:       real val(10)
                   1028: .P2
                   1029: the Fortran
                   1030: .P1
                   1031:       read(*,*) count, val
                   1032: .P2
                   1033: is turned into some header lines:
                   1034: .P1
                   1035: static integer c_\|\^_3 = 3;
                   1036: static integer c_\|\^_10 = 10;
                   1037: static integer c_\|\^_4 = 4;
                   1038: \&. . .
                   1039:     /* Builtin functions */
                   1040:     integer s_rsle(), do_lio(), e_rsle();
                   1041: \&. . .
                   1042:     /* Fortran I/O blocks */
                   1043:     static cilist io_\|\^_1 = { 0, 5, 0, 0, 0 };
                   1044: .P2
                   1045: and the executable lines
                   1046: .P1
                   1047: s_rsle(&io_\|\^_1);
                   1048: do_lio(&c_\|\^_3, &c_\|\^_10, (char *)&count[0], (ftnlen)sizeof(integer));
                   1049: do_lio(&c_\|\^_4, &c_\|\^_10, (char *)&val[0], (ftnlen)sizeof(real));
                   1050: e_rsle();
                   1051: .P2
                   1052: Implicit Fortran do-loops, e.g.
                   1053: .P1
                   1054:       read(*,*) (count(i), val(i), i = 1, 10)
                   1055: .P2
                   1056: get turned into explicit C loops:
                   1057: .P1
                   1058: s_rsle(&io_\|\^_4);
                   1059: for (i = 1; i <= 10; ++i) {
                   1060:     do_lio(&c_\|\^_3, &c_\|\^_1, (char *)&count[i - 1], (ftnlen)sizeof(integer));
                   1061:     do_lio(&c_\|\^_4, &c_\|\^_1, (char *)&val[i - 1], (ftnlen)sizeof(real));
                   1062: }
                   1063: e_rsle();
                   1064: .P2
                   1065: The Fortran
                   1066: .CW end=
                   1067: and
                   1068: .CW err=
                   1069: specifiers make the resulting C even less readable, as they require
                   1070: tests to be inserted.  For example,
                   1071: .P1
                   1072:       read(*,*,err=10) count, val
                   1073:  10   continue
                   1074: .P2
                   1075: becomes
                   1076: .P1
                   1077:     i_\|\^_1 = s_rsle(&io_\|\^_1);
                   1078:     if (i_\|\^_1 != 0) {
                   1079:         goto L10;
                   1080:     }
                   1081:     i_\|\^_1 = do_lio(&c_\|\^_3, &c_\|\^_10, (char *)&count[0], (ftnlen)sizeof(integer));
                   1082:     if (i_\|\^_1 != 0) {
                   1083:         goto L10;
                   1084:     }
                   1085:     i_\|\^_1 = do_lio(&c_\|\^_4, &c_\|\^_10, (char *)&val[0], (ftnlen)sizeof(real));
                   1086:     if (i_\|\^_1 != 0) {
                   1087:         goto L10;
                   1088:     }
                   1089:     i_\|\^_1 = e_rsle();
                   1090: L10:
                   1091:     ;
                   1092: .P2
                   1093: .PP
                   1094: A Fortran routine containing $n$ \f(CWentry\fR statements
                   1095: is turned into $n^+^2$ C functions, a big one containing
                   1096: the translation of everything but the \f(CWentry\fR statements,
                   1097: and $n^+^1$ little ones that invoke the big one.  Each little
                   1098: one passes a different integer to the big one to tell
                   1099: it where to begin; the big one starts with a switch
                   1100: that branches to the code for the appropriate entry.
                   1101: For instance, the Fortran
                   1102: .P1
                   1103:       function sine(x)
                   1104:       data pi/3.14159265358979324/
                   1105:       sine = sin(x)
                   1106:       return
                   1107:       entry cosneg(y)
                   1108:       cosneg = cos(y+pi)
                   1109:       return
                   1110:       end
                   1111: .P2
                   1112: is turned into the big procedure
                   1113: .P1
                   1114: doublereal sine_0_(n_\|\^_, x, y)
                   1115: int n_\|\^_;
                   1116: real *x, *y;
                   1117: {
                   1118:     /* Initialized data */
                   1119: 
                   1120:     static real pi = (float)3.14159265358979324;
                   1121: 
                   1122:     /* System generated locals */
                   1123:     real ret_val;
                   1124: 
                   1125:     /* Builtin functions */
                   1126:     double sin(), cos();
                   1127: 
                   1128:     switch(n_\|\^_) {
                   1129:        case 1: goto L_cosneg;
                   1130:        }
                   1131: 
                   1132:     ret_val = sin(*x);
                   1133:     return ret_val;
                   1134: 
                   1135: L_cosneg:
                   1136:     ret_val = cos(*y + pi);
                   1137:     return ret_val;
                   1138: } /* sine_ */
                   1139: .P2
                   1140: and the little invoking procedures
                   1141: .P1
                   1142: doublereal sine_(x)
                   1143: real *x;
                   1144: {
                   1145:     return sine_0_(0, x, (real *)0);
                   1146:     }
                   1147: 
                   1148: doublereal cosneg_(y)
                   1149: real *y;
                   1150: {
                   1151:     return sine_0_(1, (real *)0, y);
                   1152:     }
                   1153: .P2
                   1154: .LP
                   1155: Fortran
                   1156: .CW common
                   1157: regions are turned into C
                   1158: .CW struct s.
                   1159: For example, the Fortran declarations
                   1160: .P1
                   1161:       common /named/ c, d, r, i, l
                   1162:       complex c(10)
                   1163:       double precision d(10)
                   1164:       real r(10)
                   1165:       integer i(10)
                   1166:       logical m(10)
                   1167: 
                   1168:       if (m(i(2))) d(3) = d(4)/d(5)
                   1169: .P2
                   1170: result in
                   1171: .P1
                   1172: struct {
                   1173:     complex c[10];
                   1174:     doublereal d[10];
                   1175:     real r[10];
                   1176:     integer i[10];
                   1177:     logical m[10];
                   1178: } named_;
                   1179: 
                   1180: #define named_1 named_
                   1181: \&. . .
                   1182: 
                   1183:     if (named_1.m[named_1.i[1] - 1]) {
                   1184:        named_1.d[2] = named_1.d[3] / named_1.d[4];
                   1185:        }
                   1186: .P2
                   1187: Under the
                   1188: .CW -p
                   1189: option, the above
                   1190: .CW if
                   1191: statement becomes more readable:
                   1192: .P1
                   1193: \&. . .
                   1194: #define c (named_1.c)
                   1195: #define d (named_1.d)
                   1196: #define r (named_1.r)
                   1197: #define i (named_1.i)
                   1198: #define m (named_1.m)
                   1199: \&. . .
                   1200:     if (m[i[1] - 1]) {
                   1201:        d[2] = d[3] / d[4];
                   1202: .P2
                   1203: If the above
                   1204: .CW common
                   1205: block were involved in a
                   1206: .CW "block data"
                   1207: subprogram, e.g.
                   1208: .P1
                   1209:       block data
                   1210:       common /named/ c, d, r, i, l, m
                   1211:       complex c(10)
                   1212:       double precision d(10)
                   1213:       real r(10)
                   1214:       integer i(10)
                   1215:       logical m(10)
                   1216:       data c(1)/(1.0,0e0)/, d(2)/2d0/, r(3)/3e0/, i(4)/4/,
                   1217:      *     m(5)/.false./
                   1218:       end
                   1219: .P2
                   1220: then the
                   1221: .CW struct
                   1222: would begin
                   1223: .CW "struct named_1_ {" '', ``
                   1224: and $f2c$ would issue a more elaborate
                   1225: .CW #define :
                   1226: .P1
                   1227: #define named_1 (*(struct named_1_ *) &named_)
                   1228: 
                   1229: /* Initialized data */
                   1230: 
                   1231: struct {
                   1232:     complex e_1;
                   1233:     doublereal fill_2[10];
                   1234:     doublereal e_3;
                   1235:     doublereal fill_4[9];
                   1236:     real e_5;
                   1237:     integer fill_6[10];
                   1238:     integer e_7;
                   1239:     integer fill_8[11];
                   1240:     logical e_9;
                   1241:     integer fill_10[5];
                   1242:     } named_ = { (float)1., (float)0., {0}, 2., {0}, (float)3., {0}, 4,
                   1243:            {0},  FALSE_ };
                   1244: .P2
                   1245: In this example, $f2c$ relies on C's structure initialization rules
                   1246: to supply zeros to the
                   1247: \f(CWfill_\fIn\fR
                   1248: arrays that take up the space for which no
                   1249: .CW data
                   1250: values were given.  (The logical constants
                   1251: .CW TRUE_
                   1252: and
                   1253: .CW FALSE_
                   1254: are defined in
                   1255: .CW f2c.h .)
                   1256: .PP
                   1257: Character manipulations of multiple-character strings
                   1258: generally result in function calls.  For example,
                   1259: the Fortran
                   1260: .P1
                   1261:       character*(*) function cat(a,b)
                   1262:       character*(*) a, b
                   1263:       cat = a // b
                   1264:       end
                   1265: .P2
                   1266: yields
                   1267: .P1
                   1268: \&. . .
                   1269: static integer c_\|\^_2 = 2;
                   1270: 
                   1271: /* Character */ int cat_(ret_val, ret_val_len, a, b, a_len, b_len)
                   1272: char *ret_val;
                   1273: ftnlen ret_val_len;
                   1274: char *a, *b;
                   1275: ftnlen a_len;
                   1276: ftnlen b_len;
                   1277: {
                   1278: 
                   1279:     /* System generated locals */
                   1280:     address a_\|\^_1[2];
                   1281:     integer i_\|\^_1[2];
                   1282: 
                   1283:     /* Builtin functions */
                   1284:     /* Subroutine */ int s_cat();
                   1285: 
                   1286: /* Writing concatenation */
                   1287:     i_\|\^_1[0] = a_len, a_\|\^_1[0] = a;
                   1288:     i_\|\^_1[1] = b_len, a_\|\^_1[1] = b;
                   1289:     s_cat(ret_val, a_\|\^_1, i_\|\^_1, &c_\|\^_2, ret_val_len);
                   1290: } /* cat_ */
                   1291: .P2
                   1292: Note how the return-value length
                   1293: .CW ret_val_len ) (
                   1294: and parameter lengths
                   1295: .CW a_len "" (
                   1296: and
                   1297: .CW b_len )
                   1298: are used.
                   1299: Single character operations are generally done in-line.
                   1300: For example, the body of the Fortran
                   1301: .P1
                   1302:       character*1 function lastnb(x,n)
                   1303:       character*1 x(n)
                   1304:       lastnb = ' '
                   1305:       do 10 i = n, 1, -1
                   1306:          if (x(i) .ne. ' ') then
                   1307:             lastnb = x(i)
                   1308:             return
                   1309:             end if
                   1310:  10      continue
                   1311:       end
                   1312: .P2
                   1313: becomes
                   1314: .P1
                   1315:     *ret_val = ' ';
                   1316:     for (i = *n; i >= 1; --i) {
                   1317:        if (x[i] != ' ') {
                   1318:            *ret_val = x[i];
                   1319:            return ;
                   1320:        }
                   1321: /* L10: */
                   1322:     }
                   1323: .P2
                   1324: .PP
                   1325: $F2c$ uses
                   1326: .CW struct s
                   1327: and
                   1328: .CW #define s
                   1329: to translate
                   1330: .CW equivalence s.
                   1331: For a complicated example showing the interaction of
                   1332: .CW data
                   1333: with
                   1334: .CW common ,
                   1335: .CW equivalence ,
                   1336: and, for good measure, Hollerith notation,
                   1337: consider the Fortran
                   1338: .P1
                   1339:       common /cmname/ c
                   1340:       complex c(10)
                   1341:       double precision d(10)
                   1342:       real r(10)
                   1343:       integer i(10)
                   1344:       logical m(10)
                   1345:       equivalence (c(1),d(1),r(1),i(1),m(1))
                   1346:       data c(1)/(1.,0.)/
                   1347:       data d(2)/2d0/, r(5)/3e0/, i(6)/4/, m(7)/.true./
                   1348:       call sam(c,d(1),r(2),i(3),m(4),14hsome hollerith,14)
                   1349:       end
                   1350: .P2
                   1351: The resulting C is
                   1352: .P1
                   1353: \&. . .
                   1354: struct cmname_1_ {
                   1355:     complex c[10];
                   1356: };
                   1357: 
                   1358: #define cmname_1 (*(struct cmname_1_ *) &cmname_)
                   1359: 
                   1360: /* Initialized data */
                   1361: 
                   1362: struct {
                   1363:     complex e_1;
                   1364:     doublereal e_2;
                   1365:     real e_3;
                   1366:     integer e_4;
                   1367:     logical e_5;
                   1368:     integer fill_6[13];
                   1369:     } cmname_ = { (float)1., (float)0., 2., (float)3., 4, TRUE_ };
                   1370: 
                   1371: 
                   1372: /* Table of constant values */
                   1373: 
                   1374: static integer c_\|\^_14 = 14;
                   1375: .P2
                   1376: .P1
                   1377: /* Main program */ MAIN_\|\^_()
                   1378: {
                   1379: 
                   1380:     /* Local variables */
                   1381: 
                   1382: #define d ((doublereal *)&cmname_1)
                   1383: #define i ((integer *)&cmname_1)
                   1384: #define l ((logical *)&cmname_1)
                   1385: #define r ((real *)&cmname_1)
                   1386:     extern /* Subroutine */ int sam_();
                   1387: 
                   1388:     sam_(cmname_1.c, d, &r[1], &i[2], &m[3], "some hollerith", &c_\|\^_14, 14L);
                   1389: } /* MAIN_\|\^_ */
                   1390: 
                   1391: #undef r
                   1392: #undef l
                   1393: #undef i
                   1394: #undef d
                   1395: .P2
                   1396: As this example shows, $f2c$ turns a Fortran MAIN program into
                   1397: a C function named
                   1398: .CW MAIN_\|\^_ .
                   1399: Why not
                   1400: .CW main ?
                   1401: Well, $libF77$ contains a C main routine that arranges
                   1402: for files to be closed automatically when the Fortran program stops,
                   1403: arranges for an error message to be printed if a floating-point
                   1404: exception occurs, and arranges for the command-line argument
                   1405: accessing functions
                   1406: .CW iargc
                   1407: and
                   1408: .CW getarg
                   1409: to work properly.  This C main routine invokes
                   1410: .CW MAIN_\|\^_ .
                   1411: .SH
                   1412: 6.  PORTABILITY ISSUES
                   1413: .PP
                   1414: Three portability issues are relevant to $f2c$:
                   1415: the portability of the support libraries ($libF77$ and $libI77$)
                   1416: upon which the translated C programs rely,
                   1417: that of the converter $f2c$ itself,
                   1418: and that of the C it produces.
                   1419: .PP
                   1420: Regarding the first issue,
                   1421: some vendors (e.g., Sun and MIPS) have changed the calling conventions for
                   1422: their $libI77$ from the original conventions (those of
                   1423: .[ [
                   1424: Feldman Weinberger Portable Fortran
                   1425: .]]).
                   1426: Other vendors (e.g., MIPS) have changed the $libF77$ calling conventions
                   1427: (e.g., for
                   1428: .CW complex -valued
                   1429: functions).
                   1430: Thus, having libraries $libF77$ and $libI77$
                   1431: or otherwise having library routines with the names
                   1432: that $f2c$ expects is insufficient.
                   1433: When using a machine whose vendor provides but has gratuitously changed
                   1434: $libF77$ or $libI77$, one cannot safely mix objects compiled
                   1435: from the C produced by $f2c$ with objects compiled by the vendor's
                   1436: Fortran compiler, and one must use the correct libraries with
                   1437: programs translated by $f2c$.  In such a case, the recommended procedure
                   1438: is to obtain source for the libraries (e.g. from
                   1439: .I netlib
                   1440: \(em see \(sc8), combine them into a single library, say
                   1441: .CW libf2c ,
                   1442: and install the library where it they can be conveniently accessed.
                   1443: On a UNIX system, for example, one might install
                   1444: .CW libf2c
                   1445: in
                   1446: .CW /usr/lib/libf2c.a ;
                   1447: then one could issue the command
                   1448: .P1
                   1449: cc *.c -lf2c -lm
                   1450: .P2
                   1451: to compile and link a program translated by $f2c$.
                   1452: .PP
                   1453: The converter itself is reasonably portable and has run successfully on Apollo,
                   1454: Cray, IBM, MIPS, SGI, Sun and DEC VAX equipment, all running some
                   1455: version of the UNIX operating system.
                   1456: However, we shall see that the C it produces may not be portable due to
                   1457: subtle storage management issues in Fortran 77.
                   1458: In any case, the C output of $f2c$ will run fine, at least if
                   1459: the \f(CW\%-W\fIn\fR option (see Appendix B) is used to set the
                   1460: number of characters per word correctly, and if C
                   1461: .CW double
                   1462: values may fall on an odd-word boundary.
                   1463: .PP
                   1464: The Fortran 77 standard says that \f(CWComplex\fP and \f(CWDouble Precision\fP
                   1465: objects occupy two ``units'' of space while other non-character data types
                   1466: occupy one ``unit.''
                   1467: It may be necessary to edit the header file
                   1468: .CW f2c.h
                   1469: to make these assumptions hold, if possible.
                   1470: On the Cray, for example,
                   1471: .CW float
                   1472: and
                   1473: .CW double
                   1474: are the same C types, and Fortran double precision, if
                   1475: available, would correspond to the C type
                   1476: .CW "long double" .
                   1477: In this case, changing the definition of
                   1478: .CW doublereal
                   1479: in
                   1480: .CW f2c.h
                   1481: from
                   1482: .P1
                   1483: typedef double doublereal;
                   1484: .P2
                   1485: to
                   1486: .P1
                   1487: typedef long double doublereal;
                   1488: .P2
                   1489: would be appropriate.  For the Think C compiler on the
                   1490: Macintosh, on the other hand, this line would need to become
                   1491: .P1
                   1492: typedef short double doublereal;
                   1493: .P2
                   1494: .PP
                   1495: If your C compiler predefines symbols that could clash with
                   1496: translated Fortran variable names, then you should also
                   1497: add appropriate
                   1498: .CW #undef
                   1499: lines to
                   1500: .CW f2c.h .
                   1501: The current default
                   1502: .CW f2c.h
                   1503: provides the following
                   1504: .CW #undef
                   1505: lines for the following symbols:
                   1506: .TS
                   1507: center;
                   1508: lfCW lfCW lfCW lfCW lfCW lfCW.
                   1509: cray   mc68020 sgi     sun2    u370    u3b5
                   1510: gcos   mips    sparc   sun3    u3b     unix
                   1511: mc68010        pdp11   sun     sun4    u3b2    vax
                   1512: .TE
                   1513: .PP
                   1514: As an extension to the Fortran 77 Standard, $f2c$
                   1515: allows noncharacter variables to be initialized with character
                   1516: data.  This extension is inherently nonportable, as the number
                   1517: of characters storable per ``unit'' varies from machine to machine.
                   1518: Since 32 bit machines are the most plentiful, $f2c$
                   1519: assumes 4 characters per Fortran ``unit'', but this assumption
                   1520: can be overridden by the \f(CW\%-W\fIn\fR command-line option.
                   1521: For example,
                   1522: .CW \%-W8
                   1523: is appropriate for C that is to be run on Cray computers,
                   1524: since Crays store 8 characters per word.
                   1525: An example is helpful here:  the Fortran
                   1526: .P1
                   1527:       data i/'abcd'/
                   1528:       j = i
                   1529:       end
                   1530: .P2
                   1531: turns into
                   1532: .P1
                   1533:     /* Initialized data */
                   1534: 
                   1535:     static struct {
                   1536:        char e_1[4];
                   1537:        } equiv_3 = { {'a', 'b', 'c', 'd'} };
                   1538: 
                   1539: #define i (*(integer *)&equiv_3)
                   1540: 
                   1541:     static integer j;
                   1542: 
                   1543:     j = i;
                   1544: \&. . .
                   1545: #undef i
                   1546: .P2
                   1547: (Some use of
                   1548: .CW i ,
                   1549: e.g. ``\f(CWj = i\fR'', is necessary or $f2c$
                   1550: will see that
                   1551: .CW i
                   1552: is not used and will not initialize it.)  If the target
                   1553: machine were a Cray and the string were
                   1554: .CW 'abcdefgh'
                   1555: or \f(CW"abcdefhg"\fR,
                   1556: then the Fortran would run fine, but the C produced by $f2c$ would only
                   1557: store \f(CW"abcd"\fR
                   1558: in i, $4$ being the default number of characters per word.
                   1559: The $f2c$ command-line option
                   1560: .CW \%-W8
                   1561: gives the correct initialization for a Cray.
                   1562: .PP
                   1563: The initialization above is clumsy, using $4$ separate characters.
                   1564: Using the option
                   1565: .CW -A ,
                   1566: for ANSI, produces
                   1567: .P1
                   1568: \&. . .
                   1569:        } equiv_3 = { "abcd" };
                   1570: \&. . .
                   1571: .P2
                   1572: See Appendix B.
                   1573: .PP
                   1574: The above examples explain why the Fortran 77 standard excludes
                   1575: Hollerith data statements: the number of characters per word is
                   1576: not specified and hence such code is not portable even in Fortran.
                   1577: (Fortran that conservatively assumes only 1 or 2 characters per word is
                   1578: portable but messy.  Note that Fortran 77 forbids the mixing, via
                   1579: .CW common ,
                   1580: .CW data ,
                   1581: or
                   1582: .CW equivalence ,
                   1583: of character and noncharacter types.  Like many Fortran compilers,
                   1584: $f2c$ permits such nonportable mixing;
                   1585: initialization of numeric variables with Hollerith data is one
                   1586: example of this mixing.)
                   1587: .PP
                   1588: Some Fortran 66 programs pass Hollerith strings to
                   1589: .CW integer
                   1590: variables.  $F2c$ treats a Hollerith string as a character string,
                   1591: but this may lead to bus errors on some systems if the character
                   1592: string winds up being improperly aligned.  The
                   1593: .CW \%-h
                   1594: option instructs $f2c$ to try to give character variables
                   1595: and constants the same alignment as
                   1596: .CW integer s.
                   1597: Under
                   1598: .CW \%-h ,
                   1599: for example,  the Fortran
                   1600: .P1
                   1601:       call foo("a string")
                   1602:       call goo(8ha string)
                   1603: .P2
                   1604: is translated to
                   1605: .P1
                   1606: static struct { integer fill; char val[8+1]; char fill2[3]; } c_b1_st = { 0,
                   1607:        "a string" };
                   1608: #define c_b1 c_b1_st.val
                   1609: \&. . .
                   1610:     foo_(c_b1, 8L);
                   1611:     goo_(c_b1, 8L);
                   1612: \&. . .
                   1613: .P2
                   1614: .PP
                   1615: Some systems require that C values of type
                   1616: .CW double
                   1617: be aligned on a double-word boundary.  Fortran
                   1618: .CW common
                   1619: and
                   1620: .CW equivalence
                   1621: statements may require some C
                   1622: .CW double
                   1623: values to be aligned on an odd-word boundary.
                   1624: On systems where double-word alignment is required,
                   1625: C compilers pad structures, if necessary, to arrange
                   1626: for the right alignment.  Often such padding has no effect on
                   1627: the validity of $f2c$'s
                   1628: translation, but using
                   1629: .CW common
                   1630: or
                   1631: .CW equivalence ,
                   1632: it is easy to contrive examples in which
                   1633: the translated C works incorrectly.
                   1634: $F2c$ issues a warning message when double-word alignment may
                   1635: cause trouble, but, like $f77$,
                   1636: it makes no attempt to circumvent this trouble;
                   1637: the run-time costs of circumvention would be substantial.
                   1638: .PP
                   1639: Long decimal strings in \f(CWdata\fP statements are passed to C unaltered.
                   1640: However, expressions involving long decimal strings are rounded
                   1641: in a machine-dependent manner.
                   1642: On a VAX 8550, the Fortran
                   1643: .P1
                   1644:       x=1.2**10
                   1645:       end
                   1646: .P2
                   1647: yields the C
                   1648: .P1
                   1649:     static real x;
                   1650: 
                   1651:     x = (float)6.1917364224000008;
                   1652: .P2
                   1653: .PP
                   1654: ANSI C compilers require that all but one instance of any entity with external scope,
                   1655: such as the \f(CWstruct\fPs into which $f2c$ translates \f(CWcommon\fP,
                   1656: be declared \f(CWextern\fP and that exactly one declaration should define the entity,
                   1657: i.e., should not be declared \f(CWextern\fP.
                   1658: Most older C compilers have no such restriction.
                   1659: To be compatible with ANSI usage, the $f2c$
                   1660: command-line option
                   1661: .CW -ec
                   1662: causes the \f(CWstruct\fP corresponding
                   1663: to an uninitialized \f(CWcommon\fP region to be declared \f(CWextern\fP
                   1664: and makes a
                   1665: .CW union
                   1666: of all successive declarations of that
                   1667: \f(CWcommon\fP region into a defining declaration placed in a file with the
                   1668: name \f(CWcname_com.c\fR, where
                   1669: .CW cname
                   1670: is the name of the \f(CWcommon\fP region.
                   1671: For example, the Fortran
                   1672: .P1
                   1673:       common /cmname/ c
                   1674:       complex c(10)
                   1675:       c(1)=cmplx(1.,0.)
                   1676:       call sam(c)
                   1677:       end
                   1678:       subroutine sam(c)
                   1679:       complex c
                   1680:       common /cmname/ca
                   1681:       complex ca(10)
                   1682:       ca(2) = cmplx(1e0,2e0)
                   1683:       return
                   1684:       end
                   1685: .P2
                   1686: when converted by \f(CWf2c -ec\fP produces
                   1687: .P1
                   1688: /* Common Block Declarations */
                   1689: 
                   1690: union {
                   1691:     struct {
                   1692:        complex c[10];
                   1693:     } _1;
                   1694:     struct {
                   1695:        complex ca[10];
                   1696:     } _2;
                   1697: } cmname_;
                   1698: 
                   1699: #define cmname_1 (cmname_._1)
                   1700: #define cmname_2 (cmname_._2)
                   1701: 
                   1702: /* Main program */ MAIN_\|\^_()
                   1703: {
                   1704: 
                   1705:     extern /* Subroutine */ int sam_();
                   1706: 
                   1707:     cmname_1.c[0].r = (float)1., cmname_1.c[0].i = (float)0.;
                   1708:     sam_(cmname_1.c);
                   1709: } /* MAIN_\|\^_ */
                   1710: 
                   1711: /* Subroutine */ int sam_(c)
                   1712: complex *c;
                   1713: {
                   1714:     cmname_2.ca[1].r = (float)1., cmname_2.ca[1].i = (float)2.;
                   1715:     return 0;
                   1716: } /* sam_ */
                   1717: .P2
                   1718: as well as the file
                   1719: .CW cmname_com.c :
                   1720: .P1
                   1721: #include "f2c.h"
                   1722: union {
                   1723:     struct {
                   1724:        complex c[10];
                   1725:     } _1;
                   1726:     struct {
                   1727:        complex ca[10];
                   1728:     } _2;
                   1729: } cmname_;
                   1730: .P2
                   1731: The files
                   1732: .CW *_com.c
                   1733: may be compiled into a library
                   1734: against which one can load to satisfy overly fastidious ANSI C compilers.
                   1735: .PP
                   1736: The rules of Fortran 77 apparently permit a situation in which
                   1737: $f2c$ declares a function to be of type
                   1738: .CW int ,
                   1739: then defines it to be of another type, as illustrated by the
                   1740: first example in \(sc7.  In that example, $f2c$ discovers too late that
                   1741: .CW f
                   1742: is not a subroutine.  With some C compilers, this causes nothing
                   1743: worse than a warning message; with others, it causes the compilation
                   1744: to be aborted.  With unforgiving C compilers, one can usually avoid
                   1745: trouble by splitting the Fortran source into one file per
                   1746: procedure, e.g., with the
                   1747: .I fsplit (1)
                   1748: command, and converting each procedure separately.
                   1749: Another solution is to use prototypes, as discussed in \(sc7.
                   1750: .PP
                   1751: With an ANSI C system that enforced consistent
                   1752: prototype declarations across separate compilations,
                   1753: it would be impossible to translate the main program correctly
                   1754: in the last example just by looking at the main program.
                   1755: Recent C++ compilers do enforce the consistency of
                   1756: prototype declarations across separate compilations,
                   1757: e.g., by encoding calling sequences into the translated names of functions,
                   1758: except for functions that are declared \f(CWextern "C"\fR and
                   1759: compiled separately.
                   1760: $F2c$ allows one to use this escape hatch:  under
                   1761: .CW -C++ ,
                   1762: $f2c$ inserts
                   1763: .P1
                   1764: #ifdef _\|\^_cplusplus
                   1765: extern "C" {
                   1766: #endif
                   1767: .P2
                   1768: at the beginning of its C++ output and places
                   1769: .P1
                   1770: #ifdef _\|\^_cplusplus
                   1771:        }
                   1772: #endif
                   1773: .P2
                   1774: at the end of its C++ output.  The
                   1775: .CW "#ifdef _\|\^_cplusplus"
                   1776: lines are for the benefit of older C++ compilers that
                   1777: do not recognize \f(CWextern "C"\fR.
                   1778: .SH
                   1779: 7. PROTOTYPES
                   1780: .PP
                   1781: In ANSI C and C++, a
                   1782: .I prototype
                   1783: describes the calling sequence of a function.
                   1784: Prototypes can save debugging time by helping catch
                   1785: errors in calling sequences.  The
                   1786: .CW \%-P
                   1787: option instructs $f2c$ to emit prototypes for all
                   1788: the functions defined in the C it produces; specifically,
                   1789: $f2c$ creates a \fIfile\f(CW.P\fR of prototypes
                   1790: for each input \fIfile\f(CW.f\fR or \fIfile\f(CW.F\fR.
                   1791: One can then arrange for relevant prototype files
                   1792: to be seen by the C compiler.
                   1793: For instance, if $f2c$'s
                   1794: header file
                   1795: .CW f2c.h
                   1796: is installed as
                   1797: .CW /usr/include/f2c.h ,
                   1798: one could issue the UNIX command
                   1799: .P1
                   1800: cat /usr/include/f2c.h *.P >f2c.h
                   1801: .P2
                   1802: to create a local copy of
                   1803: .CW f2c.h
                   1804: that has in it all the prototypes in
                   1805: .CW *.P .
                   1806: Since the C produced by $f2c$ always specifies
                   1807: .P1
                   1808: #include "f2c.h"
                   1809: .P2
                   1810: (rather than
                   1811: .CW "#include <f2c.h>" ),
                   1812: the C compiler will look first in the current directory for
                   1813: .CW f2c.h
                   1814: and thus will find the local copy that contains the prototypes.
                   1815: .PP
                   1816: $F2c$ can also read the prototype files it writes;
                   1817: one simply specifies them as arguments to $f2c$.
                   1818: In fact, $f2c$ reads all prototype files before any
                   1819: Fortran files; although multiple Fortran files are handled
                   1820: independently, any prototype file arguments apply to all of them.
                   1821: $F2c$ has more detailed knowledge of Fortran types than it conveys
                   1822: in the C it puts out; for example,
                   1823: .CW logical
                   1824: and
                   1825: .CW integer
                   1826: are different Fortran types, but are mapped to the same C type.
                   1827: Moreover,
                   1828: .CW character ,
                   1829: .CW complex ,
                   1830: and
                   1831: .CW "double complex"
                   1832: Fortran functions are all translated to
                   1833: .CW VOID
                   1834: C functions, and, unless the
                   1835: .CW \%-R
                   1836: option is specified, both
                   1837: .CW real
                   1838: and
                   1839: .CW "double precision"
                   1840: Fortran functions are translated to
                   1841: .CW doublereal
                   1842: C functions.  Because $f2c$ denotes all these
                   1843: types differently in its prototype files, it
                   1844: can catch errors that are invisible to an ANSI C
                   1845: (or C++) compiler.
                   1846: .PP
                   1847: The following table shows the types
                   1848: that $f2c$ uses for procedure arguments:
                   1849: .TS
                   1850: center box;
                   1851: lfCW lfCW.
                   1852: C_fp   complex
                   1853: D_fp   doublereal
                   1854: E_fp   real\fR under \f(CW-!R\fR (the default)\fP
                   1855: H_fp   character
                   1856: I_fp   integer\fR or \f(CWinteger*4
                   1857: J_fp   integer*2
                   1858: K_fp   shortlogical\fR (\f(CWlogical\fR under \f(CW-i2\fR or \f(CW-I2\fR)\fP
                   1859: L_fp   logical
                   1860: R_fp   real\fR under \f(CW-R
                   1861: S_fp   subroutine\fR
                   1862: U_fp   \fRuntyped \f(CWexternal
                   1863: Z_fp   doublecomplex
                   1864: .TE
                   1865: These types are defined in
                   1866: .CW f2c.h ;
                   1867: they appear in prototypes and, under
                   1868: .CW \%-A
                   1869: or
                   1870: .CW \%-C++ ,
                   1871: in the C that $f2c$ writes.  Prototypes also use special
                   1872: .CW void
                   1873: types to denote the return values of
                   1874: .CW complex ,
                   1875: .CW "double complex",
                   1876: and
                   1877: .CW character
                   1878: functions:
                   1879: .TS
                   1880: center box;
                   1881: lfCW lfCW.
                   1882: C_f    complex
                   1883: H_f    character
                   1884: Z_f    double complex
                   1885: .TE
                   1886: .PP
                   1887: $F2c$ also writes special comments in prototype files giving
                   1888: the length of each
                   1889: .CW common
                   1890: block; when given prototype files as arguments, $f2c$ reads
                   1891: these special comments so it can issue a warning message if its
                   1892: Fortran input specifies a different length for some
                   1893: .CW common
                   1894: block.
                   1895: .PP
                   1896: Sometimes people write otherwise valid Fortran 77 that
                   1897: specifies different lengths for a
                   1898: .CW common
                   1899: block.  If such Fortran is split into several files and converted
                   1900: to C, the loader could end up giving too little space to the
                   1901: .CW common
                   1902: block in question.  One can avoid the confusion this could cause by
                   1903: running $f2c$ twice, first with
                   1904: .CW \%-P!c ,
                   1905: then with the resulting prototypes as additional arguments;
                   1906: the prototypes let $f2c$ determine (and convey to all of its
                   1907: output C files) the true length needed for
                   1908: each
                   1909: .CW common
                   1910: block.
                   1911: .PP
                   1912: One complication with prototypes comes from Fortran subprograms that
                   1913: declare a procedure to be
                   1914: .CW external
                   1915: but do not explicitly specify a type for it and only
                   1916: pass it as a parameter to another procedure.  (If the
                   1917: subprogram also invokes the
                   1918: .CW external
                   1919: procedure, then $f2c$ can tell whether the procedure is
                   1920: a subroutine or a function; in the latter case, Fortran's
                   1921: implicit typing rules specify a type for the procedure.)
                   1922: If it can do no better, then $f2c$ assumes that untyped
                   1923: .CW external
                   1924: procedures are subroutines (and hence become
                   1925: .CW int -valued
                   1926: functions in C).
                   1927: This can cause the generated C to have
                   1928: multiple and inconsistent declarations for some procedures.
                   1929: For example,
                   1930: .P1
                   1931:        external f
                   1932:        call foo(f)
                   1933:        end
                   1934:        function f(x)
                   1935:        double precision f, x
                   1936:        f = x
                   1937:        end
                   1938: .P2
                   1939: results in
                   1940: .CW MAIN_\|\^_
                   1941: declaring
                   1942: .P1
                   1943:     extern /* Subroutine */ int f_();
                   1944: .P2
                   1945: and in the subsequent definition of
                   1946: .CW "doublereal f_(x)"
                   1947: in the same C file.
                   1948: Such inconsistencies are grounds for some C compilers
                   1949: to abort compilation.
                   1950: .PP
                   1951: $F2c$'s type inferences only apply sequentially to
                   1952: the procedures in a file, because $f2c$ writes C for each procedure
                   1953: before reading the next one.  Thus, as just illustrated, if procedure
                   1954: .CW xyz
                   1955: comes after
                   1956: .CW abc
                   1957: in a Fortran input file, then $f2c$ cannot use information
                   1958: it gains when it sees the definition of
                   1959: .CW xyz
                   1960: to deduce types for
                   1961: .CW external
                   1962: procedures passed as arguments to
                   1963: .CW xyz
                   1964: by
                   1965: .CW abc .
                   1966: By using the
                   1967: .CW \%-P
                   1968: option and running $f2c$ several times, one can
                   1969: get around this deficiency.  For instance, if file
                   1970: .CW zap.f
                   1971: contains the Fortran shown above, then the commands
                   1972: .P1
                   1973:        f2c -P!c zap.f
                   1974:        f2c -A zap.[fP]
                   1975: .P2
                   1976: result in a file
                   1977: .CW zap.c
                   1978: in which
                   1979: .CW MAIN_\|\^_
                   1980: correctly types
                   1981: .CW f_
                   1982: and
                   1983: .CW foo_
                   1984: as
                   1985: .P1
                   1986:     extern doublereal f_();
                   1987:     extern /* Subroutine */ int foo_(D_fp);
                   1988: .P2
                   1989: rather than
                   1990: .P1
                   1991:     extern /* Subroutine */ int f_();
                   1992:     extern /* Subroutine */ int foo_(U_fp);
                   1993: .P2
                   1994: The first invocation of $f2c$ results in a file
                   1995: .CW zap.P
                   1996: containing
                   1997: .P1
                   1998: extern doublereal f_(doublereal *x);
                   1999: /*:ref: foo_ 10 1 200 */
                   2000: .P2
                   2001: The second invocation of $f2c$ is able to type
                   2002: .CW f_
                   2003: and
                   2004: .CW foo_
                   2005: correctly because of the first line in
                   2006: .CW zap.P .
                   2007: .PP
                   2008: The second line in
                   2009: .CW zap.P
                   2010: is a special comment that records the incomplete type
                   2011: information that $f2c$ has about
                   2012: .CW foo_ .
                   2013: $F2c$ puts one such special comment in the prototype file for each
                   2014: Fortran procedure that is referenced but not defined in the Fortran file.
                   2015: When it reads prototype files, $f2c$ deciphers these comments and
                   2016: uses them to check the consistency of calling sequences.
                   2017: As it learns more about untyped external procedures, $f2c$ updates
                   2018: the information it has on them; the
                   2019: .CW :ref:
                   2020: comments it writes in a prototype file reflect $f2c$'s latest knowledge.
                   2021: .PP
                   2022: Ordinarily $f2c$ tries to infer the type of an untyped
                   2023: .CW external
                   2024: procedure from its use as arguments to procedures of
                   2025: known argument types.  For example, if
                   2026: .CW f.f
                   2027: contains just
                   2028: .P1
                   2029:        external f
                   2030:        call foo(f)
                   2031:        end
                   2032: .P2
                   2033: and if
                   2034: .CW foo.P
                   2035: contains
                   2036: .P1
                   2037: extern int foo_(D_fp);
                   2038: .P2
                   2039: then
                   2040: .P1
                   2041: f2c -A f.f foo.P
                   2042: .P2
                   2043: results in the declaration
                   2044: .P1
                   2045:     extern doublereal f_();
                   2046: .P2
                   2047: Under unusual circumstances, such type inferences
                   2048: can lead to erroneous error messages or to incorrect typing.
                   2049: Here is an example:
                   2050: .P1
                   2051:        subroutine zoo
                   2052:        external f
                   2053:        double precision f
                   2054:        external g
                   2055:        call zap(1,f)
                   2056:        call zap(2,g)
                   2057:        end
                   2058:        subroutine goo
                   2059:        call g
                   2060:        end
                   2061: .P2
                   2062: $F2c$ first infers g to be a double precision function, then discovers
                   2063: that it must be a subroutine and issues a warning message about
                   2064: inconsistent declarations for
                   2065: .CW g .
                   2066: This example is legal Fortran 77;
                   2067: .CW zap
                   2068: could be defined, for instance, by
                   2069: .P1
                   2070:        subroutine zap(n,f)
                   2071:        external f
                   2072:        if (n .le. 1) call zap1(f)
                   2073:        if (n .ge. 2) call zap2(f)
                   2074:        end
                   2075: .P2
                   2076: In such a case one can specify the
                   2077: .CW \%-!it
                   2078: option to instruct $f2c$ not to infer the types of otherwise
                   2079: untypable
                   2080: .CW external
                   2081: procedures from their appearance as arguments to known procedures.
                   2082: Here is another (somewhat far-fetched) example where
                   2083: .CW \%-!it
                   2084: is useful:
                   2085: .P1
                   2086:        subroutine grok(f,g,h)
                   2087:        external f, g, h
                   2088:        logical g
                   2089:        call foo(1,g)
                   2090:        call foo(2,f)
                   2091:        call zit(1,f)
                   2092:        call zit(2,h)
                   2093:        call zot(f(3))
                   2094:        end
                   2095: .P2
                   2096: Without
                   2097: .CW \%-!it ,
                   2098: $f2c$ first infers
                   2099: .CW f_
                   2100: to be a
                   2101: .CW logical
                   2102: function, then discovers that Fortran's implicit typing
                   2103: rules require it to be a
                   2104: .CW real
                   2105: function.
                   2106: $F2c$ issues the
                   2107: warning message
                   2108: .CW "fixing wrong type inferred for f" '', ``
                   2109: which should serve as a warning that $f2c$ may have made some
                   2110: incorrect type inferences in the mean time.
                   2111: Indeed, $f2c$ ends up typing
                   2112: .CW h_
                   2113: as a
                   2114: .CW logical
                   2115: function; with
                   2116: .CW \%-!it
                   2117: specified, $f2c$ types
                   2118: .CW h_
                   2119: as an
                   2120: .CW external
                   2121: procedure unknown type, i.e., a
                   2122: .CW U_fp ,
                   2123: which to the C compiler appears to be a subroutine.
                   2124: (Even with
                   2125: .CW \%-!it
                   2126: specified, $f2c$ issues a warning message about inconsistent
                   2127: calling sequences for
                   2128: .CW foo .)
                   2129: .PP
                   2130: Because $f2c$ writes its latest knowledge of types into
                   2131: prototype files, it is easy to write a crude (Bourne) shell script
                   2132: that will glean the maximum possible type information:
                   2133: .P1
                   2134: >f.p
                   2135: until
                   2136:        f2c -Pit f.p f.f
                   2137:        cmp -s f.p f.P
                   2138: do
                   2139:        mv f.P f.p
                   2140:        done
                   2141: .P2
                   2142: In such scripts, use of the
                   2143: .CW \%-Ps
                   2144: option can save an iteration;
                   2145: .CW \%-Ps
                   2146: implies
                   2147: .CW \%-P
                   2148: and instructs $f2c$ to issue return code 4 if another
                   2149: iteration might change a declaration or prototype.
                   2150: Thus the following script is more efficient:
                   2151: .EQ
                   2152: delim off
                   2153: .EN
                   2154: .P1
                   2155: while :; do
                   2156:        f2c -Ps f.[fP]
                   2157:        case $? in 4) ;; *) break;; esac
                   2158:        done
                   2159: .P2
                   2160: .EQ
                   2161: delim $$
                   2162: .EN
                   2163: The number of iterations depends on the call graph of the
                   2164: procedures in
                   2165: .CW f.f
                   2166: and on their order of appearance in
                   2167: .CW f.f .
                   2168: Sorting them into topological order (so that if
                   2169: .CW abc
                   2170: calls
                   2171: .CW def ,
                   2172: then
                   2173: .CW abc
                   2174: precedes
                   2175: .CW def )
                   2176: and reverse topological order and alternating between
                   2177: the two orders
                   2178: is probably a good heuristic.
                   2179: For example, we were able to completely type
                   2180: the \s-2PORT3\s+2 subroutine library
                   2181: in two passes by first processing it in reverse topological order,
                   2182: then in forward order.  Unfortunately, one can devise situations
                   2183: where arbitrarily many iterations are required.  This is slightly
                   2184: annoying, since with appropriate data structures (in an extensively
                   2185: reorganized version of $f2c$), one could do this calculation
                   2186: in linear time.
                   2187: .SH
                   2188: 8. EXPERIENCE WITH \f(BInetlib\fP
                   2189: .PP
                   2190: With the help of Eric Grosse, we arranged for the $netlib$
                   2191: .[ [
                   2192: Dongarra Grosse 1987
                   2193: .]]
                   2194: server
                   2195: .CW [email protected]
                   2196: to provide an experimental Fortran-to-C translation service
                   2197: by electronic mail.
                   2198: By executing the UNIX command
                   2199: .sp .5
                   2200: .ce
                   2201: \f(CW(echo execute f2c; cat foo.f) | mail [email protected]\fR
                   2202: .sp .5
                   2203: one submits the Fortran in
                   2204: .CW foo.f
                   2205: to $netlib$'s $f2c$ service;
                   2206: $netlib$ replies with the C and diagnostic messages produced by $f2c$ from
                   2207: .CW foo.f .
                   2208: (The
                   2209: .CW include
                   2210: mechanism described in \(sc3 makes no sense in this
                   2211: context, so it is disabled.)  To start using this service,
                   2212: one would generally execute
                   2213: .sp .5
                   2214: .ce
                   2215: \f(CWecho 'send index from f2c' | mail [email protected]\fR
                   2216: .sp .5
                   2217: to check on the current status of the service.
                   2218: Before compiling the returned C, it is necessary to get a copy of
                   2219: .CW f2c.h :
                   2220: .sp .5
                   2221: .ce
                   2222: \f(CWecho 'send f2c.h from f2c' | mail [email protected]\fR
                   2223: .sp .5
                   2224: Most likely it would also be necessary to obtain source for the
                   2225: versions of $libF77$ and $libI77$ assumed by $f2c$:
                   2226: .sp .5
                   2227: .ce
                   2228: \f(CWecho 'send libf77 libi77 from f2c' | mail [email protected]\fR
                   2229: .PP
                   2230: For testing purposes, we retain the original Fortran submitted to
                   2231: $netlib$'s
                   2232: .CW "execute f2c" '' ``
                   2233: service.  Observing $f2c$'s behavior on over 400,000 lines
                   2234: of submitted Fortran helped
                   2235: us find many obscure bugs and led us to make some of the
                   2236: extensions described in \(sc3.  For example, a
                   2237: .CW "block data"
                   2238: subprogram initializing a variable that does not appear
                   2239: in any
                   2240: .CW common
                   2241: blocks now elicits a warning message (rather than causing
                   2242: $f2c$ to drop core).  Another example is that $f2c$
                   2243: now gives the warning message
                   2244: .CW "Statement order error: declaration after DATA" '' ``
                   2245: and declines to produce any C
                   2246: if a declaration comes after a
                   2247: .CW data
                   2248: statement (for reasons discussed in \(sc9);
                   2249: $f2c$ formerly gave a more obscure error message
                   2250: and then produced invalid C.
                   2251: .PP
                   2252: Now that $netlib$ offers source for $f2c$ itself (as explained
                   2253: in the
                   2254: .CW index
                   2255: file mentioned above), we expect to curtail $netlib$'s
                   2256: .CW "execute f2c" '' ``
                   2257: service, perhaps limiting it to employees of AT&T and Bellcore;
                   2258: to learn the current state of affairs, request the current
                   2259: .CW index
                   2260: file.
                   2261: .SH
                   2262: 9. POSSIBLE EXTENSIONS
                   2263: .PP
                   2264: Currently $f2c$ simplifies constant expressions.
                   2265: It would be nice if constant expressions were simply
                   2266: passed through, and if Fortran
                   2267: .CW parameter s
                   2268: were translated as
                   2269: .CW #define s.
                   2270: Unfortunately, several things conspire to make this
                   2271: nearly impossible to do in full generality.
                   2272: Perhaps worst is that
                   2273: .CW parameter s
                   2274: may be assigned
                   2275: .CW complex
                   2276: or
                   2277: .CW doublecomplex
                   2278: expressions that might, for example, involve complex division
                   2279: and exponentiation to a large integer power.
                   2280: .CW Parameter s
                   2281: may appear in
                   2282: .CW data
                   2283: statements, which may initialize
                   2284: .CW common
                   2285: variables and so be moved near the beginning of the C output.
                   2286: Arranging to have the right
                   2287: .CW #define s
                   2288: in effect for the data initialization would, in this worst case,
                   2289: be a nightmare.  Of course, one could arrange to
                   2290: handle ``easy'' cases with unsimplified constant expressions
                   2291: and
                   2292: .CW #define s
                   2293: for parameters.
                   2294: .PP
                   2295: Prototypes and the argument consistency checks currently ignore
                   2296: alternate return specifiers.  Prototypes could be adorned with
                   2297: special comments indicating where alternate return specifiers
                   2298: are supposed to come, or at least telling the number of such
                   2299: specifiers, which is all that really matters.
                   2300: Since alternate return specifiers are rarely used
                   2301: (Fortran 90 calls them ``obsolescent''),
                   2302: we have so far refrained from this exercise.
                   2303: .PP
                   2304: Fortran 90 allows
                   2305: .CW data
                   2306: statements to appear anywhere.  It would be nice if $f2c$ could
                   2307: do the same, but that would entail major rewriting of $f2c$.
                   2308: Presently
                   2309: .CW data
                   2310: values are written to a file as soon as they are seen; among
                   2311: the information in the file is the offset of each value.
                   2312: If an
                   2313: .CW equivalence
                   2314: statement could follow the
                   2315: .CW data
                   2316: statement, then the offsets would be invalidated.
                   2317: .PP
                   2318: It would be fairly straightforward to extend $f2c$'s I/O
                   2319: to encompass the new specifiers introduced by Fortran 90.
                   2320: Unfortunately, that would mean changing $libI77$ in ways
                   2321: that would make it incompatible with $f77$.
                   2322: .PP
                   2323: Of course, it would be nice to translate all of Fortran 90, but
                   2324: some of the Fortran 90 array manipulations would require new
                   2325: calling conventions and large enough revisions to $f2c$ that
                   2326: one might be better off starting from scratch.
                   2327: .PP
                   2328: With sufficient hacking,
                   2329: $f2c$ could be modified to recognize
                   2330: Fortran 90 control structures
                   2331: .CW case , (
                   2332: .CW cycle , 
                   2333: .CW exit ,
                   2334: and named loops), local arrays of
                   2335: dimensions that depend on arguments and common values,
                   2336: and such types as
                   2337: .CW logical*1 ,
                   2338: .CW logical*2 ,
                   2339: .CW integer*1
                   2340: or
                   2341: .CW byte .
                   2342: Since our main concern is with making portable Fortran 77
                   2343: libraries available to the C world, we have so far refrained
                   2344: from these further extensions.  Perhaps commercial
                   2345: vendors will wish to provide some of these extensions.
                   2346: .SH
                   2347: 10. REFERENCES
                   2348: .LP
                   2349: .so tmac.sdisp1
                   2350: .[
                   2351: $LIST$
                   2352: .]

unix.superglobalmegacorp.com

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