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