home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / fchk294s.zip / ftnchek-2.9.4 / intrins.h < prev    next >
Text File  |  1996-08-25  |  12KB  |  300 lines

  1. /* intrins.h:
  2.    List of intrinsic functions for use by find_intrinsic
  3.    and check_intrins_args.  You may add locally available intrinsics
  4.    to this list (order not important).
  5.  
  6.     Copyright (C) 1993 by Robert K. Moniot.
  7.     This program is free software.  Permission is granted to
  8.     modify it and/or redistribute it, retaining this notice.
  9.     No guarantees accompany this software.
  10.  
  11.  
  12. */
  13.  
  14.  
  15.     /* Define positional flags to allow specifying more
  16.        than one allowed type of argument for generics.
  17.      */
  18.  
  19. #define I   (1 << type_INTEGER)
  20. #define R   (1 << type_REAL)
  21. #define D   (1 << type_DP)
  22. #define C   (1 << type_COMPLEX)
  23. #define Z   (1 << type_DCOMPLEX)
  24. #define L   (1 << type_LOGICAL)
  25. #define STR (1 << type_STRING)
  26.  
  27.     /* Table contains: name, num_args, arg_type, result_type, flags.
  28.        Special num_args values are defined in symtab.h.
  29.  
  30.        Flags: I_F77 if it is in Table 5 p. 15-24, I_NONF77 otherwise
  31.           I_MIXED_ARGS if arguments are not all of same type.
  32.           I_NONPURE if arg need not have defined value (LEN).
  33.           I_C_TO_R indicates complex -> real in generic cases
  34.               (ABS,IMAG,REAL).
  35.           I_SP_R indicates specific REAL result (REAL)
  36.               I_NOTARG if it is a generic with no specific meaning,
  37.               or if it is a type conversion, lexical relationship,
  38.               or min or max (cf. p. 15-3, sec. 15.3.2)
  39.           I_EXTRA indicates common nonstd function
  40.           I_VMS indicates VMS-specific function
  41.           I_UNIX indicates UNIX-specific function
  42.      */
  43.  
  44. {"INT",     1,    I|R|D|C|Z,type_INTEGER,    I_F77|I_NOTARG},
  45. {"IFIX",    1,    R,    type_INTEGER,    I_F77|I_NOTARG},
  46. {"IDINT",    1,    D,    type_INTEGER,    I_F77|I_NOTARG},
  47. {"REAL",    1,    I|R|D|C|Z,type_GENERIC, I_F77|I_NOTARG|I_C_TO_R|I_SP_R},
  48. {"FLOAT",    1,    I,    type_REAL,    I_F77|I_NOTARG},
  49. {"SNGL",    1,    D,    type_REAL,    I_F77|I_NOTARG},
  50. {"DBLE",    1,    I|R|D|C|Z,type_DP,    I_F77|I_NOTARG},
  51. {"CMPLX",    I_1or2,    I|R|D|C|Z,type_COMPLEX,    I_F77|I_NOTARG},
  52. {"ICHAR",    1,    STR,    type_INTEGER,    I_F77|I_NOTARG|I_ICHAR},
  53. {"CHAR",    1,    I,    type_STRING,    I_F77|I_NOTARG|I_CHAR},
  54. {"AINT",    1,    R|D,    type_GENERIC,    I_F77},
  55. {"DINT",    1,    D,    type_DP,    I_F77},
  56. {"ANINT",    1,    R|D,    type_GENERIC,    I_F77},
  57. {"DNINT",    1,    D,    type_DP,    I_F77},
  58. {"NINT",    1,    R|D,    type_INTEGER,    I_F77},
  59. {"IDNINT",    1,    D,    type_INTEGER,    I_F77},
  60. {"ABS",     1,    I|R|D|C|Z,type_GENERIC,    I_F77|I_C_TO_R|I_ABS},
  61. {"IABS",    1,    I,    type_INTEGER,    I_F77|I_ABS},
  62. {"DABS",    1,    D,    type_DP,    I_F77},
  63. {"CABS",    1,    C,    type_REAL,    I_F77},
  64. {"MOD",     2,    I|R|D,    type_GENERIC,    I_F77|I_MOD},
  65. {"AMOD",    2,    R,    type_REAL,    I_F77},
  66. {"DMOD",    2,    D,    type_DP,    I_F77},
  67. {"SIGN",    2,    I|R|D,    type_GENERIC,    I_F77|I_SIGN},
  68. {"ISIGN",    2,    I,    type_INTEGER,    I_F77|I_SIGN},
  69. {"DSIGN",    2,    D,    type_DP,    I_F77},
  70. {"DIM",        2,    I|R|D,    type_GENERIC,    I_F77|I_DIM},
  71. {"IDIM",    2,    I,    type_INTEGER,    I_F77|I_DIM},
  72. {"DDIM",    2,    D,    type_DP,    I_F77},
  73. {"DPROD",    2,    R,    type_DP,    I_F77},
  74. {"MAX",        I_2up,    I|R|D,    type_GENERIC,    I_F77|I_NOTARG|I_MAX},
  75. {"MAX0",    I_2up,    I,    type_INTEGER,    I_F77|I_NOTARG|I_MAX},
  76. {"AMAX1",    I_2up,    R,    type_REAL,    I_F77|I_NOTARG},
  77. {"DMAX1",    I_2up,    D,    type_DP,    I_F77|I_NOTARG},
  78. {"AMAX0",    I_2up,    I,    type_REAL,    I_F77|I_NOTARG},
  79. {"MAX1",    I_2up,    R,    type_INTEGER,    I_F77|I_NOTARG},
  80. {"MIN",     I_2up,    I|R|D,    type_GENERIC,    I_F77|I_NOTARG|I_MIN},
  81. {"MIN0",    I_2up,    I,    type_INTEGER,    I_F77|I_NOTARG|I_MIN},
  82. {"AMIN1",    I_2up,    R,    type_REAL,    I_F77|I_NOTARG},
  83. {"DMIN1",    I_2up,    D,    type_DP,    I_F77|I_NOTARG},
  84. {"AMIN0",    I_2up,    I,    type_REAL,    I_F77|I_NOTARG},
  85. {"MIN1",    I_2up,    R,    type_INTEGER,    I_F77|I_NOTARG},
  86. {"LEN",     1,    STR,    type_INTEGER,    I_F77|I_LEN},
  87. {"INDEX",    2,    STR,    type_INTEGER,    I_F77|I_INDEX},
  88. {"AIMAG",    1,    C,    type_REAL,    I_F77},
  89. {"CONJG",    1,    C,    type_COMPLEX,    I_F77},
  90. {"SQRT",    1,    R|D|C|Z,type_GENERIC,    I_F77},
  91. {"DSQRT",    1,    D,    type_DP,    I_F77},
  92. {"CSQRT",    1,    C,    type_COMPLEX,    I_F77},
  93. {"EXP",        1,    R|D|C|Z,type_GENERIC,    I_F77},
  94. {"DEXP",    1,    D,    type_DP,    I_F77},
  95. {"CEXP",    1,    C,    type_COMPLEX,    I_F77},
  96. {"LOG",     1,    R|D|C|Z,type_GENERIC,    I_F77|I_NOTARG},
  97. {"ALOG",    1,    R,    type_REAL,    I_F77},
  98. {"DLOG",    1,    D,    type_DP,    I_F77},
  99. {"CLOG",    1,    C,    type_COMPLEX,    I_F77},
  100. {"LOG10",    1,    R|D,    type_GENERIC,    I_F77|I_NOTARG},
  101. {"ALOG10",    1,    R,    type_REAL,    I_F77},
  102. {"DLOG10",    1,    D,    type_DP,    I_F77},
  103. {"SIN",     1,    R|D|C|Z,type_GENERIC,    I_F77},
  104. {"DSIN",    1,    D,    type_DP,    I_F77},
  105. {"CSIN",    1,    C,    type_COMPLEX,    I_F77},
  106. {"COS",     1,    R|D|C|Z,type_GENERIC,    I_F77},
  107. {"DCOS",    1,    D,    type_DP,    I_F77},
  108. {"CCOS",    1,    C,    type_COMPLEX,    I_F77},
  109. {"TAN",     1,    R|D,    type_GENERIC,    I_F77},
  110. {"DTAN",    1,    D,    type_DP,    I_F77},
  111. {"ASIN",    1,    R|D,    type_GENERIC,    I_F77},
  112. {"DASIN",    1,    D,    type_DP,    I_F77},
  113. {"ACOS",    1,    R|D,    type_GENERIC,    I_F77},
  114. {"DACOS",    1,    D,    type_DP,    I_F77},
  115. {"ATAN",    1,    R|D,    type_GENERIC,    I_F77},
  116. {"DATAN",    1,    D,    type_DP,    I_F77},
  117. {"ATAN2",    2,    R|D,    type_GENERIC,    I_F77},
  118. {"DATAN2",    2,    D,    type_DP,    I_F77},
  119. {"SINH",    1,    R|D,    type_GENERIC,    I_F77},
  120. {"DSINH",    1,    D,    type_DP,    I_F77},
  121. {"COSH",    1,    R|D,    type_GENERIC,    I_F77},
  122. {"DCOSH",    1,    D,    type_DP,    I_F77},
  123. {"TANH",    1,    R|D,    type_GENERIC,    I_F77},
  124. {"DTANH",    1,    D,    type_DP,    I_F77},
  125. {"LGE",     2,    STR,    type_LOGICAL,    I_F77|I_NOTARG},
  126. {"LGT",     2,    STR,    type_LOGICAL,    I_F77|I_NOTARG},
  127. {"LLE",     2,    STR,    type_LOGICAL,    I_F77|I_NOTARG},
  128. {"LLT",     2,    STR,    type_LOGICAL,    I_F77|I_NOTARG},
  129.  
  130.         /* DOUBLE COMPLEX intrinsics are included regardless
  131.            of -intrinsics option, since they are essential
  132.            to support of this datatype.
  133.          */
  134. {"DCMPLX",    I_1or2,    I|R|D|C|Z,type_DCOMPLEX,I_NONF77|I_NOTARG},
  135. {"DCONJG",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  136. {"DIMAG",    1,    Z,    type_DP,    I_NONF77},
  137. {"IMAG",    1,    C|Z,    type_GENERIC,    I_NONF77|I_NOTARG|I_C_TO_R},
  138. {"DREAL",    1,    Z,    type_DP,    I_NONF77},
  139. {"CDABS",    1,    Z,    type_DP,    I_NONF77},
  140. {"ZABS",    1,    Z,    type_DP,    I_NONF77},
  141. {"CDSQRT",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  142. {"ZSQRT",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  143. {"CDEXP",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  144. {"ZEXP",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  145. {"CDLOG",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  146. {"ZLOG",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  147. {"CDSIN",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  148. {"ZSIN",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  149. {"CDCOS",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  150. {"ZCOS",    1,    Z,    type_DCOMPLEX,    I_NONF77},
  151.  
  152.         /* DFLOAT has been available in almost all Fortran
  153.                    implementations for decades, but curiously, was
  154.                    omitted from the Fortran 66 and Fortran 77
  155.                    standards.  A separate intrinsic is essential,
  156.                    because DBLE(FLOAT()) will lose bits for integer
  157.                    arguments larger than the REAL fraction size.  If
  158.                    we don't include it here, declaration file output
  159.                    will incorrectly type it as REAL instead of DOUBLE
  160.                    PRECISION. -- NHFB */
  161.  
  162. {"DFLOAT",    1,    I,    type_DP,    I_NONF77},
  163.  
  164.         /* Quad precision intrinsics are included regardless
  165.            of -intrinsics option, since they are essential
  166.            to support of this datatype.  (Actually most of
  167.            them are better handled by generics.)
  168.          */
  169. {"IQINT",    1,    R,    type_INTEGER,    I_NONF77|I_NOTARG|I_QARG},
  170. {"SNGLQ",    1,    R,    type_REAL,    I_NONF77|I_NOTARG|I_QARG},
  171. {"QREAL",    1,    C,    type_QUAD,    I_NONF77|I_NOTARG|I_QARG|I_QUAD},
  172. {"DBLEQ",    1,    R,    type_DP,    I_NONF77|I_NOTARG|I_QARG},
  173. {"QFLOAT",    1,    I,    type_QUAD,    I_NONF77|I_NOTARG|I_QUAD},
  174. {"QEXTD",    1,    D,    type_QUAD,    I_NONF77|I_NOTARG|I_QUAD},
  175. {"QEXT",    1,    I|R|D,    type_QUAD,    I_NONF77|I_NOTARG|I_QUAD},
  176. {"QCMPLX",    I_1or2,    I|R|D|C|Z,type_CQUAD,    I_NONF77|I_NOTARG|I_QUAD},
  177. {"QINT",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  178. {"QNINT",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  179. {"IQNINT",    1,    R,    type_INTEGER,    I_NONF77|I_QARG},
  180. {"QABS",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  181. {"CQABS",    1,    C,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  182. {"QMOD",    2,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  183. {"QSIGN",    2,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  184. {"QDIM",    2,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  185. {"QPROD",    2,    D,    type_QUAD,    I_NONF77|I_QUAD},
  186. {"QMAX1",    I_2up,    R,    type_QUAD,    I_NONF77|I_NOTARG|I_QARG|I_QUAD},
  187. {"QMIN1",    I_2up,    R,    type_QUAD,    I_NONF77|I_NOTARG|I_QARG|I_QUAD},
  188. {"QIMAG",    1,    C,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  189. {"QCONJG",    1,    C,    type_CQUAD,    I_NONF77|I_QARG|I_QUAD},
  190. {"QSQRT",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  191. {"CQSQRT",    1,    C,    type_CQUAD,    I_NONF77|I_QARG|I_QUAD},
  192. {"QEXP",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  193. {"CQEXP",    1,    C,    type_CQUAD,    I_NONF77|I_QARG|I_QUAD},
  194. {"QLOG",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  195. {"CQLOG",    1,    C,    type_CQUAD,    I_NONF77|I_QARG|I_QUAD},
  196. {"QLOG10",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  197. {"QSIN",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  198. {"CQSIN",    1,    C,    type_CQUAD,    I_NONF77|I_QARG|I_QUAD},
  199. {"QCOS",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  200. {"CQCOS",    1,    C,    type_CQUAD,    I_NONF77|I_QARG|I_QUAD},
  201. {"QTAN",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  202. {"QARSIN",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  203. {"QARCOS",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  204. {"QATAN",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  205. {"QATAN2",    2,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  206. {"QSINH",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  207. {"QCOSH",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  208. {"QTANH",    1,    R,    type_QUAD,    I_NONF77|I_QARG|I_QUAD},
  209.  
  210. #ifdef NONSTD_INTRINSICS
  211.  
  212.     /* Nonstandard but widely used intrinsics.  These follow both
  213.        VMS and AIX defns, so they are probably de facto standard.
  214.        Not included: specifics covered by a generic.
  215.        N.B. Argument checking is not tight for these: some
  216.        take arrays, 0 or 1 arguments, etc. that are not
  217.        handled by check_intrins_args().  Remarks are placed by
  218.        these cases.
  219.      */
  220.  
  221.  
  222.         /* Bit test & Shift operations: these follow Mil. Std. 1753 */
  223. {"BTEST",    2,    I,    type_LOGICAL,    I_NONF77|I_EXTRA},
  224. {"IAND",    2,    I,    type_INTEGER,    I_NONF77|I_EXTRA},
  225. {"IOR",        2,    I,    type_INTEGER,    I_NONF77|I_EXTRA},
  226. {"IBSET",    2,    I,    type_INTEGER,    I_NONF77|I_EXTRA},
  227. {"IBCLR",    2,    I,    type_INTEGER,    I_NONF77|I_EXTRA},
  228. {"IBITS",    3,    I,    type_INTEGER,    I_NONF77|I_EXTRA},
  229. {"IEOR",    2,    I,    type_INTEGER,    I_NONF77|I_EXTRA},
  230. {"ISHFT",    2,    I,    type_INTEGER,    I_NONF77|I_EXTRA},
  231. {"ISHFTC",    3,    I,    type_INTEGER,    I_NONF77|I_EXTRA},
  232. {"MVBITS",    5,    I,    type_SUBROUTINE,I_NONF77|I_EXTRA},
  233. {"NOT",        1,    I,    type_INTEGER,    I_NONF77|I_EXTRA},
  234.  
  235.         /* Address-of function */
  236. {"LOC",        1,I|R|D|C|Z|L|STR,type_INTEGER,    I_NONF77|I_EXTRA},
  237.  
  238.         /* Utility routines */
  239. {"EXIT",       I_0or1,    I,    type_SUBROUTINE,I_NONF77|I_EXTRA},
  240. #endif
  241.  
  242.         /* Unix only.  These are a selected subset of the F77
  243.            library routines listed in the USENIX manual section 3F.
  244.          */
  245. #ifdef UNIX_INTRINSICS
  246. {"ABORT",    1,    STR,    type_SUBROUTINE,I_NONF77|I_UNIX},
  247. {"AND",        2,    I,    type_INTEGER,    I_NONF77|I_UNIX},
  248.         /* I, then STR not enforced in GETARG. */
  249. {"GETARG",    2,    I|STR,    type_SUBROUTINE,I_MIXED_ARGS|I_NONF77|I_UNIX},
  250. {"GETENV",    2,    STR,    type_SUBROUTINE,I_NONF77|I_UNIX},
  251. {"GMTIME",    2,    I,    type_SUBROUTINE,I_NONF77|I_UNIX},/*2nd arg array(9)*/
  252. #ifdef IARGC_NO_ARG
  253. {"IARGC",    0,    0,    type_INTEGER,    I_NONF77|I_UNIX},
  254. #else
  255. #ifdef IARGC_ONE_ARG
  256. {"IARGC",    1,    I,    type_INTEGER,    I_NONF77|I_UNIX},
  257. #else  /* default is to allow 0 or 1 */
  258. {"IARGC",    I_0or1,    I,    type_INTEGER,    I_NONF77|I_UNIX},
  259. #endif
  260. #endif
  261. {"LSHIFT",    2,    I,    type_INTEGER,    I_NONF77|I_UNIX},
  262. {"LTIME",    2,    I,    type_SUBROUTINE,I_NONF77|I_UNIX},/*2nd arg array(9)*/
  263. {"OR",        2,    I,    type_INTEGER,    I_NONF77|I_UNIX},
  264. #ifdef RAND_NO_ARG    /*RAND() form*/
  265. {"IRAND",    0,    0,    type_INTEGER,    I_NONF77|I_UNIX},
  266. {"RAND",    0,    0,    type_REAL,    I_NONF77|I_UNIX},
  267. #else
  268. #ifdef RAND_ONE_ARG    /*RAND(ISEED) form*/
  269. {"IRAND",    1,    I,    type_INTEGER,    I_NONF77|I_UNIX|I_NONPURE},
  270. {"RAND",    1,    I,    type_REAL,    I_NONF77|I_UNIX|I_NONPURE},
  271. #else                /* Allow either form */
  272. {"IRAND",    I_0or1,    I,    type_INTEGER,    I_NONF77|I_UNIX|I_NONPURE},
  273. {"RAND",    I_0or1,    I,    type_REAL,    I_NONF77|I_UNIX|I_NONPURE},
  274. #endif
  275. #endif
  276. {"RSHIFT",    2,    I,    type_INTEGER,    I_NONF77|I_UNIX},
  277. {"SRAND",    1,    I|R,    type_SUBROUTINE,I_NONF77|I_UNIX},/*AIX has this*/
  278. {"SYSTEM",    1,    STR,    type_INTEGER,    I_NONF77|I_UNIX},
  279. {"TIME",    I_0or1,    I,    type_INTEGER,    I_NONF77|I_UNIX},
  280. {"XOR",        2,    I,    type_INTEGER,    I_NONF77|I_UNIX},
  281. #endif
  282.  
  283. #ifdef VMS_INTRINSICS        /* VMS only */
  284. {"DATE",    1,    STR,    type_SUBROUTINE,I_NONF77|I_VMS},
  285. {"ERRSNS",    5,    I,    type_SUBROUTINE,I_NONF77|I_VMS},
  286. {"IDATE",    3,    I,    type_SUBROUTINE,I_NONF77|I_VMS},
  287. {"RAN",        1,    I,    type_REAL,    I_NONF77|I_VMS|I_NONPURE},
  288. {"SECNDS",    1,    R,    type_REAL,    I_NONF77|I_VMS},
  289. {"SIZEOF",    1,    I|R|D|C|Z|L|STR,type_INTEGER,    I_NONF77|I_VMS},
  290. {"TIME",    1,    STR,    type_SUBROUTINE,I_NONF77|I_VMS},
  291. #endif
  292.  
  293. #undef I
  294. #undef R
  295. #undef D
  296. #undef C
  297. #undef Z
  298. #undef L
  299. #undef STR
  300.