Annotation of 3BSD/cmd/lisp/sysat.c, revision 1.1

1.1     ! root        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:        }

unix.superglobalmegacorp.com

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