|
|
1.1 ! root 1: static char *sccsid = "@(#)lam7.c 34.2 11/7/80"; ! 2: ! 3: #include "global.h" ! 4: ! 5: lispval ! 6: Lfork() { ! 7: register lispval temp; ! 8: int pid; ! 9: ! 10: chkarg(0,"fork"); ! 11: if ((pid=fork())) { ! 12: temp = newint(); ! 13: temp->i = pid; ! 14: return(temp); ! 15: } else ! 16: return(nil); ! 17: } ! 18: ! 19: lispval ! 20: Lwait() ! 21: { ! 22: register lispval ret, temp; ! 23: int status = -1, pid; ! 24: snpand(2); ! 25: ! 26: ! 27: chkarg(0,"wait"); ! 28: pid = wait(&status); ! 29: ret = newdot(); ! 30: protect(ret); ! 31: temp = newint(); ! 32: temp->i = pid; ! 33: ret->d.car = temp; ! 34: temp = newint(); ! 35: temp->i = status; ! 36: ret->d.cdr = temp; ! 37: return(ret); ! 38: } ! 39: ! 40: lispval ! 41: Lpipe() ! 42: { ! 43: register lispval ret, temp; ! 44: int pipes[2]; ! 45: snpand(2); ! 46: ! 47: chkarg(0,"pipe"); ! 48: pipes[0] = -1; ! 49: pipes[1] = -1; ! 50: pipe(pipes); ! 51: ret = newdot(); ! 52: protect(ret); ! 53: temp = newint(); ! 54: temp->i = pipes[0]; ! 55: ret->d.car = temp; ! 56: temp = newint(); ! 57: temp->i = pipes[1]; ! 58: ret->d.cdr = temp; ! 59: return(ret); ! 60: } ! 61: ! 62: lispval ! 63: Lfdopen() ! 64: { ! 65: register lispval fd, type; ! 66: FILE *ptr; ! 67: ! 68: chkarg(2,"fdopen"); ! 69: type = (np-1)->val; ! 70: fd = lbot->val; ! 71: if( TYPE(fd)!=INT ) ! 72: return(nil); ! 73: if ( (ptr=fdopen((int)fd->i, (char *)type->a.pname))==NULL) ! 74: return(nil); ! 75: return(P(ptr)); ! 76: } ! 77: ! 78: lispval ! 79: Lexece() ! 80: { ! 81: lispval fname, arglist, envlist, temp; ! 82: char *args[100], *envs[100], estrs[1024]; ! 83: char *p, *cp, **sp; ! 84: snpand(0); ! 85: ! 86: switch(np-lbot) { ! 87: case 0: ! 88: protect(nil); ! 89: case 1: ! 90: protect(nil); ! 91: case 2: ! 92: protect(nil); ! 93: case 3: ! 94: break; ! 95: default: ! 96: argerr("exece"); ! 97: } ! 98: envlist = (--np)->val; ! 99: arglist = (--np)->val; ! 100: fname = (--np)->val; ! 101: while (TYPE(fname)!=ATOM) ! 102: fname = error("exece: non atom function name",TRUE); ! 103: while (TYPE(arglist)!=DTPR && arglist!=nil) ! 104: arglist = error("exece: non list arglist",TRUE); ! 105: for (sp=args; arglist!=nil; arglist=arglist->d.cdr) { ! 106: temp = arglist->d.car; ! 107: if (TYPE(temp)!=ATOM) ! 108: error("exece: non atom argument seen",FALSE); ! 109: *sp++ = temp->a.pname; ! 110: } ! 111: *sp = 0; ! 112: if (TYPE(envlist)!=DTPR && envlist!=nil) ! 113: return(nil); ! 114: for (sp=envs,cp=estrs; envlist!=nil; envlist=envlist->d.cdr) { ! 115: temp = envlist->d.car; ! 116: if (TYPE(temp)!=DTPR || TYPE(temp->d.car)!=ATOM ! 117: || TYPE(temp->d.cdr)!=ATOM) ! 118: error("exece: Bad enviroment list",FALSE); ! 119: *sp++ = cp; ! 120: for (p=temp->d.car->a.pname; (*cp++ = *p++);) ; ! 121: *(cp-1) = '='; ! 122: for (p=temp->d.cdr->a.pname; (*cp++ = *p++);) ; ! 123: } ! 124: *sp = 0; ! 125: ! 126: return(inewint(execve(fname->a.pname, args, envs))); ! 127: } ! 128: ! 129: int gensymcounter = 0; /* should really be in data.c */ ! 130: ! 131: lispval ! 132: Lgensym() ! 133: { ! 134: lispval arg; ! 135: char leader; ! 136: snpand(0); ! 137: ! 138: if(lbot-np==0)protect(nil); ! 139: arg = lbot->val; ! 140: leader = 'g'; ! 141: if (arg != nil && TYPE(arg)==ATOM) ! 142: leader = arg->a.pname[0]; ! 143: sprintf(strbuf, "%c%05d", leader, gensymcounter++); ! 144: atmlen = 7; ! 145: return((lispval)newatom()); ! 146: } ! 147: extern struct types { ! 148: char *next_free; ! 149: int space_left, ! 150: space, ! 151: type, ! 152: type_len; /* note type_len is in units of int */ ! 153: lispval *items, ! 154: *pages, ! 155: *type_name; ! 156: struct heads ! 157: *first; ! 158: } atom_str ; ! 159: ! 160: lispval ! 161: Lremprop() ! 162: { ! 163: register struct argent *argp; ! 164: register lispval pptr, ind, opptr; ! 165: register struct argent *lbot, *np; ! 166: lispval atm; ! 167: int disemp = FALSE; ! 168: ! 169: chkarg(2,"remprop"); ! 170: argp = lbot; ! 171: ind = argp[1].val; ! 172: atm = argp->val; ! 173: switch (TYPE(atm)) { ! 174: case DTPR: ! 175: pptr = atm->d.cdr; ! 176: disemp = TRUE; ! 177: break; ! 178: case ATOM: ! 179: if((lispval)atm==nil) ! 180: pptr = nilplist; ! 181: else ! 182: pptr = atm->a.plist; ! 183: break; ! 184: default: ! 185: errorh(Vermisc, "remprop: Illegal first argument :", ! 186: nil, FALSE, 0, atm); ! 187: } ! 188: opptr = nil; ! 189: if (pptr==nil) ! 190: return(nil); ! 191: while(TRUE) { ! 192: if (TYPE(pptr->d.cdr)!=DTPR) ! 193: errorh(Vermisc, "remprop: Bad property list", ! 194: nil, FALSE, 0,atm); ! 195: if (pptr->d.car == ind) { ! 196: if( opptr != nil) ! 197: opptr->d.cdr = pptr->d.cdr->d.cdr; ! 198: else if(disemp) ! 199: atm->d.cdr = pptr->d.cdr->d.cdr; ! 200: else if(atm==nil) ! 201: nilplist = pptr->d.cdr->d.cdr; ! 202: else ! 203: atm->a.plist = pptr->d.cdr->d.cdr; ! 204: return(pptr->d.cdr); ! 205: } ! 206: if ((pptr->d.cdr)->d.cdr == nil) return(nil); ! 207: opptr = pptr->d.cdr; ! 208: pptr = (pptr->d.cdr)->d.cdr; ! 209: } ! 210: } ! 211: ! 212: lispval ! 213: Lbcdad() ! 214: { ! 215: lispval ret, temp; ! 216: ! 217: chkarg(1,"bcdad"); ! 218: temp = lbot->val; ! 219: if (TYPE(temp)!=ATOM) ! 220: error("ONLY ATOMS HAVE FUNCTION BINDINGS", FALSE); ! 221: temp = temp->a.fnbnd; ! 222: if (TYPE(temp)!=BCD) ! 223: return(nil); ! 224: ret = newint(); ! 225: ret->i = (int)temp; ! 226: return(ret); ! 227: } ! 228: ! 229: lispval ! 230: Lstringp() ! 231: { ! 232: chkarg(1,"stringp"); ! 233: if (TYPE(lbot->val)==STRNG) ! 234: return(tatom); ! 235: return(nil); ! 236: } ! 237: ! 238: lispval ! 239: Lsymbolp() ! 240: { ! 241: chkarg(1,"symbolp"); ! 242: if (TYPE(lbot->val)==ATOM) ! 243: return(tatom); ! 244: return(nil); ! 245: } ! 246: ! 247: lispval ! 248: Lrematom() ! 249: { ! 250: register lispval temp; ! 251: ! 252: chkarg(1,"rematom"); ! 253: temp = lbot->val; ! 254: if (TYPE(temp)!=ATOM) ! 255: return(nil); ! 256: temp->a.fnbnd = nil; ! 257: temp->a.pname = (char *)CNIL; ! 258: temp->a.plist = nil; ! 259: (atom_items->i)--; ! 260: (atom_str.space_left)++; ! 261: temp->a.clb=(lispval)atom_str.next_free; ! 262: atom_str.next_free=(char *) temp; ! 263: return(tatom); ! 264: } ! 265: ! 266: #define QUTMASK 0200 ! 267: #define VNUM 0000 ! 268: ! 269: lispval ! 270: Lprname() ! 271: { ! 272: lispval a, ret; ! 273: register lispval work, prev; ! 274: char *front, *temp; int clean; ! 275: char ctemp[100]; ! 276: extern char *ctable; ! 277: snpand(2); ! 278: ! 279: chkarg(1,"prname"); ! 280: a = lbot->val; ! 281: switch (TYPE(a)) { ! 282: case INT: ! 283: sprintf(ctemp,"%d",a->i); ! 284: break; ! 285: ! 286: case DOUB: ! 287: sprintf(ctemp,"%f",a->r); ! 288: break; ! 289: ! 290: case ATOM: ! 291: temp = front = a->a.pname; ! 292: clean = *temp; ! 293: if (*temp == '-') temp++; ! 294: clean = clean && (ctable[*temp] != VNUM); ! 295: while (clean && *temp) ! 296: clean = (!(ctable[*temp++] & QUTMASK)); ! 297: if (clean) ! 298: strcpyn(ctemp, front, 99); ! 299: else ! 300: sprintf(ctemp,"\"%s\"",front); ! 301: break; ! 302: ! 303: default: ! 304: error("prname does not support this type", FALSE); ! 305: } ! 306: temp = ctemp; ! 307: protect(ret = prev = newdot()); ! 308: while (*temp) { ! 309: prev->d.cdr = work = newdot(); ! 310: strbuf[0] = *temp++; ! 311: strbuf[1] = 0; ! 312: work->d.car = getatom(); ! 313: work->d.cdr = nil; ! 314: prev = work; ! 315: } ! 316: return(ret->d.cdr); ! 317: } ! 318: Lexit() ! 319: { ! 320: register lispval handy; ! 321: if(np-lbot==0) exit(0); ! 322: handy = lbot->val; ! 323: if(TYPE(handy)==INT) ! 324: exit(handy->i); ! 325: exit(-1); ! 326: } ! 327: lispval ! 328: Iimplode(unintern) ! 329: { ! 330: register lispval handy, work; ! 331: register char *cp = strbuf; ! 332: extern int atmlen; /* used by newatom and getatom */ ! 333: ! 334: chkarg(1,"implode"); ! 335: for(handy = lbot->val; handy!=nil; handy = handy->d.cdr) ! 336: { ! 337: work = handy->d.car; ! 338: if(cp >= endstrb) ! 339: errorh(Vermisc,"maknam/impode argument exceeds buffer",nil,FALSE,43,lbot->val); ! 340: again: ! 341: switch(TYPE(work)) ! 342: { ! 343: case ATOM: ! 344: *cp++ = work->a.pname[0]; ! 345: break; ! 346: case SDOT: ! 347: case INT: ! 348: *cp++ = work->i; ! 349: break; ! 350: case STRNG: ! 351: *cp++ = * (char *) work; ! 352: break; ! 353: default: ! 354: work = errorh(Vermisc,"implode/maknam: Illegal type for this arg:",nil,FALSE,44,work); ! 355: goto again; ! 356: } ! 357: } ! 358: *cp = 0; ! 359: if(unintern) return((lispval)newatom()); ! 360: else return((lispval) getatom()); ! 361: } ! 362: ! 363: lispval ! 364: Lmaknam() ! 365: { ! 366: return(Iimplode(TRUE)); /* unintern result */ ! 367: } ! 368: ! 369: lispval ! 370: Limplode() ! 371: { ! 372: return(Iimplode(FALSE)); /* intern result */ ! 373: } ! 374: ! 375: lispval ! 376: Lintern() ! 377: { ! 378: register int hash; ! 379: register lispval handy,atpr; ! 380: register char *name; ! 381: ! 382: ! 383: chkarg(1,"intern"); ! 384: if(TYPE(handy=lbot->val) != ATOM) ! 385: errorh(Vermisc,"non atom to intern ",nil,FALSE,0,handy); ! 386: /* compute hash of pname of arg */ ! 387: hash = hashfcn(handy->a.pname); ! 388: ! 389: /* search for atom with same pname on hash list */ ! 390: ! 391: atpr = (lispval) hasht[hash]; ! 392: for(atpr = (lispval) hasht[hash] ! 393: ; atpr != CNIL ! 394: ; atpr = (lispval)atpr->a.hshlnk) ! 395: { ! 396: if(strcmp(atpr->a.pname,handy->a.pname) == 0) return(atpr); ! 397: } ! 398: ! 399: /* not there yet, put the given one on */ ! 400: ! 401: handy->a.hshlnk = hasht[hash]; ! 402: hasht[hash] = (struct atom *)handy; ! 403: return(handy); ! 404: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.