|
|
1.1 ! root 1: #ifndef lint ! 2: static char *rcsid = ! 3: "$Header: lamr.c 1.2 83/06/04 02:15:48 sklower 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: Lgetentry() ! 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 (*)())((np-5)->val); /* insert entry point */ ! 310: handy->bcd.discipline = ((np-4)->val); /* insert discipline */ ! 311: #ifdef ROWAN ! 312: handy->language = (np-3)->val; /* insert language */ ! 313: handy->params = ((np-2)->val); /* insert parameters */ ! 314: handy->loctab = ((np-1)->val); /* insert local table */ ! 315: #endif ! 316: return(handy); ! 317: } ! 318: ! 319: /** Lreplace ************************************************************/ ! 320: /* */ ! 321: /* Destructively modifies almost any kind of data. */ ! 322: ! 323: lispval ! 324: Lreplace() ! 325: { ! 326: register lispval a1, a2; ! 327: register int t; ! 328: chkarg(2,"replace"); ! 329: ! 330: if((t = TYPE(a1 = (lbot)->val)) != TYPE(a2 = np[-1].val)) ! 331: error("REPLACE ARGS MUST BE SAME TYPE",FALSE); ! 332: ! 333: switch( t ) ! 334: { ! 335: ! 336: case VALUE: a1->l = a2->l; ! 337: return( a1 ); ! 338: ! 339: case INT: a1->i = a2->i; ! 340: return( a1 ); ! 341: ! 342: ! 343: case ARRAY: a1->ar.data = a2->ar.data; ! 344: a1->ar.accfun = a2->ar.accfun; ! 345: a1->ar.length = a2->ar.length; ! 346: a1->ar.delta = a2->ar.delta; ! 347: return( a1 ); ! 348: ! 349: case DOUB: a1->r = a2->r; ! 350: return( a1 ); ! 351: ! 352: case SDOT: ! 353: case DTPR: a1->d.car = a2->d.car; ! 354: a1->d.cdr = a2->d.cdr; ! 355: return( a1 ); ! 356: case BCD: a1->bcd.start = a2->bcd.start; ! 357: a1->bcd.discipline = a2->bcd.discipline; ! 358: return( a1 ); ! 359: default: ! 360: errorh1(Vermisc,"Replace: cannot handle the type of this arg", ! 361: nil,FALSE,0,a1); ! 362: } ! 363: /* NOTREACHED */ ! 364: } ! 365: ! 366: /* Lvaluep */ ! 367: ! 368: lispval ! 369: Lvaluep() ! 370: { ! 371: chkarg(1,"valuep"); ! 372: if( TYPE(lbot->val) == VALUE ) return(tatom); else return(nil); ! 373: } ! 374: ! 375: CNTTYP() { return; /* HI! COUNT ONE TYPE CALL! */ } ! 376: ! 377: lispval ! 378: Lod() ! 379: { ! 380: int i; ! 381: chkarg(2,"od"); ! 382: ! 383: while( TYPE(np[-1].val) != INT ) ! 384: np[-1].val = error("2nd ARG TO OD MUST BE INTEGER",TRUE); ! 385: ! 386: for( i = 0; i < np->val->i; ++i ) ! 387: printf(copval(odform,CNIL)->a.pname,((int *)(np[-2].val))[i]); ! 388: ! 389: dmpport(poport); ! 390: return(nil); ! 391: } ! 392: lispval ! 393: Lfake() ! 394: { ! 395: chkarg(1,"fake"); ! 396: ! 397: if( TYPE(lbot->val) != INT ) ! 398: error("ARG TO FAKE MUST BE INTEGER",TRUE); ! 399: ! 400: return((lispval)(lbot->val->i)); ! 401: } ! 402: ! 403: /* this used to be Lwhat, but was changed to Lmaknum for maclisp ! 404: compatiblity ! 405: */ ! 406: lispval ! 407: Lmaknum() ! 408: { ! 409: chkarg(1,"maknum"); ! 410: return(inewint((int)(lbot->val))); ! 411: } ! 412: lispval ! 413: Lderef() ! 414: { ! 415: chkarg(1,"deref"); ! 416: ! 417: if( TYPE(lbot->val) != INT ) ! 418: error("arg to deref must be integer",TRUE); ! 419: ! 420: return(inewint(*(int *)(lbot->val->i))); ! 421: } ! 422: ! 423: lispval ! 424: Lpname() ! 425: { ! 426: chkarg(1,"pname"); ! 427: if(TYPE(lbot->val) != ATOM) ! 428: error("ARG TO PNAME MUST BE AN ATOM",FALSE); ! 429: return((lispval)(lbot->val->a.pname)); ! 430: } ! 431: ! 432: lispval ! 433: Larrayref() ! 434: { ! 435: chkarg(2,"arrayref"); ! 436: if(TYPE((lbot)->val) != ARRAY) ! 437: error("FIRST ARG TO ARRAYREF MUST BE ARRAY",FALSE); ! 438: vtemp = (lbot + 1)->val; ! 439: chek: while(TYPE(vtemp) != INT) ! 440: vtemp = error("SECOND ARG TO ARRAYREF MUST BE INTEGER",TRUE); ! 441: if( vtemp->i < 0 ) ! 442: { ! 443: vtemp = error("NEGATIVE ARRAY OFFSET",TRUE); ! 444: goto chek; ! 445: } ! 446: if( vtemp->i >= (np-2)->val->ar.length->i ) ! 447: { ! 448: vtemp = error("ARRAY OFFSET TOO LARGE",TRUE); ! 449: goto chek; ! 450: } ! 451: vtemp = (lispval)((np-2)->val->ar.data + ((np-2)->val->ar.delta->i)*(vtemp->i)); ! 452: /* compute address of desired item */ ! 453: return(vtemp); ! 454: ! 455: } ! 456: ! 457: lispval ! 458: Lptr() ! 459: { ! 460: chkarg(1,"ptr"); ! 461: return(inewval(lbot->val)); ! 462: } ! 463: ! 464: lispval ! 465: Llctrace() ! 466: { ! 467: chkarg(1,"lctrace"); ! 468: lctrace = (int)(lbot->val->a.clb); ! 469: return((lispval)lctrace); ! 470: } ! 471: ! 472: lispval ! 473: Lslevel() ! 474: { ! 475: return(inewint(np-orgnp-2)); ! 476: } ! 477: ! 478: lispval ! 479: Lsimpld() ! 480: { ! 481: register lispval pt; ! 482: register char *cpt = strbuf; ! 483: ! 484: chkarg(1,"simpld"); ! 485: ! 486: for(atmlen=1, pt=np->val; NOTNIL(pt); ++atmlen, pt = pt->d.cdr); ! 487: ! 488: if( atmlen > STRBLEN ) ! 489: { ! 490: error("LCODE WAS TOO LONG",TRUE); ! 491: return((lispval)inewstr("")); ! 492: } ! 493: ! 494: for(pt=np->val; NOTNIL(pt); pt = pt->d.cdr) *(cpt++) = pt->d.car->i; ! 495: *cpt = 0; ! 496: ! 497: return((lispval)newstr(1)); ! 498: } ! 499: ! 500: ! 501: /* Lopval *************************************************************/ ! 502: /* */ ! 503: /* Routine which allows system registers and options to be examined */ ! 504: /* and modified. Calls copval, the routine which is called by c code */ ! 505: /* to do the same thing from inside the system. */ ! 506: ! 507: lispval ! 508: Lopval() ! 509: { ! 510: lispval quant; ! 511: ! 512: if( lbot == np ) ! 513: return(error("bad call to opval",TRUE)); ! 514: quant = lbot->val; /* get name of sys variable */ ! 515: while( TYPE(quant) != ATOM ) ! 516: quant = error("first arg to opval must be an atom",TRUE); ! 517: ! 518: if(np > lbot+1) vtemp = (lbot+1)->val ; ! 519: else vtemp = CNIL; ! 520: return(copval(quant,vtemp)); ! 521: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.