home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume20 / cfortran / part02 < prev    next >
Encoding:
Text File  |  1991-06-26  |  56.7 KB  |  1,204 lines

  1. Newsgroups: comp.sources.misc
  2. From: Burkhard Burow <burow@cernvax.cern.ch>
  3. Subject:  v20i067:  cfortran - a bridge between C and FORTRAN, Part02/02
  4. Message-ID: <1991Jun25.193417.29440@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 99448899475aca49f1c8959692bf74a5
  6. Date: Tue, 25 Jun 1991 19:34:17 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Burkhard Burow <burow@cernvax.cern.ch>
  10. Posting-number: Volume 20, Issue 67
  11. Archive-name: cfortran/part02
  12.  
  13. #! /bin/sh
  14. # into a shell via "sh file" or similar.  To overwrite existing files,
  15. # type "sh file -c".
  16. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  17. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  18. # Contents:  cfortran.h
  19. # Wrapped by kent@sparky on Tue Jun 25 14:25:33 1991
  20. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  21. echo If this archive is complete, you will see the following message:
  22. echo '          "shar: End of archive 2 (of 2)."'
  23. if test -f 'cfortran.h' -a "${1}" != "-c" ; then 
  24.   echo shar: Will not clobber existing file \"'cfortran.h'\"
  25. else
  26.   echo shar: Extracting \"'cfortran.h'\" \(54924 characters\)
  27.   sed "s/^X//" >'cfortran.h' <<'END_OF_FILE'
  28. X/* cfortran.h */
  29. X/* Burkhard Burow, University of Toronto, 1991. */
  30. X
  31. X#ifndef __CFORTRAN_LOADED
  32. X#define __CFORTRAN_LOADED       1
  33. X
  34. X#if !defined(mips) && !defined(_IBMR2) && !(defined(vms) && defined(VAXC))
  35. X??=error This header file is for the following compilers:
  36. X??=error - MIPS cc and f77 2.0. (e.g. Silicon Graphics, DECstations, ...)
  37. X??=error - IBM AIX XL C and FORTRAN Compiler/6000 Version 01.01.0000.0000
  38. X??=error - VAX VMS CC 3.1 and FORTRAN 5.4.
  39. X#else
  40. X
  41. X#ifdef vms
  42. X#include <descrip.h>
  43. X#endif
  44. X#include <stddef.h>
  45. X#include <stdlib.h>
  46. X#include <string.h>
  47. X
  48. X/* Note that for VMS and IBMR2 (without -Dextname), one may wish to change the
  49. X   defaults for fcallsc and/or ccallsc. */
  50. X
  51. X#if defined(mips) || (defined(_IBMR2) && defined(extname))
  52. X#define C_(A)                  A/**/_
  53. X#define ccallsc(NAME)          NAME
  54. X#else
  55. X#define C_(A)                  A
  56. X#define ccallsc(NAME)          CF/**/NAME
  57. X#endif
  58. X#define fcallsc                C_
  59. X#define C_FUNCTION             fcallsc
  60. X#define FORTRAN_FUNCTION       C_
  61. X#define COMMON_BLOCK           C_
  62. X/*-------------------------------------------------------------------------*/
  63. X
  64. X/*               UTILITIES USED WITHIN CFORTRAN                            */
  65. X
  66. X#define MIN(A,B) (A<B?A:B)
  67. X#define firstindexlength( A) (sizeof(A)     /sizeof(A[0]))
  68. X#define secondindexlength(A) (sizeof((A)[0])/sizeof((A)[0][0]))
  69. X
  70. X/* Convert a vector of C strings into FORTRAN strings. */
  71. Xstatic char *c2fstrv(char* cstr, char *fstr, int elem_len, int sizeofcstr)
  72. X{ int i,j;
  73. X/* elem_len includes \0 for C strings. Fortran strings don't have term. \0.
  74. X   Useful size of string must be the same in both languages. */
  75. Xfor (i=0; i<sizeofcstr/elem_len; i++) {
  76. X  for (j=1; j<elem_len && *cstr; j++) *fstr++ = *cstr++;
  77. X  cstr += 1+elem_len-j;
  78. X  for (; j<elem_len; j++) *fstr++ = ' ';
  79. X}
  80. Xreturn fstr-sizeofcstr+sizeofcstr/elem_len;
  81. X}
  82. X
  83. X/* Convert a vector of FORTRAN strings into C strings. */
  84. Xstatic char *f2cstrv(char *fstr, char* cstr, int elem_len, int sizeofcstr)
  85. X{ int i,j;
  86. X/* elem_len includes \0 for C strings. Fortran strings don't have term. \0.
  87. X   Useful size of string must be the same in both languages. */
  88. Xcstr += sizeofcstr;
  89. Xfstr += sizeofcstr - sizeofcstr/elem_len;
  90. Xfor (i=0; i<sizeofcstr/elem_len; i++) {
  91. X  *--cstr = '\0';
  92. X  for (j=1; j<elem_len; j++) *--cstr = *--fstr;
  93. X}
  94. Xreturn cstr;
  95. X}
  96. X
  97. X/* kill the trailing char t's in string s. */
  98. Xstatic char *kill_trailing(char *s, char t)
  99. X{char *e;
  100. Xe = s + strlen(s);
  101. Xif (e>s) {                           /* Need this to handle NULL string.*/
  102. X  while (e>s && *--e==t);            /* Don't follow t's past beginning. */
  103. X  e[*e==t?0:1] = '\0';               /* Handle s[0]=t correctly.       */
  104. X}
  105. Xreturn s;
  106. X}
  107. X
  108. X/* kill_trailingn(s,t,e) will kill the trailing t's in string s. e normally
  109. Xpoints to the terminating '\0' of s, but may actually point to anywhere in s.
  110. Xs's new '\0' will be placed at e or earlier in order to remove any trailing t's.
  111. XIf e<s string s is left unchanged. */
  112. Xstatic char *kill_trailingn(char *s, char t, char *e)
  113. X{
  114. Xif (e==s) *e = '\0';                 /* Kill the string makes sense here.*/
  115. Xelse if (e>s) {                      /* Watch out for neg. length string.*/
  116. X  while (e>s && *--e==t);            /* Don't follow t's past beginning. */
  117. X  e[*e==t?0:1] = '\0';               /* Handle s[0]=t correctly.       */
  118. X}
  119. Xreturn s;
  120. X}
  121. X
  122. X/* Note the following assumes that any element which has t's to be chopped off,
  123. Xdoes indeed fill the entire element. */
  124. Xstatic char *vkill_trailing(char* cstr, int elem_len, int sizeofcstr, char t)
  125. X{ int i;
  126. Xfor (i=0; i<sizeofcstr/elem_len; i++) /* elem_len includes \0 for C strings. */
  127. X  kill_trailingn(cstr+elem_len*i,t,cstr+elem_len*(i+1)-1);
  128. Xreturn cstr;
  129. X}
  130. X
  131. X#ifdef vms
  132. Xtypedef struct dsc$descriptor_s fstring;
  133. X#define DSC$DESCRIPTOR_A(DIMCT)                                                \
  134. Xstruct {                                                                       \
  135. X  unsigned short dsc$w_length;                                                 \
  136. X  unsigned char  dsc$b_dtype;                                                  \
  137. X  unsigned char  dsc$b_class;                                                  \
  138. X           char *dsc$a_pointer;                                                \
  139. X           char  dsc$b_scale;                                                  \
  140. X  unsigned char dsc$b_digits;                                                  \
  141. X  struct {                                                                     \
  142. X    unsigned                   : 3;                                            \
  143. X    unsigned dsc$v_fl_binscale : 1;                                            \
  144. X    unsigned dsc$v_fl_redim    : 1;                                            \
  145. X    unsigned dsc$v_fl_column   : 1;                                            \
  146. X    unsigned dsc$v_fl_coeff    : 1;                                            \
  147. X    unsigned dsc$v_fl_bounds   : 1;                                            \
  148. X  } dsc$b_aflags;                                                              \
  149. X  unsigned char  dsc$b_dimct;                                                  \
  150. X  unsigned long  dsc$l_arsize;                                                 \
  151. X           char *dsc$a_a0;                                                     \
  152. X           long  dsc$l_m [DIMCT];                                              \
  153. X  struct {                                                                     \
  154. X    long dsc$l_l;                                                              \
  155. X    long dsc$l_u;                                                              \
  156. X  } dsc$bounds [DIMCT];                                                        \
  157. X}
  158. Xtypedef DSC$DESCRIPTOR_A(1) fstringvector;
  159. X/*typedef DSC$DESCRIPTOR_A(2) fstringarrarr;
  160. X  typedef DSC$DESCRIPTOR_A(3) fstringarrarrarr;*/
  161. X#define initfstr(F,C,ELEMNO,ELEMLEN)                                           \
  162. X( (F).dsc$l_arsize=  ( (F).dsc$w_length                        =(ELEMLEN) )    \
  163. X                    *( (F).dsc$l_m[0]=(F).dsc$bounds[0].dsc$l_u=(ELEMNO)  ),   \
  164. X  (F).dsc$a_a0    =  ( (F).dsc$a_pointer=(C) ) - (F).dsc$w_length          ,(F))
  165. X
  166. X#define F2CSTRVCOPY(C,F)                                                       \
  167. X  vkill_trailing(f2cstrv(F->dsc$a_pointer,C,F->dsc$w_length+1,                 \
  168. X                         F->dsc$l_m[0]*(F->dsc$w_length+1)),                   \
  169. X                 F->dsc$w_length+1,F->dsc$l_m[0]*(F->dsc$w_length+1),' ')
  170. X#define C2FSTRVCOPY(C,F) c2fstrv(C,F->dsc$a_pointer,F->dsc$w_length+1,         \
  171. X                                 F->dsc$l_m[0]*(F->dsc$w_length+1)    )
  172. X
  173. X#else
  174. X#define _NUM_ELEMS      -1
  175. X#define _NUM_ELEM_ARG   -2
  176. X#define NUM_ELEMS(A)    A,_NUM_ELEMS
  177. X#define NUM_ELEM_ARG(B) *A/**/B,_NUM_ELEM_ARG
  178. X#define TERM_CHARS(A,B) A,B
  179. Xstatic int num_elem(char *strv, unsigned elem_len, int term_char,
  180. X                    int num_term_char)
  181. X/* elem_len is the number of characters in each element of strv, the FORTRAN
  182. Xvector of strings. The last element of the vector must begin with at least
  183. Xnum_term_char term_char characters, so that this routine can determine how
  184. Xmany elements are in the vector. */
  185. X{
  186. Xunsigned num,i;
  187. Xif (num_term_char == _NUM_ELEMS || num_term_char == _NUM_ELEM_ARG)
  188. X  return term_char;
  189. Xif (num_term_char <=0) num_term_char = elem_len;
  190. Xfor (num=0; ; num++) {
  191. X  for (i=0; i<num_term_char && *strv==term_char; i++,strv++);
  192. X  if (i==num_term_char) break;
  193. X  else strv += elem_len-i;
  194. X}
  195. Xreturn num;
  196. X}
  197. X#endif
  198. X/*-------------------------------------------------------------------------*/
  199. X
  200. X/*           UTILITIES FOR C TO USE STRINGS IN FORTRAN COMMON BLOCKS       */
  201. X
  202. X/* C string TO Fortran Common Block STRing. */
  203. X/* DIM is the number of DIMensions of the array in terms of strings, not
  204. X   characters. e.g. char a[12] has DIM = 0, char a[12][4] has DIM = 1, etc. */
  205. X#define C2FCBSTR(CSTR,FSTR,DIM)                                                \
  206. X c2fstrv((char *)CSTR, (char *)FSTR, sizeof(FSTR)/cfelementsof(FSTR,DIM)+1,    \
  207. X         sizeof(FSTR)+cfelementsof(FSTR,DIM))
  208. X
  209. X/* Fortran Common Block string TO C STRing. */
  210. X#define FCB2CSTR(FSTR,CSTR,DIM)                                                \
  211. X vkill_trailing(f2cstrv((char *)FSTR, (char *)CSTR,                            \
  212. X                        sizeof(FSTR)/cfelementsof(FSTR,DIM)+1,                 \
  213. X                        sizeof(FSTR)+cfelementsof(FSTR,DIM)),                  \
  214. X                sizeof(FSTR)/cfelementsof(FSTR,DIM)+1,                         \
  215. X                sizeof(FSTR)+cfelementsof(FSTR,DIM), ' ')
  216. X
  217. X#define cfDEREFERENCE0
  218. X#define cfDEREFERENCE1 *
  219. X#define cfDEREFERENCE2 **
  220. X#define cfDEREFERENCE3 ***
  221. X#define cfDEREFERENCE4 ****
  222. X#define cfDEREFERENCE5 *****
  223. X#define cfelementsof(A,D) (sizeof(A)/sizeof(cfDEREFERENCE/**/D(A)))
  224. X
  225. X/*-------------------------------------------------------------------------*/
  226. X
  227. X/*               UTILITIES FOR C TO CALL FORTRAN SUBROUTINES               */
  228. X
  229. X/* Define lookup tables for how to handle the various types of variables.  */
  230. X
  231. X#ifdef VAXC        /* To avoid %CC-I-PARAMNOTUSED. */
  232. X#pragma nostandard
  233. X#endif
  234. X
  235. X#define VCF(TN,I)      V/**/TN(A/**/I,B/**/I)
  236. X#define VDOUBLE(  A,B) double  B = A;
  237. X#define VFLOAT(   A,B) float   B = A;
  238. X#define VINT(     A,B) int     B = (int)A;      /* typecast for enum's sake */
  239. X#define VLOGICAL( A,B) int     B = A;
  240. X#define VLONG(    A,B) long    B = A;
  241. X#define VDOUBLEV( A,B) double *B = A;
  242. X#define VFLOATV(  A,B) float  *B = A;
  243. X#define VINTV(    A,B) int    *B = A;
  244. X#define VDOUBLEVV(A,B) double *B = A[0];
  245. X#define VFLOATVV( A,B) float  *B = A[0];
  246. X#define VINTVV(   A,B) int    *B = A[0];
  247. X#define VPDOUBLE( A,B)
  248. X#define VPFLOAT(  A,B)
  249. X#define VPINT(    A,B)
  250. X#define VPLOGICAL(A,B)
  251. X#define VPLONG(   A,B)
  252. X#define VPVOID(   A,B)
  253. X#define VPSTRUCT( A,B)
  254. X#ifdef vms
  255. X#define VSTRING(  A,B) static struct {fstring f; unsigned clen;} B =           \
  256. X                                       {{0,DSC$K_DTYPE_T,DSC$K_CLASS_S,NULL},0};
  257. X#define VPSTRING( A,B) static fstring B={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,NULL};
  258. X#define VSTRINGV( A,B) static fstringvector B =                                \
  259. X{sizeof(A),DSC$K_DTYPE_T,DSC$K_CLASS_A,NULL,0,0,{0,0,0,1,1,1},1,0,NULL,0,{1,0}};
  260. X#define VPSTRINGV(A,B) static fstringvector B =                                \
  261. X{0,DSC$K_DTYPE_T,DSC$K_CLASS_A,NULL,0,0,{0,0,0,1,1,1},1,0,NULL,0,{1,0}};
  262. X#else
  263. X#define VSTRING(  A,B) struct {unsigned short clen, flen;} B;
  264. X#define VSTRINGV( A,B) struct {char *s; unsigned flen;} B;
  265. X#define VPSTRING( A,B) int     B;
  266. X#define VPSTRINGV(A,B) struct {unsigned short sizeofA, flen;} B;
  267. X#endif
  268. X
  269. X#define ADOUBLE(  A,B) &B
  270. X#define AFLOAT(   A,B) &B
  271. X#define AINT(     A,B) &B
  272. X#define ALOGICAL( A,B) &B
  273. X#define ALONG(    A,B) &B
  274. X#define ADOUBLEV( A,B)  B
  275. X#define AFLOATV(  A,B)  B
  276. X#define AINTV(    A,B)  B
  277. X#define ADOUBLEVV(A,B)  B
  278. X#define AFLOATVV( A,B)  B
  279. X#define AINTVV(   A,B)  B
  280. X#define APDOUBLE( A,B) &A
  281. X#define APFLOAT(A,B)   &A
  282. X#define APINT(    A,B) (int *) & A   /* typecast for enum's sake */
  283. X#define APLOGICAL(A,B) &A
  284. X#define APLONG(   A,B) &A
  285. X#define APVOID(   A,B) (void *) A
  286. X#define APSTRUCT( A,B) (void *)&A
  287. X#define ASTRING(  A,B) CSTRING(A,B,sizeof(A))
  288. X#define APSTRING( A,B) CPSTRING(A,B,sizeof(A))
  289. X#ifdef vms
  290. X#define ASTRINGV( A,B) (initfstr(B,malloc(sizeof(A)-firstindexlength(A)),      \
  291. X                                 firstindexlength(A),secondindexlength(A)-1),  \
  292. X                c2fstrv(A[0],B.dsc$a_pointer,secondindexlength(A),sizeof(A)),&B)
  293. X#define APSTRINGV(A,B) (initfstr(B,A[0],firstindexlength(A),                   \
  294. X                                 secondindexlength(A)-1),                      \
  295. X                        c2fstrv(A[0],A[0],secondindexlength(A),sizeof(A)), &B)
  296. X#else
  297. X#define ASTRINGV( A,B) (B.s=malloc(sizeof(A)-firstindexlength(A)),             \
  298. X                  c2fstrv(A[0],B.s,(B.flen=secondindexlength(A)-1)+1,sizeof(A)))
  299. X#define APSTRINGV(A,B) c2fstrv(A[0],A[0],(B.flen=secondindexlength(A)-1)+1,    \
  300. X                               B.sizeofA=sizeof(A))
  301. X#endif
  302. X
  303. X#define JCF(TN,I)      J/**/TN(A/**/I,B/**/I)
  304. X#define JDOUBLE(  A,B)
  305. X#define JFLOAT(   A,B)
  306. X#define JINT(     A,B)
  307. X#define JLOGICAL( A,B)
  308. X#define JLONG(    A,B)
  309. X#define JDOUBLEV( A,B)
  310. X#define JFLOATV(  A,B)
  311. X#define JINTV(    A,B)
  312. X#define JDOUBLEVV(A,B)
  313. X#define JFLOATVV( A,B)
  314. X#define JINTVV(   A,B)
  315. X#define JPDOUBLE( A,B)
  316. X#define JPFLOAT(  A,B)
  317. X#define JPINT(    A,B)
  318. X#define JPLOGICAL(A,B)
  319. X#define JPLONG(   A,B)
  320. X#define JPVOID(   A,B)
  321. X#define JPSTRUCT( A,B)
  322. X#ifdef vms
  323. X#define JSTRING(  A,B)
  324. X#define JPSTRING( A,B)
  325. X#else
  326. X#define JSTRING(  A,B) ,B.flen
  327. X#define JPSTRING( A,B) ,B
  328. X#endif
  329. X#define JSTRINGV       JSTRING
  330. X#define JPSTRINGV      JSTRING
  331. X
  332. X#define WCF(TN,I)      W/**/TN(A/**/I,B/**/I)
  333. X#define WDOUBLE(  A,B)
  334. X#define WFLOAT(   A,B)
  335. X#define WINT(     A,B)
  336. X#define WLOGICAL( A,B)
  337. X#define WLONG(    A,B)
  338. X#define WDOUBLEV( A,B)
  339. X#define WFLOATV(  A,B)
  340. X#define WINTV(    A,B)
  341. X#define WDOUBLEVV(A,B)
  342. X#define WFLOATVV( A,B)
  343. X#define WINTVV(   A,B)
  344. X#define WPDOUBLE( A,B)
  345. X#define WPFLOAT(  A,B)
  346. X#define WPINT(    A,B)
  347. X#define WPLOGICAL(A,B)
  348. X#define WPLONG(   A,B)
  349. X#define WPVOID(   A,B)
  350. X#define WPSTRUCT( A,B)
  351. X#define WSTRING(  A,B) (A[B.clen]!='\0'?A[B.clen]='\0':0); /* A may be "const"*/
  352. X#define WPSTRING( A,B) kill_trailing(A,' ');
  353. X#ifdef vms
  354. X#define WSTRINGV( A,B) free(B.dsc$a_pointer);
  355. X#define WPSTRINGV(A,B)                                                         \
  356. X  vkill_trailing(f2cstrv((char*)A, (char*)A,                                   \
  357. X                         B.dsc$w_length+1, B.dsc$l_arsize+B.dsc$l_m[0]),       \
  358. X                 B.dsc$w_length+1, B.dsc$l_arsize+B.dsc$l_m[0], ' ');
  359. X#else
  360. X#define WSTRINGV( A,B) free(B.s);
  361. X#define WPSTRINGV(A,B) vkill_trailing(                                         \
  362. X         f2cstrv((char*)A,(char*)A,B.flen+1,B.sizeofA), B.flen+1,B.sizeofA,' ');
  363. X#endif
  364. X
  365. X#define NDOUBLE        double        *
  366. X#define NFLOAT         float         *
  367. X#define NINT           int           *
  368. X#define NLOGICAL       int           *
  369. X#define NLONG          long          *
  370. X#define NDOUBLEV       double        *
  371. X#define NFLOATV        float         *
  372. X#define NINTV          int           *
  373. X#define NFLOATVV       float         *
  374. X#define NINTVV         int           *
  375. X#define NPDOUBLE       double        *
  376. X#define NPFLOAT        float         *
  377. X#define NPINT          int           *
  378. X#define NPLOGICAL      int           *
  379. X#define NPLONG         long          *
  380. X#define NPVOID         void          *
  381. X#define NPSTRUCT       void          *
  382. X#ifdef vms
  383. X#define NSTRING        fstring       *
  384. X#define NSTRINGV       fstringvector *
  385. X#else
  386. X#define NSTRING        char          *
  387. X#define NSTRINGV       char          *
  388. X#endif
  389. X#define NPSTRING       NSTRING
  390. X#define NPSTRINGV      NSTRINGV
  391. X
  392. X#ifdef VAXC        /* Have avoid %CC-I-PARAMNOTUSED. */
  393. X#pragma standard
  394. X#endif
  395. X
  396. X#define CCALLSFSUB0(NAME) {C_(NAME)();}
  397. X
  398. X#define CCALLSFSUB1(NAME,T1,A1)                                                \
  399. X{V/**/T1(A1,B1) C_(NAME)(A/**/T1(A1,B1) J/**/T1(A1,B1)); W/**/T1(A1,B1)}
  400. X
  401. X#define CCALLSFSUB2(NAME,T1,T2,A1,A2)                                          \
  402. X{V/**/T1(A1,B1) V/**/T2(A2,B2)                                                 \
  403. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2) J/**/T1(A1,B1) J/**/T2(A2,B2));        \
  404. X W/**/T1(A1,B1) W/**/T2(A2,B2)}
  405. X
  406. X#define CCALLSFSUB3(NAME,T1,T2,T3,A1,A2,A3)                                    \
  407. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3)                                  \
  408. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3)                         \
  409. X          J/**/T1(A1,B1) J/**/T2(A2,B2) J/**/T3(A3,B3));                       \
  410. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3)}
  411. X
  412. X#define CCALLSFSUB4(NAME,T1,T2,T3,T4,A1,A2,A3,A4)                              \
  413. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3) V/**/T4(A4,B4)                   \
  414. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3),A/**/T4(A4,B4)          \
  415. X          J/**/T1(A1,B1) J/**/T2(A2,B2) J/**/T3(A3,B3) J/**/T4(A4,B4));        \
  416. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3) W/**/T4(A4,B4)}
  417. X
  418. X#define CCALLSFSUB5(NAME,T1,T2,T3,T4,T5,A1,A2,A3,A4,A5)                        \
  419. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3) V/**/T4(A4,B4) V/**/T5(A5,B5)    \
  420. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3),A/**/T4(A4,B4),         \
  421. X          A/**/T5(A5,B5) J/**/T1(A1,B1) J/**/T2(A2,B2) J/**/T3(A3,B3)          \
  422. X          J/**/T4(A4,B4) J/**/T5(A5,B5));                                      \
  423. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3) W/**/T4(A4,B4) W/**/T5(A5,B5)}
  424. X
  425. X#define CCALLSFSUB6(NAME,T1,T2,T3,T4,T5,T6,A1,A2,A3,A4,A5,A6)                  \
  426. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3) V/**/T4(A4,B4)                   \
  427. X V/**/T5(A5,B5) V/**/T6(A6,B6)                                                 \
  428. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3),A/**/T4(A4,B4),         \
  429. X          A/**/T5(A5,B5),A/**/T6(A6,B6) J/**/T1(A1,B1) J/**/T2(A2,B2)          \
  430. X          J/**/T3(A3,B3) J/**/T4(A4,B4) J/**/T5(A5,B5) J/**/T6(A6,B6));        \
  431. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3) W/**/T4(A4,B4)                   \
  432. X W/**/T5(A5,B5) W/**/T6(A6,B6)}
  433. X
  434. X#define CCALLSFSUB7(NAME,T1,T2,T3,T4,T5,T6,T7,A1,A2,A3,A4,A5,A6,A7)            \
  435. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3) V/**/T4(A4,B4)                   \
  436. X V/**/T5(A5,B5) V/**/T6(A6,B6) V/**/T7(A7,B7)                                  \
  437. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3),A/**/T4(A4,B4),         \
  438. X          A/**/T5(A5,B5),A/**/T6(A6,B6),A/**/T7(A7,B7)                         \
  439. X          J/**/T1(A1,B1) J/**/T2(A2,B2) J/**/T3(A3,B3) J/**/T4(A4,B4)          \
  440. X          J/**/T5(A5,B5) J/**/T6(A6,B6) J/**/T7(A7,B7));                       \
  441. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3) W/**/T4(A4,B4)                   \
  442. X W/**/T5(A5,B5) W/**/T6(A6,B6) W/**/T7(A7,B7)}
  443. X
  444. X#define CCALLSFSUB8(NAME,T1,T2,T3,T4,T5,T6,T7,T8,A1,A2,A3,A4,A5,A6,A7,A8)      \
  445. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3) V/**/T4(A4,B4)                   \
  446. X V/**/T5(A5,B5) V/**/T6(A6,B6) V/**/T7(A7,B7) V/**/T8(A8,B8)                   \
  447. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3),A/**/T4(A4,B4),         \
  448. X          A/**/T5(A5,B5),A/**/T6(A6,B6),A/**/T7(A7,B7),A/**/T8(A8,B8)          \
  449. X          J/**/T1(A1,B1) J/**/T2(A2,B2) J/**/T3(A3,B3) J/**/T4(A4,B4)          \
  450. X          J/**/T5(A5,B5) J/**/T6(A6,B6) J/**/T7(A7,B7) J/**/T8(A8,B8));        \
  451. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3) W/**/T4(A4,B4)                   \
  452. X W/**/T5(A5,B5) W/**/T6(A6,B6) W/**/T7(A7,B7) W/**/T8(A8,B8)}
  453. X
  454. X#define CCALLSFSUB9(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\
  455. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3) V/**/T4(A4,B4)                   \
  456. X V/**/T5(A5,B5) V/**/T6(A6,B6) V/**/T7(A7,B7) V/**/T8(A8,B8) V/**/T9(A9,B9)    \
  457. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3),A/**/T4(A4,B4),         \
  458. X          A/**/T5(A5,B5),A/**/T6(A6,B6),A/**/T7(A7,B7),A/**/T8(A8,B8),         \
  459. X          A/**/T9(A9,B9) J/**/T1(A1,B1) J/**/T2(A2,B2) J/**/T3(A3,B3)          \
  460. X          J/**/T4(A4,B4) J/**/T5(A5,B5) J/**/T6(A6,B6) J/**/T7(A7,B7)          \
  461. X          J/**/T8(A8,B8) J/**/T9(A9,B9));                                      \
  462. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3) W/**/T4(A4,B4)                   \
  463. X W/**/T5(A5,B5) W/**/T6(A6,B6) W/**/T7(A7,B7) W/**/T8(A8,B8) W/**/T9(A9,B9)}
  464. X
  465. X#define CCALLSFSUB10(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,                       \
  466. X                          A1,A2,A3,A4,A5,A6,A7,A8,A9,AA)                       \
  467. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3) V/**/T4(A4,B4) V/**/T5(A5,B5)    \
  468. X V/**/T6(A6,B6) V/**/T7(A7,B7) V/**/T8(A8,B8) V/**/T9(A9,B9) V/**/TA(AA,BA)    \
  469. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3),A/**/T4(A4,B4),         \
  470. X          A/**/T5(A5,B5),A/**/T6(A6,B6),A/**/T7(A7,B7),A/**/T8(A8,B8),         \
  471. X          A/**/T9(A9,B9),A/**/TA(AA,BA) J/**/T1(A1,B1) J/**/T2(A2,B2)          \
  472. X          J/**/T3(A3,B3) J/**/T4(A4,B4) J/**/T5(A5,B5) J/**/T6(A6,B6)          \
  473. X          J/**/T7(A7,B7) J/**/T8(A8,B8) J/**/T9(A9,B9) J/**/TA(AA,BA));        \
  474. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3) W/**/T4(A4,B4) W/**/T5(A5,B5)    \
  475. X W/**/T6(A6,B6) W/**/T7(A7,B7) W/**/T8(A8,B8) W/**/T9(A9,B9) W/**/TA(AA,BA) }
  476. X
  477. X#define CCALLSFSUB11(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,                    \
  478. X                          A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB)                    \
  479. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3) V/**/T4(A4,B4) V/**/T5(A5,B5)    \
  480. X V/**/T6(A6,B6) V/**/T7(A7,B7) V/**/T8(A8,B8) V/**/T9(A9,B9) V/**/TA(AA,BA)    \
  481. X V/**/TB(AB,BB)                                                                \
  482. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3),A/**/T4(A4,B4),         \
  483. X          A/**/T5(A5,B5),A/**/T6(A6,B6),A/**/T7(A7,B7),A/**/T8(A8,B8),         \
  484. X          A/**/T9(A9,B9),A/**/TA(AA,BA),A/**/TB(AB,BB) J/**/T1(A1,B1)          \
  485. X          J/**/T2(A2,B2) J/**/T3(A3,B3) J/**/T4(A4,B4) J/**/T5(A5,B5)          \
  486. X          J/**/T6(A6,B6) J/**/T7(A7,B7) J/**/T8(A8,B8) J/**/T9(A9,B9)          \
  487. X          J/**/TA(AA,BA) J/**/TB(AB,BB));                                      \
  488. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3) W/**/T4(A4,B4) W/**/T5(A5,B5)    \
  489. X W/**/T6(A6,B6) W/**/T7(A7,B7) W/**/T8(A8,B8) W/**/T9(A9,B9) W/**/TA(AA,BA)    \
  490. X W/**/TB(AB,BB) }
  491. X
  492. X#define CCALLSFSUB16(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,     \
  493. X                          A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG)     \
  494. X{V/**/T1(A1,B1) V/**/T2(A2,B2) V/**/T3(A3,B3) V/**/T4(A4,B4) V/**/T5(A5,B5)    \
  495. X V/**/T6(A6,B6) V/**/T7(A7,B7) V/**/T8(A8,B8) V/**/T9(A9,B9) V/**/TA(AA,BA)    \
  496. X V/**/TB(AB,BB) V/**/TC(AC,BC) V/**/TD(AD,BD) V/**/TE(AE,BE) V/**/TF(AF,BF)    \
  497. X V/**/TG(AG,BG)                                                                \
  498. X C_(NAME)(A/**/T1(A1,B1),A/**/T2(A2,B2),A/**/T3(A3,B3),A/**/T4(A4,B4),         \
  499. X          A/**/T5(A5,B5),A/**/T6(A6,B6),A/**/T7(A7,B7),A/**/T8(A8,B8),         \
  500. X          A/**/T9(A9,B9),A/**/TA(AA,BA),A/**/TB(AB,BB),A/**/TC(AC,BC),         \
  501. X          A/**/TD(AD,BD),A/**/TE(AE,BE),A/**/TF(AF,BF),A/**/TG(AG,BG)          \
  502. X          J/**/T1(A1,B1) J/**/T2(A2,B2) J/**/T3(A3,B3) J/**/T4(A4,B4)          \
  503. X          J/**/T5(A5,B5) J/**/T6(A6,B6) J/**/T7(A7,B7) J/**/T8(A8,B8)          \
  504. X          J/**/T9(A9,B9) J/**/TA(AA,BA) J/**/TB(AB,BB) J/**/TC(AC,BC)          \
  505. X          J/**/TD(AD,BD) J/**/TE(AE,BE) J/**/TF(AF,BF) J/**/TG(AG,BG));        \
  506. X W/**/T1(A1,B1) W/**/T2(A2,B2) W/**/T3(A3,B3) W/**/T4(A4,B4) W/**/T5(A5,B5)    \
  507. X W/**/T6(A6,B6) W/**/T7(A7,B7) W/**/T8(A8,B8) W/**/T9(A9,B9) W/**/TA(AA,BA)    \
  508. X W/**/TB(AB,BB) W/**/TC(AC,BC) W/**/TD(AD,BD) W/**/TE(AE,BE) W/**/TF(AF,BF)    \
  509. X W/**/TG(AG,BG) }
  510. X
  511. X#define PROTOCCALLSFSUB0(NAME) void C_(NAME)();
  512. X#define PROTOCCALLSFSUB1(NAME,T1) void C_(NAME)(N/**/T1, ...);
  513. X#define PROTOCCALLSFSUB2(NAME,T1,T2) void C_(NAME)(N/**/T1,N/**/T2, ...);
  514. X#define PROTOCCALLSFSUB3(NAME,T1,T2,T3) void C_(NAME)(N/**/T1,N/**/T2,N/**/T3, \
  515. X                                                      ...);
  516. X#define PROTOCCALLSFSUB4(NAME,T1,T2,T3,T4)                                     \
  517. X                    void C_(NAME)(N/**/T1,N/**/T2,N/**/T3,N/**/T4, ...);
  518. X#define PROTOCCALLSFSUB5(NAME,T1,T2,T3,T4,T5)                                  \
  519. X                    void C_(NAME)(N/**/T1,N/**/T2,N/**/T3,N/**/T4,N/**/T5, ...);
  520. X#define PROTOCCALLSFSUB6(NAME,T1,T2,T3,T4,T5,T6)                               \
  521. X                    void C_(NAME)(N/**/T1,N/**/T2,N/**/T3,N/**/T4,N/**/T5,     \
  522. X                                  N/**/T6, ...);
  523. X#define PROTOCCALLSFSUB7(NAME,T1,T2,T3,T4,T5,T6,T7)                            \
  524. X                    void C_(NAME)(N/**/T1,N/**/T2,N/**/T3,N/**/T4,N/**/T5,     \
  525. X                                  N/**/T6,N/**/T7, ...);
  526. X#define PROTOCCALLSFSUB8(NAME,T1,T2,T3,T4,T5,T6,T7,T8)                         \
  527. X                    void C_(NAME)(N/**/T1,N/**/T2,N/**/T3,N/**/T4,N/**/T5,     \
  528. X                                  N/**/T6,N/**/T7,N/**/T8, ...);
  529. X#define PROTOCCALLSFSUB9(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9)                      \
  530. X                    void C_(NAME)(N/**/T1,N/**/T2,N/**/T3,N/**/T4,N/**/T5,     \
  531. X                                  N/**/T6,N/**/T7,N/**/T8,N/**/T9, ...);
  532. X#define PROTOCCALLSFSUB10(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA)                  \
  533. X                    void C_(NAME)(N/**/T1,N/**/T2,N/**/T3,N/**/T4,N/**/T5,     \
  534. X                                  N/**/T6,N/**/T7,N/**/T8,N/**/T9,N/**/TA, ...);
  535. X#define PROTOCCALLSFSUB11(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB)               \
  536. X                    void C_(NAME)(N/**/T1,N/**/T2,N/**/T3,N/**/T4,N/**/T5,     \
  537. X                                  N/**/T6,N/**/T7,N/**/T8,N/**/T9,N/**/TA,     \
  538. X                                  N/**/TB, ...);
  539. X#define PROTOCCALLSFSUB16(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG)\
  540. X                    void C_(NAME)(N/**/T1,N/**/T2,N/**/T3,N/**/T4,N/**/T5,     \
  541. X                                  N/**/T6,N/**/T7,N/**/T8,N/**/T9,N/**/TA,     \
  542. X                                  N/**/TB,N/**/TC,N/**/TD,N/**/TE,N/**/TF,     \
  543. X                                  N/**/TG, ...);
  544. X
  545. X/*-------------------------------------------------------------------------*/
  546. X
  547. X/*               UTILITIES FOR C TO CALL FORTRAN FUNCTIONS                 */
  548. X
  549. X/*N.B. PROTOCCALLSFFUNn(..) generates code, whether or not the FORTRAN
  550. X  function is called. Therefore, especially for creator's of C header files
  551. X  for large FORTRAN libraries which include many functions, to reduce
  552. X  compile time and object code size, it may be desirable to create
  553. X  preprocessor directives to allow users to create code for only those
  554. X  functions which they use.                                                */
  555. X
  556. X/* The following defines the maximum length string that a function can return.
  557. X   Of course it may be undefine-d and re-define-d before individual
  558. X   PROTOCCALLSFFUNn(..) as required.                                       */
  559. X#define MAX_LEN_FORTRAN_FUNCTION_STRING 0x4FE
  560. X
  561. X/* The following defines a character used by CFORTRAN to flag the end of a
  562. X   string coming out of a FORTRAN routine.                                 */
  563. X#define CFORTRAN_NON_CHAR 0x7F
  564. X
  565. X/* Define lookup tables for how to handle the various types of variables.
  566. X   Tables used by for value  returnde by - function:  U,E,G,X
  567. X                                         - arguments: U,B,D,W
  568. X   Note that W... tables are from above.                                   */
  569. X#ifdef VAXC        /* To avoid %CC-I-PARAMNOTUSED. */
  570. X#pragma nostandard
  571. X#endif
  572. X
  573. X#define UDOUBLE        double
  574. X#define UFLOAT         float
  575. X#define UINT           int
  576. X#define ULOGICAL       int
  577. X#define ULONG          long
  578. X#define UFLOATV        float  *
  579. X#define UINTV          int    *
  580. X#define UDOUBLEVV      double *
  581. X#define UFLOATVV       float  *
  582. X#define UINTVV         int    *
  583. X#define UPDOUBLE       double *
  584. X#define UPFLOAT        float  *
  585. X#define UPINT          int    *
  586. X#define UPLOGICAL      int    *
  587. X#define UPLONG         long   *
  588. X#define UPVOID         void   *
  589. X#define UPSTRUCT       void   *
  590. X#define UVOID          void   * /*Needed for FORTRAN calls to C subroutines. */
  591. X#define USTRING        char   *
  592. X#define USTRINGV       char   *
  593. X#define UPSTRING       char   *
  594. X#define UPSTRINGV      char   *
  595. X
  596. X#define EDOUBLE        double A0;
  597. X#define EFLOAT         float  A0;
  598. X#define EINT           int    A0;
  599. X#define ELOGICAL       int    A0;
  600. X#define ELONG          long   A0;
  601. X#ifdef vms
  602. X#define ESTRING        static char AA0[MAX_LEN_FORTRAN_FUNCTION_STRING+1];     \
  603. X                       static fstring A0 =                                     \
  604. X             {MAX_LEN_FORTRAN_FUNCTION_STRING,DSC$K_DTYPE_T,DSC$K_CLASS_S,AA0};\
  605. X               memset(AA0, CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING);\
  606. X                                    *(AA0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';
  607. X#else
  608. X#define ESTRING        static char A0[MAX_LEN_FORTRAN_FUNCTION_STRING+1];      \
  609. X                       memset(A0, CFORTRAN_NON_CHAR,                           \
  610. X                              MAX_LEN_FORTRAN_FUNCTION_STRING);                \
  611. X                       *(A0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';
  612. X#endif
  613. X/* ESTRING must use static char. array which is guaranteed to exist after
  614. X   function returns.                                                     */
  615. X
  616. X/* N.B.i) The diff. for 0 (Zero) and >=1 arguments.
  617. X       ii)That the folowing create a single unmatched '(' bracket, which
  618. X          must of course be matched in the call.
  619. X       iii)Commas must be handled very carefully                         */
  620. X#define GZDOUBLE(   B) A0=C_(B)(
  621. X#define GZFLOAT(    B) A0=C_(B)(
  622. X#define GZINT(      B) A0=C_(B)(
  623. X#define GZLOGICAL(  B) A0=C_(B)(
  624. X#define GZLONG(     B) A0=C_(B)(
  625. X#ifdef vms
  626. X#define GZSTRING(   B) B(&A0
  627. X#else
  628. X#define GZSTRING(   B) C_(B)(A0,MAX_LEN_FORTRAN_FUNCTION_STRING
  629. X#endif
  630. X
  631. X#define GDOUBLE(    B) A0=C_(B)(
  632. X#define GFLOAT(     B) A0=C_(B)(
  633. X#define GINT(       B) A0=C_(B)(
  634. X#define GLOGICAL(   B) A0=C_(B)(
  635. X#define GLONG(      B) A0=C_(B)(
  636. X#define GSTRING(    B) GZSTRING(B),
  637. X
  638. X#define BDOUBLE(    A) (double)   A
  639. X#define BFLOAT(     A) (float)    A
  640. X#define BINT(       A) (int)      A    /* typecast for enum's sake */
  641. X#define BLOGICAL(   A) (int)      A
  642. X#define BLONG(      A) (long)     A
  643. X#define BSTRING(    A) (char *)   A
  644. X#define BFLOATV(    A)            A
  645. X#define BINTV(      A)            A
  646. X#define BSTRINGV(   A) (char *)   A
  647. X#define BFLOATVV(   A)           (A)[0]
  648. X#define BINTVV(     A)           (A)[0]
  649. X#define BPDOUBLE(   A)           &A
  650. X#define BPFLOAT(    A)           &A
  651. X#define BPINT(      A)           &A /*no longer typecast for enum*/
  652. X#define BPLOGICAL(  A)           &A
  653. X#define BPLONG(     A)           &A
  654. X#define BPSTRING(   A) (char *)   A
  655. X#define BPSTRINGV(  A) (char *)   A
  656. X#define BPVOID(     A) (void *)   A
  657. X#define BPSTRUCT(   A) (void *)  &A
  658. X
  659. X#define SDOUBLE(    A)
  660. X#define SFLOAT(     A)
  661. X#define SINT(       A)
  662. X#define SLOGICAL(   A)
  663. X#define SLONG(      A)
  664. X#define SSTRING(    A) ,sizeof(A)
  665. X#define SFLOATV(    A)
  666. X#define SINTV(      A)
  667. X#define SSTRINGV(   A) ,( (unsigned)0xFFFF*firstindexlength(A)                 \
  668. X                         +secondindexlength(A))
  669. X#define SFLOATVV(   A)
  670. X#define SINTVV(     A)
  671. X#define SPDOUBLE(   A)
  672. X#define SPFLOAT(    A)
  673. X#define SPINT(      A)
  674. X#define SPLOGICAL(  A)
  675. X#define SPLONG(     A)
  676. X#define SPSTRING(   A) ,sizeof(A)
  677. X#define SPSTRINGV      SSTRINGV
  678. X#define SPVOID(     A)
  679. X#define SPSTRUCT(   A)
  680. X
  681. X#define HDOUBLE(    A)
  682. X#define HFLOAT(     A)
  683. X#define HINT(       A)
  684. X#define HLOGICAL(   A)
  685. X#define HLONG(      A)
  686. X#define HSTRING(    A) ,unsigned A
  687. X#define HFLOATV(    A)
  688. X#define HINTV(      A)
  689. X#define HSTRINGV(   A) ,unsigned A
  690. X#define HFLOATVV(   A)
  691. X#define HINTVV(     A)
  692. X#define HPDOUBLE(   A)
  693. X#define HPFLOAT(    A)
  694. X#define HPINT(      A)
  695. X#define HPLOGICAL(  A)
  696. X#define HPLONG(     A)
  697. X#define HPSTRING(   A) ,unsigned A
  698. X#define HPSTRINGV(  A) ,unsigned A
  699. X#define HPVOID(     A)
  700. X#define HPSTRUCT(   A)
  701. X
  702. X#define CCF(TN,I)        C/**/TN(A/**/I,B/**/I,C/**/I)
  703. X#define CDOUBLE(  A,B,C) &A
  704. X#define CFLOAT(   A,B,C) &A
  705. X#define CINT(     A,B,C) &A
  706. X#define CLOGICAL( A,B,C) &A
  707. X#define CLONG(    A,B,C) &A
  708. X#define CFLOATV(  A,B,C)  A
  709. X#define CINTV(    A,B,C)  A
  710. X#define CFLOATVV( A,B,C)  A
  711. X#define CINTVV(   A,B,C)  A
  712. X#define CPDOUBLE( A,B,C)  A
  713. X#define CPFLOAT(  A,B,C)  A
  714. X#define CPINT(    A,B,C)  A         /* typecast for enum's sake */
  715. X#define CPLOGICAL(A,B,C)  A
  716. X#define CPLONG(   A,B,C)  A
  717. X#define CPVOID(   A,B,C)  A
  718. X#define CPSTRUCT( A,B,C)  A
  719. X#ifdef vms
  720. X#define CSTRING(  A,B,C) (B.clen=strlen(A),B.f.dsc$a_pointer=A,                \
  721. X                    C==sizeof(char*)||C==B.clen+1?B.f.dsc$w_length=B.clen,&B.f:\
  722. X          (memset((A)+B.clen,' ',C-B.clen-1),A[B.f.dsc$w_length=C-1]='\0',&B.f))
  723. X#define CSTRINGV( A,B,C) (                                                     \
  724. X          initfstr(B, malloc((C/0xFFFF)*(C%0xFFFF-1)), C/0xFFFF, C%0xFFFF-1),  \
  725. X          c2fstrv(A,B.dsc$a_pointer,C%0xFFFF,(C/0xFFFF)*(C%0xFFFF))         ,&B)
  726. X#define CPSTRING( A,B,C) (B.dsc$w_length=strlen(A),B.dsc$a_pointer=A,          \
  727. X        C==sizeof(char*)?&B:(memset((A)+B.dsc$w_length,' ',C-B.dsc$w_length-1),\
  728. X                             A[B.dsc$w_length=C-1]='\0',&B))
  729. X#define CPSTRINGV(A,B,C)  (initfstr(B, A, C/0xFFFF, C%0xFFFF-1),               \
  730. X                           c2fstrv(A,A,C%0xFFFF,(C/0xFFFF)*(C%0xFFFF)) ,&B)
  731. X#else
  732. X#define CSTRING(  A,B,C) (B.clen=strlen(A),                                    \
  733. X                          C==sizeof(char*)||C==B.clen+1?B.flen=B.clen,(A):     \
  734. X                     (memset((A)+B.clen,' ',C-B.clen-1),A[B.flen=C-1]='\0',(A)))
  735. X#define CSTRINGV( A,B,C) (B.s=malloc((C/0xFFFF)*(C%0xFFFF-1)),                 \
  736. X                     c2fstrv(A,B.s,(B.flen=C%0xFFFF-1)+1,(C/0xFFFF)*(C%0xFFFF)))
  737. X#define CPSTRING( A,B,C) (B=strlen(A), C==sizeof(char*)?(A):                   \
  738. X                          (memset((A)+B,' ',C-B-1),A[B=C-1]='\0',(A)))
  739. X#define CPSTRINGV(A,B,C) c2fstrv(A,A,(B.flen=C%0xFFFF-1)+1,                    \
  740. X                                 B.sizeofA=(C/0xFFFF)*(C%0xFFFF))
  741. X#endif
  742. X
  743. X#define XDOUBLE        return A0;
  744. X#define XFLOAT         return A0;
  745. X#define XINT           return A0;
  746. X#define XLOGICAL       return A0;
  747. X#define XLONG          return A0;
  748. X#ifdef vms
  749. X#define XSTRING        return kill_trailing(                                   \
  750. X                                      kill_trailing(AA0,CFORTRAN_NON_CHAR),' ');
  751. X#else
  752. X#define XSTRING        return kill_trailing(                                   \
  753. X                                      kill_trailing( A0,CFORTRAN_NON_CHAR),' ');
  754. X#endif
  755. X
  756. X#ifdef VAXC        /* Have avoided %CC-I-PARAMNOTUSED. */
  757. X#pragma standard
  758. X#endif
  759. X
  760. X#define CFFUN(NAME) __cf__/**/NAME
  761. X
  762. X#define CCALLSFFUN0(NAME) CFFUN(NAME)()
  763. X
  764. X#define CCALLSFFUN1(NAME,T1,A1) CFFUN(NAME)(B/**/T1(A1) S/**/T1(A1))
  765. X
  766. X#define CCALLSFFUN2(NAME,T1,T2,A1,A2) CFFUN(NAME)(B/**/T1(A1),B/**/T2(A2)      \
  767. X                                                  S/**/T1(A1) S/**/T2(A2))
  768. X
  769. X#define CCALLSFFUN3(NAME,T1,T2,T3,A1,A2,A3)                                    \
  770. XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3)                                \
  771. X            S/**/T1(A1) S/**/T2(A2) S/**/T3(A3))
  772. X
  773. X#define CCALLSFFUN4(NAME,T1,T2,T3,T4,A1,A2,A3,A4)                              \
  774. XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4)                    \
  775. X            S/**/T1(A1) S/**/T2(A2) S/**/T3(A3) S/**/T4(A4))
  776. X
  777. X#define CCALLSFFUN5(NAME,T1,T2,T3,T4,T5,A1,A2,A3,A4,A5)                        \
  778. XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5)        \
  779. X            S/**/T1(A1) S/**/T2(A2) S/**/T3(A3) S/**/T4(A4) S/**/T5(A5))
  780. X
  781. X#define CCALLSFFUN6(NAME,T1,T2,T3,T4,T5,T6,A1,A2,A3,A4,A5,A6)                  \
  782. XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5)        \
  783. X            B/**/T6(A6)                                                        \
  784. XS/**/T1(A1) S/**/T2(A2) S/**/T3(A3) S/**/T4(A4) S/**/T5(A5) S/**/T6(A6))
  785. X
  786. X#define CCALLSFFUN7(NAME,T1,T2,T3,T4,T5,T6,T7,A1,A2,A3,A4,A5,A6,A7)            \
  787. XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5)        \
  788. X            B/**/T6(A6),B/**/T7(A7) S/**/T1(A1) S/**/T2(A2) S/**/T3(A3)        \
  789. X            S/**/T4(A4) S/**/T5(A5) S/**/T6(A6) S/**/T7(A7))
  790. X
  791. X#define CCALLSFFUN8(NAME,T1,T2,T3,T4,T5,T6,T7,T8,A1,A2,A3,A4,A5,A6,A7,A8)      \
  792. XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5)        \
  793. X            B/**/T6(A6),B/**/T7(A7),B/**/T8(A8) S/**/T1(A1) S/**/T2(A2)        \
  794. X            S/**/T3(A3) S/**/T4(A4) S/**/T5(A5) S/**/T6(A6) S/**/T7(A7)        \
  795. X            S/**/T8(A8))
  796. X
  797. X#define CCALLSFFUN9(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\
  798. XCFFUN(NAME)(B/**/T1(A1),B/**/T2(A2),B/**/T3(A3),B/**/T4(A4),B/**/T5(A5)        \
  799. X            B/**/T6(A6),B/**/T7(A7),B/**/T8(A8),B/**/T9(A9) S/**/T1(A1)        \
  800. X            S/**/T2(A2) S/**/T3(A3) S/**/T4(A4) S/**/T5(A5) S/**/T6(A6)        \
  801. X            S/**/T7(A7) S/**/T8(A8) S/**/T9(A9))
  802. X
  803. X/*  N.B. Create a separate function instead of using (call function, function
  804. Xvalue here) because in order to create the variables needed for the input
  805. Xarg.'s which may be const.'s one has to do the creation within {}, but these
  806. Xcan never be placed within ()'s. Therefore one must create wrapper functions.
  807. Xgcc, on the other hand may be able to avoid the wrapper functions. */
  808. X
  809. X#define PROTOCCALLSFFUN0(F,NAME)                                               \
  810. XU/**/F NAME(); /* This is needed to correctly handle the value returned        \
  811. XN.B. Can only have prototype arg.'s with difficulty, a la G... table since     \
  812. XFORTRAN functions returning strings have extra arg.'s. Don't bother, since     \
  813. Xthis only causes a compiler warning to come up when one uses FCALLSCFUNn and   \
  814. XCCALLSFFUNn for the same function in the same source code. Something done by   \
  815. Xthe experts in tests only.*/                                                   \
  816. Xstatic U/**/F CFFUN(NAME)() {E/**/F  GZ/**/F(NAME)); X/**/F}
  817. X
  818. X#define PROTOCCALLSFFUN1(F,NAME,T1)                                            \
  819. XU/**/F C_(NAME)();                                                             \
  820. Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1 H/**/T1(C1))                              \
  821. X{VCF(T1,1) E/**/F G/**/F(NAME)CCF(T1,1) JCF(T1,1)); WCF(T1,1) X/**/F}
  822. X
  823. X#define PROTOCCALLSFFUN2(F,NAME,T1,T2)                                         \
  824. XU/**/F C_(NAME)();                                                             \
  825. Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2 H/**/T1(C1) H/**/T2(C2))       \
  826. X{VCF(T1,1) VCF(T2,2) E/**/F G/**/F(NAME)CCF(T1,1),CCF(T2,2)                    \
  827. X JCF(T1,1) JCF(T2,2)); WCF(T1,1) WCF(T2,2) X/**/F}
  828. X
  829. X#define PROTOCCALLSFFUN3(F,NAME,T1,T2,T3)                                      \
  830. XU/**/F C_(NAME)();                                                             \
  831. Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3                     \
  832. X                          H/**/T1(C1) H/**/T2(C2) H/**/T3(C3))                 \
  833. X{VCF(T1,1) VCF(T2,2) VCF(T3,3) E/**/F                                          \
  834. X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3) JCF(T1,1) JCF(T2,2) JCF(T3,3));     \
  835. X WCF(T1,1) WCF(T2,2) WCF(T3,3) X/**/F}
  836. X
  837. X#define PROTOCCALLSFFUN4(F,NAME,T1,T2,T3,T4)                                   \
  838. XU/**/F C_(NAME)();                                                             \
  839. Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4          \
  840. X                          H/**/T1(C1) H/**/T2(C2) H/**/T3(C3) H/**/T4(C4))     \
  841. X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) E/**/F                                \
  842. X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4) JCF(T1,1) JCF(T2,2)       \
  843. X JCF(T3,3) JCF(T4,4)); WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) X/**/F}
  844. X
  845. X#define PROTOCCALLSFFUN5(F,NAME,T1,T2,T3,T4,T5)                                \
  846. XU/**/F C_(NAME)();                                                             \
  847. Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4,         \
  848. X   U/**/T5 A5 H/**/T1(C1) H/**/T2(C2) H/**/T3(C3) H/**/T4(C4) H/**/T5(C5))     \
  849. X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) VCF(T5,5) E/**/F                      \
  850. X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4),CCF(T5,5)                 \
  851. X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5));                           \
  852. X WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5) X/**/F}
  853. X
  854. X#define PROTOCCALLSFFUN6(F,NAME,T1,T2,T3,T4,T5,T6)                             \
  855. XU/**/F C_(NAME)();                                                             \
  856. Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4,         \
  857. X                          U/**/T5 A5,U/**/T6 A6 H/**/T1(C1) H/**/T2(C2)        \
  858. X                        H/**/T3(C3) H/**/T4(C4) H/**/T5(C5) H/**/T6(C6))       \
  859. X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) VCF(T5,5) VCF(T6,6) E/**/F            \
  860. X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4),CCF(T5,5),CCF(T6,6)       \
  861. X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5) JCF(T6,6));                 \
  862. X WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5) WCF(T6,6) X/**/F}
  863. X
  864. X#define PROTOCCALLSFFUN7(F,NAME,T1,T2,T3,T4,T5,T6,T7)                          \
  865. XU/**/F C_(NAME)();                                                             \
  866. Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4,         \
  867. X                          U/**/T5 A5,U/**/T6 A6,U/**/T7 A7 H/**/T1(C1)         \
  868. X  H/**/T2(C2) H/**/T3(C3) H/**/T4(C4) H/**/T5(C5) H/**/T6(C6) H/**/T7(C7))     \
  869. X{VCF(T1,1) VCF(T2,2) VCF(T3,3) VCF(T4,4) VCF(T5,5) VCF(T6,6) VCF(T7,7) E/**/F  \
  870. X G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4),CCF(T5,5),CCF(T6,6),      \
  871. X             CCF(T7,7)                                                         \
  872. X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5) JCF(T6,6) JCF(T7,7));       \
  873. X WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5) WCF(T6,6) WCF(T7,7) X/**/F}
  874. X
  875. X#define PROTOCCALLSFFUN8(F,NAME,T1,T2,T3,T4,T5,T6,T7,T8)                       \
  876. XU/**/F C_(NAME)();                                                             \
  877. Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4,         \
  878. X    U/**/T5 A5,U/**/T6 A6,U/**/T7 A7,U/**/T8 A8 H/**/T1(C1) H/**/T2(C2)        \
  879. X  H/**/T3(C3) H/**/T4(C4) H/**/T5(C5) H/**/T6(C6) H/**/T7(C7) H/**/T8(C8))     \
  880. 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)\
  881. X E/**/F  G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4),CCF(T5,5),        \
  882. X                     CCF(T6,6),CCF(T7,7),CCF(T8,8)                             \
  883. X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5) JCF(T6,6) JCF(T7,7)         \
  884. X JCF(T8,8)); WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5)                 \
  885. X                       WCF(T6,6) WCF(T7,7) WCF(T8,8) X/**/F}
  886. X
  887. X#define PROTOCCALLSFFUN9(F,NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9)                    \
  888. XU/**/F C_(NAME)();                                                             \
  889. Xstatic U/**/F CFFUN(NAME)(U/**/T1 A1,U/**/T2 A2,U/**/T3 A3,U/**/T4 A4,         \
  890. X    U/**/T5 A5,U/**/T6 A6,U/**/T7 A7,U/**/T8 A8,U/**/T9 A9                     \
  891. X  H/**/T1(C1) H/**/T2(C2) H/**/T3(C3) H/**/T4(C4) H/**/T5(C5) H/**/T6(C6)      \
  892. X  H/**/T7(C7) H/**/T8(C8) H/**/T9(C9))                                         \
  893. 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)\
  894. X VCF(T9,9) E/**/F  G/**/F(NAME)CCF(T1,1),CCF(T2,2),CCF(T3,3),CCF(T4,4),        \
  895. X                     CCF(T5,5),CCF(T6,6),CCF(T7,7),CCF(T8,8),CCF(T9,9)         \
  896. X JCF(T1,1) JCF(T2,2) JCF(T3,3) JCF(T4,4) JCF(T5,5) JCF(T6,6) JCF(T7,7)         \
  897. X JCF(T8,8) JCF(T9,9)); WCF(T1,1) WCF(T2,2) WCF(T3,3) WCF(T4,4) WCF(T5,5)       \
  898. X                       WCF(T6,6) WCF(T7,7) WCF(T8,8) WCF(T9,9) X/**/F}
  899. X
  900. X/*-------------------------------------------------------------------------*/
  901. X
  902. X/*               UTILITIES FOR FORTRAN TO CALL C ROUTINES                  */
  903. X
  904. X#ifdef VAXC        /* To avoid %CC-I-PARAMNOTUSED. */
  905. X#pragma nostandard
  906. X#endif
  907. X
  908. X#define DDOUBLE(    A)
  909. X#define DFLOAT(     A)
  910. X#define DINT(       A)
  911. X#define DLOGICAL(   A)
  912. X#define DLONG(      A)
  913. X#define DDOUBLEV(   A)
  914. X#define DFLOATV(    A)
  915. X#define DINTV(      A)
  916. X#define DDOUBLEVV(  A)
  917. X#define DFLOATVV(   A)
  918. X#define DINTVV(     A)
  919. X#define DPDOUBLE(   A)
  920. X#define DPFLOAT(    A)
  921. X#define DPINT(      A)
  922. X#define DPLOGICAL(  A)
  923. X#define DPLONG(     A)
  924. X#define DPVOID(     A)
  925. X#ifdef vms
  926. X#define DSTRING(    A)
  927. X#else
  928. X#define DSTRING(    A) ,unsigned A
  929. X#endif
  930. X#define DSTRINGV       DSTRING
  931. X#define DPSTRING       DSTRING
  932. X#define DPSTRINGV      DSTRING
  933. X
  934. X#define QDOUBLE(    A)
  935. X#define QFLOAT(     A)
  936. X#define QINT(       A)
  937. X#define QLOGICAL(   A)
  938. X#define QLONG(      A)
  939. X#define QDOUBLEV(   A)
  940. X#define QFLOATV(    A)
  941. X#define QINTV(      A)
  942. X#define QDOUBLEVV(  A)
  943. X#define QFLOATVV(   A)
  944. X#define QINTVV(     A)
  945. X#define QPDOUBLE(   A)
  946. X#define QPFLOAT(    A)
  947. X#define QPINT(      A)
  948. X#define QPLOGICAL(  A)
  949. X#define QPLONG(     A)
  950. X#define QPVOID(     A)
  951. X#ifdef vms
  952. X#define QSTRINGV(   A) char *A;
  953. X#else
  954. X#define QSTRINGV(   A) char *A; unsigned int A/**/N;
  955. X#endif
  956. X#define QSTRING(    A) char *A;
  957. X#define QPSTRING(   A) char *A;
  958. X#define QPSTRINGV      QSTRINGV
  959. X
  960. X#define TCF(NAME,TN,I)     T/**/TN(NAME,A/**/I,B/**/I,D/**/I)
  961. X#define TDOUBLE(  M,A,B,D) *A
  962. X#define TFLOAT(   M,A,B,D) *A
  963. X#define TINT(     M,A,B,D) *A
  964. X#define TLOGICAL( M,A,B,D) *A
  965. X#define TLONG(    M,A,B,D) *A
  966. X#define TDOUBLEV( M,A,B,D)  A
  967. X#define TFLOATV(  M,A,B,D)  A
  968. X#define TINTV(    M,A,B,D)  A
  969. X#define TDOUBLEVV(M,A,B,D)  A
  970. X#define TFLOATVV( M,A,B,D)  A
  971. X#define TINTVV(   M,A,B,D)  A
  972. X#define TPDOUBLE( M,A,B,D)  A
  973. X#define TPFLOAT(  M,A,B,D)  A
  974. X#define TPINT(    M,A,B,D)  A
  975. X#define TPLOGICAL(M,A,B,D)  A
  976. X#define TPLONG(   M,A,B,D)  A
  977. X#define TPVOID(   M,A,B,D)  A
  978. X#ifdef vms
  979. X#define TSTRING(  M,A,B,D)((B=malloc(A->dsc$w_length+1))[A->dsc$w_length]='\0',\
  980. X kill_trailing(memcpy(B,A->dsc$a_pointer,A->dsc$w_length),' '))
  981. X#define TSTRINGV( M,A,B,D)                                                     \
  982. X (B=malloc((A->dsc$w_length+1)*A->dsc$l_m[0]), (void *)F2CSTRVCOPY(B,A))
  983. X#else
  984. X#define TSTRING(  M,A,B,D) (memcpy(B=malloc(D+1),A,D),B[D]='\0',               \
  985. X                                                     kill_trailing(B,' '))
  986. X#define TSTRINGV( M,A,B,D) (B/**/N=num_elem(A,D,M/**/_STRV_/**/A),             \
  987. X     (void *)vkill_trailing(f2cstrv(A,B=malloc(B/**/N*(D+1)),D+1,B/**/N*(D+1)),\
  988. X                            D+1,B/**/N*(D+1),' '))
  989. X#endif
  990. X#define TPSTRING            TSTRING
  991. X#define TPSTRINGV           TSTRINGV
  992. X
  993. X#define RCF(TN,I)           R/**/TN(A/**/I,B/**/I,D/**/I)
  994. X#define RDOUBLE(  A,B,D)
  995. X#define RFLOAT(   A,B,D)
  996. X#define RINT(     A,B,D)
  997. X#define RLOGICAL( A,B,D)
  998. X#define RLONG(    A,B,D)
  999. X#define RDOUBLEV( A,B,D)
  1000. X#define RFLOATV(  A,B,D)
  1001. X#define RINTV(    A,B,D)
  1002. X#define RDOUBLEVV(A,B,D)
  1003. X#define RFLOATVV( A,B,D)
  1004. X#define RINTVV(   A,B,D)
  1005. X#define RPDOUBLE( A,B,D)
  1006. X#define RPFLOAT(  A,B,D)
  1007. X#define RPINT(    A,B,D)
  1008. X#define RPLOGICAL(A,B,D)
  1009. X#define RPLONG(   A,B,D)
  1010. X#define RPVOID(   A,B,D)
  1011. X#define RSTRING(  A,B,D)    free(B);
  1012. X#define RSTRINGV( A,B,D)    free(B);
  1013. X#ifdef vms
  1014. X#define RPSTRING( A,B,D)                                                       \
  1015. X memcpy(A->dsc$a_pointer,B,MIN(strlen(B),A->dsc$w_length)),                    \
  1016. X (A->dsc$w_length>strlen(B)?                                                   \
  1017. X   memset(A->dsc$a_pointer+strlen(B),' ', A->dsc$w_length-strlen(B)):0),free(B);
  1018. X#define RPSTRINGV(A,B,D) C2FSTRVCOPY(B,A), free(B);
  1019. X#else
  1020. X#define RPSTRING( A,B,D)   memcpy(A,B,MIN(strlen(B),D)),                       \
  1021. X                  (D>strlen(B)?memset(A+strlen(B),' ', D-strlen(B)):0), free(B);
  1022. X#define RPSTRINGV(A,B,D) c2fstrv(B,A,D+1,(D+1)*B/**/N), free(B);
  1023. X#endif
  1024. X
  1025. X#define FZDOUBLE(   A) double  fcallsc(A)(
  1026. X#define FZFLOAT(    A) float   fcallsc(A)(
  1027. X#define FZINT(      A) int     fcallsc(A)(
  1028. X#define FZLOGICAL(  A) int     fcallsc(A)(
  1029. X#define FZLONG(     A) long    fcallsc(A)(
  1030. X#define FZVOID(     A) void    fcallsc(A)(
  1031. X#ifdef vms
  1032. X#define FZSTRING(   A) void    fcallsc(A)(fstring *AS
  1033. X#else
  1034. X#define FZSTRING(   A) void    fcallsc(A)(char *AS, unsigned D0
  1035. X#endif
  1036. X
  1037. X#define FDOUBLE(    A) double  fcallsc(A)(
  1038. X#define FFLOAT(     A) float   fcallsc(A)(
  1039. X#define FINT(       A) int     fcallsc(A)(
  1040. X#define FLOGICAL(   A) int     fcallsc(A)(
  1041. X#define FLONG(      A) long    fcallsc(A)(
  1042. X#define FVOID(      A) void    fcallsc(A)(
  1043. X#define FSTRING(    A) FZSTRING(A),
  1044. X
  1045. X#define LDOUBLE( NAME) A0=ccallsc(NAME)
  1046. X#define LFLOAT(  NAME) A0=ccallsc(NAME)
  1047. X#define LINT(    NAME) A0=ccallsc(NAME)
  1048. X#define LLOGICAL(NAME) A0=ccallsc(NAME)
  1049. X#define LLONG(   NAME) A0=ccallsc(NAME)
  1050. X#define LSTRING( NAME) A0=ccallsc(NAME)
  1051. X#define LVOID(   NAME)    ccallsc(NAME)
  1052. X
  1053. X#define KDOUBLE
  1054. X#define KFLOAT
  1055. X#define KINT
  1056. X#define KLOGICAL
  1057. X#define KLONG
  1058. X#define KVOID
  1059. X/* KSTRING copies the string into the position provided by the caller. */
  1060. X#ifdef vms
  1061. X#define KSTRING                                                                \
  1062. X memcpy(AS->dsc$a_pointer,A0, MIN(AS->dsc$w_length,(A0==NULL?0:strlen(A0))) ); \
  1063. X AS->dsc$w_length>(A0==NULL?0:strlen(A0))?                                     \
  1064. X  memset(AS->dsc$a_pointer+(A0==NULL?0:strlen(A0)),' ',                        \
  1065. X         AS->dsc$w_length-(A0==NULL?0:strlen(A0))):0;
  1066. X#else
  1067. X#define KSTRING  memcpy(AS,A0, MIN(D0,(A0==NULL?0:strlen(A0))) );              \
  1068. X                 D0>(A0==NULL?0:strlen(A0))?memset(AS+(A0==NULL?0:strlen(A0)), \
  1069. X                                            ' ', D0-(A0==NULL?0:strlen(A0))):0;
  1070. X#endif
  1071. X
  1072. X/* Note that K.. and I.. can't be combined since K.. has to access data before
  1073. XR.., in order for functions returning strings which are also passed in as
  1074. Xarguments to work correctly. Note that R.. frees and hence may corrupt the
  1075. Xstring. */
  1076. X#define IDOUBLE        return  A0;
  1077. X#define IFLOAT         return  A0;
  1078. X#define IINT           return  A0;
  1079. X#define ILOGICAL       return  A0;
  1080. X#define ILONG          return  A0;
  1081. X#define ISTRING        return    ;
  1082. X#define IVOID          return    ;
  1083. X
  1084. X#ifdef VAXC        /* Have avoided %CC-I-PARAMNOTUSED. */
  1085. X#pragma standard
  1086. X#endif
  1087. X
  1088. X#define FCALLSCSUB0(NAME)                FCALLSCFUN0(VOID,NAME)
  1089. X#define FCALLSCSUB1(NAME,T1)             FCALLSCFUN1(VOID,NAME,T1)
  1090. X#define FCALLSCSUB2(NAME,T1,T2)          FCALLSCFUN2(VOID,NAME,T1,T2)
  1091. X#define FCALLSCSUB3(NAME,T1,T2,T3)       FCALLSCFUN3(VOID,NAME,T1,T2,T3)
  1092. X#define FCALLSCSUB4(NAME,T1,T2,T3,T4)    FCALLSCFUN4(VOID,NAME,T1,T2,T3,T4)
  1093. X#define FCALLSCSUB5(NAME,T1,T2,T3,T4,T5) FCALLSCFUN5(VOID,NAME,T1,T2,T3,T4,T5)
  1094. X#define FCALLSCSUB6(NAME,T1,T2,T3,T4,T5,T6)                                    \
  1095. X                               FCALLSCFUN6(VOID,NAME,T1,T2,T3,T4,T5,T6)
  1096. X#define FCALLSCSUB7(NAME,T1,T2,T3,T4,T5,T6,T7)                                 \
  1097. X                               FCALLSCFUN7(VOID,NAME,T1,T2,T3,T4,T5,T6,T7)
  1098. X#define FCALLSCSUB8(NAME,T1,T2,T3,T4,T5,T6,T7,T8)                              \
  1099. X                               FCALLSCFUN8(VOID,NAME,T1,T2,T3,T4,T5,T6,T7,T8)
  1100. X#define FCALLSCSUB9(NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9)                           \
  1101. X                               FCALLSCFUN9(VOID,NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9)
  1102. X
  1103. X#define FCALLSCFUN0(T0,NAME)                                                   \
  1104. XFZ/**/T0(NAME)) {U/**/T0 A0; L/**/T0(NAME)(); K/**/T0 I/**/T0}
  1105. X
  1106. X#define FCALLSCFUN1(T0,NAME,T1)                                                \
  1107. XF/**/T0(NAME)N/**/T1 A1 D/**/T1(D1)) {U/**/T0 A0; Q/**/T1(B1)                  \
  1108. X L/**/T0(NAME)(TCF(NAME,T1,1)); K/**/T0 RCF(T1,1) I/**/T0}
  1109. X
  1110. X#define FCALLSCFUN2(T0,NAME,T1,T2)                                             \
  1111. XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2 D/**/T1(D1) D/**/T2(D2))                    \
  1112. X{U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2)                                           \
  1113. X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2));K/**/T0 RCF(T1,1)RCF(T2,2)I/**/T0}
  1114. X
  1115. X#define FCALLSCFUN3(T0,NAME,T1,T2,T3)                                          \
  1116. XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3 D/**/T1(D1) D/**/T2(D2)          \
  1117. X D/**/T3(D3)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3)                 \
  1118. X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),TCF(NAME,T3,3));                  \
  1119. X K/**/T0 RCF(T1,1) RCF(T2,2) RCF(T3,3) I/**/T0}
  1120. X
  1121. X#define FCALLSCFUN4(T0,NAME,T1,T2,T3,T4)                                       \
  1122. XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4 D/**/T1(D1)           \
  1123. X D/**/T2(D2) D/**/T3(D3) D/**/T4(D4)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2)     \
  1124. X Q/**/T3(B3) Q/**/T4(B4) L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),          \
  1125. X TCF(NAME,T3,3),TCF(NAME,T4,4)); K/**/T0 RCF(T1,1)RCF(T2,2) RCF(T3,3) RCF(T4,4)\
  1126. X I/**/T0}
  1127. X
  1128. X#define FCALLSCFUN5(T0,NAME,T1,T2,T3,T4,T5)                                    \
  1129. XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5            \
  1130. X D/**/T1(D1) D/**/T2(D2) D/**/T3(D3) D/**/T4(D4) D/**/T5(D5)) {U/**/T0 A0;     \
  1131. X Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3) Q/**/T4(B4) Q/**/T5(B5)                   \
  1132. X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),TCF(NAME,T3,3),TCF(NAME,T4,4),    \
  1133. X TCF(NAME,T5,5)); K/**/T0 RCF(T1,1)RCF(T2,2)RCF(T3,3)RCF(T4,4)RCF(T5,5) I/**/T0}
  1134. X
  1135. X#define FCALLSCFUN6(T0,NAME,T1,T2,T3,T4,T5,T6)                                 \
  1136. XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5,           \
  1137. X N/**/T6 A6 D/**/T1(D1) D/**/T2(D2) D/**/T3(D3) D/**/T4(D4) D/**/T5(D5)        \
  1138. X D/**/T6(D6)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3) Q/**/T4(B4)     \
  1139. X Q/**/T5(B5) Q/**/T6(B6) L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),          \
  1140. X TCF(NAME,T3,3),TCF(NAME,T4,4),TCF(NAME,T5,5),TCF(NAME,T6,6)); K/**/T0         \
  1141. X RCF(T1,1) RCF(T2,2) RCF(T3,3) RCF(T4,4) RCF(T5,5) RCF(T6,6) I/**/T0}
  1142. X
  1143. X#define FCALLSCFUN7(T0,NAME,T1,T2,T3,T4,T5,T6,T7)                              \
  1144. XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5,           \
  1145. X N/**/T6 A6 N/**/T7 A7 D/**/T1(D1) D/**/T2(D2) D/**/T3(D3) D/**/T4(D4)         \
  1146. X D/**/T5(D5) D/**/T6(D6) D/**/T7(D7)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2)     \
  1147. X Q/**/T3(B3) Q/**/T4(B4) Q/**/T5(B5) Q/**/T6(B6) Q/**/T7(B7)                   \
  1148. X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),TCF(NAME,T3,3),TCF(NAME,T4,4),    \
  1149. X TCF(NAME,T5,5),TCF(NAME,T6,6),TCF(NAME,T7,7)); K/**/T0                        \
  1150. X RCF(T1,1) RCF(T2,2) RCF(T3,3) RCF(T4,4) RCF(T5,5) RCF(T6,6) RCF(T7,7) I/**/T0}
  1151. X
  1152. X#define FCALLSCFUN8(T0,NAME,T1,T2,T3,T4,T5,T6,T7,T8)                           \
  1153. XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5,           \
  1154. X N/**/T6 A6 N/**/T7 A7 N/**/T8 A8 D/**/T1(D1) D/**/T2(D2) D/**/T3(D3)          \
  1155. X D/**/T4(D4) D/**/T5(D5) D/**/T6(D6) D/**/T7(D7) D/**/T8(D8)) {U/**/T0 A0;     \
  1156. X Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3) Q/**/T4(B4) Q/**/T5(B5) Q/**/T6(B6)       \
  1157. X Q/**/T7(B7) Q/**/T8(B8) L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),          \
  1158. X TCF(NAME,T3,3),TCF(NAME,T4,4),TCF(NAME,T5,5),TCF(NAME,T6,6),TCF(NAME,T7,7),   \
  1159. X TCF(NAME,T8,8)); K/**/T0 RCF(T1,1) RCF(T2,2) RCF(T3,3) RCF(T4,4) RCF(T5,5)    \
  1160. X RCF(T6,6) RCF(T7,7) RCF(T8,8) I/**/T0}
  1161. X
  1162. X#define FCALLSCFUN9(T0,NAME,T1,T2,T3,T4,T5,T6,T7,T8,T9)                        \
  1163. XF/**/T0(NAME)N/**/T1 A1,N/**/T2 A2,N/**/T3 A3,N/**/T4 A4,N/**/T5 A5,           \
  1164. X N/**/T6 A6 N/**/T7 A7 N/**/T8 A8 N/**/T9 A9 D/**/T1(D1) D/**/T2(D2)           \
  1165. X D/**/T3(D3) D/**/T4(D4) D/**/T5(D5) D/**/T6(D6) D/**/T7(D7) D/**/T8(D8)       \
  1166. X D/**/T8(D8) D/**/T9(D9)) {U/**/T0 A0; Q/**/T1(B1) Q/**/T2(B2) Q/**/T3(B3)     \
  1167. X Q/**/T4(B4) Q/**/T5(B5) Q/**/T6(B6) Q/**/T7(B7) Q/**/T8(B8) Q/**/T9(B9)       \
  1168. X L/**/T0(NAME)(TCF(NAME,T1,1),TCF(NAME,T2,2),TCF(NAME,T3,3),TCF(NAME,T4,4),    \
  1169. X TCF(NAME,T5,5),TCF(NAME,T6,6),TCF(NAME,T7,7),TCF(NAME,T8,8),TCF(NAME,T9,9));  \
  1170. X K/**/T0 RCF(T1,1) RCF(T2,2) RCF(T3,3) RCF(T4,4) RCF(T5,5)                     \
  1171. X RCF(T6,6) RCF(T7,7) RCF(T8,8) RCF(T9,9) I/**/T0}
  1172. X
  1173. X
  1174. X#endif                                  /* __CFORTRAN_LOADED */
  1175. X#endif                                  /* This is VMS, Mips or IBMR2.      */
  1176. END_OF_FILE
  1177.   if test 54924 -ne `wc -c <'cfortran.h'`; then
  1178.     echo shar: \"'cfortran.h'\" unpacked with wrong size!
  1179.   fi
  1180.   # end of 'cfortran.h'
  1181. fi
  1182. echo shar: End of archive 2 \(of 2\).
  1183. cp /dev/null ark2isdone
  1184. MISSING=""
  1185. for I in 1 2 ; do
  1186.     if test ! -f ark${I}isdone ; then
  1187.     MISSING="${MISSING} ${I}"
  1188.     fi
  1189. done
  1190. if test "${MISSING}" = "" ; then
  1191.     echo You have unpacked both archives.
  1192.     rm -f ark[1-9]isdone
  1193. else
  1194.     echo You still must unpack the following archives:
  1195.     echo "        " ${MISSING}
  1196. fi
  1197. exit 0
  1198. exit 0 # Just in case...
  1199. -- 
  1200. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1201. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1202. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1203. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1204.