1 /* The constants and data types of REXX/imc      (C) Ian Collier 1992 */
2 
3 #ifndef _const_h
4 #define _const_h
5 
6 #define VER "beta-1.75"
7 #define LEVEL "4.00"  /* Language level supported */
8 
9 /* A paranoid Solaris detector. */
10 #if (defined(__svr4__)||defined(__SVR4)||defined(__SVR4)) && (defined(sun)||defined(__sun)||defined(__sun__))
11 #define Solaris
12 #endif
13 
14 #define four       (sizeof(int))
15 #ifdef POINTER64
16 #define align(x)   (((x)+7)&~7)
17 #define toalign(x) (((~(x))+1)&7)
18 #else
19 #define align(x)   (((x)+3)&~3)
20 #define toalign(x) (((~(x))+1)&3)
21 #endif
22 
23 #define rxmathname "rxmathfn"   /* The basenames of the two REXX auxiliary */
24 #define rxquename  "rxque"      /* files  */
25 
26 #ifndef filetype
27 #define filetype   ".rexx"      /* Default file extension */
28 #endif
29 
30 #define maxopstack 30    /* Maximum number of pending operations in an expr */
31 #define maxvarname 250   /* Maximum length of a variable name or label */
32 #define maxargs 30       /* Maximum number of arguments in function call */
33 #define maxextension 32  /* Maximum length of a file extension */
34 #define maxenviron 31    /* Maximum length of an environment name */
35 #define maxexp 999999999 /* maximum exponent of a number (must fit into int) */
36 #define maxdigits 10000  /* maximum allowable setting for NUMERIC DIGITS */
37 #define maxtracelen 500  /* maximum length of a line of trace */
38 #define traceindent 1    /* Spaces per indentation level in traceback */
39 #define STDIN 0          /* = fileno(stdin) */
40 
41 #define cnull (char *)0  /* Various null pointers ... */
42 #define inull (int *)0
43 
44 #define Isyntax   0      /* Integers associated with the SIGNAL ON traps */
45 #define Ierror    1
46 #define Ihalt     2
47 #define Inovalue  3
48 #define Ifailure  4
49 #define Inotready 5
50 #define Imax      6
51 
52 #define Tclauses    1    /* The bit values for the various TRACE facilities */
53 #define Tlabels     2
54 #define Tresults    4
55 #define Tintermed   8
56 #define Tcommands  16
57 #define Terrors    32
58 #define Tfailures  64
59 #define Tinteract 128
60 
61 /* valid flag values for RexxStartProgram */
62 #define RXMAIN      1   /* Coming from main(). */
63 #define RXVERSION   2   /* Print version.  Exit unless another flag is set. */
64 #define RXOPTIONX   4   /* Do not add file extension; ignore first line. */
65 #define RXEXITS     8   /* Preserve previous exits. */
66 #define RXDIGITS   16   /* Preserve previous NUMERIC DIGITS. */
67 #define RXSTUFF    32   /* Stuff the stack just before it is terminated. */
68 
69 #define Einit      -1   /* Initialisation error */
70 #define Ehalt       4   /* Program interrupted */
71 #define Emem        5   /* Machine storage exhausted */
72 #define Elcomm      6   /* Unmatched '/*' */
73 #define Equote      6   /* Unmatched quote */
74 #define Enowhen     7   /* Expected WHEN */
75 #define Eselect     7   /* Expected OTHERWISE */
76 #define Ethen       8   /* Unexpected THEN */
77 #define Ewhen       9   /* Unexpected WHEN */
78 #define Eend       10   /* Unexpected or unmatched END */
79 #define Echar      13   /* Invalid character in program */
80 #define Enoend     14   /* Incomplete DO/SELECT/IF */
81 #define Eprogend   14
82 #define Ebin       15   /* Invalid binary constant */
83 #define Ehex       15   /* Invalid hexadecimal constant */
84 #define Elabel     16   /* Label not found */
85 #define Eprocedure 17   /* Unexpected PROCEDURE */
86 #define Enothen    18   /* Expected THEN */
87 #define Enostring  19   /* String or symbol expected */
88 #define Enosymbol  20   /* Symbol expected */
89 #define Exend      21   /* Invalid data on end of clause */
90 #define Etrace     24   /* Invalid TRACE request */
91 #define Eform      25   /* Invalid subkeyword found */
92 #define Etrap      25
93 #define Enonint    26   /* Invalid whole number */
94 #define Erange     26
95 #define Exdo       27   /* Invalid DO syntax */
96 #define Eleave     28   /* Invalid LEAVE or ITERATE */
97 #define Elong      30   /* Symbol too long */
98 #define Ename      31   /* Name starts with number or '.' */
99 #define Ebadexpr   35   /* Invalid expression */
100 #define Eassign    35
101 #define Elpar      36   /* Unmatched '(' */
102 #define Ecomma     37   /* Unexpected comma */
103 #define Erpar      37   /* Unexpected ')' */
104 #define Eparse     38   /* Invalid template */
105 #define Eopstk     39   /* Evaluation stack overflow */
106 #define Eargs      40
107 #define Ecall      40   /* Incorrect call to routine */
108 #define Eformat    40
109 #define Enoarg     40
110 #define Enum       41   /* Bad arithmetic conversion */
111 #define Edivide    42
112 #define Eoflow     42   /* Arithmetic overflow or underflow */
113 #define Eundef     43   /* Routine not found */
114 #define Enoresult  44   /* Function did not return data */
115 #define Ereturn    45   /* No data specified on function RETURN */
116 #define Exlabel    47   /* Unexpected label */
117 #define Esys       48   /* Failure in system service */
118 #define Elost      49   /* Implementation error */
119 #define Eincalled  50   /* Error in called routine */
120 #define Enovalue   80   /* No-value error */
121 #define Eexist     81   /* Use of an un-implemented feature! */
122 #define Esyntax    82   /* Syntax error */
123 #define Elabeldot  83   /* Label ends with '.' */
124 #define Emanyargs  84   /* Too many arguments (> 30) */
125 #define Eerror     85   /* command returned error */
126 #define Efailure   86   /* command returned failure */
127 #define Enotready  87   /* I/O operation raised "notready" error */
128 #define Ercomm     88   /* Unexpected '* /' */
129 #define Esig       89   /* Interpreter stopped because of a signal */
130 #define Eeof       99   /* End of file */
131 #define Eerrno    100   /* errortext(rc+Eerrno) gives the IO error for rc */
132 #define Ebounds   200   /* File position was out of bounds */
133 #define Eseek     201   /* Reposition attempted on transient stream */
134 #define Eaccess   202   /* Write attempted on a read-only stream */
135 #define Eread     203   /* Read attempted on a write-only stream */
136 
137 #define numwords 50     /* How many tokens are below */
138 #define Command -102    /* "Command" tokens are strictly less than this */
139 
140 #define SAY       -128  /* The various tokens */
141 #define SAYN      -127  /*  - in the same order as in words[] */
142 #define DO        -126
143 #define END       -125
144 #define IF        -124
145 #define ELSE      -123
146 #define SELECT    -122
147 #define WHEN      -121
148 #define OPTIONS   -120
149 #define PARSE     -119
150 #define PUSH      -118
151 #define QUEUE     -117
152 #define EXIT      -116
153 #define RETURN    -115
154 #define CALL      -114
155 #define SIGNAL    -113
156 #define ITERATE   -112
157 #define LEAVE     -111
158 #define INTERPRET -110
159 #define TRACE     -109
160 #define OTHERWISE -108
161 #define NOP       -107
162 #define PROCEDURE -106
163 #define ADDRESS   -105
164 #define NUMERIC   -104
165 #define DROP      -103
166 #define THEN      -102
167 #define PULL      -101
168 #define ARG       -100
169 #define SOURCE    -99
170 #define VAR       -98
171 #define VERSION   -97
172 #define LINEIN    -96
173 #define VALUE     -95
174 #define WITH      -94
175 #define UPPER     -93
176 #define TO        -92
177 #define BY        -91
178 #define FOR       -90
179 #define FOREVER   -89
180 #define WHILE     -88
181 #define UNTIL     -87
182 #define ON        -86
183 #define OFF       -85
184 #define DIGITS    -84
185 #define FUZZ      -83
186 #define FORM      -82
187 #define EXPOSE    -81
188 #define HIDE      -80
189 #define NAME      -79
190 
191 #define LABEL     -50  /* equals NOP; inserted instead of a label */
192 
193 #define SYMBOL    -16 /*240*/            /* lowest symbol number */
194 #define CONCAT    -15 /*241*/ /* ||  */  /* The various symbolic tokens */
195 #define LXOR      -14 /*242*/ /* &&  */
196 #define EQU       -13 /*243*/ /* ==  */
197 #define LEQ       -12 /*244*/ /* <=  */
198 #define GEQ       -11 /*245*/ /* >=  */
199 #define NEQ       -10 /*246*/ /* \=  */
200 #define NNEQ      -9  /*247*/ /* \== */
201 #define MOD       -8  /*248*/ /* //  */
202 #define LESS      -7  /*249*/ /* <<  */
203 #define GRTR      -6  /*250*/ /* >>  */
204 #define LLEQ      -5  /*251*/ /* <<= */
205 #define GGEQ      -4  /*252*/ /* >>= */
206 #define POWER     -3  /*253*/ /* **  */
207 
208 #define Cconcat   0x7c7c    /* || */     /* ASCII values of these operators */
209 #define Cxor      0x2626    /* && */
210 #define Cequ      0x3d3d    /* == */
211 #define Cleq1     0x3c3d    /* <= */
212 #define Cleq2     0x5c3e    /* \> */
213 #define Cgeq1     0x3e3d    /* >= */
214 #define Cgeq2     0x5c3c    /* \< */
215 #define Cneq1     0x5c3d    /* \= */
216 #define Cneq2     0x3c3e    /* <> */
217 #define Cneq3     0x3e3c    /* >< */
218 #define Cnneq     0x5c3d3d  /* \== */
219 #define Cmod      0x2f2f    /* // */
220 #define Cless     0x3c3c    /* << */
221 #define Cgrtr     0x3e3e    /* >> */
222 #define Clleq1    0x3c3c3d  /* <<= */
223 #define Clleq2    0x5c3e3e  /* \>> */
224 #define Cggeq1    0x3e3e3d  /* >>= */
225 #define Cggeq2    0x5c3c3c  /* \<< */
226 #define Cpower    0x2a2a    /* ** */
227 
228 #define OPpower   0 /* **        */ /* The various operator numbers (used   */
229 #define OPmul     1 /* *         */ /* by scanning() and related functions) */
230 #define OPdiv     2 /* /         */
231 #define OPadd     3 /* + (binary)*/
232 #define OPsub     4 /* - (binary)*/
233 #define OPspc     5 /* space     */
234 #define OPcat     6 /* ||        */
235 #define OPequ     7 /* =         */
236 #define OPeequ    8 /* ==        */
237 #define OPless    9 /* <         */
238 #define OPleq    10 /* <=        */
239 #define OPgrtr   11 /* >         */
240 #define OPgeq    12 /* >=        */
241 #define OPneq    13 /* \=        */
242 #define OPand    14 /* &         */
243 #define OPxor    15 /* &&        */
244 #define OPor     16 /* |         */
245 #define OPidiv   17 /* %         */
246 #define OPmod    18 /* //        */
247 #define OPnneq   19 /* \==       */
248 #define OPlless  20 /* <<        */
249 #define OPggrtr  21 /* >>        */
250 #define OPlleq   22 /* <<=       */
251 #define OPggeq   23 /* >>=       */
252 #define OPneg    24 /* - (unary) */
253 #define OPplus   25 /* + (unary) */
254 #define OPnot    26 /* \         */
255 
256 typedef void (*sighandler)();
257 
258 typedef struct _program {   /* Structure for the preprocessed program */
259    int num;                 /* Line number in source (for traceback) */
260    char *source;            /* Start of this statement within the source */
261    char *sourcend;          /* End of same */
262    int related;             /* A related statement number (if any) */
263    char *line;              /* The program line to be interpreted */
264 } program;
265 
266 struct procstack {  /* A program stack entry for an external procedure call */
267    int stmt;        /* Statement number of call instruction */
268    char *csp;       /* Old calculator stack */
269    int ecsp;        /* Old calculator stack end */
270    int csl;         /* Old calculator stack length */
271    char trc;        /* Old trace flag */
272    char tim;        /* Old timestamp flag */
273    char form;       /* Old NUMERIC FORM */
274                     /* Some padding (one byte, probably) */
275    int digits;      /* Old NUMERIC DIGITS */
276    int fuzz;        /* Old NUMERIC FUZZ */
277    long mic;        /* Old timestamp microseconds */
278    long sec;        /* Old timestamp seconds */
279    int address1;    /* Old current environment */
280    int address2;    /* Old alternate environment */
281    program *prg;    /* Old tokenised program */
282    int stmts;       /* Old number of statements */
283    int lines;       /* Old number of program lines */
284    char **src;      /* Old source */
285    char *lab;       /* Old labels */
286 #ifdef POINTER64
287    int dummy;       /* Artificial padding */
288 #endif
289    int lev;         /* Old pstack level */
290    int len;         /* Length of this stack entry */
291    int type;        /* Type = 13 for external procedure call */
292 };
293 
294 struct procstack2 { /* A program stack entry for a procedure call */
295    int stmt;        /* Statement number of call instruction */
296    char *csp;       /* Old calculator stack */
297    int ecsp;        /* Old calculator stack end */
298    int csl;         /* Old calculator stack length */
299    char trc;        /* Old trace flag */
300    char tim;        /* Old timestamp flag */
301    char form;       /* Old NUMERIC FORM */
302                     /* Some padding (one byte, probably) */
303    int digits;      /* Old NUMERIC DIGITS */
304    int fuzz;        /* Old NUMERIC FUZZ */
305    long mic;        /* Old timestamp microseconds */
306    long sec;        /* Old timestamp seconds */
307    int address1;    /* Old current environment */
308    int address2;    /* Old alternate environment */
309    program *prg;    /* The current interpreted string or the current program */
310 #ifdef POINTER64
311    int dummy;       /* Artificial padding */
312 #endif
313    int stmts;       /* Number of statements in the above */
314    int len;         /* Length of this stack entry */
315    int type;        /* Type = 11 for internal procedure call;  */
316 };                  /*        12 after a PROCEDURE instruction */
317 
318 struct minstack {   /* A minimum program stack entry */
319    int stmt;        /* Statement where block started */
320 #ifdef POINTER64
321    int dummy;       /* Artificial padding */
322 #endif
323    char *pos;       /* Pointer to statement (used to find the WHILE or UNTIL)*/
324    int len;         /* Length of this stack entry */
325    int type;        /* Type =  0 for DO;  */
326 };                  /*         8 for DO WHILE/FOREVER */
327                     /*        10 for DO with control variable */
328                     /*         2 for SELECT */
329 
330 struct forstack {   /* A program stack entry for the "DO count" instruction */
331    int stmt;        /* Statement number of DO instruction */
332 #ifdef POINTER64
333    int dummy1;      /* Artificial padding */
334 #endif
335    char *pos;       /* Pointer to statement (used to find the WHILE or UNTIL)*/
336 #ifdef POINTER64
337    int dummy;       /* More artificial padding */
338 #endif
339    int fornum;      /* Loop counter */
340    int len;         /* Length of this stack entry */
341    int type;        /* Type = 15 for a "DO count" instruction */
342 };
343 
344 struct interpstack {/* A program stack entry for the INTERPRET instruction */
345    int stmt;        /* Statement number of INTERPRET instruction */
346    program *prg;    /* Old tokenised program */
347 #ifdef POINTER64
348    int dummy;       /* Artificial padding */
349 #endif
350    int stmts;       /* Old number of statements */
351    int len;         /* Length of this stack entry */
352    int type;        /* Type = 14 for an INTERPRET instruction */
353 };
354 
355 struct interactstack {/* A program stack entry for interactive instructions */
356                       /* NB always followed by an interpstack entry */
357    int stmt;        /* Statement number of the interruption */
358    char *csp;       /* Old calculator stack */
359    int ecs;         /* Old calculator stack end pointer */
360    int csl;         /* Old calculator stack length */
361    int len;         /* Length of this stack entry */
362    int type;        /* Type = 16 for interactive instructions */
363 };
364 
365 struct errorstack { /* A program stack entry for saving a traceback line */
366    int stmt;        /* Statement number of the error */
367    program *prg;    /* Program where the error occurred */
368 #ifdef POINTER64
369    int dummy;       /* Artificial padding */
370 #endif
371    int stmts;       /* Number of statements in this program */
372    int len;         /* Length of this stack entry */
373    int type;        /* Type = 20 for saved traceback line */
374 };
375 
376 struct fileinfo {   /* Structure containing information about an open file */
377    FILE *fp;        /* The stream pointer */
378    char wr;         /* Whether writing is allowed; -1=write-only */
379    char lastwr;     /* Whether the last operation was a write */
380    char persist;    /* Whether the file is persistent (i.e. a regular file) */
381    long rdpos;      /* The read character position (0-based) */
382    int rdline;      /* The read line position, if known (1-based) */
383    int rdchars;     /* Whether an incomplete line has been read */
384    long wrpos;      /* The write character position (0-based) */
385    int wrline;      /* The write line position, if known (1-based) */
386    int wrchars;     /* Whether an incomplete line has been written */
387    int errnum;      /* Error status for stream('d') */
388 };
389 
390 typedef struct _hashent { /* Structure containing hash table entry */
391    int next;        /* Length of the whole item */
392    int less;        /* Pointer to left child */
393    int grtr;        /* Pointer to right child */
394    void *value;     /* Pointer to value */
395 } hashent;
396 
397 typedef struct _varent {       /* a variable table entry */
398    int next;                   /* length of structure */
399    int less;                   /* position of left child within tree */
400    int grtr;                   /* position of right child within tree */
401    int namelen;                /* length of variable's name */
402    int valalloc;               /* length allocated to variable's value */
403    int vallen;                 /* actual length of variable's value */
404 } varent;
405 
406 typedef struct _funcinfo { /* Structure containing info about a function */
407    void *dlhandle;         /* Handle from dlopen(), if this is the "main" fn */
408    int (*dlfunc)();        /* Address of the function */
409    char *name;             /* file name of a previously found function*/
410    int saa;                /* calling sequence */
411 } funcinfo;
412 
413 typedef struct _dictionary {/* Structure containing a list of REXX functions */
414    char *name;              /* REXX name of function */
415    int (*function)();       /* Address of function */
416 } dictionary;
417 
418 #endif /* !_const_h */
419