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