Annotation of 41BSD/cmd/lisp/sysat.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.