|
|
1.1 root 1: /* sccs id @(#)global.h 34.4 10/22/80 */
2:
3: /**********************************************************************/
4: /* */
5: /* file: global.h */
6: /* contents: */
7: /* GLOBAL STUFF *******************************************************/
8:
9: #include <stdio.h>
10: #include <pagsiz.h>
11: #include "config.h"
12: #ifdef UNIXTS
13: #include "tsfix.h"
14: #endif
15:
16: #define AD 0
17:
18: #define peekc(p) (p->_cnt>0? *(p)->_ptr&0377:_filbuf(p)==-1?-1:((p)->_cnt++,*--(p)->_ptr&0377))
19:
20: #define FALSE 0
21: #define TRUE 1
22: #define EVER ;;
23: #define CNIL ((lispval) -4)
24: #define nil ((lispval) 0)
25: #define eofa ((lispval) 20)
26: #define NOTNIL(a) ((int)a)
27: #define ISNIL(a) (!(int)a)
28: #define STRBLEN 512
29:
30:
31: #define NULL_CHAR 0
32: #define LF '\n'
33: #define WILDCHR '\0177'
34:
35:
36: /* type flags and the macros to get them ********************************/
37:
38: #define UNBO -1
39: #define STRNG 0
40: #define ATOM 1
41: #define INT 2
42: #define DTPR 3
43: #define DOUB 4
44: #define BCD 5
45: #define PORT 6
46: #define ARRAY 7
47: #define SDOT 9
48: #define VALUE 10
49:
50: #define HUNK2 11 /* The hunks */
51: #define HUNK4 12
52: #define HUNK8 13
53: #define HUNK16 14
54: #define HUNK32 15
55: #define HUNK64 16
56: #define HUNK128 17
57:
58: /* the numbers per page of the different data objects *******************/
59:
60: #define NUMSPACES 16
61:
62: #define ATOMSPP 25
63: #define STRSPP NBPG
64: #define INTSPP 128
65: #define DTPRSPP 64
66: #define DOUBSPP 64
67: #define ARRAYSPP 25
68: #define SDOTSPP 64
69: #define VALSPP 128
70: #define BCDSPP 64
71:
72: #define HUNK2SPP 64 /* hunk page sizes */
73: #define HUNK4SPP 32
74: #define HUNK8SPP 16
75: #define HUNK16SPP 8
76: #define HUNK32SPP 4
77: #define HUNK64SPP 2
78: #define HUNK128SPP 1
79:
80: extern char typetable[]; /* the table with types for each page */
81:
82: #define TYPL(a1) ((typetable+1)[(int)(a1) >> 9])
83: #define SETTYPE(a1,b) {if((itemp = ((int)a1) >> 9) >= TTSIZE) badmem();\
84: (typetable + 1)[itemp] = (b); }
85:
86: #define TYPE(a1) ((typetable+1)[(int)(a1) >> 9])
87: #define HUNKP(a1) ((TYPE(a1)+5) & 16)
88: #define HUNKSIZE(a1) ((TYPE(a1)+5) & 15)
89:
90: #define VALID(a) (a >= CNIL && a < datalim)
91:
92: /* some types ***********************************************************/
93: #define lispint long
94: #define MAX10LNG 200000000 /* max long divided by 10 */
95:
96:
97: typedef union lispobj *lispval ;
98:
99: struct dtpr {
100: lispval cdr, car;
101: };
102:
103: struct sdot {
104: int I;
105: lispval CDR;
106: };
107:
108:
109: struct atom {
110: lispval clb; /* current level binding*/
111: lispval plist; /* pointer to prop list */
112: #ifndef WILD
113: lispval fnbnd; /* function binding */
114: #endif
115: struct atom *hshlnk; /* hash link to next */
116: char *pname; /* print name */
117: };
118: #ifdef WILD
119: #define fnbnd clb
120: #endif
121:
122: struct array {
123: lispval accfun, /* access function--may be anything */
124: aux; /* slot for dimensions or auxilliary data */
125: char *data; /* pointer to first byte of array */
126: lispval length, delta; /* length in items and length of one item */
127: };
128:
129: struct bfun {
130: lispval (*entry)(); /* entry point to routine */
131: lispval discipline, /* argument-passing discipline */
132: language, /* language coded in */
133: params, /* parameter list if relevant */
134: loctab; /* local table */
135: };
136:
137: struct Hunk {
138: lispval hunk[1];
139: };
140:
141: union lispobj {
142: struct atom a;
143: FILE *p;
144: struct dtpr d;
145: long int i;
146: long int *j;
147: double r;
148: lispval (*f)();
149: struct array ar;
150: struct sdot s;
151: char c;
152: lispval l;
153: struct bfun bcd;
154: struct Hunk h;
155: };
156:
157:
158: #include "sigtab.h" /* table of all pointers to lisp data */
159:
160: /* Port definitions *****************************************************/
161: extern FILE *piport, /* standard input port */
162: *poport, /* standard output port */
163: *errport, /* port for error messages */
164: *rdrport; /* temporary port for readr */
165: extern FILE *xports[]; /* page of file *'s for lisp */
166: extern int lineleng ; /* line length desired */
167: extern char rbktf; /* logical flag: ] mode */
168: extern char *ctable; /* Character table in current use */
169: #define Xdqc ctable[131]
170: #define Xesc ctable[130]
171: #define Xsdc ctable[129]
172:
173: /* name stack ***********************************************************/
174:
175: #define NAMESIZE 3072
176:
177: /* the name stack limit is raised by NAMINC every namestack overflow to allow
178: a user function to handle the error
179: */
180: #define NAMINC 25
181:
182: extern struct nament {
183: lispval val,
184: atm;
185: } *bnp, /* first free bind entry*/
186: *bnplim; /* limit of bindstack */
187:
188: struct argent {
189: lispval val;
190: };
191: extern struct argent *lbot, *np, *namptr;
192: extern struct nament *bnp; /* first free bind entry*/
193: extern struct argent *nplim; /* don't have this = np */
194: extern struct argent *orgnp; /* used by top level to reset to start */
195: extern struct nament *orgbnp; /* used by top level to reset to start */
196: extern struct nament *bnplim; /* limit of bindstack */
197: extern struct argent *np, /* top entry on stack */
198: *lbot, /* bottom of cur frame */
199: *namptr; /* temporary pointer */
200: extern lispval sigacts[16];
201: extern lispval hunk_pages[7], hunk_items[7], hunk_name[7];
202:
203: #define TNP if(np >= nplim) namerr();
204:
205: #define TNP if(np >= nplim) namerr();
206: #define INRNP if (np++ >= nplim) namerr();
207: #define protect(p) (np++->val = (p))
208: #define chkarg(p,x); if((p)!=np-lbot) argerr(x);
209:
210:
211: /** status codes **********************************************/
212: /* */
213: /* these define how status and sstatus should service probes */
214: /* into the lisp data base */
215:
216: /* common status codes */
217: #define ST_NO 0
218:
219: /* status codes */
220: #define ST_READ 1
221: #define ST_FEATR 2
222: #define ST_SYNT 3
223: #define ST_RINTB 4
224: #define ST_NFETR 5
225: #define ST_DMPR 6
226: #define ST_CTIM 7
227: #define ST_LOCT 8
228: #define ST_ISTTY 9
229: #define ST_UNDEF 10
230:
231: /* sstatus codes */
232: #define ST_SET 1
233: #define ST_FEATW 2
234: #define ST_TOLC 3
235: #define ST_CORE 4
236: #define ST_INTB 5
237: #define ST_NFETW 6
238: #define ST_DMPW 7
239: #define ST_AUTR 8
240: #define ST_TRAN 9
241: #define ST_BCDTR 10
242:
243:
244: /* number of counters for fasl to use in a profiling lisp */
245: #define NMCOUNT 5000
246:
247: /* hashing things *******************************************************/
248: #define HASHTOP 1024 /* we handle 8-bit characters by dropping top bit */
249: extern struct atom *hasht[HASHTOP];
250: extern int hash; /* set by ratom */
251: extern int atmlen; /* length of atom including final null */
252:
253:
254: /** exception handling ***********************************************/
255: extern int exception; /* if TRUE then an exception is pending, one of */
256: /* the below */
257: extern int sigintcnt; /* if > 0 then there is a SIGINT pending */
258:
259: /* big string buffer for whomever needs it ******************************/
260: extern char strbuf[STRBLEN];
261: extern char *endstrb;
262:
263: /* break and error declarations *****************************************/
264: #define SAVSIZE 44 /* number of bytes saved by setexit */
265: #define BRRETB 1
266: #define BRCONT 2
267: #define BRGOTO 3
268: #define BRRETN 4
269: #define INTERRUPT 5
270: #define THROW 6
271: extern int depth; /* depth of nested breaks */
272: extern lispval contval; /* the value being returned up */
273: extern int retval; /* used by each error/prog call */
274: extern int rsetsw; /* used by *rset mode */
275:
276:
277: /* other stuff **********************************************************/
278: extern lispval ftemp,vtemp,argptr,ttemp; /* temporaries: use briefly */
279: extern int itemp;
280: /* for pointer type conversion */
281: #include "dfuncs.h"
282:
283: #define NUMBERP 2
284: #define BCDP 5
285: #define PORTP 6
286: #define ARRAYP 7
287:
288: #define ABSVAL 0
289: #define MINUS 1
290: #define ADD1 2
291: #define SUB1 3
292: #define NOT 4
293: #define LNILL 5
294: #define ZEROP 6
295: #define ONEP 7
296: #define PLUS 8
297: #define TIMES 9
298: #define DIFFERENCE 10
299: #define QUOTIENT 11
300: #define MOD 12
301: #define LESSP 13
302: #define GREATERP 14
303: #define SUM 15
304: #define PRODUCT 16
305: #define AND 17
306: #define OR 18
307: #define XOR 19
308:
309: interpt();
310: handler(); extern sigdelay, sigstruck;
311:
312: /* limit of valid data area **************************************/
313:
314: extern lispval datalim;
315:
316: /** macros to push and pop the value of an atom on the stack ******/
317:
318: #define PUSHDOWN(atom,value)\
319: {bnp->atm=(atom);bnp++->val=(atom)->a.clb;(atom)->a.clb=value;\
320: if(bnp>bnplim) binderr();}
321:
322: #define POP\
323: {--bnp;bnp->atm->a.clb=bnp->val;}
324:
325: /** macro for evaluating atoms in eval and interpreter ***********/
326:
327: #define EVALATOM(x) vtemp = x->a.clb;\
328: if( vtemp == CNIL ) {\
329: printf("%s: ",(x)->a.pname);\
330: vtemp = error("UNBOUND VARIABLE",TRUE);}
331:
332: /* having to do with small integers */
333:
334: #define SMALL(i) ((lispval)(1024 + (i<<2)))
335: #define P(p) ((lispval) (xports +((p)-_iob)))
336: #define PN(p) ((int) ((p)-_iob))
337: #define okport(arg,default) (vtemp = arg,((TYPE((vtemp))!=PORT)?default:(vtemp)->p))
338:
339: extern lispval ioname[]; /* names of open files */
340: /* interpreter globals */
341:
342: extern int lctrace;
343:
344: /* register lisp macros for registers */
345:
346: #define saveonly(n) asm("#save n")
347: #define snpand(n) asm("#protect n")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.