|
|
1.1 root 1: static char *sccsid = "@(#)fex4.c 34.1 10/3/80";
2:
3: #include "global.h"
4: #include "lfuncs.h"
5: #include "chkrtab.h"
6: #include <signal.h>
7:
8: /* this is now a lambda function instead of a nlambda.
9: the only reason that it wasn't a lambda to begin with is that
10: the person who wrote it didn't know how to write a lexpr
11: - jkf
12: */
13: lispval
14: Lsyscall() {
15: register lispval temp;
16: register struct argent *aptr;
17: register int acount = 0;
18: int args[50];
19: snpand(3);
20:
21: /* there must be at least one argument */
22:
23: if (np==lbot) { chkarg(1,"syscall"); }
24:
25: aptr = lbot;
26: temp = lbot->val;
27: if (TYPE(temp) != INT)
28: return(error("syscall: bad first argument ", FALSE));
29: args[acount++] = temp->i;
30: while( ++aptr < np && acount < 49) {
31: temp = aptr->val;
32: switch(TYPE(temp)) {
33:
34: case ATOM:
35: args[acount++] = (int)temp->a.pname;
36: break;
37:
38: case STRNG:
39: args[acount++] = (int) temp;
40: break;
41:
42: case INT:
43: args[acount++] = (int)temp->i;
44: break;
45:
46: default:
47: return(error("syscall: arg not symbol, string or fixnum", FALSE));
48: }
49: }
50:
51: temp = newint();
52: temp->i = vsyscall(args);
53: return(temp);
54: }
55:
56: /* eval-when: this has the form (eval-when <list> <form1> <form2> ...)
57: where the list may contain any combination of `eval', `load', `compile'.
58: The interpreter (us) looks for the atom `eval', if it is present
59: we treat the rest of the forms as a progn.
60: */
61:
62: lispval
63: Nevwhen()
64: {
65: register lispval handy;
66: snpand(1);
67:
68: for(handy=(lbot->val)->d.car ; handy != nil ; handy = handy->d.cdr)
69: if (handy->d.car == (lispval) Veval) { lbot=np ;
70: protect(((lbot-1)->val)->d.cdr);
71: return(Nprogn()); } ;
72:
73:
74: return(nil); /* eval not seen */
75: }
76:
77:
78: /* Status functions.
79: * These operate on the statuslist stlist which has the form:
80: * ( status_elem_1 status_elem_2 status_elem_3 ...)
81: * where each status element has the form:
82: * ( name readcode setcode . readvalue)
83: * where
84: * name - name of the status feature (the first arg to the status
85: * function).
86: * readcode - fixnum which tells status how to read the value of
87: * this status name. The codes are #defined.
88: * setcode - fixnum which tells sstatus how to set the value of
89: * this status name
90: * readvalue - the value of the status feature is usually stored
91: * here.
92: *
93: * Readcodes:
94: *
95: * ST_READ - if no second arg, return readvalue.
96: * if the second arg is given, we return t if it is eq to
97: * the readvalue.
98: * ST_FEATR - used in (status feature xxx) where we test for xxx being
99: * in the status features list
100: * ST_SYNT - used in (status syntax c) where we return c's syntax code
101: * ST_INTB - read stattab entry
102: * ST_NFETR - used in (status nofeature xxx) where we test for xxx not
103: * being in the status features list
104: * ST_DMPR - read the dumpmode
105: * ST_UNDEF - return the undefined functions in the transfer table
106: *
107: * Setcodes:
108: * ST_NO - if not allowed to set this status through sstatus.
109: * ST_SET - if the second arg is made the readvalue.
110: * ST_FEATW - for (sstatus feature xxx), we add xxx to the
111: * (status features) list.
112: * ST_TOLC - if non nil, map upper case chars in atoms to lc.
113: * ST_CORE - if non nil, have bus errors and segmentation violations
114: * dump core, if nil have them produce a bad-mem err msg
115: * ST_INTB - set stattab table entry
116: * ST_NFETW - use in (sstatus nofeature xxx) where we wish to remove xxx
117: * from the status feature list.
118: * ST_DMPW - set the dumpmode
119: * ST_BCDTR - (ifdef RSET) if non nil, creat trace stack entries for
120: * calls from BCD functions to BCD functions
121: */
122: #include <time.h>
123:
124: lispval
125: Nstatus()
126: {
127: register lispval handy,curitm,valarg;
128: int indx,ctim;
129: int typ;
130: char *cp;
131: char *ctime();
132: struct tm *lctime,*localtime();
133: extern char *ctable;
134: extern int dmpmode;
135: extern lispval chktt();
136: lispval Istsrch();
137: snpand(3);
138:
139: if(lbot->val == nil) return(nil);
140: handy = lbot->val; /* arg list */
141:
142: while(TYPE(handy) != DTPR) handy = error("status: bad arg list",TRUE);
143:
144: curitm = Istsrch(handy->d.car); /* look for feature */
145:
146: if( curitm == nil ) return(nil); /* non existant */
147:
148: if( handy->d.cdr == nil ) valarg = (lispval) CNIL;
149: else valarg = handy->d.cdr->d.car;
150:
151: /* now do the processing with curitm pointing to the requested
152: item in the status list
153: */
154:
155: switch( typ = curitm->d.cdr->d.car->i ) { /* look at readcode */
156:
157:
158: case ST_READ:
159: curitm = Istsrch(handy->d.car); /* look for name */
160: if(curitm == nil) return(nil);
161: if( valarg != (lispval) CNIL)
162: error("status: Second arg not allowed.",FALSE);
163: else return(curitm->d.cdr->d.cdr->d.cdr);
164:
165: case ST_NFETR: /* look for feature present */
166: case ST_FEATR: /* look for feature */
167: curitm = Istsrch(matom("features"));
168: if( valarg == (lispval) CNIL)
169: error("status: need second arg",FALSE);
170:
171: for( handy = curitm->d.cdr->d.cdr->d.cdr;
172: handy != nil;
173: handy = handy->d.cdr)
174: if(handy->d.car == valarg)
175: return(typ == ST_FEATR ? tatom : nil);
176:
177: return(typ == ST_FEATR ? nil : tatom);
178:
179: case ST_SYNT: /* want character syntax */
180: handy = Vreadtable->a.clb;
181: chkrtab(handy);
182: if( valarg == (lispval) CNIL)
183: error("status: need second arg",FALSE);
184:
185: while (TYPE(valarg) != ATOM)
186: valarg = error("status: second arg must be atom",TRUE);
187:
188: indx = valarg->a.pname[0]; /* get first char */
189:
190: if(valarg->a.pname[1] != '\0')
191: error("status: only one character atom allowed",FALSE);
192:
193: handy = inewint(ctable[indx] & 0377);
194: return(handy);
195:
196: case ST_RINTB:
197: return(stattab[curitm->d.cdr->d.cdr->d.cdr->i]);
198:
199: case ST_DMPR:
200: return(inewint(dmpmode));
201:
202: case ST_CTIM:
203: ctim = time(0);
204: cp = ctime(&ctim);
205: cp[24] = '\0';
206: return(matom(cp));
207:
208: case ST_LOCT:
209: ctim = time(0);
210: lctime = localtime(&ctim);
211: (handy = newdot())->d.car = inewint(lctime->tm_sec);
212: protect(handy);
213: handy->d.cdr = (valarg = newdot());
214: valarg->d.car = inewint(lctime->tm_min);
215: valarg->d.cdr = (curitm = newdot());
216: curitm->d.car = inewint(lctime->tm_hour);
217: curitm->d.cdr = (valarg = newdot());
218: valarg->d.car = inewint(lctime->tm_mday);
219: valarg->d.cdr = (curitm = newdot());
220: curitm->d.car = inewint(lctime->tm_mon);
221: curitm->d.cdr = (valarg = newdot());
222: valarg->d.car = inewint(lctime->tm_year);
223: valarg->d.cdr = (curitm = newdot());
224: curitm->d.car = inewint(lctime->tm_wday);
225: curitm->d.cdr = (valarg = newdot());
226: valarg->d.car = inewint(lctime->tm_yday);
227: valarg->d.cdr = (curitm = newdot());
228: valarg->d.car = inewint(lctime->tm_isdst);
229: return(handy);
230:
231: case ST_ISTTY:
232: return( (isatty(0) == TRUE ? tatom : nil));
233:
234: case ST_UNDEF:
235: return(chktt());
236: }
237: }
238: lispval
239: Nsstatus()
240: {
241: register lispval handy;
242: lispval Isstatus();
243:
244: handy = lbot->val;
245:
246: while( TYPE(handy) != DTPR || TYPE(handy->d.cdr) != DTPR)
247: handy = error("sstatus: Bad args",TRUE);
248:
249: return(Isstatus(handy->d.car,handy->d.cdr->d.car));
250: }
251:
252: /* Isstatus - internal routine to do a set status. */
253: lispval
254: Isstatus(curnam,curval)
255: lispval curnam,curval;
256: {
257: register lispval curitm,head;
258: lispval Istsrch(),Iaddstat();
259: int badmemr(),clrtt();
260: extern int uctolc, dmpmode, bcdtrsw;
261:
262: curitm = Istsrch(curnam);
263: /* if doesnt exist, make one up */
264:
265: if(curitm == nil) curitm = Iaddstat(curnam,ST_READ,ST_SET,nil);
266:
267: switch (curitm->d.cdr->d.cdr->d.car->i) {
268:
269: case ST_NO: error("sstatus: cannot set this status",FALSE);
270:
271: case ST_SET: goto setit;
272:
273: case ST_FEATW: curitm = Istsrch(matom("features"));
274: (curnam = newdot())->d.car = curval;
275: curnam->d.cdr = curitm->d.cdr->d.cdr->d.cdr; /* old val */
276: curitm->d.cdr->d.cdr->d.cdr = curnam;
277: return(curval);
278:
279: case ST_NFETW: /* remove from features list */
280: curitm = Istsrch(matom("features"))->d.cdr->d.cdr;
281: for(head = curitm->d.cdr; head != nil; head = head->d.cdr)
282: {
283: if(head->d.car == curval) curitm->d.cdr = head->d.cdr;
284: else curitm = head;
285: }
286: return(nil);
287:
288:
289: case ST_TOLC: if(curval == nil) uctolc = FALSE;
290: else uctolc = TRUE;
291: goto setit;
292:
293: case ST_CORE: if(curval == nil)
294: {
295: signal(SIGBUS,badmemr); /* catch bus errors */
296: signal(SIGSEGV,badmemr); /* and segmentation viols */
297: }
298: else {
299: signal(SIGBUS,SIG_DFL); /* let them core dump */
300: signal(SIGSEGV,SIG_DFL);
301: }
302: goto setit;
303:
304: case ST_INTB:
305: stattab[curitm->d.cdr->d.cdr->d.cdr->i] = curval;
306: return(curval);
307:
308: case ST_DMPW:
309: if(TYPE(curval) != INT ||
310: (curval->i != 413 &&
311: curval->i != 410)) errorh(Vermisc,"sstatus: bad dump mode:",
312: nil,FALSE,0,curval);
313: dmpmode= curval->i;
314: return(curval);
315:
316: case ST_AUTR:
317: if(curval != nil) Sautor = (lispval) TRUE;
318: else Sautor = FALSE;
319: goto setit;
320:
321: case ST_TRAN:
322: if(curval != nil)
323: {
324: Strans = (lispval) TRUE;
325: /* the atom `on' set to set up all table
326: * to their bcd fcn if possible
327: */
328: if(curval == matom("on")) clrtt(1);
329: }
330: else {
331: Strans = (lispval) FALSE;
332: clrtt(0); /* clear all transfer tables */
333: }
334: goto setit;
335: case ST_BCDTR:
336: if(curval == nil) bcdtrsw = FALSE;
337: else bcdtrsw = TRUE;
338: goto setit;
339: }
340:
341: setit: /* store value in status list */
342: curitm->d.cdr->d.cdr->d.cdr = curval;
343: return(curval);
344:
345:
346: }
347:
348: /* Istsrch - utility routine to search the status list for the
349: name given as an argument. If such an entry is not found,
350: we return nil
351: */
352:
353: lispval Istsrch(nam)
354: lispval nam;
355: {
356: register lispval handy;
357:
358: for(handy = stlist ; handy != nil ; handy = handy->d.cdr)
359: if(handy->d.car->d.car == nam) return(handy->d.car);
360:
361: return(nil);
362: }
363:
364: /* Iaddstat - add a status entry to the status list */
365: /* return new entry in status list */
366:
367: lispval
368: Iaddstat(name,readcode,setcode,valu)
369: lispval name,valu;
370: int readcode,setcode;
371: {
372: register lispval handy,handy2;
373: snpand(2);
374:
375:
376: protect(handy=newdot()); /* build status list here */
377:
378: (handy2 = newdot())->d.car = name;
379:
380: handy->d.car = handy2;
381:
382: ((handy2->d.cdr = newdot())->d.car = newint())->i = readcode;
383:
384: handy2 = handy2->d.cdr;
385:
386: ((handy2->d.cdr = newdot())->d.car = newint())->i = setcode;
387:
388: handy2->d.cdr->d.cdr = valu;
389:
390: /* link this one in */
391:
392: handy->d.cdr = stlist;
393: stlist = handy;
394:
395: return(handy->d.car); /* return new item in stlist */
396: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.