|
|
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 intrinsic functions ! 617: .CW and , ! 618: .CW or , ! 619: .CW xor , ! 620: and ! 621: .CW not ! 622: perform bitwise Boolean operations. ! 623: .Bp ! 624: $LibF77$ provides two functions for accessing command-line arguments: ! 625: .CW iargc(dummy) ! 626: returns the number of command-line arguments (and ignores its argument); ! 627: .CW getarg(k,c) ! 628: sets the character string ! 629: .CW c ! 630: to the $k$th command-line argument (or to blanks if $k$ is out of range). ! 631: .Bp ! 632: Variable, ! 633: .CW common , ! 634: and procedure names may be arbitrarily long, but they ! 635: are truncated after the 50th character. These names may ! 636: contain underscores (in which case their translations will ! 637: have a pair of underscores appended). ! 638: .Bp ! 639: MAIN programs may have arguments, which are ignored. ! 640: .Bp ! 641: .CW Common ! 642: variables may be initialized by a ! 643: .CW data ! 644: statement in any module, not just in a ! 645: .CW "block data" ! 646: subprogram. ! 647: .Bp ! 648: The label may be omitted from a ! 649: .CW do ! 650: loop if the loop ! 651: is terminated by an ! 652: .CW enddo ! 653: statement. ! 654: .Bp ! 655: Unnamed Fortran 90 ! 656: .CW "do while" ! 657: loops are allowed. ! 658: Such a loop begins with a statement of the form ! 659: .ce ! 660: \f(CWdo \fR[\fIlabel\^\fR] [\f(CW,\fR] \f(CWwhile(\fIlogical expression\f(CW)\fR ! 661: and ends either after the statement labelled by $label$ or after a matching ! 662: .CW enddo . ! 663: .Bp ! 664: $F2c$ recognizes the Fortran 90 synonyms ! 665: .CW < , ! 666: .CW <= , ! 667: .CW == , ! 668: .CW >= , ! 669: .CW > , ! 670: and ! 671: .CW <> ! 672: for the Fortran comparison operators ! 673: .CW .LT. , ! 674: .CW .LE. , ! 675: .CW .EQ. , ! 676: .CW .GE. , ! 677: .CW .GT. , ! 678: and ! 679: .CW .NE. ! 680: .Bp ! 681: \f(CWNamelist\fR ! 682: works as in Fortran 90 ! 683: .[ [ ! 684: Fort8x ! 685: .]], ! 686: with a minor restriction on ! 687: .CW namelist ! 688: input: subscripts must have the form ! 689: .ce ! 690: $subscript$ [ : $subscript$ [ : $stride$ ] ] ! 691: For example, the Fortran ! 692: .P1 ! 693: integer m(8) ! 694: real x(10,10) ! 695: namelist /xx/ m, x ! 696: \&. . . ! 697: read(*,xx) ! 698: .P2 ! 699: could read ! 700: .P1 ! 701: &xx x(1,1) = 2, x(1:3,8:10:2) = 1,2,3,4,5,6 m(7:8) = 9,10/ ! 702: .P2 ! 703: but would elicit error messages on the inputs ! 704: .P1 ! 705: &xx x(:3,8:10:2) = 1,2,3,4,5,6/ ! 706: &xx x(1:3,8::2) = 1,2,3,4,5,6/ ! 707: &xx m(7:) = 9,10/ ! 708: .P2 ! 709: (which inputs would be legal in Fortran 90). ! 710: For compatibility with the ! 711: .CW namelist ! 712: variants supplied by several vendors as Fortran 77 extensions, ! 713: $f2c$'s version of $libI77$ permits $dollar$ to be used instead of ! 714: .CW & ! 715: and ! 716: .CW / ! 717: in ! 718: .CW namelist ! 719: input. Thus the Fortran shown above could read ! 720: .P1 ! 721: $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 ! 722: .P2 ! 723: .in 0 ! 724: .Bp ! 725: Internal list-directed and namelist I/O are allowed. ! 726: .Bp ! 727: In an ! 728: .CW open ! 729: statement, ! 730: .CW name= ! 731: is treated as ! 732: .CW file= . ! 733: .SH ! 734: 4. INVOCATION EXAMPLES ! 735: .PP ! 736: To convert the Fortran files ! 737: .CW main.f ! 738: and ! 739: .CW subs.f , ! 740: one might use the UNIX\u\(rg\d command: ! 741: .P1 ! 742: f2c main.f subs.f ! 743: .P2 ! 744: This results in translated files suffixed with ! 745: .CW .c , ! 746: i.e., the resulting C files are ! 747: .CW main.c ! 748: and ! 749: .CW subs.c . ! 750: To translate all the Fortran files in the current ! 751: directory, compile the resulting C, ! 752: and create an executable program named ! 753: .CW myprog , ! 754: one might use the following pair of UNIX commands: ! 755: .P1 ! 756: f2c *.f ! 757: cc -o myprog *.c -lF77 -lI77 -lm ! 758: .P2 ! 759: The above ! 760: .CW -lF77 ! 761: and ! 762: .CW -lI77 ! 763: options assume that the ``standard'' Fortran support libraries ! 764: $libF77$ and $libI77$ ! 765: are appropriate for use with $f2c$. On some systems this is ! 766: not the case (as further discussed in \(sc6); if one had ! 767: installed a combination of the appropriate $libF77$ and $libI77$ ! 768: in the appropriate place, then the above example might become ! 769: .P1 ! 770: f2c *.f ! 771: cc -o myprog *.c -lf2c -lm ! 772: .P2 ! 773: Sometimes it is desirable to use $f2c$'s ! 774: .CW -R ! 775: option, which tells $f2c$ not to force all floating-point operations ! 776: to be done in double precision. (One might argue that ! 777: .CW -R ! 778: should be the default, but we find the current arrangement ! 779: more convenient for testing $f2c$.) With ! 780: .CW -R ! 781: specified, the previous example becomes ! 782: .P1 ! 783: f2c -R *.f ! 784: cc -o myprog *.c -lf2c -lm ! 785: .P2 ! 786: Sometimes it is desirable to translate several Fortran source ! 787: files into a single C file. This is easily done by using $f2c$ ! 788: as a filter: ! 789: .P1 ! 790: cat *.f | f2c >mystuff.c ! 791: .P2 ! 792: The ! 793: .CW -A ! 794: option lets $f2c$ use ANSI C constructs ! 795: .[ [ ! 796: ANSIC ! 797: .]], ! 798: which yields more readable C when ! 799: .CW character ! 800: variables are initialized. With both ! 801: .CW -A ! 802: and ! 803: .CW -R ! 804: specified, the last example becomes ! 805: .P1 ! 806: cat *.f | f2c -A -R >mystuff.c ! 807: .P2 ! 808: For use with C++ ! 809: .[ [ ! 810: Stroustrup C++ Programming Language 1986 ! 811: .]], ! 812: one would specify ! 813: .CW -C++ ! 814: rather than ! 815: .CW -A ; ! 816: the last example would then become ! 817: .P1 ! 818: cat *.f | f2c -C++ -R >mystuff.c ! 819: .P2 ! 820: The ! 821: .CW -C++ ! 822: option gives ANSI-style headers and old-style C formatting ! 823: of character strings and ! 824: .CW float ! 825: constants (since some C++ compilers reject the ANSI versions ! 826: of these constructs). ! 827: .LP ! 828: With ANSI C, one can use ! 829: .I prototypes , ! 830: i.e., a special syntax describing the calling sequences ! 831: of procedures, to help catch errors in argument passing. To ! 832: make using prototypes convenient, the ! 833: .CW -P ! 834: option causes $f2c$ to create a \fIfile\f(CW.P\fR of prototypes ! 835: for the procedures defined in ! 836: each input \fIfile\f(CW.f\fR (or \fIfile\f(CW.F\fR, i.e., the ! 837: suffix ! 838: .CW .f '' `` ! 839: or ! 840: .CW .F '' `` ! 841: is replaced by ! 842: .CW .P ''). `` ! 843: One could concatenate all relevant prototype files into ! 844: a header file and arrange for the header to be ! 845: .CW #include d ! 846: with each C file compiled. ! 847: Since ! 848: .CW -P ! 849: implies ! 850: .CW -A ! 851: unless ! 852: .CW -C++ ! 853: is specified, one could ! 854: convert all the Fortran files in the current directory ! 855: to ANSI C ! 856: and get corresponding prototype files by issuing the command ! 857: .P1 ! 858: f2c -P *.f ! 859: .P2 ! 860: Several command options may be combined if none but perhaps the ! 861: last takes an argument; thus to specify ! 862: .CW -R ! 863: and get C++ prototypes for all the ! 864: files in the current directory, one could say either ! 865: .P1 ! 866: f2c -C++ -P -R *.f ! 867: .P2 ! 868: or ! 869: .P1 ! 870: f2c -C++PR *.f ! 871: .P2 ! 872: or ! 873: .P1 ! 874: f2c -RPC++ *.f ! 875: .P2 ! 876: \(em options can come in any order. ! 877: .LP ! 878: For numeric variables initialized by character data, the ! 879: .CW -W ! 880: option specifies the (machine-dependent!) ! 881: number of characters per word and is further discussed ! 882: in \(sc6. This option takes a numeric argument, as in ! 883: .CW -W8 ; ! 884: such an option must be listed either separately or at the end ! 885: of a string of other options, as in ! 886: .P1 ! 887: f2c -C++RPW8 *.f ! 888: .P2 ! 889: .SH ! 890: 5. TRANSLATION DETAILS ! 891: .PP ! 892: $F2c$ is based on the ancient $f77$ Fortran compiler of ! 893: .[ [ ! 894: Feldman Weinberger Portable Fortran ! 895: .]]. ! 896: That compiler produced a C parse-tree, ! 897: which it converted into input for the second pass of the ! 898: portable C compiler (PCC) ! 899: .[ [ ! 900: Johnson portable compiler ! 901: .]]. ! 902: The compiler has been used for many years and is the ! 903: direct ancestor of many current Fortran compilers. ! 904: Thus, it provided us with a solid base of Fortran knowledge ! 905: and a nearly complete C representation. ! 906: The converter $f2c$ is a copy of the $f77$ Fortran compiler ! 907: which has been altered to print out a C representation ! 908: of the program being converted. ! 909: The program $f2c$ is a \fIhorror\fP, based on ancient code and ! 910: hacked unmercifully. ! 911: Users are only supposed to look at its C output, ! 912: not at its appalling inner workings. ! 913: .PP ! 914: Here are some examples that illustrate $f2c$'s translations. ! 915: For starters, it is helpful to see a short but complete ! 916: example: $f2c$ turns the ! 917: Fortran inner product routine ! 918: .P1 ! 919: .so dot.f ! 920: .P2 ! 921: into ! 922: .P1 ! 923: .so dot.c ! 924: .P2 ! 925: The translated C always starts with a ``translated by f2c'' comment ! 926: and a ! 927: .CW #include ! 928: of ! 929: .CW f2c.h . ! 930: $F2c$ forces the variable and procedure names to lower-case and ! 931: appends an underscore to the external name ! 932: .CW dot ! 933: (to avoid possible conflicts with library names). ! 934: The parameter adjustments ! 935: .CW --x '' `` ! 936: and ! 937: .CW --y '' `` ! 938: account for the fact that C arrays start at index 0. ! 939: Unused labels are retained in comments for orienteering purposes. ! 940: Within a function, Fortran references to the function name are turned into ! 941: references to the local variable ! 942: .CW ret_val , ! 943: which holds the value to be returned. Unless the ! 944: .CW -R ! 945: option is specified, $f2c$ converts the return type of ! 946: .CW real ! 947: function values to ! 948: .CW doublereal . ! 949: Because using the C ``op='' operators ! 950: leads to greater efficiency on some machines, $f2c$ looks for opportunities ! 951: to use these operators, as in the line ! 952: .CW "ret_val += ..." '' `` ! 953: above. ! 954: .PP ! 955: $F2c$ generally dispenses with superfluous parentheses: ANSI C ! 956: specifies a clear order of evaluation for floating-point expressions, ! 957: and $f2c$ uses the ANSI C rules to decide when parentheses are required ! 958: to faithfully translate a parenthesized Fortran expression. ! 959: Non-ANSI compilers are free to violate parentheses; by default, $f2c$ does ! 960: not attempt to break an expression into several statements to ! 961: foil pernicious non-ANSI C compilers. Thus, for example, the Fortran ! 962: .P1 ! 963: x = a*(b*c) ! 964: y = (a*b)*c ! 965: .P2 ! 966: becomes ! 967: .P1 ! 968: x = a * (b * c); ! 969: y = a * b * c; ! 970: .P2 ! 971: The ! 972: .CW \%-kr ! 973: and ! 974: .CW \%-krd ! 975: options cause $f2c$ to use temporary variables to force correct ! 976: evaluation order with non-ANSI C compilers. ! 977: .ig ! 978: If, for instance, ! 979: .CW a , ! 980: .CW b , ! 981: and ! 982: .CW c , ! 983: are ! 984: .CW real ! 985: variables, then under ! 986: .CW \%-kr ! 987: the above Fortran results in ! 988: .P1 ! 989: /* System generated locals */ ! 990: real r_1; ! 991: \&. . . ! 992: r_1 = b * c; ! 993: x = a * r_1; ! 994: r_1 = a * b; ! 995: y = r_1 * c; ! 996: .P2 ! 997: .. ! 998: .PP ! 999: Fortran I/O is complicated; like $f77$, $f2c$ converts ! 1000: a Fortran I/O statement into calls on the Fortran I/O library $libI77$. ! 1001: For Fortran ! 1002: .CW read s ! 1003: and ! 1004: .CW write s, ! 1005: there is generally one call to start the statement, one to end it, ! 1006: and one for each item read or written. Given the Fortran declarations ! 1007: .P1 ! 1008: integer count(10) ! 1009: real val(10) ! 1010: .P2 ! 1011: the Fortran ! 1012: .P1 ! 1013: read(*,*) count, val ! 1014: .P2 ! 1015: is turned into some header lines: ! 1016: .P1 ! 1017: static integer c_\|\^_3 = 3; ! 1018: static integer c_\|\^_10 = 10; ! 1019: static integer c_\|\^_4 = 4; ! 1020: \&. . . ! 1021: /* Builtin functions */ ! 1022: integer s_rsle(), do_lio(), e_rsle(); ! 1023: \&. . . ! 1024: /* Fortran I/O blocks */ ! 1025: static cilist io_\|\^_1 = { 0, 5, 0, 0, 0 }; ! 1026: .P2 ! 1027: and the executable lines ! 1028: .P1 ! 1029: s_rsle(&io_\|\^_1); ! 1030: do_lio(&c_\|\^_3, &c_\|\^_10, (char *)&count[0], (ftnlen)sizeof(integer)); ! 1031: do_lio(&c_\|\^_4, &c_\|\^_10, (char *)&val[0], (ftnlen)sizeof(real)); ! 1032: e_rsle(); ! 1033: .P2 ! 1034: Implicit Fortran do-loops, e.g. ! 1035: .P1 ! 1036: read(*,*) (count(i), val(i), i = 1, 10) ! 1037: .P2 ! 1038: get turned into explicit C loops: ! 1039: .P1 ! 1040: s_rsle(&io_\|\^_4); ! 1041: for (i = 1; i <= 10; ++i) { ! 1042: do_lio(&c_\|\^_3, &c_\|\^_1, (char *)&count[i - 1], (ftnlen)sizeof(integer)); ! 1043: do_lio(&c_\|\^_4, &c_\|\^_1, (char *)&val[i - 1], (ftnlen)sizeof(real)); ! 1044: } ! 1045: e_rsle(); ! 1046: .P2 ! 1047: The Fortran ! 1048: .CW end= ! 1049: and ! 1050: .CW err= ! 1051: specifiers make the resulting C even less readable, as they require ! 1052: tests to be inserted. For example, ! 1053: .P1 ! 1054: read(*,*,err=10) count, val ! 1055: 10 continue ! 1056: .P2 ! 1057: becomes ! 1058: .P1 ! 1059: i_\|\^_1 = s_rsle(&io_\|\^_1); ! 1060: if (i_\|\^_1 != 0) { ! 1061: goto L10; ! 1062: } ! 1063: i_\|\^_1 = do_lio(&c_\|\^_3, &c_\|\^_10, (char *)&count[0], (ftnlen)sizeof(integer)); ! 1064: if (i_\|\^_1 != 0) { ! 1065: goto L10; ! 1066: } ! 1067: i_\|\^_1 = do_lio(&c_\|\^_4, &c_\|\^_10, (char *)&val[0], (ftnlen)sizeof(real)); ! 1068: if (i_\|\^_1 != 0) { ! 1069: goto L10; ! 1070: } ! 1071: i_\|\^_1 = e_rsle(); ! 1072: L10: ! 1073: ; ! 1074: .P2 ! 1075: .PP ! 1076: A Fortran routine containing $n$ \f(CWentry\fR statements ! 1077: is turned into $n^+^2$ C functions, a big one containing ! 1078: the translation of everything but the \f(CWentry\fR statements, ! 1079: and $n^+^1$ little ones that invoke the big one. Each little ! 1080: one passes a different integer to the big one to tell ! 1081: it where to begin; the big one starts with a switch ! 1082: that branches to the code for the appropriate entry. ! 1083: For instance, the Fortran ! 1084: .P1 ! 1085: function sine(x) ! 1086: data pi/3.14159265358979324/ ! 1087: sine = sin(x) ! 1088: return ! 1089: entry cosneg(y) ! 1090: cosneg = cos(y+pi) ! 1091: return ! 1092: end ! 1093: .P2 ! 1094: is turned into the big procedure ! 1095: .P1 ! 1096: doublereal sine_0_(n_\|\^_, x, y) ! 1097: int n_\|\^_; ! 1098: real *x, *y; ! 1099: { ! 1100: /* Initialized data */ ! 1101: ! 1102: static real pi = (float)3.14159265358979324; ! 1103: ! 1104: /* System generated locals */ ! 1105: real ret_val; ! 1106: ! 1107: /* Builtin functions */ ! 1108: double sin(), cos(); ! 1109: ! 1110: switch(n_\|\^_) { ! 1111: case 1: goto L_cosneg; ! 1112: } ! 1113: ! 1114: ret_val = sin(*x); ! 1115: return ret_val; ! 1116: ! 1117: L_cosneg: ! 1118: ret_val = cos(*y + pi); ! 1119: return ret_val; ! 1120: } /* sine_ */ ! 1121: .P2 ! 1122: and the little invoking procedures ! 1123: .P1 ! 1124: doublereal sine_(x) ! 1125: real *x; ! 1126: { ! 1127: return sine_0_(0, x, (real *)0); ! 1128: } ! 1129: ! 1130: doublereal cosneg_(y) ! 1131: real *y; ! 1132: { ! 1133: return sine_0_(1, (real *)0, y); ! 1134: } ! 1135: .P2 ! 1136: .LP ! 1137: Fortran ! 1138: .CW common ! 1139: regions are turned into C ! 1140: .CW struct s. ! 1141: For example, the Fortran declarations ! 1142: .P1 ! 1143: common /named/ c, d, r, i, l ! 1144: complex c(10) ! 1145: double precision d(10) ! 1146: real r(10) ! 1147: integer i(10) ! 1148: logical m(10) ! 1149: ! 1150: if (m(i(2))) d(3) = d(4)/d(5) ! 1151: .P2 ! 1152: result in ! 1153: .P1 ! 1154: struct { ! 1155: complex c[10]; ! 1156: doublereal d[10]; ! 1157: real r[10]; ! 1158: integer i[10]; ! 1159: logical m[10]; ! 1160: } named_; ! 1161: ! 1162: #define named_1 named_ ! 1163: \&. . . ! 1164: ! 1165: if (named_1.m[named_1.i[1] - 1]) { ! 1166: named_1.d[2] = named_1.d[3] / named_1.d[4]; ! 1167: } ! 1168: .P2 ! 1169: Under the ! 1170: .CW -p ! 1171: option, the above ! 1172: .CW if ! 1173: statement becomes more readable: ! 1174: .P1 ! 1175: \&. . . ! 1176: #define c (named_1.c) ! 1177: #define d (named_1.d) ! 1178: #define r (named_1.r) ! 1179: #define i (named_1.i) ! 1180: #define m (named_1.m) ! 1181: \&. . . ! 1182: if (m[i[1] - 1]) { ! 1183: d[2] = d[3] / d[4]; ! 1184: .P2 ! 1185: If the above ! 1186: .CW common ! 1187: block were involved in a ! 1188: .CW "block data" ! 1189: subprogram, e.g. ! 1190: .P1 ! 1191: block data ! 1192: common /named/ c, d, r, i, l, m ! 1193: complex c(10) ! 1194: double precision d(10) ! 1195: real r(10) ! 1196: integer i(10) ! 1197: logical m(10) ! 1198: data c(1)/(1.0,0e0)/, d(2)/2d0/, r(3)/3e0/, i(4)/4/, ! 1199: * m(5)/.false./ ! 1200: end ! 1201: .P2 ! 1202: then the ! 1203: .CW struct ! 1204: would begin ! 1205: .CW "struct named_1_ {" '', `` ! 1206: and $f2c$ would issue a more elaborate ! 1207: .CW #define : ! 1208: .P1 ! 1209: #define named_1 (*(struct named_1_ *) &named_) ! 1210: ! 1211: /* Initialized data */ ! 1212: ! 1213: struct { ! 1214: complex e_1; ! 1215: doublereal fill_2[10]; ! 1216: doublereal e_3; ! 1217: doublereal fill_4[9]; ! 1218: real e_5; ! 1219: integer fill_6[10]; ! 1220: integer e_7; ! 1221: integer fill_8[11]; ! 1222: logical e_9; ! 1223: integer fill_10[5]; ! 1224: } named_ = { (float)1., (float)0., {0}, 2., {0}, (float)3., {0}, 4, ! 1225: {0}, FALSE_ }; ! 1226: .P2 ! 1227: In this example, $f2c$ relies on C's structure initialization rules ! 1228: to supply zeros to the ! 1229: \f(CWfill_\fIn\fR ! 1230: arrays that take up the space for which no ! 1231: .CW data ! 1232: values were given. (The logical constants ! 1233: .CW TRUE_ ! 1234: and ! 1235: .CW FALSE_ ! 1236: are defined in ! 1237: .CW f2c.h .) ! 1238: .PP ! 1239: Character manipulations of multiple-character strings ! 1240: generally result in function calls. For example, ! 1241: the Fortran ! 1242: .P1 ! 1243: character*(*) function cat(a,b) ! 1244: character*(*) a, b ! 1245: cat = a // b ! 1246: end ! 1247: .P2 ! 1248: yields ! 1249: .P1 ! 1250: \&. . . ! 1251: static integer c_\|\^_2 = 2; ! 1252: ! 1253: /* Character */ int cat_(ret_val, ret_val_len, a, b, a_len, b_len) ! 1254: char *ret_val; ! 1255: ftnlen ret_val_len; ! 1256: char *a, *b; ! 1257: ftnlen a_len; ! 1258: ftnlen b_len; ! 1259: { ! 1260: ! 1261: /* System generated locals */ ! 1262: address a_\|\^_1[2]; ! 1263: integer i_\|\^_1[2]; ! 1264: ! 1265: /* Builtin functions */ ! 1266: /* Subroutine */ int s_cat(); ! 1267: ! 1268: /* Writing concatenation */ ! 1269: i_\|\^_1[0] = a_len, a_\|\^_1[0] = a; ! 1270: i_\|\^_1[1] = b_len, a_\|\^_1[1] = b; ! 1271: s_cat(ret_val, a_\|\^_1, i_\|\^_1, &c_\|\^_2, ret_val_len); ! 1272: } /* cat_ */ ! 1273: .P2 ! 1274: Note how the return-value length ! 1275: .CW ret_val_len ) ( ! 1276: and parameter lengths ! 1277: .CW a_len "" ( ! 1278: and ! 1279: .CW b_len ) ! 1280: are used. ! 1281: Single character operations are generally done in-line. ! 1282: For example, the body of the Fortran ! 1283: .P1 ! 1284: character*1 function lastnb(x,n) ! 1285: character*1 x(n) ! 1286: lastnb = ' ' ! 1287: do 10 i = n, 1, -1 ! 1288: if (x(i) .ne. ' ') then ! 1289: lastnb = x(i) ! 1290: return ! 1291: end if ! 1292: 10 continue ! 1293: end ! 1294: .P2 ! 1295: becomes ! 1296: .P1 ! 1297: *ret_val = ' '; ! 1298: for (i = *n; i >= 1; --i) { ! 1299: if (x[i] != ' ') { ! 1300: *ret_val = x[i]; ! 1301: return ; ! 1302: } ! 1303: /* L10: */ ! 1304: } ! 1305: .P2 ! 1306: .PP ! 1307: $F2c$ uses ! 1308: .CW struct s ! 1309: and ! 1310: .CW #define s ! 1311: to translate ! 1312: .CW equivalence s. ! 1313: For a complicated example showing the interaction of ! 1314: .CW data ! 1315: with ! 1316: .CW common , ! 1317: .CW equivalence , ! 1318: and, for good measure, Hollerith notation, ! 1319: consider the Fortran ! 1320: .P1 ! 1321: common /cmname/ c ! 1322: complex c(10) ! 1323: double precision d(10) ! 1324: real r(10) ! 1325: integer i(10) ! 1326: logical m(10) ! 1327: equivalence (c(1),d(1),r(1),i(1),m(1)) ! 1328: data c(1)/(1.,0.)/ ! 1329: data d(2)/2d0/, r(5)/3e0/, i(6)/4/, m(7)/.true./ ! 1330: call sam(c,d(1),r(2),i(3),m(4),14hsome hollerith,14) ! 1331: end ! 1332: .P2 ! 1333: The resulting C is ! 1334: .P1 ! 1335: \&. . . ! 1336: struct cmname_1_ { ! 1337: complex c[10]; ! 1338: }; ! 1339: ! 1340: #define cmname_1 (*(struct cmname_1_ *) &cmname_) ! 1341: ! 1342: /* Initialized data */ ! 1343: ! 1344: struct { ! 1345: complex e_1; ! 1346: doublereal e_2; ! 1347: real e_3; ! 1348: integer e_4; ! 1349: logical e_5; ! 1350: integer fill_6[13]; ! 1351: } cmname_ = { (float)1., (float)0., 2., (float)3., 4, TRUE_ }; ! 1352: ! 1353: ! 1354: /* Table of constant values */ ! 1355: ! 1356: static integer c_\|\^_14 = 14; ! 1357: ! 1358: /* Main program */ MAIN_\|\^_() ! 1359: { ! 1360: ! 1361: /* Local variables */ ! 1362: ! 1363: #define d ((doublereal *)&cmname_1) ! 1364: #define i ((integer *)&cmname_1) ! 1365: #define l ((logical *)&cmname_1) ! 1366: #define r ((real *)&cmname_1) ! 1367: extern /* Subroutine */ int sam_(); ! 1368: ! 1369: sam_(cmname_1.c, d, &r[1], &i[2], &m[3], "some hollerith", &c_\|\^_14, 14L); ! 1370: } /* MAIN_\|\^_ */ ! 1371: ! 1372: #undef r ! 1373: #undef l ! 1374: #undef i ! 1375: #undef d ! 1376: .P2 ! 1377: As this example shows, $f2c$ turns a Fortran MAIN program into ! 1378: a C function named ! 1379: .CW MAIN_\|\^_ . ! 1380: Why not ! 1381: .CW main ? ! 1382: Well, $libF77$ contains a C main routine that arranges ! 1383: for files to be closed automatically when the Fortran program stops, ! 1384: arranges for an error message to be printed if a floating-point ! 1385: exception occurs, and arranges for the command-line argument ! 1386: accessing functions ! 1387: .CW iargc ! 1388: and ! 1389: .CW getarg ! 1390: to work properly. This C main routine invokes ! 1391: .CW MAIN_\|\^_ . ! 1392: .SH ! 1393: 6. PORTABILITY ISSUES ! 1394: .PP ! 1395: Three portability issues are relevant to $f2c$: ! 1396: the portability of the support libraries ($libF77$ and $libI77$) ! 1397: upon which the translated C programs rely, ! 1398: that of the converter $f2c$ itself, ! 1399: and that of the C it produces. ! 1400: .PP ! 1401: Regarding the first issue, ! 1402: some vendors (e.g., Sun and MIPS) have changed the calling conventions for ! 1403: their $libI77$ from the original conventions (those of ! 1404: .[ [ ! 1405: Feldman Weinberger Portable Fortran ! 1406: .]]). ! 1407: Other vendors (e.g., MIPS) have changed the $libF77$ calling conventions ! 1408: (e.g., for ! 1409: .CW complex -valued ! 1410: functions). ! 1411: Thus, having libraries $libF77$ and $libI77$ ! 1412: or otherwise having library routines with the names ! 1413: that $f2c$ expects is insufficient. ! 1414: When using a machine whose vendor provides but has gratuitously changed ! 1415: $libF77$ or $libI77$, one cannot safely mix objects compiled ! 1416: from the C produced by $f2c$ with objects compiled by the vendor's ! 1417: Fortran compiler, and one must use the correct libraries with ! 1418: programs translated by $f2c$. In such a case, the recommended procedure ! 1419: is to obtain source for the libraries (e.g. from ! 1420: .I netlib ! 1421: \(em see \(sc8), combine them into a single library, say ! 1422: .CW libf2c , ! 1423: and install the library where it they can be conveniently accessed. ! 1424: On a UNIX system, for example, one might install ! 1425: .CW libf2c ! 1426: in ! 1427: .CW /usr/lib/libf2c.a ; ! 1428: then one could issue the command ! 1429: .P1 ! 1430: cc *.c -lf2c -lm ! 1431: .P2 ! 1432: to compile and link a program translated by $f2c$. ! 1433: .PP ! 1434: The converter itself is reasonably portable and has run successfully on Apollo, ! 1435: Cray, IBM, MIPS, SGI, Sun and DEC VAX equipment, all running some ! 1436: version of the UNIX operating system. ! 1437: However, we shall see that the C it produces may not be portable due to ! 1438: subtle storage management issues in Fortran 77. ! 1439: In any case, the C output of $f2c$ will run fine, at least if ! 1440: the \f(CW\%-W\fIn\fR option (see Appendix B) is used to set the ! 1441: number of characters per word correctly, and if C ! 1442: .CW double ! 1443: values may fall on an odd-word boundary. ! 1444: .PP ! 1445: The Fortran 77 standard says that \f(CWComplex\fP and \f(CWDouble Precision\fP ! 1446: objects occupy two ``units'' of space while other non-character data types ! 1447: occupy one ``unit.'' ! 1448: It may be necessary to edit the header file ! 1449: .CW f2c.h ! 1450: to make these assumptions hold, if possible. ! 1451: On the Cray, for example, ! 1452: .CW float ! 1453: and ! 1454: .CW double ! 1455: are the same C types, and Fortran double precision, if ! 1456: available, would correspond to the C type ! 1457: .CW "long double" . ! 1458: In this case, changing the definition of ! 1459: .CW doublereal ! 1460: in ! 1461: .CW f2c.h ! 1462: from ! 1463: .P1 ! 1464: typedef double doublereal; ! 1465: .P2 ! 1466: to ! 1467: .P1 ! 1468: typedef long double doublereal; ! 1469: .P2 ! 1470: would be appropriate. For the Think C compiler on the ! 1471: Macintosh, on the other hand, this line would need to become ! 1472: .P1 ! 1473: typedef short double doublereal; ! 1474: .P2 ! 1475: .PP ! 1476: If your C compiler predefines symbols that could clash with ! 1477: translated Fortran variable names, then you should also ! 1478: add appropriate ! 1479: .CW #undef ! 1480: lines to ! 1481: .CW f2c.h . ! 1482: The current default ! 1483: .CW f2c.h ! 1484: provides the following ! 1485: .CW #undef ! 1486: lines for the following symbols: ! 1487: .TS ! 1488: center; ! 1489: lfCW lfCW lfCW lfCW lfCW lfCW. ! 1490: cray mc68020 sgi sun2 u370 u3b5 ! 1491: gcos mips sparc sun3 u3b unix ! 1492: mc68010 pdp11 sun sun4 u3b2 vax ! 1493: .TE ! 1494: .PP ! 1495: As an extension to the Fortran 77 Standard, $f2c$ ! 1496: allows noncharacter variables to be initialized with character ! 1497: data. This extension is inherently nonportable, as the number ! 1498: of characters storable per ``unit'' varies from machine to machine. ! 1499: Since 32 bit machines are the most plentiful, $f2c$ ! 1500: assumes 4 characters per Fortran ``unit'', but this assumption ! 1501: can be overridden by the \f(CW\%-W\fIn\fR command-line option. ! 1502: For example, ! 1503: .CW \%-W8 ! 1504: is appropriate for C that is to be run on Cray computers, ! 1505: since Crays store 8 characters per word. ! 1506: An example is helpful here: the Fortran ! 1507: .P1 ! 1508: data i/'abcd'/ ! 1509: j = i ! 1510: end ! 1511: .P2 ! 1512: turns into ! 1513: .P1 ! 1514: /* Initialized data */ ! 1515: ! 1516: static struct { ! 1517: char e_1[4]; ! 1518: } equiv_3 = { {'a', 'b', 'c', 'd'} }; ! 1519: ! 1520: #define i (*(integer *)&equiv_3) ! 1521: ! 1522: static integer j; ! 1523: ! 1524: j = i; ! 1525: \&. . . ! 1526: #undef i ! 1527: .P2 ! 1528: (Some use of ! 1529: .CW i , ! 1530: e.g. ``\f(CWj = i\fR'', is necessary or $f2c$ ! 1531: will see that ! 1532: .CW i ! 1533: is not used and will not initialize it.) If the target ! 1534: machine were a Cray and the string were ! 1535: .CW 'abcdefgh' ! 1536: or \f(CW"abcdefhg"\fR, ! 1537: then the Fortran would run fine, but the C produced by $f2c$ would only ! 1538: store \f(CW"abcd"\fR ! 1539: in i, $4$ being the default number of characters per word. ! 1540: The $f2c$ command-line option ! 1541: .CW \%-W8 ! 1542: gives the correct initialization for a Cray. ! 1543: .PP ! 1544: The initialization above is clumsy, using $4$ separate characters. ! 1545: Using the option ! 1546: .CW -A , ! 1547: for ANSI, produces ! 1548: .P1 ! 1549: \&. . . ! 1550: } equiv_3 = { "abcd" }; ! 1551: \&. . . ! 1552: .P2 ! 1553: See Appendix B. ! 1554: .PP ! 1555: The above examples explain why the Fortran 77 standard excludes ! 1556: Hollerith data statements: the number of characters per word is ! 1557: not specified and hence such code is not portable even in Fortran. ! 1558: (Fortran that conservatively assumes only 1 or 2 characters per word is ! 1559: portable but messy. Note that Fortran 77 forbids the mixing, via ! 1560: .CW common , ! 1561: .CW data , ! 1562: or ! 1563: .CW equivalence , ! 1564: of character and noncharacter types. Like many Fortran compilers, ! 1565: $f2c$ permits such nonportable mixing; ! 1566: initialization of numeric variables with Hollerith data is one ! 1567: example of this mixing.) ! 1568: .PP ! 1569: Some Fortran 66 programs pass Hollerith strings to ! 1570: .CW integer ! 1571: variables. $F2c$ treats a Hollerith string as a character string, ! 1572: but this may lead to bus errors on some systems if the character ! 1573: string winds up being improperly aligned. The ! 1574: .CW \%-h ! 1575: option instructs $f2c$ to try to give character variables ! 1576: and constants the same alignment as ! 1577: .CW integer s. ! 1578: Under ! 1579: .CW \%-h , ! 1580: for example, the Fortran ! 1581: .P1 ! 1582: call foo("a string") ! 1583: call goo(8ha string) ! 1584: .P2 ! 1585: is translated to ! 1586: .P1 ! 1587: static struct { integer fill; char val[8+1]; char fill2[3]; } c_b1_st = { 0, ! 1588: "a string" }; ! 1589: #define c_b1 c_b1_st.val ! 1590: \&. . . ! 1591: foo_(c_b1, 8L); ! 1592: goo_(c_b1, 8L); ! 1593: \&. . . ! 1594: .P2 ! 1595: .PP ! 1596: Some systems require that C values of type ! 1597: .CW double ! 1598: be aligned on a double-word boundary. Fortran ! 1599: .CW common ! 1600: and ! 1601: .CW equivalence ! 1602: statements may require some C ! 1603: .CW double ! 1604: values to be aligned on an odd-word boundary. ! 1605: On systems where double-word alignment is required, ! 1606: C compilers pad structures, if necessary, to arrange ! 1607: for the right alignment. Often such padding has no effect on ! 1608: the validity of $f2c$'s ! 1609: translation, but using ! 1610: .CW common ! 1611: or ! 1612: .CW equivalence , ! 1613: it is easy to contrive examples in which ! 1614: the translated C works incorrectly. ! 1615: $F2c$ issues a warning message when double-word alignment may ! 1616: cause trouble, but, like $f77$, ! 1617: it makes no attempt to circumvent this trouble; ! 1618: the run-time costs of circumvention would be substantial. ! 1619: .PP ! 1620: Long decimal strings in \f(CWdata\fP statements are passed to C unaltered. ! 1621: However, expressions involving long decimal strings are rounded ! 1622: in a machine-dependent manner. ! 1623: On a VAX 8550, the Fortran ! 1624: .P1 ! 1625: x=1.2**10 ! 1626: end ! 1627: .P2 ! 1628: yields the C ! 1629: .P1 ! 1630: static real x; ! 1631: ! 1632: x = (float)6.1917364224000008; ! 1633: .P2 ! 1634: .PP ! 1635: ANSI C compilers require that all but one instance of any entity with external scope, ! 1636: such as the \f(CWstruct\fPs into which $f2c$ translates \f(CWcommon\fP, ! 1637: be declared \f(CWextern\fP and that exactly one declaration should define the entity, ! 1638: i.e., should not be declared \f(CWextern\fP. ! 1639: Most older C compilers have no such restriction. ! 1640: To be compatible with ANSI usage, the $f2c$ ! 1641: command-line option ! 1642: .CW -ec ! 1643: causes the \f(CWstruct\fP corresponding ! 1644: to an uninitialized \f(CWcommon\fP region to be declared \f(CWextern\fP ! 1645: and makes a ! 1646: .CW union ! 1647: of all successive declarations of that ! 1648: \f(CWcommon\fP region into a defining declaration placed in a file with the ! 1649: name \f(CWcname_com.c\fR, where ! 1650: .CW cname ! 1651: is the name of the \f(CWcommon\fP region. ! 1652: For example, the Fortran ! 1653: .P1 ! 1654: common /cmname/ c ! 1655: complex c(10) ! 1656: c(1)=cmplx(1.,0.) ! 1657: call sam(c) ! 1658: end ! 1659: subroutine sam(c) ! 1660: complex c ! 1661: common /cmname/ca ! 1662: complex ca(10) ! 1663: ca(2) = cmplx(1e0,2e0) ! 1664: return ! 1665: end ! 1666: .P2 ! 1667: when converted by \f(CWf2c -ec\fP produces ! 1668: .P1 ! 1669: /* Common Block Declarations */ ! 1670: ! 1671: union { ! 1672: struct { ! 1673: complex c[10]; ! 1674: } _1; ! 1675: struct { ! 1676: complex ca[10]; ! 1677: } _2; ! 1678: } cmname_; ! 1679: ! 1680: #define cmname_1 (cmname_._1) ! 1681: #define cmname_2 (cmname_._2) ! 1682: ! 1683: /* Main program */ MAIN_\|\^_() ! 1684: { ! 1685: ! 1686: extern /* Subroutine */ int sam_(); ! 1687: ! 1688: cmname_1.c[0].r = (float)1., cmname_1.c[0].i = (float)0.; ! 1689: sam_(cmname_1.c); ! 1690: } /* MAIN_\|\^_ */ ! 1691: ! 1692: /* Subroutine */ int sam_(c) ! 1693: complex *c; ! 1694: { ! 1695: cmname_2.ca[1].r = (float)1., cmname_2.ca[1].i = (float)2.; ! 1696: return 0; ! 1697: } /* sam_ */ ! 1698: .P2 ! 1699: as well as the file ! 1700: .CW cmname_com.c : ! 1701: .P1 ! 1702: #include "f2c.h" ! 1703: union { ! 1704: struct { ! 1705: complex c[10]; ! 1706: } _1; ! 1707: struct { ! 1708: complex ca[10]; ! 1709: } _2; ! 1710: } cmname_; ! 1711: .P2 ! 1712: The files ! 1713: .CW *_com.c ! 1714: may be compiled into a library ! 1715: against which one can load to satisfy overly fastidious ANSI C compilers. ! 1716: .PP ! 1717: The rules of Fortran 77 apparently permit a situation in which ! 1718: $f2c$ declares a function to be of type ! 1719: .CW int , ! 1720: then defines it to be of another type, as illustrated by the ! 1721: first example in \(sc7. In that example, $f2c$ discovers too late that ! 1722: .CW f ! 1723: is not a subroutine. With some C compilers, this causes nothing ! 1724: worse than a warning message; with others, it causes the compilation ! 1725: to be aborted. With unforgiving C compilers, one can usually avoid ! 1726: trouble by splitting the Fortran source into one file per ! 1727: procedure, e.g., with the ! 1728: .I fsplit (1) ! 1729: command, and converting each procedure separately. ! 1730: Another solution is to use prototypes, as discussed in \(sc7. ! 1731: .PP ! 1732: With an ANSI C system that enforced consistent ! 1733: prototype declarations across separate compilations, ! 1734: it would be impossible to translate the main program correctly ! 1735: in the last example just by looking at the main program. ! 1736: Recent C++ compilers do enforce the consistency of ! 1737: prototype declarations across separate compilations, ! 1738: e.g., by encoding calling sequences into the translated names of functions, ! 1739: except for functions that are declared \f(CWextern "C"\fR and ! 1740: compiled separately. ! 1741: $F2c$ allows one to use this escape hatch: under ! 1742: .CW -C++ , ! 1743: $f2c$ inserts ! 1744: .P1 ! 1745: #ifdef _\|\^_cplusplus ! 1746: extern "C" { ! 1747: #endif ! 1748: .P2 ! 1749: at the beginning of its C++ output and places ! 1750: .P1 ! 1751: #ifdef _\|\^_cplusplus ! 1752: } ! 1753: #endif ! 1754: .P2 ! 1755: at the end of its C++ output. The ! 1756: .CW "#ifdef _\|\^_cplusplus" ! 1757: lines are for the benefit of older C++ compilers that ! 1758: do not recognize \f(CWextern "C"\fR. ! 1759: .SH ! 1760: 7. PROTOTYPES ! 1761: .PP ! 1762: In ANSI C and C++, a ! 1763: .I prototype ! 1764: describes the calling sequence of a function. ! 1765: Prototypes can save debugging time by helping catch ! 1766: errors in calling sequences. The ! 1767: .CW \%-P ! 1768: option instructs $f2c$ to emit prototypes for all ! 1769: the functions defined in the C it produces; specifically, ! 1770: $f2c$ creates a \fIfile\f(CW.P\fR of prototypes ! 1771: for each input \fIfile\f(CW.f\fR or \fIfile\f(CW.F\fR. ! 1772: One can then arrange for relevant prototype files ! 1773: to be seen by the C compiler. ! 1774: For instance, if $f2c$'s ! 1775: header file ! 1776: .CW f2c.h ! 1777: is installed as ! 1778: .CW /usr/include/f2c.h , ! 1779: one could issue the UNIX command ! 1780: .P1 ! 1781: cat /usr/include/f2c.h *.P >f2c.h ! 1782: .P2 ! 1783: to create a local copy of ! 1784: .CW f2c.h ! 1785: that has in it all the prototypes in ! 1786: .CW *.P . ! 1787: Since the C produced by $f2c$ always specifies ! 1788: .P1 ! 1789: #include "f2c.h" ! 1790: .P2 ! 1791: (rather than ! 1792: .CW "#include <f2c.h>" ), ! 1793: the C compiler will look first in the current directory for ! 1794: .CW f2c.h ! 1795: and thus will find the local copy that contains the prototypes. ! 1796: .PP ! 1797: $F2c$ can also read the prototype files it writes; ! 1798: one simply specifies them as arguments to $f2c$. ! 1799: In fact, $f2c$ reads all prototype files before any ! 1800: Fortran files; although multiple Fortran files are handled ! 1801: independently, any prototype file arguments apply to all of them. ! 1802: $F2c$ has more detailed knowledge of Fortran types than it conveys ! 1803: in the C it puts out; for example, ! 1804: .CW logical ! 1805: and ! 1806: .CW integer ! 1807: are different Fortran types, but are mapped to the same C type. ! 1808: Moreover, ! 1809: .CW character , ! 1810: .CW complex , ! 1811: and ! 1812: .CW "double complex" ! 1813: Fortran functions are all translated to ! 1814: .CW VOID ! 1815: C functions, and, unless the ! 1816: .CW \%-R ! 1817: option is specified, both ! 1818: .CW real ! 1819: and ! 1820: .CW "double precision" ! 1821: Fortran functions are translated to ! 1822: .CW doublereal ! 1823: C functions. Because $f2c$ denotes all these ! 1824: types differently in its prototype files, it ! 1825: can catch errors that are invisible to an ANSI C ! 1826: (or C++) compiler. ! 1827: .PP ! 1828: The following table shows the types ! 1829: that $f2c$ uses for procedure arguments: ! 1830: .TS ! 1831: center box; ! 1832: lfCW lfCW. ! 1833: C_fp complex ! 1834: D_fp doublereal ! 1835: E_fp real\fR under \f(CW-!R\fR (the default)\fP ! 1836: H_fp character ! 1837: I_fp integer\fR or \f(CWinteger*4 ! 1838: J_fp integer*2 ! 1839: K_fp shortlogical\fR (\f(CWlogical\fR under \f(CW-i2\fR or \f(CW-I2\fR)\fP ! 1840: L_fp logical ! 1841: R_fp real\fR under \f(CW-R ! 1842: S_fp subroutine\fR ! 1843: U_fp \fRuntyped \f(CWexternal ! 1844: Z_fp doublecomplex ! 1845: .TE ! 1846: These types are defined in ! 1847: .CW f2c.h ; ! 1848: they appear in prototypes and, under ! 1849: .CW \%-A ! 1850: or ! 1851: .CW \%-C++ , ! 1852: in the C that $f2c$ writes. Prototypes also use special ! 1853: .CW void ! 1854: types to denote the return values of ! 1855: .CW complex , ! 1856: .CW "double complex", ! 1857: and ! 1858: .CW character ! 1859: functions: ! 1860: .TS ! 1861: center box; ! 1862: lfCW lfCW. ! 1863: C_f complex ! 1864: H_f character ! 1865: Z_f double complex ! 1866: .TE ! 1867: .PP ! 1868: $F2c$ also writes special comments in prototype files giving ! 1869: the length of each ! 1870: .CW common ! 1871: block; when given prototype files as arguments, $f2c$ reads ! 1872: these special comments so it can issue a warning message if its ! 1873: Fortran input specifies a different length for some ! 1874: .CW common ! 1875: block. ! 1876: .PP ! 1877: Sometimes people write otherwise valid Fortran 77 that ! 1878: specifies different lengths for a ! 1879: .CW common ! 1880: block. If such Fortran is split into several files and converted ! 1881: to C, the loader could end up giving too little space to the ! 1882: .CW common ! 1883: block in question. One can avoid the confusion this could cause by ! 1884: running $f2c$ twice, first with ! 1885: .CW \%-P!c , ! 1886: then with the resulting prototypes as additional arguments; ! 1887: the prototypes let $f2c$ determine (and convey to all of its ! 1888: output C files) the true length needed for ! 1889: each ! 1890: .CW common ! 1891: block. ! 1892: .PP ! 1893: One complication with prototypes comes from Fortran subprograms that ! 1894: declare a procedure to be ! 1895: .CW external ! 1896: but do not explicitly specify a type for it and only ! 1897: pass it as a parameter to another procedure. (If the ! 1898: subprogram also invokes the ! 1899: .CW external ! 1900: procedure, then $f2c$ can tell whether the procedure is ! 1901: a subroutine or a function; in the latter case, Fortran's ! 1902: implicit typing rules specify a type for the procedure.) ! 1903: If it can do no better, then $f2c$ assumes that untyped ! 1904: .CW external ! 1905: procedures are subroutines (and hence become ! 1906: .CW int -valued ! 1907: functions in C). ! 1908: This can cause the generated C to have ! 1909: multiple and inconsistent declarations for some procedures. ! 1910: For example, ! 1911: .P1 ! 1912: external f ! 1913: call foo(f) ! 1914: end ! 1915: function f(x) ! 1916: double precision f, x ! 1917: f = x ! 1918: end ! 1919: .P2 ! 1920: results in ! 1921: .CW MAIN_\|\^_ ! 1922: declaring ! 1923: .P1 ! 1924: extern /* Subroutine */ int f_(); ! 1925: .P2 ! 1926: and in the subsequent definition of ! 1927: .CW "doublereal f_(x)" ! 1928: in the same C file. ! 1929: Such inconsistencies are grounds for some C compilers ! 1930: to abort compilation. ! 1931: .PP ! 1932: $F2c$'s type inferences only apply sequentially to ! 1933: the procedures in a file, because $f2c$ writes C for each procedure ! 1934: before reading the next one. Thus, as just illustrated, if procedure ! 1935: .CW xyz ! 1936: comes after ! 1937: .CW abc ! 1938: in a Fortran input file, then $f2c$ cannot use information ! 1939: it gains when it sees the definition of ! 1940: .CW xyz ! 1941: to deduce types for ! 1942: .CW external ! 1943: procedures passed as arguments to ! 1944: .CW xyz ! 1945: by ! 1946: .CW abc . ! 1947: By using the ! 1948: .CW \%-P ! 1949: option and running $f2c$ several times, one can ! 1950: get around this deficiency. For instance, if file ! 1951: .CW zap.f ! 1952: contains the Fortran shown above, then the commands ! 1953: .P1 ! 1954: f2c -P!c zap.f ! 1955: f2c -A zap.[fP] ! 1956: .P2 ! 1957: result in a file ! 1958: .CW zap.c ! 1959: in which ! 1960: .CW MAIN_\|\^_ ! 1961: correctly types ! 1962: .CW f_ ! 1963: and ! 1964: .CW foo_ ! 1965: as ! 1966: .P1 ! 1967: extern doublereal f_(); ! 1968: extern /* Subroutine */ int foo_(D_fp); ! 1969: .P2 ! 1970: rather than ! 1971: .P1 ! 1972: extern /* Subroutine */ int f_(); ! 1973: extern /* Subroutine */ int foo_(U_fp); ! 1974: .P2 ! 1975: The first invocation of $f2c$ results in a file ! 1976: .CW zap.P ! 1977: containing ! 1978: .P1 ! 1979: extern doublereal f_(doublereal *x); ! 1980: /*:ref: foo_ 10 1 200 */ ! 1981: .P2 ! 1982: The second invocation of $f2c$ is able to type ! 1983: .CW f_ ! 1984: and ! 1985: .CW foo_ ! 1986: correctly because of the first line in ! 1987: .CW zap.P . ! 1988: .PP ! 1989: The second line in ! 1990: .CW zap.P ! 1991: is a special comment that records the incomplete type ! 1992: information that $f2c$ has about ! 1993: .CW foo_ . ! 1994: $F2c$ puts one such special comment in the prototype file for each ! 1995: Fortran procedure that is referenced but not defined in the Fortran file. ! 1996: When it reads prototype files, $f2c$ deciphers these comments and ! 1997: uses them to check the consistency of calling sequences. ! 1998: As it learns more about untyped external procedures, $f2c$ updates ! 1999: the information it has on them; the ! 2000: .CW :ref: ! 2001: comments it writes in a prototype file reflect $f2c$'s latest knowledge. ! 2002: .PP ! 2003: Ordinarily $f2c$ tries to infer the type of an untyped ! 2004: .CW external ! 2005: procedure from its use as arguments to procedures of ! 2006: known argument types. For example, if ! 2007: .CW f.f ! 2008: contains just ! 2009: .P1 ! 2010: external f ! 2011: call foo(f) ! 2012: end ! 2013: .P2 ! 2014: and if ! 2015: .CW foo.P ! 2016: contains ! 2017: .P1 ! 2018: extern int foo_(D_fp); ! 2019: .P2 ! 2020: then ! 2021: .P1 ! 2022: f2c -A f.f foo.P ! 2023: .P2 ! 2024: results in the declaration ! 2025: .P1 ! 2026: extern doublereal f_(); ! 2027: .P2 ! 2028: Under unusual circumstances, such type inferences ! 2029: can lead to erroneous error messages or to incorrect typing. ! 2030: Here is an example: ! 2031: .P1 ! 2032: subroutine zoo ! 2033: external f ! 2034: double precision f ! 2035: external g ! 2036: call zap(1,f) ! 2037: call zap(2,g) ! 2038: end ! 2039: subroutine goo ! 2040: call g ! 2041: end ! 2042: .P2 ! 2043: $F2c$ first infers g to be a double precision function, then discovers ! 2044: that it must be a subroutine and issues a warning message about ! 2045: inconsistent declarations for ! 2046: .CW g . ! 2047: This example is legal Fortran 77; ! 2048: .CW zap ! 2049: could be defined, for instance, by ! 2050: .P1 ! 2051: subroutine zap(n,f) ! 2052: external f ! 2053: if (n .le. 1) call zap1(f) ! 2054: if (n .ge. 2) call zap2(f) ! 2055: end ! 2056: .P2 ! 2057: In such a case one can specify the ! 2058: .CW \%-!it ! 2059: option to instruct $f2c$ not to infer the types of otherwise ! 2060: untypable ! 2061: .CW external ! 2062: procedures from their appearance as arguments to known procedures. ! 2063: Here is another (somewhat far-fetched) example where ! 2064: .CW \%-!it ! 2065: is useful: ! 2066: .P1 ! 2067: subroutine grok(f,g,h) ! 2068: external f, g, h ! 2069: logical g ! 2070: call foo(1,g) ! 2071: call foo(2,f) ! 2072: call zit(1,f) ! 2073: call zit(2,h) ! 2074: call zot(f(3)) ! 2075: end ! 2076: .P2 ! 2077: Without ! 2078: .CW \%-!it , ! 2079: $f2c$ first infers ! 2080: .CW f_ ! 2081: to be a ! 2082: .CW logical ! 2083: function, then discovers that Fortran's implicit typing ! 2084: rules require it to be a ! 2085: .CW real ! 2086: function. ! 2087: $F2c$ issues the ! 2088: warning message ! 2089: .CW "fixing wrong type inferred for f" '', `` ! 2090: which should serve as a warning that $f2c$ may have made some ! 2091: incorrect type inferences in the mean time. ! 2092: Indeed, $f2c$ ends up typing ! 2093: .CW h_ ! 2094: as a ! 2095: .CW logical ! 2096: function; with ! 2097: .CW \%-!it ! 2098: specified, $f2c$ types ! 2099: .CW h_ ! 2100: as an ! 2101: .CW external ! 2102: procedure unknown type, i.e., a ! 2103: .CW U_fp , ! 2104: which to the C compiler appears to be a subroutine. ! 2105: (Even with ! 2106: .CW \%-!it ! 2107: specified, $f2c$ issues a warning message about inconsistent ! 2108: calling sequences for ! 2109: .CW foo .) ! 2110: .PP ! 2111: Because $f2c$ writes its latest knowledge of types into ! 2112: prototype files, it is easy to write a crude (Bourne) shell script ! 2113: that will glean the maximum possible type information: ! 2114: .P1 ! 2115: >f.p ! 2116: until ! 2117: f2c -Pit f.p f.f ! 2118: cmp -s f.p f.P ! 2119: do ! 2120: mv f.P f.p ! 2121: done ! 2122: .P2 ! 2123: In such scripts, use of the ! 2124: .CW \%-Ps ! 2125: option can save an iteration; ! 2126: .CW \%-Ps ! 2127: implies ! 2128: .CW \%-P ! 2129: and instructs $f2c$ to issue return code 4 if another ! 2130: iteration might change a declaration or prototype. ! 2131: Thus the following script is more efficient: ! 2132: .EQ ! 2133: delim off ! 2134: .EN ! 2135: .P1 ! 2136: while :; do ! 2137: f2c -Ps f.[fP] ! 2138: case $? in 4) ;; *) break;; esac ! 2139: done ! 2140: .P2 ! 2141: .EQ ! 2142: delim $$ ! 2143: .EN ! 2144: The number of iterations depends on the call graph of the ! 2145: procedures in ! 2146: .CW f.f ! 2147: and on their order of appearance in ! 2148: .CW f.f . ! 2149: Sorting them into topological order (so that if ! 2150: .CW abc ! 2151: calls ! 2152: .CW def , ! 2153: then ! 2154: .CW abc ! 2155: precedes ! 2156: .CW def ) ! 2157: and reverse topological order and alternating between ! 2158: the two orders ! 2159: is probably a good heuristic. ! 2160: For example, we were able to completely type ! 2161: the \s-2PORT3\s+2 subroutine library ! 2162: in two passes by first processing it in reverse topological order, ! 2163: then in forward order. Unfortunately, one can devise situations ! 2164: where arbitrarily many iterations are required. This is slightly ! 2165: annoying, since with appropriate data structures (in an extensively ! 2166: reorganized version of $f2c$), one could do this calculation ! 2167: in linear time. ! 2168: .SH ! 2169: 8. EXPERIENCE WITH \f(BInetlib\fP ! 2170: .PP ! 2171: With the help of Eric Grosse, we arranged for the $netlib$ ! 2172: .[ [ ! 2173: Dongarra Grosse 1987 ! 2174: .]] ! 2175: server ! 2176: .CW [email protected] ! 2177: to provide an experimental Fortran-to-C translation service ! 2178: by electronic mail. ! 2179: By executing the UNIX command ! 2180: .sp .5 ! 2181: .ce ! 2182: \f(CW(echo execute f2c; cat foo.f) | mail [email protected]\fR ! 2183: .sp .5 ! 2184: one submits the Fortran in ! 2185: .CW foo.f ! 2186: to $netlib$'s $f2c$ service; ! 2187: $netlib$ replies with the C and diagnostic messages produced by $f2c$ from ! 2188: .CW foo.f . ! 2189: (The ! 2190: .CW include ! 2191: mechanism described in \(sc3 makes no sense in this ! 2192: context, so it is disabled.) To start using this service, ! 2193: one would generally execute ! 2194: .sp .5 ! 2195: .ce ! 2196: \f(CWecho 'send index from f2c' | mail [email protected]\fR ! 2197: .sp .5 ! 2198: to check on the current status of the service. ! 2199: Before compiling the returned C, it is necessary to get a copy of ! 2200: .CW f2c.h : ! 2201: .sp .5 ! 2202: .ce ! 2203: \f(CWecho 'send f2c.h from f2c' | mail [email protected]\fR ! 2204: .sp .5 ! 2205: Most likely it would also be necessary to obtain source for the ! 2206: versions of $libF77$ and $libI77$ assumed by $f2c$: ! 2207: .sp .5 ! 2208: .ce ! 2209: \f(CWecho 'send libf77 libi77 from f2c' | mail [email protected]\fR ! 2210: .PP ! 2211: For testing purposes, we retain the original Fortran submitted to ! 2212: $netlib$'s ! 2213: .CW "execute f2c" '' `` ! 2214: service. Observing $f2c$'s behavior on over 400,000 lines ! 2215: of submitted Fortran helped ! 2216: us find many obscure bugs and led us to make some of the ! 2217: extensions described in \(sc3. For example, a ! 2218: .CW "block data" ! 2219: subprogram initializing a variable that does not appear ! 2220: in any ! 2221: .CW common ! 2222: blocks now elicits a warning message (rather than causing ! 2223: $f2c$ to drop core). Another example is that $f2c$ ! 2224: now gives the warning message ! 2225: .CW "Statement order error: declaration after DATA" '' `` ! 2226: and declines to produce any C ! 2227: if a declaration comes after a ! 2228: .CW data ! 2229: statement (for reasons discussed in \(sc9); ! 2230: $f2c$ formerly gave a more obscure error message ! 2231: and then produced invalid C. ! 2232: .PP ! 2233: Now that $netlib$ offers source for $f2c$ itself (as explained ! 2234: in the ! 2235: .CW index ! 2236: file mentioned above), we expect to curtail $netlib$'s ! 2237: .CW "execute f2c" '' `` ! 2238: service, perhaps limiting it to employees of AT&T and Bellcore; ! 2239: to learn the current state of affairs, request the current ! 2240: .CW index ! 2241: file. ! 2242: .SH ! 2243: 9. POSSIBLE EXTENSIONS ! 2244: .PP ! 2245: Currently $f2c$ simplifies constant expressions. ! 2246: It would be nice if constant expressions were simply ! 2247: passed through, and if Fortran ! 2248: .CW parameter s ! 2249: were translated as ! 2250: .CW #define s. ! 2251: Unfortunately, several things conspire to make this ! 2252: nearly impossible to do in full generality. ! 2253: Perhaps worst is that ! 2254: .CW parameter s ! 2255: may be assigned ! 2256: .CW complex ! 2257: or ! 2258: .CW doublecomplex ! 2259: expressions that might, for example, involve complex division ! 2260: and exponentiation to a large integer power. ! 2261: .CW Parameter s ! 2262: may appear in ! 2263: .CW data ! 2264: statements, which may initialize ! 2265: .CW common ! 2266: variables and so be moved near the beginning of the C output. ! 2267: Arranging to have the right ! 2268: .CW #define s ! 2269: in effect for the data initialization would, in this worst case, ! 2270: be a nightmare. Of course, one could arrange to ! 2271: handle ``easy'' cases with unsimplified constant expressions ! 2272: and ! 2273: .CW #define s ! 2274: for parameters. ! 2275: .PP ! 2276: Prototypes and the argument consistency checks currently ignore ! 2277: alternate return specifiers. Prototypes could be adorned with ! 2278: special comments indicating where alternate return specifiers ! 2279: are supposed to come, or at least telling the number of such ! 2280: specifiers, which is all that really matters. ! 2281: Since alternate return specifiers are rarely used ! 2282: (Fortran 90 calls them ``obsolescent''), ! 2283: we have so far refrained from this exercise. ! 2284: .PP ! 2285: Fortran 90 allows ! 2286: .CW data ! 2287: statements to appear anywhere. It would be nice if $f2c$ could ! 2288: do the same, but that would entail major rewriting of $f2c$. ! 2289: Presently ! 2290: .CW data ! 2291: values are written to a file as soon as they are seen; among ! 2292: the information in the file is the offset of each value. ! 2293: If an ! 2294: .CW equivalence ! 2295: statement could follow the ! 2296: .CW data ! 2297: statement, then the offsets would be invalidated. ! 2298: .PP ! 2299: It would be fairly straightforward to extend $f2c$'s I/O ! 2300: to encompass the new specifiers introduced by Fortran 90. ! 2301: Unfortunately, that would mean changing $libI77$ in ways ! 2302: that would make it incompatible with $f77$. ! 2303: .PP ! 2304: Of course, it would be nice to translate all of Fortran 90, but ! 2305: some of the Fortran 90 array manipulations would require new ! 2306: calling conventions and large enough revisions to $f2c$ that ! 2307: one might be better off starting from scratch. ! 2308: .PP ! 2309: With sufficient hacking, ! 2310: $f2c$ could be modified to recognize ! 2311: Fortran 90 control structures ! 2312: .CW case , ( ! 2313: .CW cycle , ! 2314: .CW exit , ! 2315: and named loops), local arrays of ! 2316: dimensions that depend on arguments and common values, ! 2317: and such types as ! 2318: .CW logical*1 , ! 2319: .CW logical*2 , ! 2320: .CW integer*1 ! 2321: or ! 2322: .CW byte . ! 2323: Since our main concern is with making portable Fortran 77 ! 2324: libraries available to the C world, we have so far refrained ! 2325: from these further extensions. Perhaps commercial ! 2326: vendors will wish to provide some of these extensions. ! 2327: .SH ! 2328: 10. REFERENCES ! 2329: .LP ! 2330: .so tmac.sdisp1 ! 2331: .[ ! 2332: $LIST$ ! 2333: .]
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.