|
|
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.