|
|
1.1 root 1: #ifndef lint
2: static char *rcsid =
3: "$Header: sysat.c,v 1.15 83/09/04 10:17:54 jkf Exp $";
4: #endif
5:
6: /* -[Sun Sep 4 08:56:49 1983 by jkf]-
7: * sysat.c $Locker: $
8: * startup data structure creation
9: *
10: * (c) copyright 1982, Regents of the University of California
11: */
12:
13: #include "global.h"
14: #include "lfuncs.h"
15: #define MK(x,y,z) mfun(x,y,z)
16: #define FIDDLE(z,b,c,y) z->a.clb=newdot(); (z->a.clb->d.car=newint())->i=b->i; \
17: z->a.clb->d.cdr=newdot(); (z->a.clb->d.cdr->d.car=newint())->i=c->i; \
18: z->a.clb->d.cdr->d.cdr=newdot(); (z->a.clb->d.cdr->d.cdr->d.car=newint())->i=y; \
19: b = z->a.clb->d.car; c = z->a.clb->d.cdr->d.car; \
20: copval(z,z->a.clb); z->a.clb = nil;
21:
22: #define cforget(x) protect(x); Lforget(); unprot();
23:
24: /* The following array serves as the temporary counters of the items */
25: /* and pages used in each space. */
26:
27: long int tint[2*NUMSPACES];
28:
29: extern int tgcthresh;
30: extern int initflag; /* starts off TRUE to indicate unsafe to gc */
31:
32: extern int *beginsweep; /* place for garbage collector to begin sweeping */
33: extern int page_limit; /* begin warning messages about running out of space */
34: extern char purepage[]; /* which pages should not be swept by gc */
35: extern int ttsize; /* need to know how much of pagetable to set to other */
36:
37: extern lispval Iaddstat(), Isstatus();
38:
39: makevals()
40: {
41: int i;
42: lispval temp;
43:
44: /* system list structure and atoms are initialized. */
45:
46: /* Before any lisp data can be created, the space usage */
47: /* counters must be set up, temporarily in array tint. */
48:
49: atom_items = (lispval) &tint[0];
50: atom_pages = (lispval) &tint[1];
51: str_items = (lispval) &tint[2];
52: str_pages = (lispval) &tint[3];
53: int_items = (lispval) &tint[4];
54: int_pages = (lispval) &tint[5];
55: dtpr_items = (lispval) &tint[6];
56: dtpr_pages = (lispval) &tint[7];
57: doub_items = (lispval) &tint[8];
58: doub_pages = (lispval) &tint[9];
59: sdot_items = (lispval) &tint[10];
60: sdot_pages = (lispval) &tint[11];
61: array_items = (lispval) &tint[12];
62: array_pages = (lispval) &tint[13];
63: val_items = (lispval) &tint[14];
64: val_pages = (lispval) &tint[15];
65: funct_items = (lispval) &tint[16];
66: funct_pages = (lispval) &tint[17];
67:
68: for (i=0; i < 7; i++)
69: {
70: hunk_pages[i] = (lispval) &tint[18+i*2];
71: hunk_items[i] = (lispval) &tint[19+i*2];
72: }
73:
74: vect_items = (lispval) &tint[34];
75: vecti_items = (lispval) &tint[35];
76: vect_pages = (lispval) &tint[36];
77: vecti_pages = (lispval) &tint[37];
78: other_items = (lispval) &tint[38];
79: other_pages = (lispval) &tint[39];
80:
81: /* This also applies to the garbage collection threshhold */
82:
83: gcthresh = (lispval) &tgcthresh;
84:
85: /* Now we commence constructing system lisp structures. */
86:
87: /* nil is a special case, constructed especially at location zero */
88:
89: hasht[hashfcn("nil")] = (struct atom *)nil;
90:
91:
92: /* allocate space for namestack and bindstack first
93: * then set up beginsweep variable so that the sweeper will
94: * ignore these `always in use' pages
95: */
96:
97: lbot = orgnp = np = ((struct argent *)csegment(VALUE,NAMESIZE,FALSE));
98: orgbnp = bnp = ((struct nament *)csegment(DTPR,NAMESIZE,FALSE));
99: /* since these dtpr pages will not be swept, we don't want them
100: * to show up in count of dtpr pages allocated or it will confuse
101: * gcafter when it tries to determine how much space is free
102: */
103: dtpr_pages->i = 0;
104: beginsweep = (int *) xsbrk(0);
105:
106: /*
107: * patching up info in type and pure tables
108: */
109: for(i=((int)beginsweep)>>9; i < ttsize; i++) (typetable+1)[i] = OTHER;
110: purepage[((int)np)>>9] = 1; /* Mark these as non-gc'd arrays */
111: purepage[((int)bnp)>>9] = 1;
112:
113: /*
114: * Names of various spaces and things
115: */
116:
117: atom_name = matom("symbol");
118: str_name = matom("string");
119: int_name = matom("fixnum");
120: dtpr_name = matom("list");
121: doub_name = matom("flonum");
122: sdot_name = matom("bignum");
123: array_name = matom("array");
124: val_name = matom("value");
125: funct_name = matom("binary");
126: port_name = matom("port"); /* not really a space */
127: vect_name = matom("vector");
128: vecti_name = matom("vectori");
129: other_name = matom("other");
130:
131: {
132: char name[6], *strcpy();
133:
134: strcpy(name, "hunk0");
135: for (i=0; i< 7; i++) {
136: hunk_name[i] = matom(name);
137: name[4]++;
138: }
139: }
140:
141: /* set up the name stack as an array of pointers */
142: nplim = orgnp+NAMESIZE-6*NAMINC;
143: temp = matom("namestack");
144: nstack = temp->a.fnbnd = newarray();
145: nstack->ar.data = (char *) (np);
146: (nstack->ar.length = newint())->i = NAMESIZE;
147: (nstack->ar.delta = newint())->i = sizeof(struct argent);
148: Vnogbar = matom("unmarked_array");
149: /* marking of the namestack will be done explicitly in gc1 */
150: (nstack->ar.aux = newdot())->d.car = Vnogbar;
151:
152:
153: /* set up the binding stack as an array of dotted pairs */
154:
155: bnplim = orgbnp+NAMESIZE-5;
156: temp = matom("bindstack");
157: bstack = temp->a.fnbnd = newarray();
158: bstack->ar.data = (char *) (bnp);
159: (bstack->ar.length = newint())->i = NAMESIZE;
160: (bstack->ar.delta = newint())->i = sizeof(struct nament);
161: /* marking of the bindstack will be done explicitly in gc1 */
162: (bstack->ar.aux = newdot())->d.car = Vnogbar;
163:
164: /* more atoms */
165:
166: tatom = matom("t");
167: tatom->a.clb = tatom;
168: lambda = matom("lambda");
169: nlambda = matom("nlambda");
170: macro = matom("macro");
171: ibase = matom("ibase"); /* base for input conversion */
172: ibase->a.clb = inewint(10);
173: (matom("base"))->a.clb = ibase->a.clb;
174: fclosure = matom("fclosure");
175: clos_marker = matom("int:closure-marker");
176: Vpbv = matom("value-structure-argument");
177: rsetatom = matom("*rset");
178: rsetatom->a.clb = nil;
179: Vsubrou = matom("subroutine");
180: Vpiport = matom("piport");
181: Vpiport->a.clb = P(piport = stdin); /* standard input */
182: Vpoport = matom("poport");
183: Vpoport->a.clb = P(poport = stdout); /* stand. output */
184: matom("errport")->a.clb = (P(errport = stderr));/* stand. err. */
185: ioname[PN(stdin)] = (lispval) pinewstr("$stdin");
186: ioname[PN(stdout)] = (lispval) pinewstr("$stdout");
187: ioname[PN(stderr)] = (lispval) pinewstr("$stderr");
188: matom("Standard-Input")->a.clb = Vpiport->a.clb;
189: matom("Standard-Output")->a.clb = Vpoport->a.clb;
190: matom("Standard-Error")->a.clb = P(errport);
191: (Vreadtable = matom("readtable"))->a.clb = Imkrtab(0);
192: strtab = Imkrtab(0);
193: Vptport = matom("ptport");
194: Vptport->a.clb = nil; /* protocal port */
195:
196: Vcntlw = matom("^w"); /* when non nil, inhibits output to term */
197: Vcntlw->a.clb = nil;
198:
199: Vldprt = matom("$ldprint");
200: /* when nil, inhibits printing of fasl/autoload */
201: /* cfasl messages to term */
202: Vldprt->a.clb = tatom;
203:
204: Vprinlevel = matom("prinlevel"); /* printer recursion count */
205: Vprinlevel->a.clb = nil; /* infinite recursion */
206:
207: Vprinlength = matom("prinlength"); /* printer element count */
208: Vprinlength->a.clb = nil; /* infinite elements */
209:
210: Vfloatformat = matom("float-format");
211: Vfloatformat->a.clb = (lispval) pinewstr("%.16g");
212:
213: Verdepth = matom("Error-Depth");
214: Verdepth->a.clb = inewint(0); /* depth of error */
215:
216: Vpurcopylits = matom("$purcopylits");
217: Vpurcopylits->a.clb = tatom; /* tells fasl to purcopy
218: * literals it reads
219: */
220: Vdisplacemacros = matom("displace-macros");
221: Vdisplacemacros->a.clb = nil; /* replace macros calls
222: * with their expanded forms
223: */
224:
225: Vprintsym = matom("print");
226:
227: atom_buffer = (lispval) strbuf;
228: Vlibdir = matom("lisp-library-directory");
229: Vlibdir->a.clb = matom("/usr/lib/lisp");
230: /* The following atoms are used as tokens by the reader */
231:
232: perda = matom(".");
233: lpara = matom("(");
234: rpara = matom(")");
235: lbkta = matom("[");
236: rbkta = matom("]");
237: snqta = matom("'");
238: exclpa = matom("!");
239:
240:
241: (Eofa = matom("eof"))->a.clb = eofa;
242: cara = MK("car",Lcar,lambda);
243: cdra = MK("cdr",Lcdr,lambda);
244:
245: /* The following few atoms have values the reader tokens. */
246: /* Perhaps this is a kludge which should be abandoned. */
247: /* On the other hand, perhaps it is an inspiration. */
248:
249: matom("perd")->a.clb = perda;
250: matom("lpar")->a.clb = lpara;
251: matom("rpar")->a.clb = rpara;
252: matom("lbkt")->a.clb = lbkta;
253: matom("rbkt")->a.clb = rbkta;
254:
255: noptop = matom("noptop");
256:
257: /* atoms used in connection with comments. */
258:
259: commta = matom("comment");
260: rcomms = matom("readcomments");
261:
262: /* the following atoms are used for lexprs */
263:
264: lexpr_atom = matom("last lexpr binding\7");
265: lexpr = matom("lexpr");
266:
267: /* the following atom is used to reference the bind stack for eval */
268: bptr_atom = matom("eval1 binding pointer\7");
269: bptr_atom->a.clb = nil;
270:
271: /* the following atoms are used for evalhook hackery */
272: evalhatom = matom("evalhook");
273: evalhatom->a.clb = nil;
274: evalhcallsw = FALSE;
275:
276: funhatom = matom("funcallhook");
277: funhatom->a.clb = nil;
278: funhcallsw = FALSE;
279:
280: Vevalframe = matom("evalframe");
281:
282: sysa = matom("sys");
283: plima = matom("pagelimit"); /* max number of pages */
284: Veval = MK("eval",Leval1,lambda);
285:
286:
287: MK("asin",Lasin,lambda);
288: MK("acos",Lacos,lambda);
289: MK("atan",Latan,lambda);
290: MK("cos",Lcos,lambda);
291: MK("sin",Lsin,lambda);
292: MK("sqrt",Lsqrt,lambda);
293: MK("exp",Lexp,lambda);
294: MK("log",Llog,lambda);
295: MK("lsh",Llsh,lambda);
296: MK("bignum-leftshift",Lbiglsh,lambda);
297: MK("sticky-bignum-leftshift",Lsbiglsh,lambda);
298: MK("frexp",Lfrexp,lambda);
299: MK("rot",Lrot,lambda);
300: MK("random",Lrandom,lambda);
301: MK("atom",Latom,lambda);
302: MK("apply",Lapply,lambda);
303: MK("funcall",Lfuncal,lambda);
304: MK("lexpr-funcall",Llexfun,lambda);
305: MK("return",Lreturn,lambda);
306: /* MK("cont",Lreturn,lambda); */
307: MK("cons",Lcons,lambda);
308: MK("scons",Lscons,lambda);
309: MK("bignum-to-list",Lbigtol,lambda);
310: MK("cadr",Lcadr,lambda);
311: MK("caar",Lcaar,lambda);
312: MK("cddr",Lc02r,lambda);
313: MK("caddr",Lc12r,lambda);
314: MK("cdddr",Lc03r,lambda);
315: MK("cadddr",Lc13r,lambda);
316: MK("cddddr",Lc04r,lambda);
317: MK("caddddr",Lc14r,lambda);
318: MK("nthelem",Lnthelem,lambda);
319: MK("eq",Leq,lambda);
320: MK("equal",Lequal,lambda);
321: /** MK("zqual",Zequal,lambda); */
322: MK("numberp",Lnumberp,lambda);
323: MK("dtpr",Ldtpr,lambda);
324: MK("bcdp",Lbcdp,lambda);
325: MK("portp",Lportp,lambda);
326: MK("arrayp",Larrayp,lambda);
327: MK("valuep",Lvaluep,lambda);
328: MK("get_pname",Lpname,lambda);
329: MK("ptr",Lptr,lambda);
330: MK("arrayref",Larrayref,lambda);
331: MK("marray",Lmarray,lambda);
332: MK("getlength",Lgetl,lambda);
333: MK("putlength",Lputl,lambda);
334: MK("getaccess",Lgeta,lambda);
335: MK("putaccess",Lputa,lambda);
336: MK("getdelta",Lgetdel,lambda);
337: MK("putdelta",Lputdel,lambda);
338: MK("getaux",Lgetaux,lambda);
339: MK("putaux",Lputaux,lambda);
340: MK("getdata",Lgetdata,lambda);
341: MK("putdata",Lputdata,lambda);
342: MK("mfunction",Lmfunction,lambda);
343: MK("getentry",Lgetentry,lambda);
344: MK("getdisc",Lgetdisc,lambda);
345: MK("putdisc",Lputdisc,lambda);
346: MK("segment",Lsegment,lambda);
347: MK("rplaca",Lrplaca,lambda);
348: MK("rplacd",Lrplacd,lambda);
349: MK("set",Lset,lambda);
350: MK("replace",Lreplace,lambda);
351: MK("infile",Linfile,lambda);
352: MK("outfile",Loutfile,lambda);
353: MK("terpr",Lterpr,lambda);
354: MK("print",Lprint,lambda);
355: MK("close",Lclose,lambda);
356: MK("patom",Lpatom,lambda);
357: MK("pntlen",Lpntlen,lambda);
358: MK("read",Lread,lambda);
359: MK("ratom",Lratom,lambda);
360: MK("readc",Lreadc,lambda);
361: MK("truename",Ltruename,lambda);
362: MK("implode",Limplode,lambda);
363: MK("maknam",Lmaknam,lambda);
364: MK("deref",Lderef,lambda);
365: MK("concat",Lconcat,lambda);
366: MK("uconcat",Luconcat,lambda);
367: MK("putprop",Lputprop,lambda);
368: MK("monitor",Lmonitor,lambda);
369: MK("get",Lget,lambda);
370: MK("getd",Lgetd,lambda);
371: MK("putd",Lputd,lambda);
372: MK("prog",Nprog,nlambda);
373: quota = MK("quote",Nquote,nlambda);
374: MK("function",Nfunction,nlambda);
375: MK("go",Ngo,nlambda);
376: MK("*catch",Ncatch,nlambda);
377: MK("errset",Nerrset,nlambda);
378: MK("status",Nstatus,nlambda);
379: MK("sstatus",Nsstatus,nlambda);
380: MK("err-with-message",Lerr,lambda);
381: MK("*throw",Nthrow,lambda); /* this is a lambda now !! */
382: reseta = MK("reset",Nreset,nlambda);
383: MK("break",Nbreak,nlambda);
384: MK("exit",Lexit,lambda);
385: MK("def",Ndef,nlambda);
386: MK("null",Lnull,lambda);
387: /* debugging, remove when done */
388: { lispval Lframedump();
389: MK("framedump",Lframedump,lambda);
390: }
391: MK("and",Nand,nlambda);
392: MK("or",Nor,nlambda);
393: MK("setq",Nsetq,nlambda);
394: MK("cond",Ncond,nlambda);
395: MK("list",Llist,lambda);
396: MK("load",Lload,lambda);
397: MK("nwritn",Lnwritn,lambda);
398: MK("*process",Lprocess,lambda); /* execute a shell command */
399: MK("allocate",Lalloc,lambda); /* allocate a page */
400: MK("sizeof",Lsizeof,lambda); /* size of one item of a data type */
401: MK("dumplisp",Ndumplisp,nlambda); /* NEW save the world */
402: MK("top-level",Ntpl,nlambda); /* top level eval-print read loop */
403: startup = matom("startup"); /* used by save and restore */
404: MK("mapcar",Lmapcar,lambda);
405: MK("maplist",Lmaplist,lambda);
406: MK("mapcan",Lmapcan,lambda);
407: MK("mapcon",Lmapcon,lambda);
408: MK("assq",Lassq,lambda);
409: MK("mapc",Lmapc,lambda);
410: MK("map",Lmap,lambda);
411: MK("flatc",Lflatsi,lambda);
412: MK("alphalessp",Lalfalp,lambda);
413: MK("drain",Ldrain,lambda);
414: MK("killcopy",Lkilcopy,lambda); /* forks aand aborts for adb */
415: MK("opval",Lopval,lambda); /* sets and retrieves system variables */
416: MK("ncons",Lncons,lambda);
417: sysa = matom("sys"); /* sys indicator for system variables */
418: MK("remob",Lforget,lambda); /* function to take atom out of hash table */
419: splice = matom("splicing");
420: MK("not",Lnull,lambda);
421: MK("plus",Ladd,lambda);
422: MK("add",Ladd,lambda);
423: MK("times",Ltimes,lambda);
424: MK("difference",Lsub,lambda);
425: MK("quotient",Lquo,lambda);
426: MK("+",Lfp,lambda);
427: MK("-",Lfm,lambda);
428: MK("*",Lft,lambda);
429: MK("/",Lfd,lambda);
430: MK("1+",Lfadd1,lambda);
431: MK("1-",Lfsub1,lambda);
432: MK("^",Lfexpt,lambda);
433: MK("double-to-float",Ldbtofl,lambda);
434: MK("float-to-double",Lfltodb,lambda);
435: MK("<",Lflessp,lambda);
436: MK("mod",Lmod,lambda);
437: MK("minus",Lminus,lambda);
438: MK("absval",Labsval,lambda);
439: MK("add1",Ladd1,lambda);
440: MK("sub1",Lsub1,lambda);
441: MK("greaterp",Lgreaterp,lambda);
442: MK("lessp",Llessp,lambda);
443: MK("any-zerop",Lzerop,lambda); /* used when bignum arg possible */
444: MK("zerop",Lzerop,lambda);
445: MK("minusp",Lnegp,lambda);
446: MK("onep",Lonep,lambda);
447: MK("sum",Ladd,lambda);
448: MK("product",Ltimes,lambda);
449: MK("do",Ndo,nlambda);
450: MK("progv",Nprogv,nlambda);
451: MK("progn",Nprogn,nlambda);
452: MK("prog2",Nprog2,nlambda);
453: MK("oblist",Loblist,lambda);
454: MK("baktrace",Lbaktrace,lambda);
455: MK("tyi",Ltyi,lambda);
456: MK("tyipeek",Ltyipeek,lambda);
457: MK("untyi",Luntyi,lambda);
458: MK("tyo",Ltyo,lambda);
459: MK("termcapinit",Ltci,lambda);
460: MK("termcapexe",Ltcx,lambda);
461: MK("int:setsyntax",Lsetsyn,lambda); /* an internal function */
462: MK("int:getsyntax",Lgetsyntax,lambda);
463: MK("int:showstack",LIshowstack,lambda);
464: MK("int:franz-call",LIfranzcall,lambda);
465: MK("makereadtable",Lmakertbl,lambda);
466: MK("zapline",Lzapline,lambda);
467: MK("aexplode",Lexplda,lambda);
468: MK("aexplodec",Lexpldc,lambda);
469: MK("aexploden",Lexpldn,lambda);
470: MK("hashtabstat",Lhashst,lambda);
471: #ifdef METER
472: MK("gcstat",Lgcstat,lambda);
473: #endif
474: MK("argv",Largv,lambda);
475: MK("arg",Larg,lambda);
476: MK("setarg",Lsetarg,lambda);
477: MK("showstack",Lshostk,lambda);
478: MK("freturn",Lfretn,lambda);
479: MK("*rset",Lrset,lambda);
480: MK("eval1",Leval1,lambda);
481: MK("evalframe",Levalf,lambda);
482: MK("evalhook",Levalhook,lambda);
483: MK("funcallhook",Lfunhook,lambda);
484: MK("int:fclosure-stack-stuff",LIfss,lambda);
485: MK("resetio",Nresetio,nlambda);
486: MK("chdir",Lchdir,lambda);
487: MK("ascii",Lascii,lambda);
488: MK("boole",Lboole,lambda);
489: MK("type",Ltype,lambda); /* returns type-name of argument */
490: MK("fix",Lfix,lambda);
491: MK("float",Lfloat,lambda);
492: MK("fact",Lfact,lambda);
493: MK("cpy1",Lcpy1,lambda);
494: MK("Divide",LDivide,lambda);
495: MK("Emuldiv",LEmuldiv,lambda);
496: MK("readlist",Lreadli,lambda);
497: MK("plist",Lplist,lambda); /* gives the plist of an atom */
498: MK("setplist",Lsetpli,lambda); /* get plist of an atom */
499: MK("eval-when",Nevwhen,nlambda);
500: MK("syscall",Lsyscall,lambda);
501: MK("intern",Lintern,lambda);
502: MK("ptime",Lptime,lambda); /* return process user time */
503: MK("fork",Lfork,lambda); /* turn on fork and wait */
504: MK("wait",Lwait,lambda);
505: /* MK("pipe",Lpipe,lambda); */
506: /* MK("fdopen",Lfdopen,lambda); */
507: MK("exece",Lexece,lambda);
508: MK("gensym",Lgensym,lambda);
509: MK("remprop",Lremprop,lambda);
510: MK("bcdad",Lbcdad,lambda);
511: MK("symbolp",Lsymbolp,lambda);
512: MK("stringp",Lstringp,lambda);
513: MK("rematom",Lrematom,lambda);
514: /** MK("prname",Lprname,lambda); */
515: MK("getenv",Lgetenv,lambda);
516: MK("I-throw-err",Lctcherr,lambda); /* directly force a throw or error */
517: MK("makunbound",Lmakunb,lambda);
518: MK("haipart",Lhaipar,lambda);
519: MK("haulong",Lhau,lambda);
520: MK("signal",Lsignal,lambda);
521: MK("fasl",Lfasl,lambda); /* NEW - new fasl loader */
522: MK("cfasl",Lcfasl,lambda); /* read in compiled C file */
523: MK("getaddress",Lgetaddress,lambda);
524: /* bind symbols without doing cfasl */
525: MK("removeaddress",Lrmadd,lambda); /* unbind symbols */
526: MK("boundp",Lboundp,lambda); /* tells if an atom is bound */
527: MK("fake",Lfake,lambda); /* makes a fake lisp pointer */
528: /*** MK("od",Lod,lambda); /* dumps info */
529: MK("maknum",Lmaknum,lambda); /* converts a pointer to an integer */
530: MK("*mod",LstarMod,lambda); /* return fixnum modulus */
531: MK("*invmod",Lstarinvmod,lambda); /* return fixnum modulus ^-1 */
532:
533: MK("fseek",Lfseek,lambda); /* seek to a specific byte in a file */
534: MK("fileopen", Lfileopen, lambda);
535: /* open a file for read/write/append*/
536:
537: MK("pv%",Lpolyev,lambda); /* polynomial evaluation instruction*/
538: MK("cprintf",Lcprintf,lambda); /* formatted print */
539: MK("sprintf",Lsprintf,lambda); /* formatted print to string */
540: MK("copyint*",Lcopyint,lambda); /* copyint* */
541: MK("purcopy",Lpurcopy,lambda); /* pure copy */
542: MK("purep",Lpurep,lambda); /* check if pure */
543: MK("int:memreport",LImemory,lambda); /* dump memory stats */
544:
545: /*
546: * Hunk stuff
547: */
548:
549: MK("*makhunk",LMakhunk,lambda); /* special hunk creater */
550: MK("hunkp",Lhunkp,lambda); /* test a hunk */
551: MK("cxr",Lcxr,lambda); /* cxr of a hunk */
552: MK("rplacx",Lrplacx,lambda); /* replace element of a hunk */
553: MK("*rplacx",Lstarrpx,lambda); /* rplacx used by hunk */
554: MK("hunksize",Lhunksize,lambda); /* size of a hunk */
555: MK("hunk-to-list",Lhtol,lambda); /* hunk to list */
556:
557: /* vector stuff */
558: MK("new-vector",Lnvec,lambda);
559: MK("new-vectori-byte",Lnvecb,lambda);
560: MK("new-vectori-word",Lnvecw,lambda);
561: MK("new-vectori-long",Lnvecl,lambda);
562: MK("vectorp",Lvectorp,lambda);
563: MK("vectorip",Lpvp,lambda);
564: MK("int:vref",LIvref,lambda);
565: MK("int:vset",LIvset,lambda);
566: MK("int:vsize",LIvsize,lambda);
567: MK("vsetprop",Lvsp,lambda);
568: MK("vprop",Lvprop,lambda);
569:
570: MK("probef",Lprobef,lambda); /* test file existance */
571: MK("substring",Lsubstring,lambda);
572: MK("substringn",Lsstrn,lambda);
573: MK("time-string",Ltimestr,lambda);
574: odform = matom("odformat"); /* format for printf's used in od */
575: rdrsdot = newsdot(); /* used in io conversions of bignums */
576: rdrsdot2 = newsdot(); /* used in io conversions of bignums */
577: rdrint = newint(); /* used as a temporary integer */
578: (nilplist = newdot())->d.cdr = newdot();
579: /* used as property list for nil,
580: since nil will eventually be put at
581: 0 (consequently in text and not
582: writable) */
583:
584: /* error variables */
585: (Vererr = matom("ER%err"))->a.clb = nil;
586: (Vertpl = matom("ER%tpl"))->a.clb = nil;
587: (Verall = matom("ER%all"))->a.clb = nil;
588: (Vermisc = matom("ER%misc"))->a.clb = nil;
589: (Verbrk = matom("ER%brk"))->a.clb = nil;
590: (Verundef = matom("ER%undef"))->a.clb = nil;
591: (Vlerall = newdot())->d.car = Verall; /* list (ER%all) */
592: (Veruwpt = matom("ER%unwind-protect"))->a.clb = nil;
593: (Verrset = matom("errset"))->a.clb = nil;
594:
595:
596: /* set up the initial status list */
597:
598: stlist = nil; /* initially nil */
599: {
600: lispval feature, dom;
601: Iaddstat(matom("features"),ST_READ,ST_NO,nil);
602: Iaddstat(feature = matom("feature"),ST_FEATR,ST_FEATW,nil);
603: Isstatus(feature,matom("franz"));
604: Isstatus(feature,matom("Franz"));
605: Isstatus(feature,matom(OS));
606: Isstatus(feature,matom("string"));
607: Isstatus(feature,dom = matom(DOMAIN));
608: Iaddstat(matom("domain"),ST_READ,ST_NO,dom);
609: Isstatus(feature,matom(MACHINE));
610: #ifdef PORTABLE
611: Isstatus(feature,matom("portable"));
612: #endif
613: #ifdef unisoft
614: Isstatus(feature,matom("unisoft"));
615: #endif
616: #ifdef sun
617: Isstatus(feature,matom("sun"));
618: #endif
619: #if os_4_1c | os_4_2
620: Isstatus(feature,matom("long-filenames"));
621: #endif
622: }
623: Iaddstat(matom("nofeature"),ST_NFETR,ST_NFETW,nil);
624: Iaddstat(matom("syntax"),ST_SYNT,ST_NO,nil);
625: Iaddstat(matom("uctolc"),ST_READ,ST_TOLC,nil);
626: Iaddstat(matom("dumpcore"),ST_READ,ST_CORE,nil);
627: Isstatus(matom("dumpcore"),nil); /*set up signals*/
628:
629: Iaddstat(matom("chainatom"),ST_RINTB,ST_INTB,inewint(0));
630: Iaddstat(matom("dumpmode"),ST_DMPR,ST_DMPW,nil);
631: Iaddstat(matom("appendmap"),ST_READ,ST_SET,nil); /* used by fasl */
632: Iaddstat(matom("debugging"),ST_READ,ST_SET,nil);
633: Iaddstat(matom("evalhook"),ST_RINTB,ST_INTB,inewint(3));
634: Isstatus(matom("evalhook"),nil); /*evalhook switch off */
635: Iaddstat(matom("bcdtrace"),ST_READ,ST_BCDTR,nil);
636: Iaddstat(matom("ctime"),ST_CTIM,ST_NO,nil);
637: Iaddstat(matom("localtime"),ST_LOCT,ST_NO,nil);
638: Iaddstat(matom("isatty"),ST_ISTTY,ST_NO,nil);
639: Iaddstat(matom("ignoreeof"),ST_READ,ST_SET,nil);
640: Iaddstat(matom("version"),ST_READ,ST_NO,mstr("Franz Lisp, Opus 38"));
641: Iaddstat(matom("automatic-reset"),ST_READ,ST_AUTR,nil);
642: Iaddstat(matom("translink"),ST_READ,ST_TRAN,nil);
643: Isstatus(matom("translink"),nil); /* turn off tran links */
644: Iaddstat(matom("undeffunc"),ST_UNDEF,ST_NO,nil); /* list undef funcs */
645: Iaddstat(matom("gcstrings"),ST_READ,ST_GCSTR,nil); /* gc strings */
646:
647: /* garbage collector things */
648:
649: MK("gc",Ngc,nlambda);
650: gcafter = MK("gcafter",Ngcafter,nlambda); /* garbage collection wind-up */
651: gcport = matom("gcport"); /* port for gc dumping */
652: gccheck = matom("gccheck"); /* flag for checking during gc */
653: gcdis = matom("gcdisable"); /* variable for disabling the gc */
654: gcdis->a.clb = nil;
655: gcload = matom("gcload"); /* option for gc while loading */
656: loading = matom("loading"); /* flag--in loader if = t */
657: noautot = matom("noautotrace"); /* option to inhibit auto-trace */
658: Vgcprint = matom("$gcprint"); /* if t then pring gc messages */
659: Vgcprint->a.clb = nil;
660:
661: (gcthresh = newint())->i = tgcthresh;
662: gccall1 = newdot(); gccall2 = newdot(); /* used to call gcafter */
663: gccall1->d.car = gcafter; /* start constructing a form for eval */
664:
665: arrayst = mstr("ARRAY"); /* array marker in name stack */
666: bcdst = mstr("BINARY"); /* binary function marker */
667: listst = mstr("INTERPRETED"); /* interpreted function marker */
668: macrost = mstr("MACRO"); /* macro marker */
669: protst = mstr("PROTECTED"); /* protection marker */
670: badst = mstr("BADPTR"); /* bad pointer marker */
671: argst = mstr("ARGST"); /* argument marker */
672: hunkfree = mstr("EMPTY"); /* empty hunk cell value */
673:
674: /* type names */
675:
676: FIDDLE(atom_name,atom_items,atom_pages,ATOMSPP);
677: FIDDLE(str_name,str_items,str_pages,STRSPP);
678: FIDDLE(other_name,other_items,other_pages,STRSPP);
679: FIDDLE(int_name,int_items,int_pages,INTSPP);
680: FIDDLE(dtpr_name,dtpr_items,dtpr_pages,DTPRSPP);
681: FIDDLE(doub_name,doub_items,doub_pages,DOUBSPP);
682: FIDDLE(sdot_name,sdot_items,sdot_pages,SDOTSPP);
683: FIDDLE(array_name,array_items,array_pages,ARRAYSPP);
684: FIDDLE(val_name,val_items,val_pages,VALSPP);
685: FIDDLE(funct_name,funct_items,funct_pages,BCDSPP);
686:
687: FIDDLE(hunk_name[0], hunk_items[0], hunk_pages[0], HUNK2SPP);
688: FIDDLE(hunk_name[1], hunk_items[1], hunk_pages[1], HUNK4SPP);
689: FIDDLE(hunk_name[2], hunk_items[2], hunk_pages[2], HUNK8SPP);
690: FIDDLE(hunk_name[3], hunk_items[3], hunk_pages[3], HUNK16SPP);
691: FIDDLE(hunk_name[4], hunk_items[4], hunk_pages[4], HUNK32SPP);
692: FIDDLE(hunk_name[5], hunk_items[5], hunk_pages[5], HUNK64SPP);
693: FIDDLE(hunk_name[6], hunk_items[6], hunk_pages[6], HUNK128SPP);
694:
695: FIDDLE(vect_name, vect_items, vect_pages, VECTORSPP)
696: FIDDLE(vecti_name, vecti_items, vecti_pages, VECTORSPP)
697:
698: (plimit = newint())->i = page_limit;
699: copval(plima,plimit); /* default value */
700:
701: /* the following atom is used when reading caar, cdar, etc. */
702:
703: xatom = matom("??");
704:
705: /* now it is OK to collect garbage */
706:
707: initflag = FALSE;
708: }
709:
710: /* matom("name") ******************************************************/
711: /* */
712: /* simulates an atom being read in from the reader and returns a */
713: /* pointer to it. */
714: /* */
715: /* BEWARE: if an atom becomes "truly worthless" and is collected, */
716: /* the pointer becomes obsolete. */
717: /* */
718: lispval
719: matom(string)
720: char *string;
721: {
722: strbuf[0] = 0;
723: strcatn(strbuf,string,STRBLEN-1); /* strcpyn always pads to n */
724: strbuf[STRBLEN-1] = 0;
725: return(getatom(TRUE));
726: }
727:
728: /* mstr ***************************************************************/
729: /* */
730: /* Makes a string. Uses matom. */
731: /* Not the most efficient but will do until the string from the code */
732: /* itself can be used as a lispval. */
733:
734: lispval mstr(string) char *string;
735: {
736: return((lispval)(pinewstr(string)));
737: }
738:
739: /* mfun("name",start) *************************************************/
740: /* */
741: /* Same as matom, but entry point to c code is associated with */
742: /* "name" as function binding. */
743: /* A pointer to the atom is returned. */
744: /* */
745: lispval mfun(string,start,discip) char *string; lispval (*start)(), discip;
746: {
747: lispval v;
748: v = matom(string);
749: v->a.fnbnd = newfunct();
750: v->a.fnbnd->bcd.start = start;
751: v->a.fnbnd->bcd.discipline = discip;
752: return(v);
753: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.