|
|
1.1 root 1: #ifndef lint
2: static char *rcsid =
3: "$Header: lamr.c,v 1.6 84/04/06 23:14:05 layer Exp $";
4: #endif
5:
6: /* -[Sat Jan 29 13:09:59 1983 by jkf]-
7: * lamr.c $Locker: $
8: * lambda functions
9: *
10: * (c) copyright 1982, Regents of the University of California
11: */
12:
13: # include "global.h"
14:
15: /*
16: *
17: * Lalloc
18: *
19: * This lambda allows allocation of pages from lisp. The first
20: * argument is the name of a space, n pages of which are allocated,
21: * if possible. Returns the number of pages allocated.
22: */
23:
24: lispval
25: Lalloc()
26: {
27: long n;
28: chkarg(2,"alloc");
29: if(TYPE((lbot+1)->val) != INT && (lbot+1)->val != nil )
30: error("2nd argument to allocate must be an integer",FALSE);
31: n = 1;
32: if((lbot+1)->val != nil) n = (lbot+1)->val->i;
33: return(alloc((lbot)->val,n)); /* call alloc to do the work */
34: }
35:
36: lispval
37: Lsizeof()
38: {
39: chkarg(1,"sizeof");
40: return(inewint(csizeof(lbot->val)));
41: }
42:
43: lispval
44: Lsegment()
45: {
46: chkarg(2,"segment");
47: chek: while(TYPE(np[-1].val) != INT )
48: np[-1].val=error("LENGTH ARG TO SEGMENT MUST BE INTEGER",TRUE);
49: if( np[-1].val->i < 0 )
50: {
51: np[-1].val = error("LENGTH ARG TO SEGMENT MUST BE POSITIVE",TRUE);
52: goto chek;
53: }
54: return(csegment(typenum((lbot)->val),(int)(np[-1].val->i),FALSE));
55: }
56:
57: /* Lforget *************************************************************/
58: /* */
59: /* This function removes an atom from the hash table. */
60:
61: lispval
62: Lforget()
63: {
64: char *name;
65: struct atom *buckpt;
66: int hash;
67: chkarg(1,"forget");
68: if(TYPE(lbot->val) != ATOM)
69: error("remob: non-atom argument",FALSE);
70: name = lbot->val->a.pname;
71: hash = hashfcn(name);
72:
73: /* We have found the hash bucket for the atom, now we remove it */
74:
75: if( hasht[hash] == (struct atom *)lbot->val )
76: {
77: hasht[hash] = lbot->val->a.hshlnk;
78: lbot->val->a.hshlnk = (struct atom *)CNIL;
79: return(lbot->val);
80: }
81:
82: buckpt = hasht[hash];
83: while(buckpt != (struct atom *)CNIL)
84: {
85: if(buckpt->hshlnk == (struct atom *)lbot->val)
86: {
87: buckpt->hshlnk = lbot->val->a.hshlnk;
88: lbot->val->a.hshlnk = (struct atom *)CNIL;
89: return(lbot->val);
90: }
91: buckpt = buckpt->hshlnk;
92: }
93:
94: /* Whoops! Guess it wasn't in the hash table after all. */
95:
96: return(lbot->val);
97: }
98:
99: lispval
100: Lgetl()
101: {
102: chkarg(1,"getlength");
103: if(TYPE(lbot->val) != ARRAY)
104: error("ARG TO GETLENGTH MUST BE AN ARRAY",TRUE);
105: return(lbot->val->ar.length);
106: }
107:
108: lispval
109: Lputl()
110: {
111: chkarg(2,"putlength");
112: if(TYPE((lbot)->val) != ARRAY)
113: error("ARG TO PUTLENGTH MUST BE AN ARRAY",FALSE);
114: chek: while(TYPE(np[-1].val) != INT)
115: np[-1].val = error("ARRAY LENGTH MUST BE AN INTEGER",FALSE);
116: if(np[-1].val->i <= 0)
117: {
118: np[-1].val = error("ARRAY LENGTH MUST BE POSITIVE",TRUE);
119: goto chek;
120: }
121: return((lbot)->val->ar.length = np[-1].val);
122: }
123: lispval
124: Lgetdel()
125: {
126: chkarg(1,"getdelta");
127: if(TYPE(lbot->val) != ARRAY)
128: error("ARG TO GETDELTA MUST BE AN ARRAY",FALSE);
129: return(lbot->val->ar.delta);
130: }
131:
132: lispval
133: Lputdel()
134: {
135: chkarg(2,"putdelta");
136: if(TYPE((np-2)->val) != ARRAY)
137: error("ARG TO PUTDELTA MUST BE AN ARRAY",FALSE);
138: chek: while(TYPE(np[-1].val) != INT)
139: np[-1].val = error("ARRAY LENGTH MUST BE AN INTEGER",TRUE);
140: if(np[-1].val->i <= 0)
141: {
142: np[-1].val = error("Array delta must be positive",TRUE);
143: goto chek;
144: }
145: return((lbot)->val->ar.delta = np[-1].val);
146: }
147:
148: lispval
149: Lgetaux()
150: {
151: chkarg(1,"getaux");
152: if(TYPE(lbot->val)!=ARRAY)
153: error("Arg to getaux must be an array", FALSE);
154: return(lbot->val->ar.aux);
155: }
156:
157: lispval
158: Lputaux()
159: {
160: chkarg(2,"putaux");
161:
162: if(TYPE((lbot)->val)!=ARRAY)
163: error("1st Arg to putaux must be array", FALSE);
164: return((lbot)->val->ar.aux = np[-1].val);
165: }
166:
167: lispval
168: Lgetdata()
169: {
170: chkarg(1,"getdata");
171: if(TYPE(lbot->val)!=ARRAY)
172: error("Arg to getdata must be an array", FALSE);
173: return((lispval)lbot->val->ar.data);
174: }
175:
176: lispval
177: Lputdata()
178: {
179: chkarg(2,"putdata");
180:
181: if(TYPE(lbot->val)!=ARRAY)
182: error("1st Arg to putaux must be array", FALSE);
183: return((lispval)(lbot->val->ar.data = (char *)(lbot[1].val)));
184: }
185:
186: lispval
187: Lgeta()
188: {
189: chkarg(1,"getaccess");
190: if(TYPE(lbot->val) != ARRAY)
191: error("ARG TO GETACCESS MUST BE AN ARRAY",FALSE);
192: return(lbot->val->ar.accfun);
193: }
194:
195: lispval
196: Lputa()
197: {
198: chkarg(2,"putaccess");
199: if(TYPE((lbot)->val) != ARRAY)
200: error("ARG TO PUTACCESS MUST BE ARRAY",FALSE);
201: return((lbot)->val->ar.accfun = np[-1].val);
202: }
203:
204: lispval
205: Lmarray()
206: {
207: register lispval handy;
208:
209: chkarg(5,"marray");
210:
211: (handy = newarray()); /* get a new array cell */
212: handy->ar.data=(char *)lbot->val;/* insert data address */
213: handy->ar.accfun = lbot[1].val; /* insert access function */
214: handy->ar.aux = lbot[2].val; /* insert aux data */
215: handy->ar.length = lbot[3].val; /* insert length */
216: handy->ar.delta = lbot[4].val; /* push delta arg */
217: return(handy);
218: }
219:
220: lispval
221: Lgtentry()
222: {
223: chkarg(1,"getentry");
224: if( TYPE(lbot->val) != BCD )
225: error("ARG TO GETENTRY MUST BE FUNCTION",FALSE);
226: return((lispval)(lbot->val->bcd.start));
227: }
228:
229: lispval
230: Lgetlang()
231: {
232: chkarg(1,"getlang");
233: while(TYPE(lbot->val)!=BCD)
234: lbot->val = error("ARG TO GETLANG MUST BE FUNCTION DESCRIPTOR",TRUE);
235: return(lbot->val->bcd.language);
236: }
237:
238: lispval
239: Lputlang()
240: {
241: chkarg(2,"putlang");
242: while(TYPE((lbot)->val)!=BCD)
243: lbot->val = error("FIRST ARG TO PUTLANG MUST BE FUNCTION DESCRIPTOR",TRUE);
244: (lbot)->val->bcd.language = np[-1].val;
245: return(np[-1].val);
246: }
247:
248: lispval
249: Lgetparams()
250: {
251: chkarg(1,"getparams");
252: if(TYPE(np[-1].val)!=BCD)
253: error("ARG TO GETPARAMS MUST BE A FUNCTION DESCRIPTOR",FALSE);
254: return(np[-1].val->bcd.params);
255: }
256:
257: lispval
258: Lputparams()
259: {
260: chkarg(2,"putparams");
261: if(TYPE((lbot)->val)!=BCD)
262: error("1st ARG TO PUTPARAMS MUST BE FUNCTION DESCRIPTOR",FALSE);
263: return((lbot)->val->bcd.params = np[-1].val);
264: }
265:
266: lispval
267: Lgetdisc()
268: {
269: chkarg(1,"getdisc");
270: if(TYPE(np[-1].val) != BCD)
271: error("ARGUMENT OF GETDISC MUST BE FUNCTION",FALSE);
272: return(np[-1].val->bcd.discipline);
273: }
274:
275: lispval
276: Lputdisc()
277: {
278: chkarg(2,"putdisc");
279: if(TYPE(np[-2].val) != BCD)
280: error("ARGUMENT OF PUTDISC MUST BE FUNCTION",FALSE);
281: return((np-2)->val->bcd.discipline = np[-1].val);
282: }
283:
284: lispval
285: Lgetloc()
286: {
287: chkarg(1,"getloc");
288: if(TYPE(lbot->val)!=BCD)
289: error("ARGUMENT TO GETLOC MUST BE FUNCTION",FALSE);
290: return(lbot->val->bcd.loctab);
291: }
292:
293: lispval
294: Lputloc()
295: {
296: chkarg(2,"putloc");
297: if(TYPE((lbot+1)->val)!=BCD);
298: error("FIRST ARGUMENT TO PUTLOC MUST BE FUNCTION",FALSE);
299: (lbot)->val->bcd.loctab = (lbot+1)->val;
300: return((lbot+1)->val);
301: }
302:
303: lispval
304: Lmfunction()
305: {
306: register lispval handy;
307: chkarg(2,"mfunction");
308: handy = (newfunct()); /* get a new function cell */
309: handy->bcd.start = (lispval (*)())((lbot)->val); /* insert entry point */
310: handy->bcd.discipline = ((lbot+1)->val); /* insert discipline */
311: return(handy);
312: }
313:
314: /** Lreplace ************************************************************/
315: /* */
316: /* Destructively modifies almost any kind of data. */
317:
318: lispval
319: Lreplace()
320: {
321: register lispval a1, a2;
322: register int t;
323: chkarg(2,"replace");
324:
325: if((t = TYPE(a1 = (lbot)->val)) != TYPE(a2 = np[-1].val))
326: error("REPLACE ARGS MUST BE SAME TYPE",FALSE);
327:
328: switch( t )
329: {
330:
331: case VALUE: a1->l = a2->l;
332: return( a1 );
333:
334: case INT: a1->i = a2->i;
335: return( a1 );
336:
337:
338: case ARRAY: a1->ar.data = a2->ar.data;
339: a1->ar.accfun = a2->ar.accfun;
340: a1->ar.length = a2->ar.length;
341: a1->ar.delta = a2->ar.delta;
342: return( a1 );
343:
344: case DOUB: a1->r = a2->r;
345: return( a1 );
346:
347: case SDOT:
348: case DTPR: a1->d.car = a2->d.car;
349: a1->d.cdr = a2->d.cdr;
350: return( a1 );
351: case BCD: a1->bcd.start = a2->bcd.start;
352: a1->bcd.discipline = a2->bcd.discipline;
353: return( a1 );
354: default:
355: errorh1(Vermisc,"Replace: cannot handle the type of this arg",
356: nil,FALSE,0,a1);
357: }
358: /* NOTREACHED */
359: }
360:
361: /* Lvaluep */
362:
363: lispval
364: Lvaluep()
365: {
366: chkarg(1,"valuep");
367: if( TYPE(lbot->val) == VALUE ) return(tatom); else return(nil);
368: }
369:
370: CNTTYP() { return; /* HI! COUNT ONE TYPE CALL! */ }
371:
372: lispval
373: Lod()
374: {
375: int i;
376: chkarg(2,"od");
377:
378: while( TYPE(np[-1].val) != INT )
379: np[-1].val = error("2nd ARG TO OD MUST BE INTEGER",TRUE);
380:
381: for( i = 0; i < np->val->i; ++i )
382: printf(copval(odform,CNIL)->a.pname,((int *)(np[-2].val))[i]);
383:
384: dmpport(poport);
385: return(nil);
386: }
387: lispval
388: Lfake()
389: {
390: chkarg(1,"fake");
391:
392: if( TYPE(lbot->val) != INT )
393: error("ARG TO FAKE MUST BE INTEGER",TRUE);
394:
395: return((lispval)(lbot->val->i));
396: }
397:
398: /* this used to be Lwhat, but was changed to Lmaknum for maclisp
399: compatiblity
400: */
401: lispval
402: Lmaknum()
403: {
404: chkarg(1,"maknum");
405: return(inewint((int)(lbot->val)));
406: }
407: lispval
408: Lderef()
409: {
410: chkarg(1,"deref");
411:
412: if( TYPE(lbot->val) != INT )
413: error("arg to deref must be integer",TRUE);
414:
415: return(inewint(*(int *)(lbot->val->i)));
416: }
417:
418: lispval
419: Lpname()
420: {
421: chkarg(1,"pname");
422: if(TYPE(lbot->val) != ATOM)
423: error("ARG TO PNAME MUST BE AN ATOM",FALSE);
424: return((lispval)(lbot->val->a.pname));
425: }
426:
427: lispval
428: Larayref()
429: {
430: chkarg(2,"arrayref");
431: if(TYPE((lbot)->val) != ARRAY)
432: error("FIRST ARG TO ARRAYREF MUST BE ARRAY",FALSE);
433: vtemp = (lbot + 1)->val;
434: chek: while(TYPE(vtemp) != INT)
435: vtemp = error("SECOND ARG TO ARRAYREF MUST BE INTEGER",TRUE);
436: if( vtemp->i < 0 )
437: {
438: vtemp = error("NEGATIVE ARRAY OFFSET",TRUE);
439: goto chek;
440: }
441: if( vtemp->i >= (np-2)->val->ar.length->i )
442: {
443: vtemp = error("ARRAY OFFSET TOO LARGE",TRUE);
444: goto chek;
445: }
446: vtemp = (lispval)((np-2)->val->ar.data + ((np-2)->val->ar.delta->i)*(vtemp->i));
447: /* compute address of desired item */
448: return(vtemp);
449:
450: }
451:
452: lispval
453: Lptr()
454: {
455: chkarg(1,"ptr");
456: return(inewval(lbot->val));
457: }
458:
459: lispval
460: Llctrace()
461: {
462: chkarg(1,"lctrace");
463: lctrace = (int)(lbot->val->a.clb);
464: return((lispval)lctrace);
465: }
466:
467: lispval
468: Lslevel()
469: {
470: return(inewint(np-orgnp-2));
471: }
472:
473: lispval
474: Lsimpld()
475: {
476: register lispval pt;
477: register char *cpt = strbuf;
478:
479: chkarg(1,"simpld");
480:
481: for(atmlen=1, pt=np->val; NOTNIL(pt); ++atmlen, pt = pt->d.cdr);
482:
483: if( atmlen > STRBLEN )
484: {
485: error("LCODE WAS TOO LONG",TRUE);
486: return((lispval)inewstr(""));
487: }
488:
489: for(pt=np->val; NOTNIL(pt); pt = pt->d.cdr) *(cpt++) = pt->d.car->i;
490: *cpt = 0;
491:
492: return((lispval)newstr(1));
493: }
494:
495:
496: /* Lopval *************************************************************/
497: /* */
498: /* Routine which allows system registers and options to be examined */
499: /* and modified. Calls copval, the routine which is called by c code */
500: /* to do the same thing from inside the system. */
501:
502: lispval
503: Lopval()
504: {
505: lispval quant;
506:
507: if( lbot == np )
508: return(error("bad call to opval",TRUE));
509: quant = lbot->val; /* get name of sys variable */
510: while( TYPE(quant) != ATOM )
511: quant = error("first arg to opval must be an atom",TRUE);
512:
513: if(np > lbot+1) vtemp = (lbot+1)->val ;
514: else vtemp = CNIL;
515: return(copval(quant,vtemp));
516: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.