|
|
1.1 root 1: #include "global.h"
2: #include "lfuncs.h"
3: #include "chkrtab.h"
4: #include <signal.h>
5:
6: lispval
7: Nsyscall() {
8: register lispval aptr, temp;
9: register int acount = 0;
10: int args[50];
11: snpand(3);
12:
13: aptr = lbot->val;
14: temp = eval(aptr->car);
15: if (TYPE(temp) != INT)
16: return(error("syscall", FALSE));
17: args[acount++] = temp->i;
18: aptr = aptr->cdr;
19: while( aptr != nil && acount < 49) {
20: temp = eval(aptr->car);
21: switch(TYPE(temp)) {
22:
23: case ATOM:
24: args[acount++] = (int)temp->a.pname;
25: break;
26:
27: case INT:
28: args[acount++] = (int)temp->i;
29: break;
30:
31: default:
32: return(error("syscall", FALSE));
33: }
34: aptr = aptr->cdr;
35: }
36:
37: if (acount==0) chkarg(2); /* produce arg count message */
38: temp = newint();
39: temp->i = vsyscall(args);
40: return(temp);
41: }
42:
43: /* eval-when: this has the form (eval-when <list> <form1> <form2> ...)
44: where the list may contain any combination of `eval', `load', `compile'.
45: The interpreter (us) looks for the atom `eval', if it is present
46: we treat the rest of the forms as a progn.
47: */
48:
49: lispval
50: Nevwhen()
51: {
52: register lispval handy;
53: snpand(1);
54:
55: for(handy=(lbot->val)->car ; handy != nil ; handy = handy->cdr)
56: if (handy->car == (lispval) Veval) { lbot=np ;
57: protect(((lbot-1)->val)->cdr);
58: return(Nprogn()); } ;
59:
60:
61: return(nil); /* eval not seen */
62: }
63:
64:
65: /* Status functions.
66: * These operate on the statuslist stlist which has the form:
67: * ( status_elem_1 status_elem_2 status_elem_3 ...)
68: * where each status element has the form:
69: * ( name readcode setcode . readvalue)
70: * where
71: * name - name of the status feature (the first arg to the status
72: * function).
73: * readcode - fixnum which tells status how to read the value of
74: * this status name. The codes are #defined.
75: * setcode - fixnum which tells sstatus how to set the value of
76: * this status name
77: * readvalue - the value of the status feature is usually stored
78: * here.
79: *
80: * Readcodes:
81: *
82: * ST_READ - if no second arg, return readvalue.
83: * if the second arg is given, we return t if it is eq to
84: * the readvalue.
85: * ST_FEATR - used in (status feature xxx) where we test for xxx being
86: * in the status features list
87: * ST_SYNT - used in (status syntax c) where we return c's syntax code
88: * ST_INTB - read stattab entry
89: * ST_NFETR - used in (status nofeature xxx) where we test for xxx not
90: * being in the status features list
91: * ST_DMPR - read the dumpmode
92: *
93: * Setcodes:
94: * ST_NO - if not allowed to set this status through sstatus.
95: * ST_SET - if the second arg is made the readvalue.
96: * ST_FEATW - for (sstatus feature xxx), we add xxx to the
97: * (status features) list.
98: * ST_TOLC - if non nil, map upper case chars in atoms to lc.
99: * ST_CORE - if non nil, have bus errors and segmentation violations
100: * dump core, if nil have them produce a bad-mem err msg
101: * ST_INTB - set stattab table entry
102: * ST_NFETW - use in (sstatus nofeature xxx) where we wish to remove xxx
103: * from the status feature list.
104: * ST_DMPW - set the dumpmode
105: */
106:
107:
108: lispval
109: Nstatus()
110: {
111: register lispval handy,curitm,valarg;
112: int indx;
113: int typ;
114: extern char *ctable;
115: extern int dmpmode;
116: lispval Istsrch();
117:
118: if(lbot->val == nil) return(nil);
119: handy = lbot->val; /* arg list */
120:
121: while(TYPE(handy) != DTPR) handy = error("status: bad arg list",TRUE);
122:
123: curitm = Istsrch(handy->car); /* look for feature */
124:
125: if( curitm == nil ) return(nil); /* non existant */
126:
127: if( handy->cdr == nil ) valarg = (lispval) CNIL;
128: else valarg = handy->cdr->car;
129:
130: /* now do the processing with curitm pointing to the requested
131: item in the status list
132: */
133:
134: switch( typ = curitm->cdr->car->i ) { /* look at readcode */
135:
136:
137: case ST_READ:
138: curitm = Istsrch(handy->car); /* look for name */
139: if(curitm == nil) return(nil);
140: if( valarg != (lispval) CNIL)
141: error("status: Second arg not allowed.",FALSE);
142: else return(curitm->cdr->cdr->cdr);
143:
144: case ST_NFETR: /* look for feature present */
145: case ST_FEATR: /* look for feature */
146: curitm = Istsrch(matom("features"));
147: if( valarg == (lispval) CNIL)
148: error("status: need second arg",FALSE);
149:
150: for( handy = curitm->cdr->cdr->cdr;
151: handy != nil;
152: handy = handy->cdr)
153: if(handy->car == valarg)
154: return(typ == ST_FEATR ? tatom : nil);
155:
156: return(typ == ST_FEATR ? nil : tatom);
157:
158: case ST_SYNT: /* want characcter syntax */
159: handy = Vreadtable->clb;
160: chkrtab(handy);
161: if( valarg == (lispval) CNIL)
162: error("status: need second arg",FALSE);
163:
164: while (TYPE(valarg) != ATOM)
165: valarg = error("status: second arg must be atom",TRUE);
166:
167: indx = valarg->pname[0]; /* get first char */
168:
169: if(valarg->pname[1] != '\0')
170: error("status: only one character atom allowed",FALSE);
171:
172: (handy = newint())->i = ctable[indx] & 0377;
173: return(handy);
174:
175: case ST_RINTB:
176: return(stattab[curitm->cdr->cdr->cdr->i]);
177:
178: case ST_DMPR:
179: return(inewint(dmpmode));
180:
181: }
182: }
183: lispval
184: Nsstatus()
185: {
186: register lispval handy;
187: lispval Isstatus();
188:
189: handy = lbot->val;
190:
191: while( TYPE(handy) != DTPR || TYPE(handy->cdr) != DTPR)
192: handy = error("sstatus: Bad args",TRUE);
193:
194: return(Isstatus(handy->car,handy->cdr->car));
195: }
196:
197: /* Isstatus - internal routine to do a set status. */
198: lispval
199: Isstatus(curnam,curval)
200: lispval curnam,curval;
201: {
202: register lispval curitm,head;
203: lispval Istsrch(),Iaddstat();
204: int badmemr();
205: extern int uctolc, dmpmode;
206:
207: curitm = Istsrch(curnam);
208: /* if doesnt exist, make one up */
209:
210: if(curitm == nil) curitm = Iaddstat(curnam,ST_READ,ST_SET,nil);
211:
212: switch (curitm->cdr->cdr->car->i) {
213:
214: case ST_NO: error("sstatus: cannot set this status",FALSE);
215:
216: case ST_SET: goto setit;
217:
218: case ST_FEATW: curitm = Istsrch(matom("features"));
219: (curnam = newdot())->car = curval;
220: curnam->cdr = curitm->cdr->cdr->cdr; /* old val */
221: curitm->cdr->cdr->cdr = curnam;
222: return(curval);
223:
224: case ST_NFETW: /* remove from features list */
225: curitm = Istsrch(matom("features"))->cdr->cdr;
226: for(head = curitm->cdr; head != nil; head = head->cdr)
227: {
228: if(head->car == curval) curitm->cdr = head->cdr;
229: else curitm = head;
230: }
231: return(nil);
232:
233:
234: case ST_TOLC: if(curval == nil) uctolc = FALSE;
235: else uctolc = TRUE;
236: goto setit;
237:
238: case ST_CORE: if(curval == nil)
239: {
240: signal(SIGBUS,badmemr); /* catch bus errors */
241: signal(SIGSEGV,badmemr); /* and segmentation viols */
242: }
243: else {
244: signal(SIGBUS,SIG_DFL); /* let them core dump */
245: signal(SIGSEGV,SIG_DFL);
246: }
247: goto setit;
248:
249: case ST_INTB:
250: stattab[curitm->cdr->cdr->cdr->i] = curval;
251: return(curval);
252:
253: case ST_DMPW:
254: if(TYPE(curval) != INT ||
255: (curval->i != 413 &&
256: curval->i != 410)) errorh(Vermisc,"sstatus: bad dump mode:",
257: nil,FALSE,0,curval);
258: dmpmode= curval->i;
259: return(curval);
260: }
261:
262: setit: /* store value in status list */
263: curitm->cdr->cdr->cdr = curval;
264: return(curval);
265:
266:
267: }
268:
269: /* Istsrch - utility routine to search the status list for the
270: name given as an argument. If such an entry is not found,
271: we return nil
272: */
273:
274: lispval Istsrch(nam)
275: lispval nam;
276: {
277: register lispval handy;
278:
279: for(handy = stlist ; handy != nil ; handy = handy->cdr)
280: if(handy->car->car == nam) return(handy->car);
281:
282: return(nil);
283: }
284:
285: /* Iaddstat - add a status entry to the status list */
286: /* return new entry in status list */
287:
288: lispval
289: Iaddstat(name,readcode,setcode,valu)
290: lispval name,valu;
291: int readcode,setcode;
292: {
293: register lispval handy,handy2;
294: snpand(2);
295:
296:
297: protect(handy=newdot()); /* build status list here */
298:
299: (handy2 = newdot())->car = name;
300:
301: handy->car = handy2;
302:
303: ((handy2->cdr = newdot())->car = newint())->i = readcode;
304:
305: handy2 = handy2->cdr;
306:
307: ((handy2->cdr = newdot())->car = newint())->i = setcode;
308:
309: handy2->cdr->cdr = valu;
310:
311: /* link this one in */
312:
313: handy->cdr = stlist;
314: stlist = handy;
315:
316: return(handy->car); /* return new item in stlist */
317: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.