1 /* This is also plain -*-c-*-
2 // Copyright (C) 2004
3 // Christian Stimming <stimming@tuhh.de>
4 
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public License as
7 // published by the Free Software Foundation; either version 2, or (at
8 // your option) any later version.
9 
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU Lesser General Public License for more details.
14 
15 // You should have received a copy of the GNU Lesser General Public License along
16 // with this library; see the file COPYING.  If not, write to the Free
17 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
18 // USA.
19 */
20 
21 /*
22 // NOTE: this is a modified file of f2c.h to work with most C++ compilers.
23 //       f2c.h for example, defines abs() as a macro, casuing parsing
24 //       problems when it encounters abs() in stdlib.h, and so on.
25 //       It is needed in Lapack++ because some of the C/Lapack functions, like
26 //       ilaenv_(), need to know what ftn_len is (system dependent.)
27 //
28 //       pow_ri() has been removed, since it collides with
29 //       sunmath.h on SUN4s.
30 //
31 //        "typedef float real" has been removed, due to conflict with
32 //        AT&T CC with real() for complex.
33 //
34 //        "typedef ... complex" has been renamed to f2c_complex to
35 //        avoid conflicts with C++ complex class.
36 */
37 
38 /** @file utils/f2c.h
39  * @brief Standard Fortran to C header file
40  *
41  * This file includes many declarations of types and headers that are
42  * needed for FORTRAN compatibility of the C code. */
43 
44 #ifndef _F2C_INCLUDE_H
45 #define _F2C_INCLUDE_H
46 
47 /* long int => int (64 bits) */
48 /* typedef long int integer; */
49 
50 typedef int integer;
51 
52 typedef char *address;
53 typedef short int shortint;
54 typedef float f2c_real;
55 typedef double doublereal;
56 typedef struct
57 {
58   f2c_real r, i;
59 } f2c_complex;
60 
61 /*
62 The complex type inside LAPACK++ has to be compatible to the FORTRAN
63 type, since LAPACK++ has to pass these values back and forth to the
64 FORTRAN functions. Don't use this data type anywhere outside
65 anymore. The included C++ class la::complex provides
66 automatic conversion from and to this FORTRAN type. */
67 typedef struct
68 {
69   doublereal r, i;
70 } doublecomplex;
71 typedef long int logical;
72 typedef short int shortlogical;
73 
74 #define TRUE_ (1)
75 #define FALSE_ (0)
76 
77 /* Extern is for use with -E */
78 #ifndef Extern
79 #define Extern extern
80 #endif
81 
82 extern int ungetc();    /* This is not declared in Sun's <stdio.h> */
83 
84 /* I/O stuff */
85 #ifndef DOXYGEN_IGNORE
86 
87 #ifdef f2c_i2
88 /* for -i2 */
89 typedef short flag;
90 typedef short ftnlen;
91 typedef short ftnint;
92 #else
93 typedef long flag;
94 typedef long ftnlen;
95 typedef long ftnint;
96 #endif /* f2c_i2 */
97 
98 /*external read, write*/
99 typedef struct
100 {
101   flag cierr;
102   ftnint ciunit;
103   flag ciend;
104   char *cifmt;
105   ftnint cirec;
106 } cilist;
107 
108 /*internal read, write*/
109 typedef struct
110 {
111   flag icierr;
112   char *iciunit;
113   flag iciend;
114   char *icifmt;
115   ftnint icirlen;
116   ftnint icirnum;
117 } icilist;
118 
119 /*open*/
120 typedef struct
121 {
122   flag oerr;
123   ftnint ounit;
124   char *ofnm;
125   ftnlen ofnmlen;
126   char *osta;
127   char *oacc;
128   char *ofm;
129   ftnint orl;
130   char *oblnk;
131 } olist;
132 
133 /*close*/
134 typedef struct
135 {
136   flag cerr;
137   ftnint cunit;
138   char *csta;
139 } cllist;
140 
141 /*rewind, backspace, endfile*/
142 typedef struct
143 {
144   flag aerr;
145   ftnint aunit;
146 } alist;
147 
148 /* inquire */
149 typedef struct
150 {
151   flag inerr;
152   ftnint inunit;
153   char *infile;
154   ftnlen infilen;
155   ftnint  *inex;  /*parameters in standard's order*/
156   ftnint  *inopen;
157   ftnint  *innum;
158   ftnint  *innamed;
159   char    *inname;
160   ftnlen  innamlen;
161   char    *inacc;
162   ftnlen  inacclen;
163   char    *inseq;
164   ftnlen  inseqlen;
165   char    *indir;
166   ftnlen  indirlen;
167   char    *infmt;
168   ftnlen  infmtlen;
169   char    *inform;
170   ftnint  informlen;
171   char    *inunf;
172   ftnlen  inunflen;
173   ftnint  *inrecl;
174   ftnint  *innrec;
175   char    *inblank;
176   ftnlen  inblanklen;
177 } inlist;
178 
179 #define VOID void
180 
181 union Multitype     /* for multiple entry points */
182 {
183   shortint h;
184   integer i;
185   f2c_real r;
186   doublereal d;
187   f2c_complex c;
188   doublecomplex z;
189 };
190 
191 typedef union Multitype Multitype;
192 
193 typedef long Long;  /* No longer used; formerly in Namelist */
194 
195 struct Vardesc      /* for Namelist */
196 {
197   char *name;
198   char *addr;
199   ftnlen *dims;
200   int  type;
201 };
202 typedef struct Vardesc Vardesc;
203 
204 struct Namelist
205 {
206   char *name;
207   Vardesc **vars;
208   int nvars;
209 };
210 typedef struct Namelist Namelist;
211 
212 /* procedure parameter types for -A and -C++ */
213 #endif /* DOXYGEN_IGNORE */
214 
215 #define F2C_proc_par_types 1
216 #ifdef __cplusplus
217 typedef int /* Unknown procedure type */ (*U_fp)(...);
218 typedef shortint(*J_fp)(...);
219 typedef integer(*I_fp)(...);
220 typedef f2c_real(*R_fp)(...);
221 typedef doublereal(*D_fp)(...), (*E_fp)(...);
222 typedef /* Complex */ VOID (*C_fp)(...);
223 typedef /* Double Complex */ VOID (*Z_fp)(...);
224 typedef logical(*L_fp)(...);
225 typedef shortlogical(*K_fp)(...);
226 typedef /* Character */ VOID (*H_fp)(...);
227 typedef /* Subroutine */ int (*S_fp)(...);
228 #else /* __cplusplus */
229 typedef int /* Unknown procedure type */ (*U_fp)();
230 typedef shortint(*J_fp)();
231 typedef integer(*I_fp)();
232 typedef f2c_real(*R_fp)();
233 typedef doublereal(*D_fp)(), (*E_fp)();
234 typedef /* Complex */ VOID (*C_fp)();
235 typedef /* Double Complex */ VOID (*Z_fp)();
236 typedef logical(*L_fp)();
237 typedef shortlogical(*K_fp)();
238 typedef /* Character */ VOID (*H_fp)();
239 typedef /* Subroutine */ int (*S_fp)();
240 #endif /* __cplusplus */
241 /* E_fp is for real functions when -R is not specified */
242 typedef VOID C_f;   /* (single precision ) complex function */
243 typedef VOID H_f;   /* character function */
244 typedef VOID Z_f;   /* double complex function */
245 typedef doublereal E_f; /* real function with -R not specified */
246 
247 /* undef any lower-case symbols that your C compiler predefines, e.g.: */
248 
249 #ifndef Skip_f2c_Undefs
250 #undef cray
251 #undef gcos
252 #undef mc68010
253 #undef mc68020
254 #undef mips
255 #undef pdp11
256 #undef sgi
257 #undef sparc
258 #undef sun
259 #undef sun2
260 #undef sun3
261 #undef sun4
262 #undef u370
263 #undef u3b
264 #undef u3b2
265 #undef u3b5
266 #undef unix
267 #undef vax
268 #endif /* Skip_f2c_Undefs */
269 
270 
271 /* If you are using a C++ compiler, append the following to f2c.h
272    for compiling libF77 and libI77. */
273 
274 #ifdef __cplusplus
275 extern "C"
276 {
277   extern int abort_(void);
278   extern double c_abs(f2c_complex *);
279   extern void c_cos(f2c_complex *, f2c_complex *);
280   extern void c_div(f2c_complex *, f2c_complex *, f2c_complex *);
281   extern void c_exp(f2c_complex *, f2c_complex *);
282   extern void c_log(f2c_complex *, f2c_complex *);
283   extern void c_sin(f2c_complex *, f2c_complex *);
284   extern void c_sqrt(f2c_complex *, f2c_complex *);
285   extern double d_abs(double *);
286   extern double d_acos(double *);
287   extern double d_asin(double *);
288   extern double d_atan(double *);
289   extern double d_atn2(double *, double *);
290   extern void d_cnjg(doublecomplex *, doublecomplex *);
291   extern double d_cos(double *);
292   extern double d_cosh(double *);
293   extern double d_dim(double *, double *);
294   extern double d_exp(double *);
295   extern double d_imag(doublecomplex *);
296   extern double d_int(double *);
297   extern double d_lg10(double *);
298   extern double d_log(double *);
299   extern double d_mod(double *, double *);
300   extern double d_nint(double *);
301   extern double d_prod(float *, float *);
302   extern double d_sign(double *, double *);
303   extern double d_sin(double *);
304   extern double d_sinh(double *);
305   extern double d_sqrt(double *);
306   extern double d_tan(double *);
307   extern double d_tanh(double *);
308   extern double derf_(double *);
309   extern double derfc_(double *);
310   extern integer do_fio(ftnint *, char *, ftnlen);
311   extern integer do_lio(ftnint *, ftnint *, char *, ftnlen);
312   extern integer do_uio(ftnint *, char *, ftnlen);
313   extern integer e_rdfe(void);
314   extern integer e_rdue(void);
315   extern integer e_rsfe(void);
316   extern integer e_rsfi(void);
317   extern integer e_rsle(void);
318   extern integer e_rsli(void);
319   extern integer e_rsue(void);
320   extern integer e_wdfe(void);
321   extern integer e_wdue(void);
322   extern integer e_wsfe(void);
323   extern integer e_wsfi(void);
324   extern integer e_wsle(void);
325   extern integer e_wsli(void);
326   extern integer e_wsue(void);
327   extern int ef1asc_(ftnint *, ftnlen *, ftnint *, ftnlen *);
328   extern integer ef1cmc_(ftnint *, ftnlen *, ftnint *, ftnlen *);
329   /*
330     #if defined(OS_WIN32) || LAPACK_OS_WIN32 || defined(OS_freebsd)
331     extern double erf(double);
332     extern double erfc(double);
333     #else
334     extern double erf(double) throw ();
335     extern double erfc(double) throw ();
336     #endif
337   */
338   /* 2004-09-08 Christian Stimming <stimming@tuhh.de>: Remove
339      declaration of erf() and erfc() since they cause trouble with
340      FreeBSD and they seem to be unneeded anyway. */
341   extern double erf_(float *);
342   extern double erfc_(float *);
343   extern integer f_back(alist *);
344   extern integer f_clos(cllist *);
345   extern integer f_end(alist *);
346   extern void f_exit(void);
347   extern integer f_inqu(inlist *);
348   extern integer f_open(olist *);
349   extern integer f_rew(alist *);
350   extern int flush_(void);
351   extern void getarg_(integer *, char *, ftnlen);
352   extern void getenv_(char *, char *, ftnlen, ftnlen);
353   extern short h_abs(short *);
354   extern short h_dim(short *, short *);
355   extern short h_dnnt(double *);
356   extern short h_indx(char *, char *, ftnlen, ftnlen);
357   extern short h_len(char *, ftnlen);
358   extern short h_mod(short *, short *);
359   extern short h_nint(float *);
360   extern short h_sign(short *, short *);
361   extern short hl_ge(char *, char *, ftnlen, ftnlen);
362   extern short hl_gt(char *, char *, ftnlen, ftnlen);
363   extern short hl_le(char *, char *, ftnlen, ftnlen);
364   extern short hl_lt(char *, char *, ftnlen, ftnlen);
365   extern integer i_abs(integer *);
366   extern integer i_dim(integer *, integer *);
367   extern integer i_dnnt(double *);
368   extern integer i_indx(char *, char *, ftnlen, ftnlen);
369   extern integer i_len(char *, ftnlen);
370   extern integer i_mod(integer *, integer *);
371   extern integer i_nint(float *);
372   extern integer i_sign(integer *, integer *);
373   extern integer iargc_(void);
374   extern ftnlen l_ge(char *, char *, ftnlen, ftnlen);
375   extern ftnlen l_gt(char *, char *, ftnlen, ftnlen);
376   extern ftnlen l_le(char *, char *, ftnlen, ftnlen);
377   extern ftnlen l_lt(char *, char *, ftnlen, ftnlen);
378   extern void pow_ci(f2c_complex *, f2c_complex *, integer *);
379   extern double pow_dd(double *, double *);
380   extern double pow_di(double *, integer *);
381   extern short pow_hh(short *, shortint *);
382   extern integer pow_ii(integer *, integer *);
383   /* extern double pow_ri(float *, integer *); */
384   extern void pow_zi(doublecomplex *, doublecomplex *, integer *);
385   extern void pow_zz(doublecomplex *, doublecomplex *, doublecomplex *);
386   extern double r_abs(float *);
387   extern double r_acos(float *);
388   extern double r_asin(float *);
389   extern double r_atan(float *);
390   extern double r_atn2(float *, float *);
391   extern void r_cnjg(f2c_complex *, f2c_complex *);
392   extern double r_cos(float *);
393   extern double r_cosh(float *);
394   extern double r_dim(float *, float *);
395   extern double r_exp(float *);
396   extern double r_imag(f2c_complex *);
397   extern double r_int(float *);
398   extern double r_lg10(float *);
399   extern double r_log(float *);
400   extern double r_mod(float *, float *);
401   extern double r_nint(float *);
402   extern double r_sign(float *, float *);
403   extern double r_sin(float *);
404   extern double r_sinh(float *);
405   extern double r_sqrt(float *);
406   extern double r_tan(float *);
407   extern double r_tanh(float *);
408   extern void s_cat(char *, char **, integer *, integer *, ftnlen);
409   extern integer s_cmp(char *, char *, ftnlen, ftnlen);
410   extern void s_copy(char *, char *, ftnlen, ftnlen);
411   extern int s_paus(char *, ftnlen);
412   extern integer s_rdfe(cilist *);
413   extern integer s_rdue(cilist *);
414   extern integer s_rnge(char *, integer, char *, integer);
415   extern integer s_rsfe(cilist *);
416   extern integer s_rsfi(icilist *);
417   extern integer s_rsle(cilist *);
418   extern integer s_rsli(icilist *);
419   extern integer s_rsne(cilist *);
420   extern integer s_rsni(icilist *);
421   extern integer s_rsue(cilist *);
422   extern int s_stop(char *, ftnlen);
423   extern integer s_wdfe(cilist *);
424   extern integer s_wdue(cilist *);
425   extern integer s_wsfe(cilist *);
426   extern integer s_wsfi(icilist *);
427   extern integer s_wsle(cilist *);
428   extern integer s_wsli(icilist *);
429   extern integer s_wsne(cilist *);
430   extern integer s_wsni(icilist *);
431   extern integer s_wsue(cilist *);
432   extern void sig_die(char *, int);
433   extern integer signal_(integer *, void (*)(int));
434   extern int system_(char *, ftnlen);
435   extern double z_abs(doublecomplex *);
436   extern void z_cos(doublecomplex *, doublecomplex *);
437   extern void z_div(doublecomplex *, doublecomplex *, doublecomplex *);
438   extern void z_exp(doublecomplex *, doublecomplex *);
439   extern void z_log(doublecomplex *, doublecomplex *);
440   extern void z_sin(doublecomplex *, doublecomplex *);
441   extern void z_sqrt(doublecomplex *, doublecomplex *);
442 }
443 #endif /* __cplusplus  */
444 
445 #endif /* _F2C_INCLUDE_H */
446