Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!sparky!kent From: burow@cernvax.cern.ch (Burkhard Burow) Newsgroups: comp.sources.misc Subject: v20i067: cfortran - a bridge between C and FORTRAN, Part02/02 Message-ID: <1991Jun25.193417.29440@sparky.IMD.Sterling.COM> Date: 25 Jun 91 19:34:17 GMT References: Sender: kent@sparky.IMD.Sterling.COM (Kent Landfield) Organization: Sterling Software, IMD Lines: 1195 Approved: kent@sparky.imd.sterling.com X-Md4-Signature: 99448899475aca49f1c8959692bf74a5 Submitted-by: Burkhard Burow Posting-number: Volume 20, Issue 67 Archive-name: cfortran/part02 #! /bin/sh # into a shell via "sh file" or similar. To overwrite existing files, # type "sh file -c". # The tool that generated this appeared in the comp.sources.unix newsgroup; # send mail to comp-sources-unix@uunet.uu.net if you want that tool. # Contents: cfortran.h # Wrapped by kent@sparky on Tue Jun 25 14:25:33 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH echo If this archive is complete, you will see the following message: echo ' "shar: End of archive 2 (of 2)."' if test -f 'cfortran.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'cfortran.h'\" else echo shar: Extracting \"'cfortran.h'\" \(54924 characters\) sed "s/^X//" >'cfortran.h' <<'END_OF_FILE' X/* cfortran.h */ X/* Burkhard Burow, University of Toronto, 1991. */ X X#ifndef __CFORTRAN_LOADED X#define __CFORTRAN_LOADED 1 X X#if !defined(mips) && !defined(_IBMR2) && !(defined(vms) && defined(VAXC)) X??=error This header file is for the following compilers: X??=error - MIPS cc and f77 2.0. (e.g. Silicon Graphics, DECstations, ...) X??=error - IBM AIX XL C and FORTRAN Compiler/6000 Version 01.01.0000.0000 X??=error - VAX VMS CC 3.1 and FORTRAN 5.4. X#else X X#ifdef vms X#include X#endif X#include X#include X#include X X/* Note that for VMS and IBMR2 (without -Dextname), one may wish to change the X defaults for fcallsc and/or ccallsc. */ X X#if defined(mips) || (defined(_IBMR2) && defined(extname)) X#define C_(A) A/**/_ X#define ccallsc(NAME) NAME X#else X#define C_(A) A X#define ccallsc(NAME) CF/**/NAME X#endif X#define fcallsc C_ X#define C_FUNCTION fcallsc X#define FORTRAN_FUNCTION C_ X#define COMMON_BLOCK C_ X/*-------------------------------------------------------------------------*/ X X/* UTILITIES USED WITHIN CFORTRAN */ X X#define MIN(A,B) (As) { /* Need this to handle NULL string.*/ X while (e>s && *--e==t); /* Don't follow t's past beginning. */ X e[*e==t?0:1] = '\0'; /* Handle s[0]=t correctly. */ X} Xreturn s; X} X X/* kill_trailingn(s,t,e) will kill the trailing t's in string s. e normally Xpoints to the terminating '\0' of s, but may actually point to anywhere in s. Xs's new '\0' will be placed at e or earlier in order to remove any trailing t's. XIf es) { /* Watch out for neg. length string.*/ X while (e>s && *--e==t); /* Don't follow t's past beginning. */ X e[*e==t?0:1] = '\0'; /* Handle s[0]=t correctly. */ X} Xreturn s; X} X X/* Note the following assumes that any element which has t's to be chopped off, Xdoes indeed fill the entire element. */ Xstatic char *vkill_trailing(char* cstr, int elem_len, int sizeofcstr, char t) X{ int i; Xfor (i=0; idsc$a_pointer,C,F->dsc$w_length+1, \ X F->dsc$l_m[0]*(F->dsc$w_length+1)), \ X F->dsc$w_length+1,F->dsc$l_m[0]*(F->dsc$w_length+1),' ') X#define C2FSTRVCOPY(C,F) c2fstrv(C,F->dsc$a_pointer,F->dsc$w_length+1, \ X F->dsc$l_m[0]*(F->dsc$w_length+1) ) X X#else X#define _NUM_ELEMS -1 X#define _NUM_ELEM_ARG -2 X#define NUM_ELEMS(A) A,_NUM_ELEMS X#define NUM_ELEM_ARG(B) *A/**/B,_NUM_ELEM_ARG X#define TERM_CHARS(A,B) A,B Xstatic int num_elem(char *strv, unsigned elem_len, int term_char, X int num_term_char) X/* elem_len is the number of characters in each element of strv, the FORTRAN Xvector of strings. The last element of the vector must begin with at least Xnum_term_char term_char characters, so that this routine can determine how Xmany elements are in the vector. */ X{ Xunsigned num,i; Xif (num_term_char == _NUM_ELEMS || num_term_char == _NUM_ELEM_ARG) X return term_char; Xif (num_term_char <=0) num_term_char = elem_len; Xfor (num=0; ; num++) { X for (i=0; i=1 arguments. X ii)That the folowing create a single unmatched '(' bracket, which X must of course be matched in the call. X iii)Commas must be handled very carefully */ X#define GZDOUBLE( B) A0=C_(B)( X#define GZFLOAT( B) A0=C_(B)( X#define GZINT( B) A0=C_(B)( X#define GZLOGICAL( B) A0=C_(B)( X#define GZLONG( B) A0=C_(B)( X#ifdef vms X#define GZSTRING( B) B(&A0 X#else X#define GZSTRING( B) C_(B)(A0,MAX_LEN_FORTRAN_FUNCTION_STRING X#endif X X#define GDOUBLE( B) A0=C_(B)( X#define GFLOAT( B) A0=C_(B)( X#define GINT( B) A0=C_(B)( X#define GLOGICAL( B) A0=C_(B)( X#define GLONG( B) A0=C_(B)( X#define GSTRING( B) GZSTRING(B), X X#define BDOUBLE( A) (double) A X#define BFLOAT( A) (float) A X#define BINT( A) (int) A /* typecast for enum's sake */ X#define BLOGICAL( A) (int) A X#define BLONG( A) (long) A X#define BSTRING( A) (char *) A X#define BFLOATV( A) A X#define BINTV( A) A X#define BSTRINGV( A) (char *) A X#define BFLOATVV( A) (A)[0] X#define BINTVV( A) (A)[0] X#define BPDOUBLE( A) &A X#define BPFLOAT( A) &A X#define BPINT( A) &A /*no longer typecast for enum*/ X#define BPLOGICAL( A) &A X#define BPLONG( A) &A X#define BPSTRING( A) (char *) A X#define BPSTRINGV( A) (char *) A X#define BPVOID( A) (void *) A X#define BPSTRUCT( A) (void *) &A X X#define SDOUBLE( A) X#define SFLOAT( A) X#define SINT( A) X#define SLOGICAL( A) X#define SLONG( A) X#define SSTRING( A) ,sizeof(A) X#define SFLOATV( A) X#define SINTV( A) X#define SSTRINGV( A) ,( (unsigned)0xFFFF*firstindexlength(A) \ X +secondindexlength(A)) X#define SFLOATVV( A) X#define SINTVV( A) X#define SPDOUBLE( A) X#define SPFLOAT( A) X#define SPINT( A) X#define SPLOGICAL( A) X#define SPLONG( A) X#define SPSTRING( A) ,sizeof(A) X#define SPSTRINGV SSTRINGV X#define SPVOID( A) X#define SPSTRUCT( A) X X#define HDOUBLE( A) X#define HFLOAT( A) X#define HINT( A) X#define HLOGICAL( A) X#define HLONG( A) X#define HSTRING( A) ,unsigned A X#define HFLOATV( A) X#define HINTV( A) X#define HSTRINGV( A) ,unsigned A X#define HFLOATVV( A) X#define HINTVV( A) X#define HPDOUBLE( A) X#define HPFLOAT( A) X#define HPINT( A) X#define HPLOGICAL( A) X#define HPLONG( A) X#define HPSTRING( A) ,unsigned A X#define HPSTRINGV( A) ,unsigned A X#define HPVOID( A) X#define HPSTRUCT( A) X X#define CCF(TN,I) C/**/TN(A/**/I,B/**/I,C/**/I) X#define CDOUBLE( A,B,C) &A X#define CFLOAT( A,B,C) &A X#define CINT( A,B,C) &A X#define CLOGICAL( A,B,C) &A X#define CLONG( A,B,C) &A X#define CFLOATV( A,B,C) A X#define CINTV( A,B,C) A X#define CFLOATVV( A,B,C) A X#define CINTVV( A,B,C) A X#define CPDOUBLE( A,B,C) A X#define CPFLOAT( A,B,C) A X#define CPINT( A,B,C) A /* typecast for enum's sake */ X#define CPLOGICAL(A,B,C) A X#define CPLONG( A,B,C) A X#define CPVOID( A,B,C) A X#define CPSTRUCT( A,B,C) A X#ifdef vms X#define CSTRING( A,B,C) (B.clen=strlen(A),B.f.dsc$a_pointer=A, \ X C==sizeof(char*)||C==B.clen+1?B.f.dsc$w_length=B.clen,&B.f:\ X (memset((A)+B.clen,' ',C-B.clen-1),A[B.f.dsc$w_length=C-1]='\0',&B.f)) X#define CSTRINGV( A,B,C) ( \ X initfstr(B, malloc((C/0xFFFF)*(C%0xFFFF-1)), C/0xFFFF, C%0xFFFF-1), \ X c2fstrv(A,B.dsc$a_pointer,C%0xFFFF,(C/0xFFFF)*(C%0xFFFF)) ,&B) X#define CPSTRING( A,B,C) (B.dsc$w_length=strlen(A),B.dsc$a_pointer=A, \ X C==sizeof(char*)?&B:(memset((A)+B.dsc$w_length,' ',C-B.dsc$w_length-1),\ X A[B.dsc$w_length=C-1]='\0',&B)) X#define CPSTRINGV(A,B,C) (initfstr(B, A, C/0xFFFF, C%0xFFFF-1), \ X c2fstrv(A,A,C%0xFFFF,(C/0xFFFF)*(C%0xFFFF)) ,&B) X#else X#define CSTRING( A,B,C) (B.clen=strlen(A), \ X C==sizeof(char*)||C==B.clen+1?B.flen=B.clen,(A): \ X (memset((A)+B.clen,' ',C-B.clen-1),A[B.flen=C-1]='\0',(A))) X#define CSTRINGV( A,B,C) (B.s=malloc((C/0xFFFF)*(C%0xFFFF-1)), \ X c2fstrv(A,B.s,(B.flen=C%0xFFFF-1)+1,(C/0xFFFF)*(C%0xFFFF))) X#define CPSTRING( A,B,C) (B=strlen(A), C==sizeof(char*)?(A): \ X (memset((A)+B,' ',C-B-1),A[B=C-1]='\0',(A))) X#define CPSTRINGV(A,B,C) c2fstrv(A,A,(B.flen=C%0xFFFF-1)+1, \ X B.sizeofA=(C/0xFFFF)*(C%0xFFFF)) X#endif X X#define XDOUBLE return A0; X#define XFLOAT return A0; X#define XINT return A0; X#define XLOGICAL return A0; X#define XLONG return A0; X#ifdef vms X#define XSTRING return kill_trailing( \ X kill_trailing(AA0,CFORTRAN_NON_CHAR),' '); X#else X#define XSTRING return kill_trailing( \ X kill_trailing( A0,CFORTRAN_NON_CHAR),' '); X#endif X X#ifdef VAXC /* Have avoided %CC-I-PARAMNOTUSED. */ X#pragma standard X#endif X X#define CFFUN(NAME) __cf__/**/NAME X X#define CCALLSFFUN0(NAME) CFFUN(NAME)() X X#define CCALLSFFUN1(NAME,T1,A1) CFFUN(NAME)(B/**/T1(A1) S/**/T1(A1)) X X#define CCALLSFFUN2(NAME,T1,T2,A1,A2) CFFUN(NAME)(B/**/T1(A1),B/**/T2(A2) \ X S/**/T1(A1) S/**/T2(A2)) X X#define CCALLSFFUN3(NAME,T1,T2,T3,A1,A2,A3) \ XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3) \ X S/**/T1(A1) S/**/T2(A2) S/**/T3(A3)) X X#define CCALLSFFUN4(NAME,T1,T2,T3,T4,A1,A2,A3,A4) \ XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4) \ X S/**/T1(A1) S/**/T2(A2) S/**/T3(A3) S/**/T4(A4)) X X#define CCALLSFFUN5(NAME,T1,T2,T3,T4,T5,A1,A2,A3,A4,A5) \ XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5) \ X S/**/T1(A1) S/**/T2(A2) S/**/T3(A3) S/**/T4(A4) S/**/T5(A5)) X X#define CCALLSFFUN6(NAME,T1,T2,T3,T4,T5,T6,A1,A2,A3,A4,A5,A6) \ XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5) \ X B/**/T6(A6) \ XS/**/T1(A1) S/**/T2(A2) S/**/T3(A3) S/**/T4(A4) S/**/T5(A5) S/**/T6(A6)) X X#define CCALLSFFUN7(NAME,T1,T2,T3,T4,T5,T6,T7,A1,A2,A3,A4,A5,A6,A7) \ XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5) \ X B/**/T6(A6),B/**/T7(A7) S/**/T1(A1) S/**/T2(A2) S/**/T3(A3) \ X S/**/T4(A4) S/**/T5(A5) S/**/T6(A6) S/**/T7(A7)) X X#define CCALLSFFUN8(NAME,T1,T2,T3,T4,T5,T6,T7,T8,A1,A2,A3,A4,A5,A6,A7,A8) \ XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5) \ X B/**/T6(A6),B/**/T7(A7),B/**/T8(A8) S/**/T1(A1) S/**/T2(A2) \ X S/**/T3(A3) S/**/T4(A4) S/**/T5(A5) S/**/T6(A6) S/**/T7(A7) \ X S/**/T8(A8)) X X#define CCALLSFFUN9(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\ XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5) \ X B/**/T6(A6),B/**/T7(A7),B/**/T8(A8),B/**/T9(A9) S/**/T1(A1) \ X S/**/T2(A2) S/**/T3(A3) S/**/T4(A4) S/**/T5(A5) S/**/T6(A6) \ X S/**/T7(A7) S/**/T8(A8) S/**/T9(A9)) X X/* N.B. Create a separate function instead of using (call function, function Xvalue here) because in order to create the variables needed for the input Xarg.'s which may be const.'s one has to do the creation within {}, but these Xcan never be placed within ()'s. Therefore one must create wrapper functions. Xgcc, on the other hand may be able to avoid the wrapper functions. */ X X#define PROTOCCALLSFFUN0(F,NAME) \ XU/**/F NAME(); /* This is needed to correctly handle the value returned \ XN.B. Can only have prototype arg.'s with difficulty, a la G... table since \ XFORTRAN functions returning strings have extra arg.'s. Don't bother, since \ Xthis only causes a compiler warning to come up when one uses FCALLSCFUNn and \ XCCALLSFFUNn for the same function in the same source code. Something done by \ Xthe experts in tests only.*/ \ Xstatic U/**/F CFFUN(NAME)() {E/**/F GZ/**/F(NAME)); X/**/F} X X#define PROTOCCALLSFFUN1(F,NAME,T1) \ XU/**/F C_(NAME)(); \ Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1 H/**/T1(C1)) \ X{VCF(T1,1) E/**/F G/**/F(NAME)CCF(T1,1) JCF(T1,1)); WCF(T1,1) X/**/F} X X#define PROTOCCALLSFFUN2(F,NAME,T1,T2) \ XU/**/F C_(NAME)(); \ Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2 H/**/T1(C1) H/**/T2(C2)) \ X{VCF(T1,1) VCF(T2,2) E/**/F G/**/F(NAME)CCF(T1,1),CCF(T2,2) \ X JCF(T1,1) JCF(T2,2)); WCF(T1,1) WCF(T2,2) X/**/F} X X#define PROTOCCALLSFFUN3(F,NAME,T1,T2,T3) \ XU/**/F C_(NAME)(); \ Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3 \ X H/**/T1(C1) H/**/T2(C2) H/**/T3(C3)) \ X{VCF(T1,1) VCF(T2,2) VCF(T3,3) E/**/F \ X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3) JCF(T1,1) JCF(T2,2) JCF(T3,3)); \ X WCF(T1,1) WCF(T2,2) WCF(T3,3) X/**/F} X X#define PROTOCCALLSFFUN4(F,NAME,T1,T2,T3,T4) \ XU/**/F C_(NAME)(); \ Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4 \ X H/**/T1(C1) H/**/T2(C2) H/**/T3(C3) H/**/T4(C4)) \ X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) E/**/F \ X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4) JCF(T1,1) JCF(T2,2) \ X JCF(T3,3) JCF(T4,4)); WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) X/**/F} X X#define PROTOCCALLSFFUN5(F,NAME,T1,T2,T3,T4,T5) \ XU/**/F C_(NAME)(); \ Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4, \ X U/**/T5 A5 H/**/T1(C1) H/**/T2(C2) H/**/T3(C3) H/**/T4(C4) H/**/T5(C5)) \ X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) VCF(T5,5) E/**/F \ X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4),CCF(T5,5) \ X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5)); \ X WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5) X/**/F} X X#define PROTOCCALLSFFUN6(F,NAME,T1,T2,T3,T4,T5,T6) \ XU/**/F C_(NAME)(); \ Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4, \ X U/**/T5 A5,U/**/T6 A6 H/**/T1(C1) H/**/T2(C2) \ X H/**/T3(C3) H/**/T4(C4) H/**/T5(C5) H/**/T6(C6)) \ X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) VCF(T5,5) VCF(T6,6) E/**/F \ X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4),CCF(T5,5),CCF(T6,6) \ X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5) JCF(T6,6)); \ X WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5) WCF(T6,6) X/**/F} X X#define PROTOCCALLSFFUN7(F,NAME,T1,T2,T3,T4,T5,T6,T7) \ XU/**/F C_(NAME)(); \ Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4, \ X U/**/T5 A5,U/**/T6 A6,U/**/T7 A7 H/**/T1(C1) \ X H/**/T2(C2) H/**/T3(C3) H/**/T4(C4) H/**/T5(C5) H/**/T6(C6) H/**/T7(C7)) \ X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) VCF(T5,5) VCF(T6,6) VCF(T7,7) E/**/F \ X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4),CCF(T5,5),CCF(T6,6), \ X CCF(T7,7) \ X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5) JCF(T6,6) JCF(T7,7)); \ X WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5) WCF(T6,6) WCF(T7,7) X/**/F} X X#define PROTOCCALLSFFUN8(F,NAME,T1,T2,T3,T4,T5,T6,T7,T8) \ XU/**/F C_(NAME)(); \ Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4, \ X U/**/T5 A5,U/**/T6 A6,U/**/T7 A7,U/**/T8 A8 H/**/T1(C1) H/**/T2(C2) \ X H/**/T3(C3) H/**/T4(C4) H/**/T5(C5) H/**/T6(C6) H/**/T7(C7) H/**/T8(C8)) \ X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) VCF(T5,5) VCF(T6,6)VCF(T7,7) VCF(T8,8)\ X E/**/F G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4),CCF(T5,5), \ X CCF(T6,6),CCF(T7,7),CCF(T8,8) \ X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5) JCF(T6,6) JCF(T7,7) \ X JCF(T8,8)); WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5) \ X WCF(T6,6) WCF(T7,7) WCF(T8,8) X/**/F} X X#define PROTOCCALLSFFUN9(F,NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ XU/**/F C_(NAME)(); \ Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4, \ X U/**/T5 A5,U/**/T6 A6,U/**/T7 A7,U/**/T8 A8,U/**/T9 A9 \ X H/**/T1(C1) H/**/T2(C2) H/**/T3(C3) H/**/T4(C4) H/**/T5(C5) H/**/T6(C6) \ X H/**/T7(C7) H/**/T8(C8) H/**/T9(C9)) \ X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) VCF(T5,5) VCF(T6,6)VCF(T7,7) VCF(T8,8)\ X VCF(T9,9) E/**/F G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4), \ X CCF(T5,5),CCF(T6,6),CCF(T7,7),CCF(T8,8),CCF(T9,9) \ X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5) JCF(T6,6) JCF(T7,7) \ X JCF(T8,8) JCF(T9,9)); WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5) \ X WCF(T6,6) WCF(T7,7) WCF(T8,8) WCF(T9,9) X/**/F} X X/*-------------------------------------------------------------------------*/ X X/* UTILITIES FOR FORTRAN TO CALL C ROUTINES */ X X#ifdef VAXC /* To avoid %CC-I-PARAMNOTUSED. */ X#pragma nostandard X#endif X X#define DDOUBLE( A) X#define DFLOAT( A) X#define DINT( A) X#define DLOGICAL( A) X#define DLONG( A) X#define DDOUBLEV( A) X#define DFLOATV( A) X#define DINTV( A) X#define DDOUBLEVV( A) X#define DFLOATVV( A) X#define DINTVV( A) X#define DPDOUBLE( A) X#define DPFLOAT( A) X#define DPINT( A) X#define DPLOGICAL( A) X#define DPLONG( A) X#define DPVOID( A) X#ifdef vms X#define DSTRING( A) X#else X#define DSTRING( A) ,unsigned A X#endif X#define DSTRINGV DSTRING X#define DPSTRING DSTRING X#define DPSTRINGV DSTRING X X#define QDOUBLE( A) X#define QFLOAT( A) X#define QINT( A) X#define QLOGICAL( A) X#define QLONG( A) X#define QDOUBLEV( A) X#define QFLOATV( A) X#define QINTV( A) X#define QDOUBLEVV( A) X#define QFLOATVV( A) X#define QINTVV( A) X#define QPDOUBLE( A) X#define QPFLOAT( A) X#define QPINT( A) X#define QPLOGICAL( A) X#define QPLONG( A) X#define QPVOID( A) X#ifdef vms X#define QSTRINGV( A) char *A; X#else X#define QSTRINGV( A) char *A; unsigned int A/**/N; X#endif X#define QSTRING( A) char *A; X#define QPSTRING( A) char *A; X#define QPSTRINGV QSTRINGV X X#define TCF(NAME,TN,I) T/**/TN(NAME,A/**/I,B/**/I,D/**/I) X#define TDOUBLE( M,A,B,D) *A X#define TFLOAT( M,A,B,D) *A X#define TINT( M,A,B,D) *A X#define TLOGICAL( M,A,B,D) *A X#define TLONG( M,A,B,D) *A X#define TDOUBLEV( M,A,B,D) A X#define TFLOATV( M,A,B,D) A X#define TINTV( M,A,B,D) A X#define TDOUBLEVV(M,A,B,D) A X#define TFLOATVV( M,A,B,D) A X#define TINTVV( M,A,B,D) A X#define TPDOUBLE( M,A,B,D) A X#define TPFLOAT( M,A,B,D) A X#define TPINT( M,A,B,D) A X#define TPLOGICAL(M,A,B,D) A X#define TPLONG( M,A,B,D) A X#define TPVOID( M,A,B,D) A X#ifdef vms X#define TSTRING( M,A,B,D)((B=malloc(A->dsc$w_length+1))[A->dsc$w_length]='\0',\ X kill_trailing(memcpy(B,A->dsc$a_pointer,A->dsc$w_length),' ')) X#define TSTRINGV( M,A,B,D) \ X (B=malloc((A->dsc$w_length+1)*A->dsc$l_m[0]), (void *)F2CSTRVCOPY(B,A)) X#else X#define TSTRING( M,A,B,D) (memcpy(B=malloc(D+1),A,D),B[D]='\0', \ X kill_trailing(B,' ')) X#define TSTRINGV( M,A,B,D) (B/**/N=num_elem(A,D,M/**/_STRV_/**/A), \ X (void *)vkill_trailing(f2cstrv(A,B=malloc(B/**/N*(D+1)),D+1,B/**/N*(D+1)),\ X D+1,B/**/N*(D+1),' ')) X#endif X#define TPSTRING TSTRING X#define TPSTRINGV TSTRINGV X X#define RCF(TN,I) R/**/TN(A/**/I,B/**/I,D/**/I) X#define RDOUBLE( A,B,D) X#define RFLOAT( A,B,D) X#define RINT( A,B,D) X#define RLOGICAL( A,B,D) X#define RLONG( A,B,D) X#define RDOUBLEV( A,B,D) X#define RFLOATV( A,B,D) X#define RINTV( A,B,D) X#define RDOUBLEVV(A,B,D) X#define RFLOATVV( A,B,D) X#define RINTVV( A,B,D) X#define RPDOUBLE( A,B,D) X#define RPFLOAT( A,B,D) X#define RPINT( A,B,D) X#define RPLOGICAL(A,B,D) X#define RPLONG( A,B,D) X#define RPVOID( A,B,D) X#define RSTRING( A,B,D) free(B); X#define RSTRINGV( A,B,D) free(B); X#ifdef vms X#define RPSTRING( A,B,D) \ X memcpy(A->dsc$a_pointer,B,MIN(strlen(B),A->dsc$w_length)), \ X (A->dsc$w_length>strlen(B)? \ X memset(A->dsc$a_pointer+strlen(B),' ', A->dsc$w_length-strlen(B)):0),free(B); X#define RPSTRINGV(A,B,D) C2FSTRVCOPY(B,A), free(B); X#else X#define RPSTRING( A,B,D) memcpy(A,B,MIN(strlen(B),D)), \ X (D>strlen(B)?memset(A+strlen(B),' ', D-strlen(B)):0), free(B); X#define RPSTRINGV(A,B,D) c2fstrv(B,A,D+1,(D+1)*B/**/N), free(B); X#endif X X#define FZDOUBLE( A) double fcallsc(A)( X#define FZFLOAT( A) float fcallsc(A)( X#define FZINT( A) int fcallsc(A)( X#define FZLOGICAL( A) int fcallsc(A)( X#define FZLONG( A) long fcallsc(A)( X#define FZVOID( A) void fcallsc(A)( X#ifdef vms X#define FZSTRING( A) void fcallsc(A)(fstring *AS X#else X#define FZSTRING( A) void fcallsc(A)(char *AS, unsigned D0 X#endif X X#define FDOUBLE( A) double fcallsc(A)( X#define FFLOAT( A) float fcallsc(A)( X#define FINT( A) int fcallsc(A)( X#define FLOGICAL( A) int fcallsc(A)( X#define FLONG( A) long fcallsc(A)( X#define FVOID( A) void fcallsc(A)( X#define FSTRING( A) FZSTRING(A), X X#define LDOUBLE( NAME) A0=ccallsc(NAME) X#define LFLOAT( NAME) A0=ccallsc(NAME) X#define LINT( NAME) A0=ccallsc(NAME) X#define LLOGICAL(NAME) A0=ccallsc(NAME) X#define LLONG( NAME) A0=ccallsc(NAME) X#define LSTRING( NAME) A0=ccallsc(NAME) X#define LVOID( NAME) ccallsc(NAME) X X#define KDOUBLE X#define KFLOAT X#define KINT X#define KLOGICAL X#define KLONG X#define KVOID X/* KSTRING copies the string into the position provided by the caller. */ X#ifdef vms X#define KSTRING \ X memcpy(AS->dsc$a_pointer,A0, MIN(AS->dsc$w_length,(A0==NULL?0:strlen(A0))) ); \ X AS->dsc$w_length>(A0==NULL?0:strlen(A0))? \ X memset(AS->dsc$a_pointer+(A0==NULL?0:strlen(A0)),' ', \ X AS->dsc$w_length-(A0==NULL?0:strlen(A0))):0; X#else X#define KSTRING memcpy(AS,A0, MIN(D0,(A0==NULL?0:strlen(A0))) ); \ X D0>(A0==NULL?0:strlen(A0))?memset(AS+(A0==NULL?0:strlen(A0)), \ X ' ', D0-(A0==NULL?0:strlen(A0))):0; X#endif X X/* Note that K.. and I.. can't be combined since K.. has to access data before XR.., in order for functions returning strings which are also passed in as Xarguments to work correctly. Note that R.. frees and hence may corrupt the Xstring. */ X#define IDOUBLE return A0; X#define IFLOAT return A0; X#define IINT return A0; X#define ILOGICAL return A0; X#define ILONG return A0; X#define ISTRING return ; X#define IVOID return ; X X#ifdef VAXC /* Have avoided %CC-I-PARAMNOTUSED. */ X#pragma standard X#endif X X#define FCALLSCSUB0(NAME) FCALLSCFUN0(VOID,NAME) X#define FCALLSCSUB1(NAME,T1) FCALLSCFUN1(VOID,NAME,T1) X#define FCALLSCSUB2(NAME,T1,T2) FCALLSCFUN2(VOID,NAME,T1,T2) X#define FCALLSCSUB3(NAME,T1,T2,T3) FCALLSCFUN3(VOID,NAME,T1,T2,T3) X#define FCALLSCSUB4(NAME,T1,T2,T3,T4) FCALLSCFUN4(VOID,NAME,T1,T2,T3,T4) X#define FCALLSCSUB5(NAME,T1,T2,T3,T4,T5) FCALLSCFUN5(VOID,NAME,T1,T2,T3,T4,T5) X#define FCALLSCSUB6(NAME,T1,T2,T3,T4,T5,T6) \ X FCALLSCFUN6(VOID,NAME,T1,T2,T3,T4,T5,T6) X#define FCALLSCSUB7(NAME,T1,T2,T3,T4,T5,T6,T7) \ X FCALLSCFUN7(VOID,NAME,T1,T2,T3,T4,T5,T6,T7) X#define FCALLSCSUB8(NAME,T1,T2,T3,T4,T5,T6,T7,T8) \ X FCALLSCFUN8(VOID,NAME,T1,T2,T3,T4,T5,T6,T7,T8) X#define FCALLSCSUB9(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ X FCALLSCFUN9(VOID,NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9) X X#define FCALLSCFUN0(T0,NAME) \ XFZ/**/T0(NAME)) {U/**/T0 A0; L/**/T0(NAME)(); K/**/T0 I/**/T0} X X#define FCALLSCFUN1(T0,NAME,T1) \ XF/**/T0(NAME)N/**/T1 A1 D/**/T1(D1)) {U/**/T0 A0; Q/**/T1(B1) \ X L/**/T0(NAME)(TCF(NAME,T1,1)); K/**/T0 RCF(T1,1) I/**/T0} X X#define FCALLSCFUN2(T0,NAME,T1,T2) \ XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2 D/**/T1(D1) D/**/T2(D2)) \ X{U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2) \ X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2));K/**/T0 RCF(T1,1)RCF(T2,2)I/**/T0} X X#define FCALLSCFUN3(T0,NAME,T1,T2,T3) \ XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3 D/**/T1(D1) D/**/T2(D2) \ X D/**/T3(D3)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3) \ X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),TCF(NAME,T3,3)); \ X K/**/T0 RCF(T1,1) RCF(T2,2) RCF(T3,3) I/**/T0} X X#define FCALLSCFUN4(T0,NAME,T1,T2,T3,T4) \ XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4 D/**/T1(D1) \ X D/**/T2(D2) D/**/T3(D3) D/**/T4(D4)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2) \ X Q/**/T3(B3) Q/**/T4(B4) L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2), \ X TCF(NAME,T3,3),TCF(NAME,T4,4)); K/**/T0 RCF(T1,1)RCF(T2,2) RCF(T3,3) RCF(T4,4)\ X I/**/T0} X X#define FCALLSCFUN5(T0,NAME,T1,T2,T3,T4,T5) \ XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5 \ X D/**/T1(D1) D/**/T2(D2) D/**/T3(D3) D/**/T4(D4) D/**/T5(D5)) {U/**/T0 A0; \ X Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3) Q/**/T4(B4) Q/**/T5(B5) \ X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),TCF(NAME,T3,3),TCF(NAME,T4,4), \ X TCF(NAME,T5,5)); K/**/T0 RCF(T1,1)RCF(T2,2)RCF(T3,3)RCF(T4,4)RCF(T5,5) I/**/T0} X X#define FCALLSCFUN6(T0,NAME,T1,T2,T3,T4,T5,T6) \ XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5, \ X N/**/T6 A6 D/**/T1(D1) D/**/T2(D2) D/**/T3(D3) D/**/T4(D4) D/**/T5(D5) \ X D/**/T6(D6)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3) Q/**/T4(B4) \ X Q/**/T5(B5) Q/**/T6(B6) L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2), \ X TCF(NAME,T3,3),TCF(NAME,T4,4),TCF(NAME,T5,5),TCF(NAME,T6,6)); K/**/T0 \ X RCF(T1,1) RCF(T2,2) RCF(T3,3) RCF(T4,4) RCF(T5,5) RCF(T6,6) I/**/T0} X X#define FCALLSCFUN7(T0,NAME,T1,T2,T3,T4,T5,T6,T7) \ XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5, \ X N/**/T6 A6 N/**/T7 A7 D/**/T1(D1) D/**/T2(D2) D/**/T3(D3) D/**/T4(D4) \ X D/**/T5(D5) D/**/T6(D6) D/**/T7(D7)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2) \ X Q/**/T3(B3) Q/**/T4(B4) Q/**/T5(B5) Q/**/T6(B6) Q/**/T7(B7) \ X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),TCF(NAME,T3,3),TCF(NAME,T4,4), \ X TCF(NAME,T5,5),TCF(NAME,T6,6),TCF(NAME,T7,7)); K/**/T0 \ X RCF(T1,1) RCF(T2,2) RCF(T3,3) RCF(T4,4) RCF(T5,5) RCF(T6,6) RCF(T7,7) I/**/T0} X X#define FCALLSCFUN8(T0,NAME,T1,T2,T3,T4,T5,T6,T7,T8) \ XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5, \ X N/**/T6 A6 N/**/T7 A7 N/**/T8 A8 D/**/T1(D1) D/**/T2(D2) D/**/T3(D3) \ X D/**/T4(D4) D/**/T5(D5) D/**/T6(D6) D/**/T7(D7) D/**/T8(D8)) {U/**/T0 A0; \ X Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3) Q/**/T4(B4) Q/**/T5(B5) Q/**/T6(B6) \ X Q/**/T7(B7) Q/**/T8(B8) L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2), \ X TCF(NAME,T3,3),TCF(NAME,T4,4),TCF(NAME,T5,5),TCF(NAME,T6,6),TCF(NAME,T7,7), \ X TCF(NAME,T8,8)); K/**/T0 RCF(T1,1) RCF(T2,2) RCF(T3,3) RCF(T4,4) RCF(T5,5) \ X RCF(T6,6) RCF(T7,7) RCF(T8,8) I/**/T0} X X#define FCALLSCFUN9(T0,NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5, \ X N/**/T6 A6 N/**/T7 A7 N/**/T8 A8 N/**/T9 A9 D/**/T1(D1) D/**/T2(D2) \ X D/**/T3(D3) D/**/T4(D4) D/**/T5(D5) D/**/T6(D6) D/**/T7(D7) D/**/T8(D8) \ X D/**/T8(D8) D/**/T9(D9)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3) \ X Q/**/T4(B4) Q/**/T5(B5) Q/**/T6(B6) Q/**/T7(B7) Q/**/T8(B8) Q/**/T9(B9) \ X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),TCF(NAME,T3,3),TCF(NAME,T4,4), \ X TCF(NAME,T5,5),TCF(NAME,T6,6),TCF(NAME,T7,7),TCF(NAME,T8,8),TCF(NAME,T9,9)); \ X K/**/T0 RCF(T1,1) RCF(T2,2) RCF(T3,3) RCF(T4,4) RCF(T5,5) \ X RCF(T6,6) RCF(T7,7) RCF(T8,8) RCF(T9,9) I/**/T0} X X X#endif /* __CFORTRAN_LOADED */ X#endif /* This is VMS, Mips or IBMR2. */ END_OF_FILE if test 54924 -ne `wc -c <'cfortran.h'`; then echo shar: \"'cfortran.h'\" unpacked with wrong size! fi # end of 'cfortran.h' fi echo shar: End of archive 2 \(of 2\). cp /dev/null ark2isdone MISSING="" for I in 1 2 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked both archives. rm -f ark[1-9]isdone else echo You still must unpack the following archives: echo " " ${MISSING} fi exit 0 exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.