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