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

1.1     ! root        1: #include "global.h"
        !             2: FILE *
        !             3: mkstFI(base,count,flag)
        !             4: char *base;
        !             5: char flag;
        !             6: {
        !             7:        register FILE *p = stderr;
        !             8: 
        !             9:        /* find free file descriptor */
        !            10:        for(;p->_flag&(_IOREAD|_IOWRT);p++)
        !            11:                if(p >= _iob + _NFILE)
        !            12:                        error("Too many open files to do readlist",FALSE);
        !            13:        p->_flag = _IOSTRG | flag;
        !            14:        p->_cnt = count;
        !            15:        p->_base = base;
        !            16:        p->_ptr = base;
        !            17:        p->_file = -1;
        !            18:        return(p);
        !            19: }
        !            20: lispval
        !            21: Lreadli()
        !            22: {
        !            23:        register lispval work, handy;
        !            24:        register FILE *p;
        !            25:        register char *string;
        !            26:        register struct argent *lbot, *np;
        !            27:        struct argent *olbot;
        !            28:        FILE *opiport = piport;
        !            29:        lispval Lread();
        !            30:        int count;
        !            31: 
        !            32:        chkarg(1);
        !            33:        if(lbot->val==nil) {            /*effectively, return(matom(""));*/
        !            34:                strbuf[0] = 0;
        !            35:                return(getatom());
        !            36:        }
        !            37:        count = 1;
        !            38: 
        !            39:        /* compute length of list */
        !            40:        for(work = lbot->val; TYPE(work)==DTPR; work=work->cdr)
        !            41:                count++;
        !            42:        string = (char *) alloca(count);
        !            43:        p = mkstFI(string, count - 1, _IOREAD);
        !            44:        for(work = lbot->val; TYPE(work)==DTPR; work=work->cdr) {
        !            45:                handy = work->car;
        !            46:                switch(TYPE(handy)) {
        !            47:                case SDOT:
        !            48:                case INT:
        !            49:                        *string++=handy->i;
        !            50:                        break;
        !            51:                case ATOM:
        !            52:                        *string++ = *(handy->pname);
        !            53:                        break;
        !            54:                default:
        !            55:                        error("Non atom or int to readlist",FALSE);
        !            56:                }
        !            57:        }
        !            58:        *string = 0;
        !            59:        olbot = lbot;
        !            60:        lbot = np;
        !            61:        protect(P(p));
        !            62:        work = Lread();
        !            63:        lbot = olbot;
        !            64:        frstFI(p);
        !            65:        return(work);
        !            66: }
        !            67: frstFI(p)
        !            68: register FILE *p;
        !            69: {
        !            70:        p->_flag=0;
        !            71:        p->_base=0;
        !            72:        p->_cnt = 0;
        !            73:        p->_ptr = 0;
        !            74:        p->_file = 0;
        !            75: }
        !            76: lispval
        !            77: Lgetenv()
        !            78: {
        !            79:        register struct argent *mylbot=lbot;
        !            80:        snpand(1);
        !            81:        if((TYPE(mylbot->val))!=ATOM)
        !            82:                error("argument to getenv must be atom",FALSE);
        !            83: 
        !            84:        strcpy(strbuf,getenv(mylbot->val->pname));
        !            85:        return(getatom());
        !            86: }
        !            87: lispval
        !            88: Lboundp()
        !            89: {
        !            90:        register struct argent *mynp=lbot;
        !            91:        register lispval result, handy;
        !            92:        snpand(3);
        !            93: 
        !            94:        if((TYPE(mynp->val))!=ATOM)
        !            95:                error("argument to boundp must be atom",FALSE);
        !            96:        if( (handy = mynp->val)->clb==CNIL)
        !            97:                result = nil;
        !            98:        else
        !            99:                (result = newdot())->cdr = handy->clb;
        !           100:        return(result);
        !           101: }
        !           102: lispval
        !           103: Lplist()
        !           104: {      
        !           105:        register lispval atm;
        !           106:        snpand(0);
        !           107:        /* get property list of an atom or disembodied property list */
        !           108: 
        !           109:        chkarg(1);
        !           110:        atm = lbot->val;
        !           111:        switch(TYPE(atm)) {
        !           112:        case ATOM:
        !           113:        case DTPR:
        !           114:                break;
        !           115:        default:
        !           116:                error("Only Atoms and disembodied property lists allowed for plist",FALSE);
        !           117:        }
        !           118:        if(atm==nil) return(nilplist);
        !           119:        return(atm->plist);
        !           120: }
        !           121: lispval
        !           122: Lsetpli()
        !           123: {      /* set the property list of the given atom to the given list */
        !           124:        register lispval atm, vall;
        !           125:        register lispval dum1, dum2;
        !           126:        register struct argent *lbot, *np;
        !           127:        snpand(2);
        !           128: 
        !           129:        chkarg(2);
        !           130:        atm = lbot->val;
        !           131:        if (TYPE(atm) != ATOM) error("First argument must be an atom",FALSE);
        !           132:        vall = (np-1)->val;
        !           133:        if (TYPE(vall)!= DTPR && vall !=nil)
        !           134:            error("Second argument must be a list",FALSE);
        !           135:        if (atm==nil)
        !           136:                nilplist = vall;
        !           137:        else
        !           138:                atm->plist = vall;
        !           139:        return(vall);
        !           140: }
        !           141: 
        !           142: lispval
        !           143: Lsignal()
        !           144: {
        !           145:        register struct argent *mylbot = lbot;
        !           146:        extern lispval sigacts[16];
        !           147:        int i; register lispval handy, old;
        !           148:        chkarg(2);
        !           149: 
        !           150:        handy = mylbot[AD].val;
        !           151:        if(TYPE(handy)!=INT)
        !           152:                error("First arg to signal must be an int",FALSE);
        !           153:        i = handy->i & 15;
        !           154:        handy = mylbot[AD+1].val;
        !           155:        if(TYPE(handy)!=ATOM)
        !           156:                error("Second arg to signal must be an atom",FALSE);
        !           157:        old = sigacts[i];
        !           158:        if(old==0) old = nil;
        !           159:        if(handy==nil)
        !           160:                sigacts[i]=((lispval) 0);
        !           161:        else
        !           162:                sigacts[i]=handy;
        !           163:        return(old);
        !           164: }
        !           165: lispval
        !           166: Lassq()
        !           167: {
        !           168:        register lispval work, handy, dum1, dum2;
        !           169:        register struct argent *lbot, *np;
        !           170:        snpand(2);
        !           171: 
        !           172:        chkarg(2);
        !           173:        for(work = lbot[AD+1].val;
        !           174:                work->car->car!=lbot->val&& work!=nil;
        !           175:                work = work->cdr);
        !           176:        return(work->car);
        !           177: }
        !           178: lispval
        !           179: Lkilcopy()
        !           180: {
        !           181:        if(fork()==0) {
        !           182:                asm(".byte 0");
        !           183:        }
        !           184: }
        !           185: lispval
        !           186: Larg()
        !           187: {
        !           188:        register lispval handy; register offset, count;
        !           189:        snpand(3);
        !           190: 
        !           191:        handy = lexpr_atom->clb;
        !           192:        if(handy==CNIL || TYPE(handy)!=DTPR)
        !           193:                error("Arg: not in context of Lexpr.",FALSE);
        !           194:        count = ((long *)handy->cdr) - (long *)handy->car;
        !           195:        if(np==lbot || lbot->val==nil)
        !           196:                return(inewint(count));
        !           197:        if(TYPE(lbot->val)!=INT || (offset = lbot->val->i - 1) > count || offset < 0 )
        !           198:                error("Out of bonds: arg to \"Arg\"",FALSE);
        !           199:        return( ((struct argent *)handy->car)[offset].val);
        !           200: }
        !           201: lispval
        !           202: Lptime(){
        !           203:        extern int GCtime;
        !           204:        int lgctime = GCtime;
        !           205:        static struct tbuf {
        !           206:                long    mytime;
        !           207:                long    allelse[3];
        !           208:        } current;
        !           209:        register lispval result, handy;
        !           210: 
        !           211:        snpand(2);
        !           212:        times(&current);
        !           213:        result = newdot();
        !           214:        handy = result;
        !           215:        protect(result);
        !           216:        result->cdr = newdot();
        !           217:        result->car = inewint(current.mytime);
        !           218:        handy = result->cdr;
        !           219:        handy->car = inewint(lgctime);
        !           220:        handy->cdr = nil;
        !           221:        if(GCtime==0)
        !           222:                GCtime = 1;
        !           223:        return(result);
        !           224: }
        !           225: 
        !           226: /* (err [value] [flag]) 
        !           227:    where if value is present, it is the value to throw to the errset.
        !           228:    flag if present must evaluate to nil, as we always evaluate value
        !           229:    before unwinding stack
        !           230:  */
        !           231: 
        !           232: lispval Lerr()
        !           233: {
        !           234:        register lispval handy;
        !           235:        lispval errorh();
        !           236:        char *mesg = "call to err";  /* default message */
        !           237: 
        !           238:        chkarg(1);
        !           239: 
        !           240:        if ((np >= lbot + 2) && ((lbot+1)->val != nil))
        !           241:                error("Second arg to err must be nil",FALSE);
        !           242:        if ((lbot->val != nil) && (TYPE(lbot->val) == ATOM))
        !           243:            mesg = lbot->val->pname;            /* new message if atom */
        !           244:                                
        !           245:        return(errorh(Vererr,mesg,lbot->val,nil));
        !           246: }
        !           247: lispval
        !           248: Ltyi()
        !           249: {
        !           250:        register FILE *port;
        !           251:        register char val;
        !           252: 
        !           253:        chkarg(1);
        !           254:        port = okport(lbot->val,okport(Vpiport->clb,stdin));
        !           255: 
        !           256: 
        !           257:        fflush(stdout);         /* flush any pending output characters */
        !           258:        val = getc(port);
        !           259:        return(inewint(val));
        !           260: }
        !           261: lispval
        !           262: Ltyipeek()
        !           263: {
        !           264:        register FILE *port;
        !           265:        register char val;
        !           266: 
        !           267:        chkarg(1);
        !           268:        port = okport(lbot->val,okport(Vpiport->clb,stdin));
        !           269: 
        !           270:        fflush(stdout);         /* flush any pending output characters */
        !           271:        val = getc(port);
        !           272:        ungetc(val,port);
        !           273:        return(inewint(val));
        !           274: }
        !           275: lispval
        !           276: Ltyo()
        !           277: {
        !           278:        register FILE *port;
        !           279:        register lispval handy, where;
        !           280:        register char val;
        !           281:        register struct argent *lbot, *np;
        !           282: 
        !           283:        chkarg(2);
        !           284:        handy = lbot->val;
        !           285:        if(TYPE(handy)!=INT)
        !           286:                error("Tyo demands number for 1st arg",FALSE);
        !           287:        val = handy->i;
        !           288: 
        !           289:        where = lbot[1].val;
        !           290:        port = (FILE *) okport(where,okport(Vpoport->clb,stdout));
        !           291:        putc(val,port);
        !           292:        return(handy);
        !           293: }
        !           294: lispval
        !           295: Imkrtab(current)
        !           296: {
        !           297:        extern struct rtab {
        !           298:                char ctable[132];
        !           299:        } initread;
        !           300:        register lispval handy; extern lispval lastrtab;
        !           301:        static int cycle = 0;
        !           302:        static char *nextfree;
        !           303:        if((cycle++)%3==0) {
        !           304:                nextfree = (char *) csegment(int_name,128);
        !           305:        }
        !           306:        handy = newarray();
        !           307:        handy->data = nextfree;
        !           308:        if(current == 0)
        !           309:                *(struct rtab *)nextfree = initread;
        !           310:        else
        !           311:                *(struct rtab *)nextfree = *(struct rtab *)ctable;
        !           312:        handy->delta = inewint(4);
        !           313:        handy->length = inewint(sizeof(struct rtab)/sizeof(int));
        !           314:        handy->accfun = handy->aux  = nil;
        !           315:        nextfree += sizeof(struct rtab);
        !           316:        return(handy);
        !           317: }
        !           318: 
        !           319: /* makereadtable - arg : t or nil
        !           320:        returns a readtable, t means return a copy of the initial readtable
        !           321: 
        !           322:                             nil means return a copy of the current readtable
        !           323: */
        !           324: lispval
        !           325: Lmakertbl()
        !           326: {
        !           327:        if(lbot==np) error("makereadtable: wrong number of args",FALSE);
        !           328: 
        !           329:        if(TYPE(lbot->val) != ATOM) 
        !           330:                error("makereadtable: arg must be atom",FALSE);
        !           331: 
        !           332:        if(lbot->val == nil) return(Imkrtab(1));
        !           333:        else return(Imkrtab(0));
        !           334: }
        !           335: lispval
        !           336: Lcpy1()
        !           337: {
        !           338:        register lispval handy = lbot->val, result = handy;
        !           339: 
        !           340: top:
        !           341:        switch(TYPE(handy))
        !           342:        {
        !           343:        case INT:
        !           344:                result = inewint(handy->i);
        !           345:                break;
        !           346:        case VALUE:
        !           347:                (result = newval())->l = handy->l;
        !           348:                break;
        !           349:        case DOUB:
        !           350:                (result = newdoub())->r = handy->r;
        !           351:                break;
        !           352:        default:
        !           353:                lbot->val =
        !           354:                    errorh(Vermisc,"Bad arg to cpy1",nil,TRUE,67,handy);
        !           355:                goto top;
        !           356:        }
        !           357:        return(result);
        !           358: }

unix.superglobalmegacorp.com

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