vif.h

     1  //! @file vif.h
     2  //! @author J. Marcel van der Veer
     3  //
     4  //! @section Copyright
     5  //
     6  // This file is part of VIF - vintage FORTRAN compiler.
     7  // Copyright 2020-2025 J. Marcel van der Veer <algol68g@xs4all.nl>.
     8  //
     9  //! @section License
    10  //
    11  // This program is free software; you can redistribute it and/or modify it 
    12  // under the terms of the GNU General Public License as published by the 
    13  // Free Software Foundation; either version 3 of the License, or 
    14  // (at your option) any later version.
    15  //
    16  // This program is distributed in the hope that it will be useful, but 
    17  // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
    18  // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 
    19  // more details. You should have received a copy of the GNU General Public 
    20  // License along with this program. If not, see <http://www.gnu.org/licenses/>.
    21  
    22  //! @section Synopsis
    23  //!
    24  //! VIF include file.
    25  
    26  // This is a monolithic include file to avoid cluttering the installation directory.
    27  
    28  #if ! defined (__VIF_H__)
    29  #define __VIF_H__
    30  #define HAVE_LINUX
    31  #define _GNU_SOURCE
    32  #include <complex.h>
    33  #include <ctype.h>
    34  #include <endian.h>
    35  #include <errno.h>
    36  #include <float.h>
    37  #include <inttypes.h>
    38  #include <libgen.h>
    39  #include <limits.h>
    40  #include <math.h>
    41  #include <quadmath.h>
    42  #include <signal.h>
    43  #include <stdarg.h>
    44  #include <stddef.h>
    45  #include <stdint.h>
    46  #include <stdio.h>
    47  #include <stdlib.h>
    48  #include <string.h>
    49  #include <sys/stat.h>
    50  #include <sys/time.h>
    51  #include <sys/utsname.h>
    52  #include <time.h>
    53  #include <unistd.h>
    54  
    55  #define prototype
    56  
    57  #define PACKAGE "vif"
    58  
    59  #define NO_IDENT ((IDENT *) NULL)
    60  #define NO_INTRINS ((INTRINS *) NULL)
    61  #define NO_LABEL ((LBL *) NULL)
    62  #define NO_MODE ((MODE *) NULL)
    63  #define NO_TEXT ((char *) NULL)
    64  #define NO_FUN NULL
    65  #define NO_FTNFILE ((FTNFILE *) NULL)
    66  #define NO_FTN_LINE ((FTN_LINE *) NULL)
    67  #define NO_FILE ((FILE *) NULL)
    68  #define NO_REF_INTEGER ((int_4 *) NULL)
    69  #define NO_EXPR ((EXPR *) NULL)
    70  #define NO_REF_TEXT ((char **) NULL)
    71  
    72  #define STDF_IN 5
    73  #define STDF_OUT 6
    74  #define STDF_PUN 6
    75  #define STDF_ERR 7
    76  
    77  typedef char *FORMAT;
    78  
    79  // Flags for gcc when compiling generated code from FORTRAN.
    80  
    81  #if defined (BOOTSTRAP)
    82    #if defined (HAVE_FREEBSD)
    83      #define CFLAGS "-pipe -ggdb -I. -Isrc/include -L. -I../include -I../../include -fdiagnostics-plain-output -fdiagnostics-show-location=once"
    84      #define LD_FLAGS "-rdynamic -Lsrc/lib -L../lib -lvif -lquadmath -lm -lexecinfo"
    85    #elif defined (HAVE_LINUX)
    86      #define CFLAGS "-pipe -ggdb -I. -Isrc/include -L. -I../include -I../../include -fdiagnostics-plain-output -fdiagnostics-show-location=once"
    87      #define LD_FLAGS "-rdynamic -Lsrc/lib -L../lib -lvif -lquadmath -lm"
    88    #else
    89      #error "undefined OS"
    90    #endif
    91  #else
    92    #if defined (HAVE_FREEBSD)
    93      #define CFLAGS "-pipe -ggdb -I. -Isrc/include -L. -I../include -I../../include -fdiagnostics-plain-output -fdiagnostics-show-location=once -z execstack"
    94      #define LD_FLAGS "-rdynamic -L./src/lib -lvif -lquadmath -lm -lexecinfo"
    95    #elif defined (HAVE_LINUX)
    96      #define CFLAGS "-pipe -ggdb -I. -Isrc/include -L. -I../include -I../../include -fdiagnostics-plain-output -fdiagnostics-show-location=once -z execstack"
    97      #define LD_FLAGS "-rdynamic -L./src/lib -lvif -lquadmath -lm"
    98    #else
    99      #error "undefined OS"
   100    #endif
   101  #endif
   102  #define OFLAGS "-O2"
   103  
   104  enum {NOTYPE, ETYPE, INTEGER, LOGICAL, REAL, COMPLEX, CHARACTER};
   105  enum {UNFORMATTED = 1, STDFORMAT, FORMATTED };
   106  enum {SOURCE = 0, TEMP, MACRO };
   107  enum {HEADER = 0, BANNER, LIST, MESSAGES, JCL, SYMBOLS, CONSTANTS, STRINGS, PARAMETERS, TYPEDEF, FREQ, COMMON, PROTOTYPE, STAT, TITLE, PRE, DECL, REFDECL, EQUIV, FMT, DATA, NESTED, BODY, POST, MAXPHA };
   108  enum {EXPR_OTHER = 0, EXPR_VAR, EXPR_CONST, EXPR_SLICE, EXPR_SUBSTR };
   109  enum {LEXEME = 0, DECLAR, WORD, LABEL, INT_NUMBER, FLT_NUMBER, TEXT };
   110  enum {STATIC = 0, AUTOMATIC };
   111  
   112  // Shorthands to improve code legibility.
   113  
   114  #define int_2 int16_t
   115  #define int_4 int32_t
   116  #define int_8 int64_t
   117  
   118  #define unt_2 uint16_t
   119  #define unt_4 uint32_t
   120  #define unt_8 uint64_t
   121  #define unt_16 unsigned __int128
   122  
   123  #define logical_4 unsigned
   124  
   125  #define real_4 float
   126  #define real_8 double
   127  #define real_16 __float128
   128  
   129  #define complex_8 float complex
   130  #define complex_16 double complex
   131  #define complex_32 __complex128
   132  
   133  // MAX_STRLEN = 2 ** MAX_STRLENS - 1
   134  #define MAX_STRLEN 4095
   135  #define MAX_STRLENS 12
   136  extern int_4 strlens[MAX_STRLENS];
   137  
   138  #define ERR (-32)
   139  #define SKIP // 
   140  #define TRUE 1
   141  #define FALSE 0
   142  #define MAX_LRECL 32760
   143  #define MAX_MACRO_DEPTH 25
   144  #define MAX_NEST 9
   145  #define INCREMENT 500
   146  #define INDENT 2
   147  #define LINES_PER_PAGE 50
   148  #define LINE_WIDTH 122
   149  #define MAX_ARGS 16
   150  #define MAX_COMMONS 100
   151  #define MAX_DIMS 6
   152  #define MAX_IDENTS 1000
   153  #define MAX_LABELS 1000
   154  #define MAX_MODULES 5000
   155  #define MAX_PRIO 9
   156  #define MAX_ERROR 5
   157  #define MAX_WARNS MAX_ERROR
   158  #define RETURN "goto _l0;\n"
   159  #define M_LOG10_2 0.30102999566398119521373889472449q
   160  
   161  #define NOT_LOCAL(idf) ((idf)->common != LOCAL)
   162  #define LOCAL 0
   163  #define EXTERN 1
   164  
   165  #define WITHIN (curret != END_OF_LINE && curret != END_OF_MODULE)
   166  
   167  #define NOT_ASSIGNMENT 0
   168  #define MACRO_DECLARATION 1
   169  #define ASSIGNMENT 2
   170  
   171  #define IS_NOT_ASSIGNMENT (statement_type () == NOT_ASSIGNMENT)
   172  #define IS_MACRO_DECLARATION (statement_type () == MACRO_DECLARATION)
   173  #define IS_ASSIGNMENT (statement_type () == ASSIGNMENT)
   174  
   175  #define END_OF_MODULE (-3)
   176  #define END_OF_LINE (-2)
   177  #define EXPECT_NONE (NULL)
   178  #define START_OF_LINE (-1)
   179  #define ARG TRUE
   180  #define NOARG FALSE
   181  #define CONST TRUE
   182  #define NOCONST FALSE
   183  #define FUN TRUE
   184  #define NOFUN FALSE
   185  #define UNIQ TRUE
   186  #define NOUNIQ FALSE
   187  #define NOPATCH 0
   188  #define NOTYPE 0
   189  #define NOLEN 0
   190  #define FORMAL TRUE
   191  #define ACTUAL FALSE
   192  #define CAST TRUE
   193  #define NOCAST FALSE
   194  #define PROTEST TRUE
   195  #define QUIET FALSE
   196  
   197  #define EXPECT_LABEL "label"
   198  #define INTERNAL_CONSISTENCY "internal consistency"
   199  
   200  #define ABS(n) ((n) > 0 ? (n) : -(n))
   201  #define MAXIMISE(u, v) ((u) = _max (u, v))
   202  #define MINIMISE(u, v) ((u) = _min (u, v)) 
   203  
   204  #define IS_JCL(c) (c == '/' || CUR_LIN.jcl)
   205  #define IS_COMMENT(c) (strchr ("cd*!#", tolower (c)) != NULL || IS_JCL (c))
   206  #define IS_VAR(n) (isalpha(n[0]) || n[0] == '_' || n[0] == '$')
   207  #define _EXPCHAR(n) (tolower (n) != '\0' && strchr ("edqx", tolower (n)) != NULL)
   208  #define _IDFCHAR(n) (tolower (n) != '\0' && strchr ("abcdefghijklmnopqrstuvwxyz0123456789_ $", tolower (n)) != NULL)
   209  #define CUR_LIN (source[curlin])
   210  #define POS(n) (tolower (CUR_LIN.text[n]))
   211  #define EXPONENT(n) _EXPCHAR (POS (n))
   212  #define CUR_COL (POS (curcol)) 
   213  
   214  #define UNSCAN {curlin = prelin; curcol = precol; strcpy (curlex, prelex); curret = preret;}
   215  
   216  #define SAVE_POS(n)\
   217    int_4 _cl_##n= curlin, _cc_##n= curcol;\
   218    int_4 _pl_##n= prelin, _pc_##n= precol;\
   219    int_4 _pr_##n= preret, _cr_##n= curret;\
   220    NEW_RECORD (_clr_##n); RECCPY (_clr_##n, curlex);\
   221    NEW_RECORD (_cpr_##n); RECCPY (_cpr_##n, prelex);
   222  
   223  #define RESTORE_POS(n) {\
   224    curlin = _cl_##n;\
   225    curcol = _cc_##n;\
   226    prelin = _pl_##n;\
   227    precol = _pc_##n;\
   228    preret = _pr_##n;\
   229    curret = _cr_##n;\
   230    RECCPY (curlex, _clr_##n);\
   231    RECCPY (prelex, _cpr_##n);\
   232  }
   233  
   234  #define MSG(sev, num, text, info)\
   235    if (prelin < 1) {\
   236      message (&source[curlin], curcol, (sev), (num), (text), (info));\
   237    } else {\
   238      message (&source[prelin], precol, (sev), (num), (text), (info));\
   239    }
   240  
   241  extern int_4 _srecordf (char *, const char *, ...);
   242  extern void _vif_backtr(int_4);
   243  
   244  #define ERROR(num, s, t) {MSG ("error", (num), (s), (t));}
   245  #define MODE_ERROR(num, s, t) {\
   246    RECORD _txt_;\
   247    _srecordf(_txt_, "%s to %s", (s), (t));\
   248    ERROR (num, "cannot convert", _txt_);\
   249    }
   250  #define PRECISION_LOSS(num, s, t) {\
   251    RECORD _txt_;\
   252    _srecordf(_txt_, "%s to %s", (s), (t));\
   253    WARNING (num, "possible precision loss", _txt_);\
   254    }
   255  #define SYNTAX(num, s) {ERROR ((num), "syntax", (s));}
   256  #define EXPECT(num, s) {ERROR ((num), "expected", (s));}
   257  #define ADJACENT(num, s) {ERROR ((num), "adjacent", (s));}
   258  #define WARNING(num, s, t) {MSG ("warning", (num), (s), (t));}
   259  #define ECHO(num, s, t) {MSG ("info", (num), (s), (t));}
   260  #define SCANER(num, s, t) {MSG ("fatal", (num), (s), (t)); exit (EXIT_FAILURE);}
   261  #define FATAL(num, s, t) {message (NULL, ERR, "fatal", (num), (s), (t)); exit (EXIT_FAILURE);}
   262  #define OVERFLOW(num, t) {fprintf (stderr, "\n** exception  ** f%d: fatal: overflow, (%s)\n", (num), (t)); _vif_backtr (SIGTERM);}
   263  
   264  #define TOKEN(s) EQUAL (curlex, (s))
   265  #define CHECKPOINT(num, s) {if (!EQUAL (curlex, (s))) {EXPECT ((num), (s));}}
   266  #define CHECKDIGIT(num, s) {if (!isdigit (s)) {EXPECT ((num), "digit");}}
   267  #define IS_NUMBER(u) ((u) == INT_NUMBER || (u) == FLT_NUMBER)
   268  
   269  #define FMT_TEXT ((char *) 1)
   270  #define FMT_INT ((char *) 2)
   271  #define FMT_REAL ((char *) 3)
   272  #define FMT_LOGICAL ((char *) 4)
   273  #define FMT_CHAR ((char *) 5)
   274  #define FMT_TERM ((char *) 6)
   275  extern int_4 __scale__;
   276  
   277  // REAL*32
   278  
   279  #define FLT128_LEN 7                   // Do NOT change this!
   280  #define FLT256_LEN 15                  // Do NOT change this!
   281  #define FLT256_GUARD 2                 // Guard digits.
   282  #define FLT256_DIG (72 - FLT256_GUARD) // 240 * log10 (2) minus guard digits.
   283  
   284  typedef unt_2 REAL16[8];
   285  typedef unt_2 REAL32[FLT256_LEN + 1]; // One for exponent.
   286  
   287  struct __real_32__
   288  {
   289    REAL32 value;
   290  };
   291  typedef struct __real_32__ real_32;
   292  
   293  struct __complex_64__
   294  {
   295    struct __real_32__ re, im;
   296  };
   297  typedef struct __complex_64__ complex_64;
   298  
   299  #define xsub(a, b) xadd (a, b, 1)
   300  #define xsum(a, b) xadd (a, b, 0)
   301  
   302  // In Fortran, only EQUIVALENCE can alias names.
   303  
   304  #define _p_ * restrict
   305  
   306  //
   307  
   308  #define RECLN 2048
   309  typedef char RECORD[RECLN + 1]; 
   310  #define RECCLR(z) memset ((z), '\0', RECLN + 1)
   311  #define RECCPY(dst, src) bufcpy (dst, src, RECLN);
   312  #define NEW_RECORD(z) RECORD z; RECCLR(z)
   313  #define NEW_STATIC_RECORD(z) static RECORD z; RECCLR(z)
   314  
   315  typedef struct FTNFILE FTNFILE;
   316  struct FTNFILE {
   317    FILE *unit;
   318    char *name, *form, *action, *disp, *buff, *rewind;
   319    int_4 lrecl, vers, in_stream, record, records, redirect, buff_init, buff_pos, buff_len, memopen_len;
   320  };
   321  
   322  #define NEW_FTN_FILE(fp, fmt, act, recl)\
   323    ((FTNFILE) {.unit = fp, .form = fmt, .action = act, .lrecl = recl, .in_stream = FALSE})
   324  
   325  #define MAX_SOURCE_FILES 1500
   326  
   327  // MAX_FILES should be 100.
   328  #define MAX_FILES 100
   329  
   330  extern FTNFILE _ffile[MAX_FILES];
   331  
   332  typedef struct CALLS CALLS;
   333  struct CALLS {
   334    char *name;
   335    int_8 calls;
   336  };
   337  
   338  typedef struct C_SRC C_SRC;
   339  struct C_SRC
   340  {
   341    int_4 proc, phase;
   342    char *text;
   343  };
   344  extern C_SRC *object;
   345  
   346  typedef struct FTN_LINE FTN_LINE;
   347  struct FTN_LINE
   348  {
   349    FTN_LINE *file;
   350    int_4 num, isn, len, label, jcl, diag, proc, cpp;
   351    char *text;
   352  };
   353  extern FTN_LINE *source, *files;
   354  extern int_4 MAX_FTN_LINES;
   355  
   356  typedef struct MODE MODE;
   357  struct MODE
   358  {
   359    int_4 type, len, dim, save, fun;
   360  };
   361  
   362  #define PLAIN_MODE(t, l) ((MODE) {.type = type, .len = len, .dim = 0, .fun = FALSE})
   363  #define TYPE(z, t, l) ((z)->mode.type == t && (z)->mode.len == l)
   364  #define IS_ROW(m) ((m).dim > 0)
   365  #define IS_SCALAR(m) ((m).dim == 0)
   366  
   367  typedef struct IDENT IDENT;
   368  struct IDENT
   369  {
   370    char *name, *var_name, *parm;
   371    int_4 arg, call, common, const_ref, external, intrinsic, line, macro, nest, save, source, used, variable; 
   372    IDENT *alias, *equiv;
   373    MODE mode;
   374    int_4 patch1, patch2;
   375    char *lwb[MAX_DIMS], *upb[MAX_DIMS], *len[MAX_DIMS];
   376    char *size;
   377  };
   378  #define C_NAME(z) ((z)->name)
   379  #define F_NAME(z) ((z)->var_name)
   380  
   381  typedef struct IMPLICIT IMPLICIT;
   382  struct IMPLICIT
   383  {
   384    MODE mode;
   385  };
   386  
   387  typedef struct LBL LBL;
   388  struct LBL
   389  {
   390    int_4 index, num, line, jumped, patch, nonexe, data, format, renum;
   391  };
   392  extern LBL *lbl;
   393  
   394  typedef struct EXPR EXPR;
   395  struct EXPR
   396  {
   397    RECORD str, elem;
   398    int_4 variant, value, opt;
   399    IDENT *idf;
   400    MODE mode;
   401  };
   402  
   403  typedef struct INTRINS INTRINS;
   404  struct INTRINS
   405  {
   406    char *ffun, *bfun, *cfun;
   407    int_4 rtyp, rlen, alen;
   408    int_4 anum, atyp;
   409    real_32 (*f1) (real_32);
   410    real_32 (*f2) (real_32, real_32);
   411    complex_64 (*f3) (complex_64);
   412  };
   413  
   414  extern char *action_default;
   415  extern char *action_read;
   416  extern char *action_readwrite;
   417  extern char *action_write;
   418  extern char *commons[], *modules[];
   419  extern char *disp_delete;
   420  extern char *disp_keep;
   421  extern char *disp_new;
   422  extern char *disp_old;
   423  extern char *form_formatted;
   424  extern char *form_unformatted;
   425  
   426  extern IDENT globals[], locals[];
   427  
   428  extern IMPLICIT implic[];
   429  
   430  extern int_4 curlin, curcol;
   431  extern int_4 curret, preret;
   432  extern int_4 end_statements;
   433  extern int_4 indent;
   434  extern int_4 jcllin;
   435  extern int_4 lhs_factor;
   436  extern int_4 macro_depth;
   437  extern int_4 macro_nest;
   438  extern int_4 MAX_C_SRC;
   439  extern int_4 MAX_C_SRC;
   440  extern int_4 MAX_FTN_LINES;
   441  extern int_4 n_c_src;
   442  extern int_4 nerrors, merrors, nwarns;
   443  extern int_4 nloctmps, nglobtmps, func;
   444  extern int_4 optimise;
   445  extern int_4 page, line, ncommons, nmodules;
   446  extern int_4 pnprocs, nprocs, nglobals, nlocals, nlabels, nftnlines, nfiles;
   447  extern int_4 prelin, precol;
   448  
   449  extern LBL labels[];
   450  
   451  extern logical_4 abend;
   452  extern logical_4 brief;
   453  extern logical_4 use_strcasecmp;
   454  extern logical_4 compile_only;
   455  extern logical_4 f4_do_loops;
   456  extern logical_4 gcc_ftn_lines;
   457  extern logical_4 hollerith;
   458  extern logical_4 implicit_r8;
   459  extern logical_4 keep;
   460  extern logical_4 no_source;
   461  extern logical_4 no_warnings;
   462  extern logical_4 pretty;
   463  extern logical_4 quiet_mode;
   464  extern logical_4 renum;
   465  extern logical_4 tidy;
   466  extern logical_4 syntax_only;
   467  extern logical_4 trace;
   468  
   469  extern RECORD curlex, prelex;
   470  extern RECORD hdate;
   471  extern RECORD hmodule, hsection;
   472  extern RECORD libnam, modnam, procnam;
   473  extern RECORD program, block;
   474  extern RECORD retnam;
   475  extern RECORD stat_start;
   476  
   477  extern char *bufcat (char *, char *, int_4);
   478  extern char *bufcpy (char *, char *, int_4);
   479  extern char *bufrep (char *, char *);
   480  extern char *_bufsub (char *, char *, int_4, int_4);
   481  extern char *c_name (char *);
   482  extern char *concat (char *, char *, char *);
   483  extern char *edit_f (char *);
   484  extern char *edit_fmt (int_4);
   485  extern char *edit_i (char *);
   486  extern char *edit_tmp (int_4);
   487  extern char *edit_unit (int_4);
   488  extern char *edit_v (char *);
   489  extern char *edit_vn (char *, int_4);
   490  extern char *encode (char *, char *);
   491  extern char *f2c_type (char *, MODE *, int_4, int_4);
   492  extern char *f_strallocat (char *, char *);
   493  extern char *f_stralloc (char *);
   494  extern char *get_uniq_str (char *, char *);
   495  extern char *idf_full_c_name (RECORD, IDENT *);
   496  extern char *intnot (char *, int_8, int_4);
   497  extern char *newpage (char *, char *);
   498  extern char *pretty_float (char *);
   499  extern char *ptr_to_array (IDENT *, int_4, int_4, int_4);
   500  extern char *qtype (MODE *);
   501  extern char *_strlower (char *);
   502  extern char *wtype (MODE *, int_4, int_4);
   503  extern char *xfixed (char *, real_32, int_4, int_4, int_4);
   504  extern char *xfloat (char *, real_32, int_4, int_4, int_4, int_4, int_4, char);
   505  extern char *xsubfixed (char *, real_32, logical_4, int_4);
   506  extern char *xtoa (char *, real_32, int_4);
   507  
   508  extern IDENT *add_local (char *, int_4, int_4, int_4, int_4, int_4, int_4, int_4);
   509  extern IDENT *add_nest (char *, int_4, MODE *);
   510  extern IDENT *extf_decl (char *, MODE *);
   511  extern IDENT *find_local (char *, MODE *);
   512  extern IDENT *impl_decl (char *, MODE *);
   513  extern IDENT *void_decl (char *, MODE *);
   514  
   515  extern int_4 add_block (char *);
   516  extern int_4 code (int_4, int_4, char *);
   517  extern int_4 code_real_32_const (char *);
   518  extern int_4 code_uniq_str (char *);
   519  extern int_4 format_str (char *str);
   520  extern int_4 impl_do (void);
   521  extern int_4 mix_len (EXPR *, EXPR *);
   522  extern int_4 new_charlen (int_4);
   523  extern int_4 ord (char);
   524  extern int_4 patch (int_4, char *);
   525  extern int_4 scan (char *);
   526  extern int_4 scan_fmt (void);
   527  extern int_4 scan_fmt (void);
   528  extern int_4 statement_type (void);
   529  
   530  extern LBL *find_label (char *);
   531  
   532  extern logical_4 accept_mode (int_4, int_4, int_4, int_4);
   533  extern logical_4 coerce (EXPR *, EXPR *);
   534  extern logical_4 express (EXPR *, int_4, int_4);
   535  extern logical_4 find_module (char *);
   536  extern logical_4 fold_expr (EXPR *, int_4);
   537  extern logical_4 fold_intrinsic (INTRINS *, EXPR *, EXPR *);
   538  extern logical_4 intrinsic_call (char *, EXPR *);
   539  extern logical_4 is_intrins (char *, INTRINS **);
   540  extern logical_4 is_int4 (char *, int_4 *);
   541  extern logical_4 is_macro_decl (char *);
   542  extern logical_4 is_specific (char *);
   543  extern logical_4 lookahead (char *);
   544  extern logical_4 reserved (char *);
   545  extern logical_4 same_name (char *, char *);
   546  extern logical_4 valid_expr (EXPR *);
   547  
   548  extern void assign (EXPR *);
   549  extern void banner (int_4, int_4, char *);
   550  extern void call (void);
   551  extern void code_comment (void);
   552  extern void code_common (void);
   553  extern void code_exts (IDENT *, int_4, int_4, int_4, int_4);
   554  extern void code_idfs (IDENT *, int_4, int_4, int_4, int_4);
   555  extern void code_index (RECORD, IDENT *, int_4);
   556  extern void code_parms (RECORD);
   557  extern void code_row_len (IDENT *);
   558  extern void common (void);
   559  extern void common (void);
   560  extern void compute_row_size (RECORD, IDENT *);
   561  extern void cpp_direct (int_4, int_4, int_4);
   562  extern void decl_autosave (void);
   563  extern void decl_data (void);
   564  extern void decl_equiv (void);
   565  extern void decl_macros (void);
   566  extern void default_impl (void);
   567  extern void diagnostic (int_4, char *);
   568  extern void dimension (void);
   569  extern void do_data (int_4 *);
   570  extern void do_io (char *, int_4 *);
   571  extern void equivalence (void);
   572  extern void executable (void);
   573  extern void exprio (EXPR *, int_4, logical_4);
   574  extern void externals (void);
   575  extern void factor (EXPR *);
   576  extern void factor_function_call (EXPR *, RECORD);
   577  extern void factor_integer_number (EXPR *, char *);
   578  extern void factor_slice_char (EXPR *, IDENT *);
   579  extern void factor_slice (EXPR *, IDENT *);
   580  extern void factor_variable (EXPR *, IDENT *, MODE *, RECORD);
   581  extern void *f_malloc (size_t);
   582  extern void fold_int_4 (char *, char *);
   583  extern void format (LBL *);
   584  extern void *f_realloc (void *, size_t);
   585  extern void compile_nested_intrinsic (char *);
   586  extern void gen_statements (LBL *, int_4);
   587  extern void get_decls (void);
   588  extern void get_dims (IDENT *, int_4);
   589  extern void get_impl (void);
   590  extern void get_source (char *, int_4);
   591  extern void idfs_impl (void);
   592  extern void idfs_unused (void);
   593  extern void implicit (void);
   594  extern void impl_type (char *, MODE *);
   595  extern void inline_args (RECORD *, int_4 *);
   596  extern void intrinsics (void);
   597  extern void jump (void);
   598  extern void macro (EXPR *, IDENT *);
   599  extern void merge_commons (void);
   600  extern void message (FTN_LINE *, int_4, char *, int_4, char *, char *);
   601  extern void norm_mode (MODE *);
   602  extern void option (char *);
   603  extern void parameter (void);
   604  extern void patch_args (void);
   605  extern void patch_args (void);
   606  extern void proc_listing (int_4);
   607  extern void recursion (EXPR *, RECORD, IDENT *);
   608  extern void tidy_source (char *);
   609  extern void RTE (const char *, const char *);
   610  extern void RTW (const char *, const char *);
   611  extern void scan_modules (void);
   612  extern void skip_card (int_4);
   613  extern void subprograms (void);
   614  extern void vif_backspace (void);
   615  extern void vif_close (void);
   616  extern void vif_endfile (void);
   617  extern void vif_jcl (void);
   618  extern void vif_open (void);
   619  extern void vif_rewind (void);
   620  extern void write_object (char *);
   621  extern void write_tidy (char *);
   622  
   623  // ++++ MACROS
   624  
   625  #define ln(x) log(x)
   626  
   627  static inline logical_4 EQUAL (char *s, char *t)
   628  {
   629    if (s == NULL || t == NULL) {
   630      return s == t;
   631    } else {
   632      return strcasecmp (s, t) == 0;
   633    }
   634  }
   635  
   636  static inline logical_4 MATCH (char *t)
   637  {
   638    if (EQUAL (curlex, t)) {
   639      return TRUE;
   640    } else {
   641      NEW_RECORD (str);
   642      _srecordf (str, "\"%s\"", t); // Stringize t
   643      return EQUAL (curlex, str);
   644    } 
   645  }
   646  
   647  static logical_4 LEQUAL (char *s, char *t)
   648  {
   649    if (s == NULL || t == NULL) {
   650      return s == t;
   651    } else {
   652      return strncasecmp (s, t, strlen (s)) == 0;
   653    }
   654  }
   655  
   656  static inline void BUG (char *s)
   657  {
   658    fprintf (stderr, "%d %s\n", curlin, source[curlin].text);
   659    message (NULL, ERR, "fatal", 4001, "compiler bug", (s));
   660    exit (EXIT_FAILURE);
   661  }
   662  
   663  #define _write_err(rc, funit, action)\
   664    fflush (_ffile[(funit)].unit);\
   665    if ((rc) < 1 || ferror (_ffile[(funit)].unit)) {\
   666      action;\
   667    }
   668  
   669  #define _read_err(rc, funit, action_end, action_err)\
   670    if (feof (_ffile[(funit)].unit)) {\
   671      action_end;\
   672    }\
   673    if ((rc) < 1 || ferror (_ffile[(funit)].unit)) {\
   674      action_err;\
   675    }
   676  
   677  #define _write_eol(funit) {\
   678    (void) _vif_printf ((funit), "\n", NULL, NOTYPE, 0);\
   679    fflush (_ffile[(funit)].unit);\
   680    }
   681  
   682  #define _read_eol(funit) {\
   683    (void) _vif_scanf ((funit), NULL, NULL, NOTYPE, 0);\
   684    }
   685  
   686  #define _abs(a) ({__typeof__ (a) _u = (a); _u >= 0 ? _u : -_u;})
   687  #define _dim_(a, b) ({__typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a > _b ? _a - _b : 0;})
   688  #define _max(a, b) ({__typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a > _b ? _a : _b;})
   689  #define _min(a, b) ({__typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b;})
   690  #define _imod(a, b) ({__typeof__ (a) _a = (a), _b = (b), _q = (__typeof__ (a)) (_a / _b); (_a - _q * _b);})
   691  #define _sign(a, b) ({__typeof__ (a) _a = _abs (a); b >= 0 ? _a : -_a;})
   692  
   693  #define _ichar(s) ((int_4) ((s)[0]))
   694  
   695  // AINT
   696  static inline real_4 _aintf (real_4 x) {return truncf (x);}
   697  static inline real_8 _aintd (real_8 x) {return trunc (x);}
   698  static inline real_16 _aintq (real_16 x) {return truncq (x);}
   699  
   700  // NINT
   701  static inline int_4 _nintf (real_4 x) {return (int_4) (x) >= 0.0 ? floorf (x + 0.5) : -floorf (0.5 - x);}
   702  static inline int_4 _nintd (real_8 x) {return (int_4) (x >= 0.0 ? floor (x + 0.5) : -floor (0.5 - x));}
   703  static inline int_4 _nintq (real_16 x) {return (int_4) (x >= 0.0q ? floorq (x + 0.5q) : -floorq (0.5q - x));}
   704  
   705  // ANINT
   706  static inline real_4 _anintf (real_4 x) {return (x) >= 0.0 ? floorf (x + 0.5) : -floorf (0.5 - x);}
   707  static inline real_8 _anintd (real_8 x) {return (x >= 0.0 ? floor (x + 0.5) : -floor (0.5 - x));}
   708  static inline real_16 _anintq (real_8 x) {return (x >= 0.0q ? floor (x + 0.5q) : -floor (0.5q - x));}
   709  
   710  // COMPLEX*32
   711  
   712  static inline complex_32 CMPLXQ (real_16 re, real_16 im) {complex_32 z; __real__ z = re; __imag__ z = im; return z;}
   713  extern complex_32 qxcmplx (real_32, real_32);
   714  
   715  // COMPLEX*64
   716  
   717  #define CMPLXX(re, im) (complex_64){re, im}
   718  #define CMPLXZ(re) (complex_64){re, X_0}
   719  
   720  // RTS
   721  
   722  extern char *_char (int);
   723  extern char *__strtok_r (char *, const char *, char **);
   724  extern char *_strupper (char *);
   725  extern char **_vif_jit (char *, char *);
   726  
   727  extern void _pi4 (real_4 *);
   728  extern void _pi8 (real_8 *);
   729  extern void _pi16 (real_16 *);
   730  extern void _pi32 (real_32 *);
   731  
   732  extern complex_16 _dcmplxq (complex_32);
   733  extern complex_16 _up_complex (complex_16, int_4);
   734  
   735  extern complex_32 _qcmplxd (complex_16);
   736  extern complex_32 _up_complex_32 (complex_32, int_4);
   737  
   738  extern complex_8 _cmplxd (complex_16);
   739  extern complex_8 _up_complex_8 (complex_8, int_4);
   740  
   741  extern int_4 _backspace (char *, int_4);
   742  extern int_4 _i1mach (int_4 *);
   743  extern int_4 _index (char *, char *);
   744  extern int_4 _init_file_buffer (int_4);
   745  extern int_4 _rewind (char *, int_4);
   746  extern int_4 _set_record (char *, int_4, int_4);
   747  extern int_4 _sys (char *, char *, char *, const char *, ...);
   748  extern int_4 _str_to_int4 (char *);
   749  extern int_4 _up_int_4 (int_4, int_4);
   750  extern int_4 _vif_printf (int_4, char *, void *, int_4, int_4);
   751  extern int_4 _vif_scanf (int_4, char *, void *, int_4, int_4);
   752  extern int_4 _xerclr (void);
   753  extern int_4 _xermsg (char *, char *, char *, int_4 *, int_4 *);
   754  extern int_4 _xgetf (int_4 *);
   755  extern int_4 _xint4 (real_32);
   756  extern int_4 _xsetf (int_4 *);
   757  
   758  extern int_8 _up_int_8 (int_8, int_4);
   759  extern int_8 _xint8 (real_32);
   760  extern int_8 _xnint8 (real_32);
   761  
   762  extern real_16 acotanq (real_16);
   763  extern real_16 cotanq (real_16);
   764  extern real_16 _qext (real_8);
   765  extern real_16 _up_real_16 (real_16, int_4);
   766  extern real_16 _strtoquad (char *, char **);
   767  extern real_16 xtoquad (real_32);
   768  extern real_16 _zabs_32 (real_16 re, real_16 im);
   769  extern real_16 cximagq (complex_64);
   770  extern real_16 cxrealq (complex_64);
   771  
   772  extern real_32 _quadtop (real_32 *, real_16);
   773  extern real_32 quadtox (real_16);
   774  extern real_32 _xerf (real_32);
   775  extern real_32 _aintx (real_32);
   776  extern real_32 _xI (real_32);
   777  extern real_32 _xmod (real_32, real_32);
   778  extern real_32 _xdimx (real_32, real_32);
   779  extern real_32 _anintx (real_32);
   780  extern real_32 _zabs_64 (real_32 re, real_32 im);
   781  
   782  extern real_4 acotanf (real_4);
   783  extern real_4 cotanf (real_4);
   784  extern real_4 _up_real_4 (real_4, int_4);
   785  extern real_4 _zabs_8 (real_4 re, real_4 im);
   786  
   787  extern real_8 acotan (real_8);
   788  extern real_8 cotan (real_8);
   789  extern real_8 _drand48 (void);
   790  extern real_8 _seconds (void);
   791  extern real_8 _str_to_real8 (char *);
   792  extern real_8 _up_real_8 (real_8, int_4);
   793  extern real_8 _zabs_16 (real_8 re, real_8 im);
   794  
   795  extern void _cputim (real_8 *);
   796  extern void _cputyd (int_4 *);
   797  extern void _fcheck (char *, int_4, char *, char *);
   798  extern void _fclose (int_4);
   799  extern void _fprintf_real_32 (char *, char *, real_32, int_4, int_4);
   800  extern void _fregister (char *, int_4, int_4, char *, char *, char *, char *);
   801  extern void _funregister (char *, int_4);
   802  extern void _ioend_read (char *, int_4);
   803  extern void _ioerr (char *, int_4);
   804  extern void _ioerr_read (char *, int_4);
   805  extern void _ioerr_write (char *, int_4);
   806  extern void _merfi (real_8 *, real_8 *, int_4 *);
   807  extern void _qhex (real_16 *);
   808  extern void _skip_eol (FILE *);
   809  extern void _srand48 (int_4 *);
   810  extern void _vif_exit (void);
   811  extern void _vif_freq (CALLS *);
   812  extern void _vif_init (void);
   813  extern void _xhex (real_32 *);
   814  
   815  extern complex_64 _coctotop (complex_64 *, real_32);
   816  extern complex_64 _cquadtop (complex_64 *, complex_32);
   817  extern complex_64 cxcos (complex_64);
   818  extern complex_64 cxflt(complex_8);
   819  extern complex_64 cxdbl(complex_16);
   820  extern complex_64 cxdiv (complex_64, complex_64);
   821  extern complex_64 cxexp (complex_64);
   822  extern complex_64 cxlog (complex_64);
   823  extern complex_64 cxmul (complex_64, complex_64);
   824  extern complex_64 cxneg (complex_64);
   825  extern complex_64 cxquad(complex_32);
   826  extern complex_64 cxreal32(real_32);
   827  extern complex_64 cxsin (complex_64);
   828  extern complex_64 cxsqrt (complex_64);
   829  extern complex_64 cxsub (complex_64, complex_64);
   830  extern complex_64 cxsum (complex_64, complex_64);
   831  extern complex_64 cxtan (complex_64);
   832  
   833  extern int_4 xsgn (const real_32 *);
   834  
   835  extern logical_4 xeq (real_32, real_32); 
   836  extern logical_4 xge (real_32, real_32); 
   837  extern logical_4 xgt (real_32, real_32);  
   838  extern logical_4 xis0 (const real_32 *);
   839  extern logical_4 xis_minf (const real_32 *);
   840  extern logical_4 xis_nan (const real_32 *);
   841  extern logical_4 xis_pinf (const real_32 *);
   842  extern logical_4 xle (real_32, real_32);  
   843  extern logical_4 xlt (real_32, real_32);
   844  extern logical_4 xneq (real_32, real_32);
   845  extern logical_4 xnot0 (const real_32 *);
   846  
   847  extern real_32 atox (char *);
   848  extern real_32 cximag (complex_64);
   849  extern real_32 cxreal (complex_64);
   850  extern real_32 dbltox (real_8);
   851  extern real_32 flttox (real_4);
   852  extern real_32 inttox (int_4);
   853  extern real_32 strtox (char *, char **);
   854  extern real_32 xabs (real_32);
   855  extern real_32 xacosh (real_32);
   856  extern real_32 xacos (real_32);
   857  extern real_32 xacotan (real_32);
   858  extern real_32 xadd (real_32, real_32, int_4);
   859  extern real_32 xasinh (real_32);
   860  extern real_32 xasin (real_32);
   861  extern real_32 xatan2 (real_32, real_32);
   862  extern real_32 xatanh (real_32);
   863  extern real_32 xatan (real_32);
   864  extern real_32 xcosh (real_32);
   865  extern real_32 xcos (real_32);
   866  extern real_32 xcotan (real_32);
   867  extern real_32 xdiv (real_32, real_32);
   868  extern real_32 xexp (real_32);
   869  extern real_32 _xhypot (real_32, real_32);
   870  extern real_32 xfrac (real_32);
   871  extern real_32 xlog10 (real_32);
   872  extern real_32 xlog (real_32);
   873  extern real_32 xmul (real_32, real_32);
   874  extern real_32 xneg (real_32);
   875  extern real_32 xpwr (real_32, int_4);
   876  extern real_32 xround (real_32);
   877  extern real_32 xsfmod (real_32, int_4 *);
   878  extern real_32 xsinh (real_32);
   879  extern real_32 xsin (real_32);
   880  extern real_32 xsqrt (real_32);
   881  extern real_32 xtanh (real_32);
   882  extern real_32 xtan (real_32);
   883  extern real_32 xtenup (int_4);
   884  extern real_32 xtrunc (real_32);
   885  extern real_4 xtoflt (real_32);
   886  extern real_8 xtodbl (real_32);
   887  
   888  // SLATEC message handling routines.
   889  
   890  extern int_4 _j4save (int_4 _p_, int_4 _p_, logical_4 _p_);
   891  extern int_4 _xerabt (char _p_, int_4 *);
   892  extern int_4 _xerbla (char _p_, int_4 _p_);
   893  extern int_4 _xerclr (void);
   894  extern int_4 _xerdmp (void);
   895  extern int_4 _xermax (int_4 _p_);
   896  extern int_4 _xermsg (char _p_, char _p_, char _p_, int_4 _p_, int_4 _p_);
   897  extern int_4 _xerprn (char _p_, int_4 _p_, char _p_, int_4 _p_);
   898  extern int_4 _xersve (char _p_, char _p_, char _p_, int_4 _p_, int_4 _p_, int_4 _p_, int_4 _p_);
   899  extern int_4 _xgetf (int_4 _p_);
   900  extern int_4 _xgetua (int_4 _p_, int_4 _p_);
   901  extern int_4 _xgetun (int_4 _p_);
   902  extern int_4 _xsetf (int_4 _p_);
   903  extern int_4 _xsetua (int_4 _p_, int_4 _p_);
   904  extern int_4 _xsetun (int_4 _p_);
   905  #endif


© 2002-2025 J.M. van der Veer (jmvdveer@xs4all.nl)