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