1 /* The global variables of REXX/imc (C) Ian Collier 1993 */ 2 3 #include<stdio.h> 4 #include<setjmp.h> 5 #include<sys/types.h> 6 #include<sys/time.h> 7 #include"const.h" 8 #include"globals.h" 9 #define INCL_RXSYSEXIT 10 #include"rexxsaa.h" 11 12 char fname[maxvarname]; /* the current file name */ 13 char extension[maxextension]; /* the default file extension */ 14 int extlen; /* and its length */ 15 int lines; /* number of lines in current source */ 16 int stmts; /* number of statements in current program*/ 17 char **source=0; /* the source of the current program */ 18 program *prog=0; /* the current program, tokenised */ 19 char *labelptr=cnull; /* start of label table */ 20 int *varstk=inull; /* offsets to levels in variable table */ 21 unsigned varstklen; /* number of elements allocated to varstk */ 22 int varstkptr; /* current level number */ 23 char *vartab=cnull; /* start of variable table */ 24 unsigned vartablen; /* space allocated to vartab */ 25 char *cstackptr=cnull; /* start of calculator stack */ 26 unsigned ecstackptr; /* length of calculator stack */ 27 unsigned cstacklen; /* space allocated to calculator stack */ 28 char *workptr=cnull; /* start of workspace */ 29 unsigned eworkptr; /* amount of workspace used */ 30 unsigned worklen; /* space allocated to workspace */ 31 char *pstackptr; /* start of program stack */ 32 unsigned epstackptr; /* length of program stack */ 33 unsigned pstacklen; /* space allocated to program stack */ 34 int pstacklev=0; /* program stack level within current func */ 35 char *hashptr[3]={0,0,0}; /* pointers to 3 hash tables */ 36 unsigned ehashptr[3]={0,0,0}; /* lengths of hash tables */ 37 unsigned hashlen[3]={0,0,0}; /* space allocated to hash tables */ 38 struct sigstruct *sgstack; /* contexts of all calls to interpreter() */ 39 /* and which signals to catch */ 40 unsigned sigstacklen=0; /* number of elements allocated to sgstack */ 41 int delayed[Imax]; /* Which signals are pending action */ 42 char *sigdata[Imax]={0,0,0,0,0,0}; /* Descriptions for pending signals */ 43 jmp_buf interactbuf; /* context of interactive trace routine */ 44 jmp_buf *exitbuf; /* where to go on exit */ 45 int interplev=-1; /* nesting level of interpreter() */ 46 int interact= -1; /* interplev of interactive trace, or -1 */ 47 int interactmsg=0; /* Whether to emit message at interactive() */ 48 int ppc=-1; /* Statement number being interpreted */ 49 int oldppc; /* saved position in case of error */ 50 int newppc; /* statement to jump to */ 51 char **curargs; /* current arguments, for ARG() */ 52 int *curarglen; /* lengths of current arguments */ 53 char *errordata=cnull; /* data to print after error message */ 54 int precision=9; /* NUMERIC DIGITS */ 55 int fuzz=9; /* NUMERIC DIGITS minus NUMERIC FUZZ */ 56 char numform=0; /* 0=SCIENTIFIC, 1=ENGINEERING */ 57 char trcflag=Tfailures; /* what to trace */ 58 char trcresult=0; /* nesting level of scanning() */ 59 char otrcflag; /* temporary store for trace flag */ 60 char trclp; /* whether to get input in interactive mode */ 61 char timeflag=0; /* bit 0: used elapsed time counter */ 62 /* bit 1: timestamp in operation */ 63 /* bit 2: used random number generator */ 64 long secs;long microsecs; /* timestamp when TIME(r) was last called */ 65 struct timeval timestamp; /* the timestamp, if in operation */ 66 int address0=0; /* The initial environment */ 67 int address1=0; /* The current environment */ 68 int address2=0; /* The alternate environment */ 69 char *rxpath; /* where to find libraries if not in REXXLIB */ 70 FILE *ttyin,*ttyout; /* access to the terminal */ 71 char *pull=cnull; /* storage used for input */ 72 unsigned pulllen=0; /* space allocated for pull */ 73 char *returnval; /* value returned by EXIT */ 74 int returnlen; /* length of that value */ 75 char *returnfree; /* what to free after returnval has been used */ 76 int rxstacksock; /* fd number of stack socket */ 77 char *varnamebuf; /* workspace for evaluating variable names */ 78 int varnamelen; /* amount of memory allocated for varnamebuff */ 79 FILE *traceout=0; /* Where to send trace output */ 80 int lasterror=0; /* The last error which occurred on I/O */ 81 int setrcflag=0; /* flag for "options setrc" */ 82 int exposeflag=0; /* flag for "options expose" */ 83 int sigpipeflag=0; /* flag for "options sigpipe" */ 84 varent *nextvar=0; /* next variable for RXSHV_NEXTV */ 85 86 87 long (*exitlist[RXEXITNUM])(); /* list of exit addresses */ 88 89 char *conditions[]= /* condition names in the same order as their I-values */ 90 {"SYNTAX","ERROR","HALT","NOVALUE","FAILURE","NOTREADY"}; 91 92 /* Character classification tables */ 93 94 /* 0 1 2 3 4 5 6 7 8 9 A B C D E F * 95 { ., ., ., ., ., ., ., ., .,\t,\n, ., .,\r, ., ., * 0 * 96 ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., ., * 1 * 97 , !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, * 2 * 98 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, * 3 * 99 @, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, * 4 * 100 P, Q, R, S, T, U, V, W, X, Y, Z, [, \, ], ^, _, * 5 * 101 `, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, * 6 * 102 p, q, r, s, t, u, v, w, x, y, z, {, |, }, ~, .}; * 7 */ 103 104 /* Table of types: -2 invalid, -1 tokenisable special char, 1 symbol char, 105 2 number, 0 other */ 106 /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ 107 int types[256]={-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2, /* 0 */ 108 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, /* 1 */ 109 0, 1, 0, 1, 1, 0,-1, 0, 0, 0,-1, 0, 0, 0, 1,-1, /* 2 */ 110 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,-1,-1,-1, 1, /* 3 */ 111 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4 */ 112 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,-2,-1,-2,-1, 1, /* 5 */ 113 -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6 */ 114 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,-2,-1,-2,-2,-2, /* 7 */ 115 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, /* 8 */ 116 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, /* 9 */ 117 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, /* A */ 118 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, /* B */ 119 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, /* C */ 120 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, /* D */ 121 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, /* E */ 122 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2};/* F */ 123 124 /* Alphanum table: 1 letter, 2 number, 3 dot, 0 other */ 125 /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ 126 int alphs[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0 */ 127 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1 */ 128 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* 2 */ 129 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, /* 3 */ 130 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4 */ 131 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 5 */ 132 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6 */ 133 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};/* 7 */ 134 135 /* Symbol table: 0 if invalid in a simple symbol, -1 if valid except at 136 start, 1 otherwise */ 137 /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ 138 int symbs[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0 */ 139 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1 */ 140 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2 */ 141 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, /* 3 */ 142 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4 */ 143 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5 */ 144 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6 */ 145 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/* 7 */ 146 147