|
|
1.1 root 1: # include "global.h"
2: lispval
3: Lalfalp()
4: {
5: register lispval first, second;
6: register struct argent *inp;
7: snpand(3); /* clobber save mask */
8:
9: chkarg(2);
10: inp = lbot;
11: first = (inp)->val;
12: second = (inp+1)->val;
13: if( (TYPE(first))!=ATOM || (TYPE(second))!=ATOM)
14: error("alphalessp expects atoms");
15: if(strcmp(first->pname,second->pname) <= 0)
16: return(tatom);
17: else
18: return(nil);
19: }
20:
21: lispval
22: Lncons()
23: {
24: register lispval handy;
25: snpand(1); /* clobber save mask */
26:
27: chkarg(1);
28: handy = newdot();
29: handy -> cdr = nil;
30: handy -> car = lbot->val;
31: return(handy);
32: }
33: lispval
34: Lzerop()
35: {
36: register lispval handy;
37: snpand(1); /* clobber save mask */
38:
39: chkarg(1);
40: handy = lbot->val;
41: switch(TYPE(handy)) {
42: case INT:
43: return(handy->i==0?tatom:nil);
44: case DOUB:
45: return(handy->r==0.0?tatom:nil);
46: }
47: return(nil);
48: }
49: lispval
50: Lonep()
51: {
52: register lispval handy; lispval Ladd();
53: snpand(1); /* clobber save mask */
54:
55: chkarg(1);
56: handy = lbot->val;
57: switch(TYPE(handy)) {
58: case INT:
59: return(handy->i==1?tatom:nil);
60: case DOUB:
61: return(handy->r==1.0?tatom:nil);
62: case SDOT:
63: protect(inewint(0));
64: handy = Ladd();
65: if(TYPE(handy)!=INT || handy->i !=1)
66: return(nil);
67: else
68: return(tatom);
69: }
70: return(nil);
71: }
72:
73: lispval
74: cmpx(lssp)
75: {
76: register struct argent *argp;
77: register struct argent *outarg;
78: register struct argent *handy;
79: register count;
80: register struct argent *lbot;
81: register struct argent *np;
82: struct argent *onp = np;
83:
84:
85: argp = lbot + 1;
86: outarg = np;
87: while(argp < onp) {
88:
89: np = outarg + 2;
90: lbot = outarg;
91: if(lssp)
92: *outarg = argp[-1], outarg[1] = *argp++;
93: else
94: outarg[1] = argp[-1], *outarg = *argp++;
95: lbot->val = Lsub();
96: np = lbot + 1;
97: if(Lnegp()==nil) return(nil);
98: }
99: return(tatom);
100: }
101:
102: lispval
103: Lgreaterp()
104: {
105: return(cmpx(FALSE));
106: }
107:
108: lispval
109: Llessp()
110: {
111: return(cmpx(TRUE));
112: }
113:
114: lispval
115: Ldiff()
116: {
117: register lispval arg1,arg2; register handy = 0;
118: snpand(3); /* clobber save mask */
119:
120:
121: chkarg(2);
122: arg1 = lbot->val;
123: arg2 = (lbot+1)->val;
124: if(TYPE(arg1)==INT && TYPE(arg2)==INT) {
125: handy=arg1->i - arg2->i;
126: }
127: else error("non-numeric argument",FALSE);
128: return(inewint(handy));
129: }
130:
131: lispval
132: Lmod()
133: {
134: register lispval arg1,arg2; lispval handy;
135: struct sdot fake1, fake2;
136: fake2.CDR = 0;
137: fake1.CDR = 0;
138: snpand(2); /* clobber save mask */
139:
140: chkarg(2);
141: handy = arg1 = lbot->val;
142: arg2 = (lbot+1)->val;
143: switch(TYPE(arg1)) {
144: case SDOT:
145: break;
146: case INT:
147: fake1.I = arg1->i;
148: arg1 =(lispval) &fake1;
149: break;
150: default:
151: error("non-numeric argument",FALSE);
152: }
153: switch(TYPE(arg2)) {
154: case SDOT:
155: break;
156: case INT:
157: fake2.I = arg2->i;
158: arg2 =(lispval) &fake2;
159: break;
160: default:
161: error("non-numeric argument",FALSE);
162: }
163: if(Lzerop()!=nil) return(handy);
164: divbig(arg1,arg2,0,&handy);
165: if(handy==((lispval)&fake1))
166: handy = inewint(fake1.I);
167: if(handy==((lispval)&fake2))
168: handy = inewint(fake2.I);
169: return(handy);
170:
171: }
172:
173:
174: lispval
175: Ladd1()
176: {
177: register lispval handy;
178: lispval Ladd();
179: snpand(1); /* fixup entry mask */
180:
181: handy = rdrint;
182: handy->i = 1;
183: protect(handy);
184: return(Ladd());
185:
186: }
187:
188: lispval
189: Lsub1()
190: {
191: register lispval handy;
192: lispval Ladd();
193: snpand(1); /* fixup entry mask */
194:
195: handy = rdrint;
196: handy->i = - 1;
197: protect(handy);
198: return(Ladd());
199: }
200:
201: lispval
202: Lminus()
203: {
204: register lispval arg1, handy;
205: register temp;
206: lispval subbig();
207: snpand(3); /* clobber save mask */
208:
209: chkarg(1);
210: arg1 = lbot->val;
211: handy = nil;
212: switch(TYPE(arg1)) {
213: case INT:
214: handy= inewint(0 - arg1->i);
215: break;
216: case DOUB:
217: handy = newdoub();
218: handy->r = -arg1->r;
219: break;
220: case SDOT:
221: handy = rdrsdot;
222: handy->I = 0;
223: handy->CDR = (lispval) 0;
224: handy = subbig(handy,arg1);
225: break;
226:
227: default:
228: error("non-numeric argument",FALSE);
229: }
230: return(handy);
231: }
232:
233: lispval
234: Lnegp()
235: {
236: register lispval handy = np[-1].val, work;
237: register flag = 0;
238: snpand(3); /* clobber save mask */
239:
240: loop:
241: switch(TYPE(handy)) {
242: case INT:
243: if(handy->i < 0) flag = TRUE;
244: break;
245: case DOUB:
246: if(handy->r < 0) flag = TRUE;
247: break;
248: case SDOT:
249: for(work = handy; work->CDR!=(lispval) 0; work = work->CDR);
250: if(work->I < 0) flag = TRUE;
251: break;
252: default:
253: handy = errorh(Vermisc,
254: "minusp: Non-(int,real,bignum) arg: ",
255: nil,
256: TRUE,
257: 0,
258: handy);
259: goto loop;
260: }
261: if(flag) return(tatom);
262: return(nil);
263: }
264:
265: lispval
266: Labsval()
267: {
268: register lispval arg1, handy;
269: register temp;
270: snpand(3); /* clobber save mask */
271:
272: chkarg(1);
273: arg1 = lbot->val;
274: if(Lnegp()!=nil) return(Lminus());
275:
276: return(arg1);
277: }
278:
279: #include "frame.h"
280: /* new version of showstack,
281: We will set fp to point where the register fp points.
282: Then fp+2 = saved ap
283: fp+4 = saved pc
284: fp+3 = saved fp
285: ap+1 = first arg
286: If we find that the saved pc is somewhere in the routine eval,
287: then we print the first argument to that eval frame. This is done
288: by looking one beyond the saved ap.
289: */
290: lispval
291: Lshostk()
292: { lispval isho();
293: return(isho(1));
294: }
295: static lispval
296: isho(f)
297: int f;
298: {
299: register struct frame *myfp; register lispval handy;
300: int **fp; /* this must be the first local */
301: int virgin=1;
302: lispval _qfuncl(),tynames(); /* locations in qfuncl */
303:
304: if(f==1)
305: printf("Forms in evaluation:\n");
306: else
307: printf("Backtrace:\n\n");
308:
309: myfp = (struct frame *) (&fp +1); /* point to current frame */
310:
311: while(TRUE)
312: {
313: if( (myfp->pc > eval && /* interpreted code */
314: myfp->pc < popnames)
315: ||
316: (myfp->pc > _qfuncl && /* compiled code */
317: myfp->pc < tynames) )
318: {
319: handy = (myfp->ap[1]);
320: if(f==1)
321: printr(handy,stdout), putchar('\n');
322: else {
323: if(virgin)
324: virgin = 0;
325: else
326: printf(" -- ");
327: printr((TYPE(handy)==DTPR)?handy->car:handy,stdout);
328: }
329:
330: }
331:
332: if(myfp > myfp->fp) break; /* end of frames */
333: else myfp = myfp->fp;
334: }
335: putchar('\n');
336: return(nil);
337: }
338: lispval
339: Lbaktrace()
340: {
341: isho(0);
342: }
343: /* ===========================================================
344: -
345: **** baktrace **** (moved back by kls)
346: -
347: - baktrace will print the names of all functions being evaluated
348: - from the current one (baktrace) down to the first one.
349: - currently it only prints the function name. Planned is a
350: - list of local variables in all stack frames.
351: - written by jkf.
352: -
353: -============================================================*/
354:
355: /*=============================================================
356: -
357: -*** oblist ****
358: -
359: - oblist returns a list of all symbols in the oblist
360: -
361: - written by jkf.
362: ============================================================*/
363:
364: lispval
365: Loblist()
366: {
367: int indx;
368: lispval headp, tailp ;
369: struct atom *symb ;
370:
371: headp = tailp = newdot(); /* allocate first DTPR */
372: protect(headp); /*protect the list from garbage collection*/
373: /*line added by kls */
374:
375: for( indx=0 ; indx <= HASHTOP-1 ; indx++ ) /* though oblist */
376: {
377: for( symb = hasht[indx] ;
378: symb != (struct atom *) CNIL ;
379: symb = symb-> hshlnk)
380: {
381: tailp->car = (lispval) symb ; /* remember this atom */
382: tailp = tailp->cdr = newdot() ; /* link to next DTPR */
383: }
384: }
385:
386: tailp->cdr = nil ; /* close the list unfortunately throwing away
387: the last DTPR
388: */
389: return(headp);
390: }
391:
392: /*
393: * Maclisp setsyntax function:
394: * (setsyntax c s x)
395: * c represents character either by fixnum or atom
396: * s is the atom "macro" or the atom "splicing" (in which case x is the
397: * macro to be invoked); or nil (meaning don't change syntax of c); or
398: * (well thats enough for now) if s is a fixnum then we modify the bits
399: * for c in the readtable.
400: */
401: #define VMAC 0316
402: #define VSPL 0315
403: #define VDQ 0212
404: #define VESC 0217
405: #include "chkrtab.h"
406:
407: lispval
408: Lsetsyn()
409: {
410: register lispval s, c;
411: register struct argent *mynp;
412: register index;
413: register struct argent *lbot, *np;
414: lispval x;
415: extern char *ctable;
416: int value;
417:
418: chkarg(3);
419: s = Vreadtable->clb;
420: chkrtab(s);
421: mynp = lbot;
422: c = (mynp++)->val;
423: s = (mynp++)->val;
424: x = (mynp++)->val;
425:
426: switch(TYPE(c)) {
427: default:
428: error("neither fixnum nor atom as char to setsyntax",FALSE);
429:
430: case ATOM:
431: index = *(c->pname);
432: if((c->pname)[1])error("Only 1 char atoms to setsyntax",FALSE);
433: break;
434:
435: case INT:
436: index = c->i;
437: }
438: switch(TYPE(s)) {
439: case INT:
440: if(s->i == VESC) Xesc = (char) index;
441: else if(s->i == VDQ) Xdqc = (char) index;
442:
443: if(ctable[index] == VESC /* if we changed the current esc */
444: && s->i != VESC /* to something else, pick current */
445: && Xesc == (char) index) {
446: ctable[index] = s->i;
447: rpltab(VESC,&Xesc);
448: }
449: else if(ctable[index] == VDQ /* likewise for double quote */
450: && s->i != VDQ
451: && Xdqc == (char) index) {
452: ctable[index] = s->i;
453: rpltab(VDQ,&Xdqc);
454: }
455: else ctable[index] = s->i;
456:
457: break;
458: case ATOM:
459: if(s==splice)
460: ctable[index] = VSPL;
461: else if(s==macro)
462: ctable[index] = VMAC;
463: if(TYPE(c)!=ATOM) {
464: strbuf[0] = index;
465: strbuf[1] = 0;
466: c = (getatom());
467: }
468: Iputprop(c,x,macro);
469: }
470: return(tatom);
471: }
472:
473:
474:
475: /* this aux function is used by setsyntax to determine the new current
476: escape or double quote character. It scans the character table for
477: the first character with the given class (either VESC or VDQ) and
478: puts that character in Xesc or Xdqc (whichever is pointed to by
479: addr).
480: */
481: rpltab(cclass,addr)
482: char cclass;
483: char *addr;
484: {
485: register int i;
486: extern char *ctable;
487: for(i=0; i<=127 && ctable[i] != cclass; i++);
488: if(i<=127) *addr = (char) i;
489: else *addr = '\0';
490: }
491:
492:
493:
494: lispval
495: Lzapline()
496: {
497: register FILE *port;
498: extern FILE * rdrport;
499:
500: port = rdrport;
501: while (!feof(port) && (getc(port)!='\n') );
502: return(nil);
503: }
504:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.