Commit | Line | Data |
---|---|---|
654e6e2d JF |
1 | #include "global.h" |
2 | #include "lfuncs.h" | |
3 | #define MK(x,y,z) mfun(x,y,z) | |
4 | #define FIDDLE(a,b,c,d) a->clb=newdot(); (a->clb->car=newint())->i=b->i; \ | |
5 | a->clb->cdr=newdot(); (a->clb->cdr->car=newint())->i=c->i; \ | |
6 | a->clb->cdr->cdr=newdot(); (a->clb->cdr->cdr->car=newint())->i=d; \ | |
7 | b = a->clb->car; c = a->clb->cdr->car; \ | |
8 | copval(a,a->clb); a->clb = nil; | |
9 | ||
10 | #define cforget(x) protect(x); Lforget(); unprot(); | |
11 | ||
12 | /* The following array serves as the temporary counters of the items */ | |
13 | /* and pages used in each space. */ | |
14 | ||
15 | long int tint[18]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; | |
16 | ||
17 | long int tgcthresh = 15; | |
18 | int initflag = TRUE; /* starts off TRUE to indicate unsafe to gc */ | |
19 | ||
20 | #define PAGE_LIMIT 3800 | |
21 | ||
22 | extern Iaddstat(); | |
23 | ||
24 | makevals() | |
25 | { | |
26 | lispval temp; | |
27 | ||
28 | /* system list structure and atoms are initialized. */ | |
29 | ||
30 | /* Before any lisp data can be created, the space usage */ | |
31 | /* counters must be set up, temporarily in array tint. */ | |
32 | ||
33 | atom_items = (lispval) &tint[0]; | |
34 | atom_pages = (lispval) &tint[1]; | |
35 | str_items = (lispval) &tint[2]; | |
36 | str_pages = (lispval) &tint[3]; | |
37 | int_items = (lispval) &tint[4]; | |
38 | int_pages = (lispval) &tint[5]; | |
39 | dtpr_items = (lispval) &tint[6]; | |
40 | dtpr_pages = (lispval) &tint[7]; | |
41 | doub_items = (lispval) &tint[8]; | |
42 | doub_pages = (lispval) &tint[9]; | |
43 | sdot_items = (lispval) &tint[10]; | |
44 | sdot_pages = (lispval) &tint[11]; | |
45 | array_items = (lispval) &tint[12]; | |
46 | array_pages = (lispval) &tint[13]; | |
47 | val_items = (lispval) &tint[14]; | |
48 | val_pages = (lispval) &tint[15]; | |
49 | funct_items = (lispval) &tint[16]; | |
50 | funct_pages = (lispval) &tint[17]; | |
51 | ||
52 | /* This also applies to the garbage collection threshhold */ | |
53 | ||
54 | gcthresh = (lispval) &tgcthresh; | |
55 | ||
56 | /* Now we commence constructing system lisp structures. */ | |
57 | ||
58 | /* nil is a special case, constructed especially at location zero */ | |
59 | ||
60 | hasht['n'^'i'^'l'] = (struct atom *)nil; | |
61 | ||
62 | ||
63 | atom_name = matom("symbol"); | |
64 | str_name = matom("string"); | |
65 | int_name = matom("fixnum"); | |
66 | dtpr_name = matom("list"); | |
67 | doub_name = matom("flonum"); | |
68 | sdot_name = matom("bignum"); | |
69 | array_name = matom("array"); | |
70 | val_name = matom("value"); | |
71 | funct_name = matom("binary"); | |
72 | ||
73 | ||
74 | /* set up the name stack as an array of pointers */ | |
75 | ||
76 | lbot = orgnp = np = ((struct argent *)csegment(val_name,NAMESIZE)); | |
77 | nplim = orgnp+NAMESIZE-5; | |
78 | temp = matom("namestack"); | |
79 | nstack = temp->fnbnd = newarray(); | |
80 | nstack->data = (char *) (np); | |
81 | (nstack->length = newint())->i = NAMESIZE; | |
82 | (nstack->delta = newint())->i = sizeof(struct argent); | |
83 | ||
84 | /* set up the binding stack as an array of dotted pairs */ | |
85 | ||
86 | orgbnp = bnp = ((struct nament *)csegment(dtpr_name,NAMESIZE)); | |
87 | bnplim = orgbnp+NAMESIZE-5; | |
88 | temp = matom("bindstack"); | |
89 | bstack = temp->fnbnd = newarray(); | |
90 | bstack->data = (char *) (bnp); | |
91 | (bstack->length = newint())->i = NAMESIZE; | |
92 | (nstack->delta = newint())->i = sizeof(struct nament); | |
93 | ||
94 | /* more atoms */ | |
95 | ||
96 | tatom = matom("t"); | |
97 | tatom->clb = tatom; | |
98 | lambda = matom("lambda"); | |
99 | nlambda = matom("nlambda"); | |
100 | macro = matom("macro"); | |
101 | ibase = matom("ibase"); /* base for input conversion */ | |
102 | ibase->clb = inewint(10); | |
103 | Vpiport = matom("piport"); | |
104 | Vpiport->clb = P(piport = stdin); /* standard input */ | |
105 | Vpoport = matom("poport"); | |
106 | Vpoport->clb = P(poport = stdout); /* stand. output */ | |
107 | matom("errport")->clb = (P(errport = stderr));/* stand. err. */ | |
108 | (Vreadtable = matom("readtable"))->clb = Imkrtab(0); | |
109 | strtab = Imkrtab(0); | |
110 | ||
111 | /* The following atoms are used as tokens by the reader */ | |
112 | ||
113 | perda = matom("."); | |
114 | lpara = matom("("); | |
115 | rpara = matom(")"); | |
116 | lbkta = matom("["); | |
117 | rbkta = matom("]"); | |
118 | snqta = matom("'"); | |
119 | exclpa = matom("!"); | |
120 | ||
121 | ||
122 | (Eofa = matom("eof"))->clb = eofa; | |
123 | cara = MK("car",Lcar,lambda); | |
124 | cdra = MK("cdr",Lcdr,lambda); | |
125 | ||
126 | /* The following few atoms have values the reader tokens. */ | |
127 | /* Perhaps this is a kludge which should be abandoned. */ | |
128 | /* On the other hand, perhaps it is an inspiration. */ | |
129 | ||
130 | matom("perd")->clb = perda; | |
131 | matom("lpar")->clb = lpara; | |
132 | matom("rpar")->clb = rpara; | |
133 | matom("lbkt")->clb = lbkta; | |
134 | matom("rbkt")->clb = rbkta; | |
135 | ||
136 | noptop = matom("noptop"); | |
137 | ||
138 | /* atoms used in connection with comments. */ | |
139 | ||
140 | commta = matom("comment"); | |
141 | rcomms = matom("readcomments"); | |
142 | ||
143 | /* the following atoms are used for lexprs */ | |
144 | ||
145 | lexpr_atom = matom("last lexpr binding\7"); | |
146 | lexpr = matom("lexpr"); | |
147 | ||
148 | sysa = matom("sys"); | |
149 | plima = matom("pagelimit"); /* max number of pages */ | |
150 | Veval = MK("eval",Leval,lambda); | |
151 | MK("asin",Lasin,lambda); | |
152 | MK("acos",Lacos,lambda); | |
153 | MK("atan",Latan,lambda); | |
154 | MK("cos",Lcos,lambda); | |
155 | MK("sin",Lsin,lambda); | |
156 | MK("sqrt",Lsqrt,lambda); | |
157 | MK("exp",Lexp,lambda); | |
158 | MK("log",Llog,lambda); | |
159 | MK("random",Lrandom,lambda); | |
160 | MK("atom",Latom,lambda); | |
161 | MK("apply",Lapply,lambda); | |
162 | MK("funcall",Lfuncal,lambda); | |
163 | MK("return",Lreturn,lambda); | |
164 | MK("retbrk",Lretbrk,lambda); | |
165 | MK("cont",Lreturn,lambda); | |
166 | MK("cons",Lcons,lambda); | |
167 | MK("scons",Lscons,lambda); | |
168 | MK("cadr",Lcadr,lambda); | |
169 | MK("caar",Lcaar,lambda); | |
170 | MK("cddr",Lc02r,lambda); | |
171 | MK("caddr",Lc12r,lambda); | |
172 | MK("cdddr",Lc03r,lambda); | |
173 | MK("cadddr",Lc13r,lambda); | |
174 | MK("cddddr",Lc04r,lambda); | |
175 | MK("caddddr",Lc14r,lambda); | |
176 | MK("nthelem",Lnthelem,lambda); | |
177 | MK("eq",Leq,lambda); | |
178 | MK("equal",Lequal,lambda); | |
179 | MK("numberp",Lnumberp,lambda); | |
180 | MK("dtpr",Ldtpr,lambda); | |
181 | MK("bcdp",Lbcdp,lambda); | |
182 | MK("portp",Lportp,lambda); | |
183 | MK("arrayp",Larrayp,lambda); | |
184 | MK("valuep",Lvaluep,lambda); | |
185 | MK("get_pname",Lpname,lambda); | |
186 | MK("arrayref",Larrayref,lambda); | |
187 | MK("marray",Lmarray,lambda); | |
188 | MK("getlength",Lgetl,lambda); | |
189 | MK("putlength",Lputl,lambda); | |
190 | MK("getaccess",Lgeta,lambda); | |
191 | MK("putaccess",Lputa,lambda); | |
192 | MK("getdelta",Lgetdel,lambda); | |
193 | MK("putdelta",Lputdel,lambda); | |
194 | MK("getaux",Lgetaux,lambda); | |
195 | MK("putaux",Lputaux,lambda); | |
196 | MK("mfunction",Lmfunction,lambda); | |
197 | MK("getentry",Lgetentry,lambda); | |
198 | MK("getdisc",Lgetdisc,lambda); | |
199 | MK("segment",Lsegment,lambda); | |
200 | MK("rplaca",Lrplaca,lambda); | |
201 | MK("rplacd",Lrplacd,lambda); | |
202 | MK("set",Lset,lambda); | |
203 | MK("replace",Lreplace,lambda); | |
204 | MK("infile",Linfile,lambda); | |
205 | MK("outfile",Loutfile,lambda); | |
206 | MK("terpr",Lterpr,lambda); | |
207 | MK("print",Lprint,lambda); | |
208 | MK("close",Lclose,lambda); | |
209 | MK("patom",Lpatom,lambda); | |
210 | MK("pntlen",Lpntlen,lambda); | |
211 | MK("read",Lread,lambda); | |
212 | MK("ratom",Lratom,lambda); | |
213 | MK("readc",Lreadc,lambda); | |
214 | MK("implode",Limplode,lambda); | |
215 | MK("maknam",Lmaknam,lambda); | |
216 | MK("concat",Lconcat,lambda); | |
217 | MK("uconcat",Luconcat,lambda); | |
218 | MK("putprop",Lputprop,lambda); | |
219 | MK("get",Lget,lambda); | |
220 | MK("getd",Lgetd,lambda); | |
221 | MK("putd",Lputd,lambda); | |
222 | MK("prog",Nprog,nlambda); | |
223 | quota = MK("quote",Nquote,nlambda); | |
224 | MK("function",Nfunction,nlambda); | |
225 | MK("go",Ngo,nlambda); | |
226 | MK("*catch",Ncatch,nlambda); | |
227 | MK("errset",Nerrset,nlambda); | |
228 | MK("status",Nstatus,nlambda); | |
229 | MK("sstatus",Nsstatus,nlambda); | |
230 | MK("err",Lerr,lambda); | |
231 | MK("*throw",Nthrow,lambda); /* this is a lambda now !! */ | |
232 | MK("reset",Nreset,nlambda); | |
233 | MK("break",Nbreak,nlambda); | |
234 | MK("exit",Lexit,lambda); | |
235 | MK("def",Ndef,nlambda); | |
236 | MK("null",Lnull,lambda); | |
237 | MK("and",Nand,nlambda); | |
238 | MK("or",Nor,nlambda); | |
239 | MK("setq",Nsetq,nlambda); | |
240 | MK("cond",Ncond,nlambda); | |
241 | MK("list",Llist,lambda); | |
242 | MK("load",Lload,lambda); | |
243 | MK("nwritn",Lnwritn,lambda); | |
244 | MK("process",Nprocess,nlambda); /* execute a shell command */ | |
245 | MK("allocate",Lalloc,lambda); /* allocate a page */ | |
246 | MK("sizeof",Lsizeof,lambda); /* size of one item of a data type */ | |
247 | MK("dumplisp",Ndumpli,nlambda); /* save the world */ | |
248 | MK("top-level",Ntpl,nlambda); /* top level eval-print read loop */ | |
249 | startup = matom("startup"); /* used by save and restore */ | |
250 | MK("mapcar",Lmapcar,lambda); | |
251 | MK("maplist",Lmaplist,lambda); | |
252 | MK("mapcan",Lmapcan,lambda); | |
253 | MK("mapcon",Lmapcon,lambda); | |
254 | MK("assq",Lassq,lambda); | |
255 | MK("mapc",Lmapc,lambda); | |
256 | MK("map",Lmap,lambda); | |
257 | MK("flatsize",Lflatsi,lambda); | |
258 | MK("alphalessp",Lalfalp,lambda); | |
259 | MK("drain",Ldrain,lambda); | |
260 | MK("killcopy",Lkilcopy,lambda); /* forks aand aborts for adb */ | |
261 | MK("opval",Lopval,lambda); /* sets and retrieves system variables */ | |
262 | MK("ncons",Lncons,lambda); | |
263 | sysa = matom("sys"); /* sys indicator for system variables */ | |
264 | MK("remob",Lforget,lambda); /* function to take atom out of hash table */ | |
265 | splice = matom("splicing"); | |
266 | MK("not",Lnull,lambda); | |
267 | MK("plus",Ladd,lambda); | |
268 | MK("add",Ladd,lambda); | |
269 | MK("times",Ltimes,lambda); | |
270 | MK("difference",Lsub,lambda); | |
271 | MK("quotient",Lquo,lambda); | |
272 | MK("mod",Lmod,lambda); | |
273 | MK("minus",Lminus,lambda); | |
274 | MK("absval",Labsval,lambda); | |
275 | MK("add1",Ladd1,lambda); | |
276 | MK("sub1",Lsub1,lambda); | |
277 | MK("greaterp",Lgreaterp,lambda); | |
278 | MK("lessp",Llessp,lambda); | |
279 | MK("zerop",Lzerop,lambda); | |
280 | MK("minusp",Lnegp,lambda); | |
281 | MK("onep",Lonep,lambda); | |
282 | MK("sum",Ladd,lambda); | |
283 | MK("product",Ltimes,lambda); | |
284 | MK("do",Ndo,nlambda); | |
285 | MK("progv",Nprogv,nlambda); | |
286 | MK("progn",Nprogn,nlambda); | |
287 | MK("prog2",Nprog2,nlambda); | |
288 | MK("oblist",Loblist,lambda); | |
289 | MK("baktrace",Lbaktra,lambda); | |
290 | MK("tyi",Ltyi,lambda); | |
291 | MK("tyipeek",Ltyipeek,lambda); | |
292 | MK("tyo",Ltyo,lambda); | |
293 | MK("setsyntax",Lsetsyn,lambda); | |
294 | MK("makereadtable",Lmakertbl,lambda); | |
295 | MK("zapline",Lzaplin,lambda); | |
296 | MK("aexplode",Lexplda,lambda); | |
297 | MK("aexplodec",Lexpldc,lambda); | |
298 | MK("aexploden",Lexpldn,lambda); | |
299 | MK("argv",Largv,lambda); | |
300 | MK("arg",Larg,lambda); | |
301 | MK("showstack",Lshostk,lambda); | |
302 | MK("resetio",Nreseti,nlambda); | |
303 | MK("chdir",Lchdir,lambda); | |
304 | MK("ascii",Lascii,lambda); | |
305 | MK("boole",Lboole,lambda); | |
306 | MK("type",Ltype,lambda); /* returns type-name of argument */ | |
307 | MK("fix",Lfix,lambda); | |
308 | MK("float",Lfloat,lambda); | |
309 | MK("fact",Lfact,lambda); | |
310 | MK("cpy1",Lcpy1,lambda); | |
311 | MK("Divide",LDivide,lambda); | |
312 | MK("Emuldiv",LEmuldiv,lambda); | |
313 | MK("readlist",Lreadli,lambda); | |
314 | MK("plist",Lplist,lambda); /* gives the plist of an atom */ | |
315 | MK("setplist",Lsetpli,lambda); /* get plist of an atom */ | |
316 | MK("eval-when",Nevwhen,nlambda); | |
317 | MK("syscall",Nsyscall,nlambda); | |
318 | MK("ptime",Lptime,lambda); /* return process user time */ | |
319 | /* | |
320 | MK("fork",Lfork,lambda); | |
321 | MK("wait",Lwait,lambda); | |
322 | MK("pipe",Lpipe,lambda); | |
323 | MK("fdopen",Lfdopen,lambda); | |
324 | MK("exece",Lexece,lambda); | |
325 | */ | |
326 | MK("gensym",Lgensym,lambda); | |
327 | MK("remprop",Lremprop,lambda); | |
328 | MK("bcdad",Lbcdad,lambda); | |
329 | MK("symbolp",Lsymbolp,lambda); | |
330 | MK("stringp",Lstringp,lambda); | |
331 | MK("rematom",Lrematom,lambda); | |
332 | MK("prname",Lprname,lambda); | |
333 | MK("getenv",Lgetenv,lambda); | |
334 | MK("makunbound",Lmakunb,lambda); | |
335 | MK("haipart",Lhaipar,lambda); | |
336 | MK("haulong",Lhau,lambda); | |
337 | MK("signal",Lsignal,lambda); | |
338 | MK("fasl",Lfasl,lambda); /* read in compiled file */ | |
339 | MK("bind",Lbind,lambda); /* like fasl but for functions | |
340 | loaded in when the lisp system | |
341 | was constructed by ld */ | |
342 | MK("boundp",Lboundp,lambda); /* tells if an atom is bound */ | |
343 | MK("fake",Lfake,lambda); /* makes a fake lisp pointer */ | |
344 | MK("od",Lod,lambda); /* dumps info */ | |
345 | MK("what",Lwhat,lambda); /* converts a pointer to an integer */ | |
346 | MK("pv%",Lpolyev,lambda); /* polynomial evaluation instruction */ | |
347 | odform = matom("odformat"); /* format for printf's used in od */ | |
348 | rdrsdot = newsdot(); /* used in io conversions of bignums */ | |
349 | rdrint = newint(); /* used as a temporary integer */ | |
350 | (nilplist = newdot())->cdr = newdot(); | |
351 | /* used as property list for nil, | |
352 | since nil will eventually be put at | |
353 | 0 (consequently in text and not | |
354 | writable) */ | |
355 | ||
356 | /* error variables */ | |
357 | (Vererr = matom("ER%err"))->clb = nil; | |
358 | (Vertpl = matom("ER%tpl"))->clb = nil; | |
359 | (Verall = matom("ER%all"))->clb = nil; | |
360 | (Vermisc = matom("ER%misc"))->clb = nil; | |
361 | (Vlerall = newdot())->car = Verall; /* list (ER%all) */ | |
362 | ||
363 | ||
364 | /* set up the initial status list */ | |
365 | ||
366 | stlist = nil; /* initially nil */ | |
367 | Iaddstat(matom("features"),ST_READ,ST_NO,nil); | |
368 | Iaddstat(matom("feature"),ST_FEATR,ST_FEATW,nil); | |
369 | Isstatus(matom("feature"),matom("franz")); | |
370 | ||
371 | Iaddstat(matom("nofeature"),ST_NFETR,ST_NFETW,nil); | |
372 | Iaddstat(matom("syntax"),ST_SYNT,ST_NO,nil); | |
373 | Iaddstat(matom("uctolc"),ST_READ,ST_TOLC,nil); | |
374 | Iaddstat(matom("dumpcore"),ST_READ,ST_CORE,nil); | |
375 | Isstatus(matom("dumpcore"),nil); /*set up signals*/ | |
376 | ||
377 | Iaddstat(matom("chainatom"),ST_RINTB,ST_INTB,inewint(0)); | |
378 | Iaddstat(matom("dumpmode"),ST_DMPR,ST_DMPW,nil); | |
379 | /* garbage collector things */ | |
380 | ||
381 | MK("gc",Ngc,nlambda); | |
382 | gcafter = MK("gcafter",Ngcafter,nlambda); /* garbage collection wind-up */ | |
383 | gcport = matom("gcport"); /* port for gc dumping */ | |
384 | gccheck = matom("gccheck"); /* flag for checking during gc */ | |
385 | gcdis = matom("gcdisable"); /* option for disabling the gc */ | |
386 | gcload = matom("gcload"); /* option for gc while loading */ | |
387 | loading = matom("loading"); /* flag--in loader if = t */ | |
388 | noautot = matom("noautotrace"); /* option to inhibit auto-trace */ | |
389 | (gcthresh = newint())->i = tgcthresh; | |
390 | gccall1 = newdot(); gccall2 = newdot(); /* used to call gcafter */ | |
391 | gccall1->car = gcafter; /* start constructing a form for eval */ | |
392 | ||
393 | arrayst = mstr("ARRAY"); /* array marker in name stack */ | |
394 | bcdst = mstr("BINARY"); /* binary function marker */ | |
395 | listst = mstr("INTERPRETED"); /* interpreted function marker */ | |
396 | macrost = mstr("MACRO"); /* macro marker */ | |
397 | protst = mstr("PROTECTED"); /* protection marker */ | |
398 | badst = mstr("BADPTR"); /* bad pointer marker */ | |
399 | argst = mstr("ARGST"); /* argument marker */ | |
400 | ||
401 | /* type names */ | |
402 | ||
403 | FIDDLE(atom_name,atom_items,atom_pages,ATOMSPP); | |
404 | FIDDLE(str_name,str_items,str_pages,STRSPP); | |
405 | FIDDLE(int_name,int_items,int_pages,INTSPP); | |
406 | FIDDLE(dtpr_name,dtpr_items,dtpr_pages,DTPRSPP); | |
407 | FIDDLE(doub_name,doub_items,doub_pages,DOUBSPP); | |
408 | FIDDLE(sdot_name,sdot_items,sdot_pages,SDOTSPP); | |
409 | FIDDLE(array_name,array_items,array_pages,ARRAYSPP); | |
410 | FIDDLE(val_name,val_items,val_pages,VALSPP); | |
411 | FIDDLE(funct_name,funct_items,funct_pages,BCDSPP); | |
412 | ||
413 | (plimit = newint())->i = PAGE_LIMIT; | |
414 | copval(plima,plimit); /* default value */ | |
415 | ||
416 | /* the following atom is used when reading caar, cdar, etc. */ | |
417 | ||
418 | xatom = matom("??"); | |
419 | ||
420 | /* now it is OK to collect garbage */ | |
421 | ||
422 | initflag = FALSE; | |
423 | } | |
424 | ||
425 | /* matom("name") ******************************************************/ | |
426 | /* */ | |
427 | /* simulates an atom being read in from the reader and returns a */ | |
428 | /* pointer to it. */ | |
429 | /* */ | |
430 | /* BEWARE: if an atom becomes "truly worthless" and is collected, */ | |
431 | /* the pointer becomes obsolete. */ | |
432 | /* */ | |
433 | lispval | |
434 | matom(string) | |
435 | char *string; | |
436 | { | |
437 | strcpy(strbuf,string); | |
438 | return(getatom()); | |
439 | } | |
440 | ||
441 | /* mstr ***************************************************************/ | |
442 | /* */ | |
443 | /* Makes a string. Uses matom. */ | |
444 | /* Not the most efficient but will do until the string from the code */ | |
445 | /* itself can be used as a lispval. */ | |
446 | ||
447 | lispval mstr(string) char *string; | |
448 | { | |
449 | return((lispval)(inewstr(string))); | |
450 | } | |
451 | ||
452 | /* mfun("name",entry) *************************************************/ | |
453 | /* */ | |
454 | /* Same as matom, but entry point to c code is associated with */ | |
455 | /* "name" as function binding. */ | |
456 | /* A pointer to the atom is returned. */ | |
457 | /* */ | |
458 | lispval mfun(string,entry,discip) char *string; lispval (*entry)(), discip; | |
459 | { | |
460 | lispval v; | |
461 | v = matom(string); | |
462 | v -> fnbnd = newfunct(); | |
463 | v->fnbnd->entry = entry; | |
464 | v->fnbnd->discipline = discip; | |
465 | return(v); | |
466 | } |