fortc(1) | UNIDATA UTILITIES | fortc(1) |
fortc - Unidata utility to generate fortran-compatible C code
fortc [-L LibDir] [-O OpSys] file
fortc Reads C code from `file', transforms it into FORTRAN compatible code, and then writes the result to standard output. The transformation is operating-system dependent because there are no standards in this matter.
The target operating-system can be specified in several ways. If the `-O' option is given, then the operating-system specified by its argument is used; otherwise, if the environmental variable `OS' exists, then the operating-system specified by it's value is used; otherwise, the default operating-system -- determined at installation time -- is used.
Global names that are not function definitions but that are to be accessible from both C and FORTRAN should be enclosed by the `FC_NAME()' macro:
extern int FC_NAME(foo)(void); /* FORTRAN function */ extern struct {
float f;
int i; } FC_NAME(comblk); /* FORTRAN common block */ cfoo() {
return FC_NAME(foo)(); /* call FORTRAN function */ }
C functions which are to be called from FORTRAN are written as follows:
int /*FORTRAN*/ foo(
character pathname, /* file name of new file */
real amount, /* amount to frobdicate by */
doubleprecision dbl, /* amount to tizzle by */
void function errf, /* error routine */
integer rcode /* returned error code */) { ...
or, equivalently,
int /*FORTRAN*/ foo(char* pathname, float* amount, double* dbl,
void (*errf)(), int* rcode) { ...
The points to note in writing FORTRAN-compatible functions are:
The functions should be written using variables with the same names as the formal parameters, and with the same semantics. In the case of formal parameters of type `character' (i.e. Fortran character-variables), a variable with the same name will exist and will be of type `char*'. In addition, for each character-variable argument, a local variable of integral type will be created and its value will be the size of the associated character-variable. The name of this variable will be the name of the associated character variable with "_len" appended (e.g. "pathname_len"). These length variables may be used in the function just like any other variable.
For example, under SunOS the previous function would become (if it is contained in the file `foo.src'):
#line 1 "foo.src" unsigned int #line 2 "foo.src" foo_(pathname, amount, errf, rcode, pathname_len)
char *pathname;
int pathname_len;
float *amount;
void (*errf)();
int *rcode; { #line 9 "foo.src"
Note that 1) preprocessor line directives have been added; 2) the function name has been suffixed with an underscore; and 3) a formal parameter, `pathname_len', has been created.
Under UNICOS, the same file would become
#include <fortran.h> #line 1 "foo.src" unsigned int #line 2 "foo.src" FOO(pathnamed, amount, errf, rcode)
_fcd pathnamed;
float *amount;
void (*errf)();
int *rcode; {
char *pathname = _fcdtocp (pathnamed);
unsigned pathname_len = _fcdlen (pathnamed); #line 9 "foo.src"
Note, in particular, the additional `#include <fortran.h>' and the creation and initialization of the local variables `pathname' and `pathname_len'.
This utility is implemented as a script and uses the system-supplied utilities sed(1) and m4(1).
In the following, `LIBDIR' is the default library directory determined at installation time.
The names of automatically generated variables might conflict with those of other, pre-existing variables.
$Date: 2000/08/07 23:15:03 $ | Printed: 0-0-0 |