This section discusses the portability of the Sather/Fortran interface. See unnamedlink about Various name binding portability issues. Issues relevant to code portability are addressed here.
It is important to distinguish between portability of the Sather compiler module that implements the Sather/Fortran interface and the portability of the code it generates. The Fortran 77 interface module is written entirely in Sather and is integrated with the ICSI Sather compiler. The Fortran interface should be available on all platforms where the ICSI Sather compiler is available. In particular, it is available on most Unix platforms.
The Fortran 77 standards says that all Fortran 77 types except for COMPLEX, DOUBLE PRECISION, and CHARACTER of any flavor occupy a single "unit" of storage space. COMPLEX and DOUBLE PRECISION types take two "units" of storage. This may need to be adjusted accordingly when porting the Sather compiler to a different platform. A modification to "System/Common/fortran.h" may be necessary. "System/Common/fortran.h" contains a set of definitions for Fortran storage types used by the Sather/Fortran interface:
typedef long int F_INTEGER; typedef long int F_LOGICAL; typedef float F_REAL; typedef double F_DOUBLE; typedef char F_CHARACTER; typedef long int F_LENGTH; typedef struct { F_REAL re, im; } F_COMPLEX_struct; typedef F_COMPLEX_struct F_COMPLEX; ... |
This proves to be adequate for most Unix platforms. On the Cray, however, both float and double types occupy the same storage, and to conform to Fortran 77 specification, fortran.h needs to be edited to define F_DOUBLE as "long double". For the Macintosh, however, it should be defined as "short double."
This is a full set of C types that are used by the interface as return and argument types:
F_INTEGER F_LOGICAL F_REAL F_DOUBLE F_CHARACTER F_STRING F_LENGTH F_COMPLEX F_HANDLER F_ROUT integer or integer*4 logical real double character or character*1 character*n string length (same as F_INTEGER) complex call argument for a subroutine with alternate returns a routine passed as argument |
Array types are represented as pointer to corresponding scalar types.