Annotation of 41BSD/cmd/lisp/lam4.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)lam4.c      34.1 10/3/80";
        !             2: 
        !             3: #include "global.h"
        !             4: typedef struct argent *ap;
        !             5: static int prunep; lispval adbig(),subbig(),mulbig();
        !             6: lispval
        !             7: Ladd()
        !             8: {
        !             9:        register lispval work;
        !            10:        register ap result, mynp, oldnp, lbot, np;
        !            11:        int itemp,restype;
        !            12: 
        !            13:        oldnp = result = np;
        !            14:        protect(rdrsdot);
        !            15:        rdrsdot->s.CDR = (lispval) 0;
        !            16:        rdrsdot->s.I =0;
        !            17:        restype = SDOT;
        !            18:        prunep = TRUE;
        !            19: 
        !            20:        for(mynp = lbot; mynp < oldnp; mynp++)
        !            21:        {
        !            22:                work = mynp->val;
        !            23:                switch(TYPE(work)) {
        !            24:                case INT:
        !            25:                        switch(restype) {
        !            26:                        case DOUB:
        !            27:                                result->val->r += work->i;
        !            28:                                break;
        !            29:                        case SDOT:
        !            30:                                dmlad(result->val,1,work->i);
        !            31:                                prunep = TRUE;
        !            32:                                break;
        !            33:                        default:
        !            34:                                goto urk;
        !            35:                        }
        !            36:                        break;
        !            37:                case SDOT:
        !            38:                        switch(restype) {
        !            39:                        case DOUB:
        !            40:                                error("Don't know how to make bignums into reals, yet",FALSE);
        !            41:                                break;
        !            42:                        case SDOT:
        !            43:                                result->val = adbig(work,result->val);
        !            44:                                restype = TYPE(result->val);
        !            45:                                if(restype==INT) {
        !            46:                                        rdrsdot->s.I=result->val->s.I;
        !            47:                                        rdrsdot->s.CDR = (lispval) 0;
        !            48:                                        result->val = rdrsdot;
        !            49:                                        restype=SDOT;
        !            50:                                        prunep = TRUE;
        !            51:                                } else
        !            52:                                        prunep = FALSE;
        !            53:                                break;
        !            54:                        default:
        !            55:                                goto urk;
        !            56:                        }
        !            57:                        break;
        !            58:                case DOUB:
        !            59:                        switch(restype) {
        !            60:                        case SDOT:
        !            61:                                if(result->val->s.CDR==(lispval) 0) {
        !            62:                                        protect(newdoub());
        !            63:                                        np[-1].val->r = result->val->i+work->r;
        !            64:                                        result->val = np[-1].val;
        !            65:                                        np--;
        !            66:                                        restype = DOUB;
        !            67:                                } else 
        !            68:                                        error("Don't know how to make bignums into reals, yet",FALSE);
        !            69:                                break;
        !            70:                        case DOUB:
        !            71:                                result->val->r += work->r;
        !            72:                                break;
        !            73:                        default:
        !            74:                                goto urk;
        !            75:                        }
        !            76:                        break;
        !            77:                default:
        !            78:                        errorh(Vermisc,"Non-number to add",nil,0,FALSE,work);
        !            79:                }
        !            80:        }
        !            81:        if(restype==DOUB || prunep==FALSE)
        !            82:                return(result->val);
        !            83:        else if (result->val->s.CDR==(lispval) 0)
        !            84:                return(inewint(result->val->s.I));
        !            85:        else {
        !            86:                struct sdot dummybig;
        !            87: 
        !            88:                dummybig.I = 0;
        !            89:                dummybig.CDR = (lispval) 0;
        !            90:                return(adbig(&dummybig,result->val));
        !            91:        }
        !            92:        urk:
        !            93:                error("Internal error in (add,sub,quo,times)",FALSE);
        !            94: }
        !            95: lispval
        !            96: Lsub()
        !            97: {
        !            98:        register lispval work;
        !            99:        register ap result, mynp, oldnp, lbot, np;
        !           100:        int itemp,restype;
        !           101:        lispval Lminus();
        !           102: 
        !           103:        oldnp = result = np;
        !           104:        mynp = lbot + 1;
        !           105:        protect(rdrsdot);
        !           106:        rdrsdot->s.CDR = (lispval) 0;
        !           107:        rdrsdot->s.I =0;
        !           108:        restype = SDOT;
        !           109:        prunep = TRUE;
        !           110:        if(oldnp==lbot)
        !           111:                goto out;
        !           112:        if(oldnp==mynp) {
        !           113:                np--;
        !           114:                return(Lminus());
        !           115:        }
        !           116:        work = lbot->val;
        !           117:        switch(TYPE(work)) {
        !           118:        case INT:
        !           119:                rdrsdot->s.I = work->i;
        !           120:                break;
        !           121:        case SDOT:
        !           122:                result->val = adbig(result->val,work);
        !           123:                if(TYPE(result->val)==INT) {
        !           124:                        rdrsdot->s.I = result->val->i;
        !           125:                        result->val = rdrsdot;
        !           126:                }
        !           127:                break;
        !           128:        case DOUB:
        !           129:                (result->val = newdoub())->r = work->r;
        !           130:                restype = DOUB;
        !           131:        }
        !           132: 
        !           133:        for(; mynp < oldnp; mynp++)
        !           134:        {
        !           135:                work = mynp->val;
        !           136:                switch(TYPE(work)) {
        !           137:                case INT:
        !           138:                        switch(restype) {
        !           139:                        case DOUB:
        !           140:                                result->val->r -= work->i;
        !           141:                                break;
        !           142:                        case SDOT:
        !           143:                                dmlad(result->val,1, -work->i);
        !           144:                                prunep = TRUE;
        !           145:                                break;
        !           146:                        default:
        !           147:                                goto urk;
        !           148:                        }
        !           149:                        break;
        !           150:                case SDOT:
        !           151:                        switch(restype) {
        !           152:                        case DOUB:
        !           153:                                errorh(Vermisc,
        !           154:                                       "difference: Don't know how to make bignums into reals, yet",
        !           155:                                       nil,FALSE,0,work);
        !           156:                                break;
        !           157:                        case SDOT:
        !           158:                                result->val = subbig(result->val,work);
        !           159:                                restype = TYPE(result->val);
        !           160:                                if(restype==INT) {
        !           161:                                        rdrsdot->s.I=result->val->s.I;
        !           162:                                        rdrsdot->s.CDR = (lispval) 0;
        !           163:                                        result->val = rdrsdot;
        !           164:                                        restype=SDOT;
        !           165:                                        prunep = TRUE;
        !           166:                                } else
        !           167:                                        prunep = FALSE;
        !           168:                                break;
        !           169:                        default:
        !           170:                                goto urk;
        !           171:                        }
        !           172:                        break;
        !           173:                case DOUB:
        !           174:                        switch(restype) {
        !           175:                        case SDOT:
        !           176:                                if(result->val->s.CDR==(lispval) 0) {
        !           177:                                        protect(newdoub());
        !           178:                                        np[-1].val->r = result->val->i-work->r;
        !           179:                                        result->val = np[-1].val;
        !           180:                                        np--;
        !           181:                                        restype = DOUB;
        !           182:                                } else 
        !           183:                                        errorh(Vermisc,
        !           184:                                               "difference: Don't know how to make bignums into reals ",nil,FALSE,0,work);
        !           185:                                break;
        !           186:                        case DOUB:
        !           187:                                result->val->r -= work->r;
        !           188:                                break;
        !           189:                        default:
        !           190:                                goto urk;
        !           191:                        }
        !           192:                        break;
        !           193:                default:
        !           194:                        errorh(Vermisc,"Non-number to minus",nil,FALSE,0,work);
        !           195:                }
        !           196:        }
        !           197: out:
        !           198:        if(restype==DOUB || prunep==FALSE)
        !           199:                return(result->val);
        !           200:        else if (result->val->s.CDR==(lispval) 0)
        !           201:                return(inewint(result->val->s.I));
        !           202:        else {
        !           203:                struct sdot dummybig;
        !           204: 
        !           205:                dummybig.I = 0;
        !           206:                dummybig.CDR = (lispval) 0;
        !           207:                return(adbig(&dummybig,result->val));
        !           208:        }
        !           209:        urk:
        !           210:                error("Internal error in (add,sub,quo,times)",FALSE);
        !           211: }
        !           212: lispval
        !           213: Ltimes()
        !           214: {
        !           215:        register lispval work;
        !           216:        register ap result, mynp, oldnp, lbot, np;
        !           217:        int itemp,restype;
        !           218: 
        !           219:        oldnp = result = np;
        !           220:        protect(rdrsdot);
        !           221:        rdrsdot->s.CDR = (lispval) 0;
        !           222:        rdrsdot->s.I = 1;
        !           223:        restype = SDOT;
        !           224:        prunep = TRUE;
        !           225: 
        !           226:        for(mynp = lbot; mynp < oldnp; mynp++)
        !           227:        {
        !           228:                work = mynp->val;
        !           229:                switch(TYPE(work)) {
        !           230:                case INT:
        !           231:                        switch(restype) {
        !           232:                        case DOUB:
        !           233:                                result->val->r *= work->i;
        !           234:                                break;
        !           235:                        case SDOT:
        !           236:                                dmlad(result->val,work->i,0);
        !           237:                                prunep = TRUE;
        !           238:                                break;
        !           239:                        default:
        !           240:                                goto urk;
        !           241:                        }
        !           242:                        break;
        !           243:                case SDOT:
        !           244:                        switch(restype) {
        !           245:                        case DOUB:
        !           246:                                error("Don't know how to make bignums into reals, yet",FALSE);
        !           247:                                break;
        !           248:                        case SDOT:
        !           249:                                result->val = mulbig(work,result->val);
        !           250:                                restype = TYPE(result->val);
        !           251:                                if(restype==INT) {
        !           252:                                        if(result->val->i==0)
        !           253:                                                return(result->val);
        !           254:                                        rdrsdot->s.I=result->val->s.I;
        !           255:                                        rdrsdot->s.CDR = (lispval) 0;
        !           256:                                        result->val = rdrsdot;
        !           257:                                        restype=SDOT;
        !           258:                                        prunep = TRUE;
        !           259:                                } else
        !           260:                                        prunep = FALSE;
        !           261:                                break;
        !           262:                        default:
        !           263:                                goto urk;
        !           264:                        }
        !           265:                        break;
        !           266:                case DOUB:
        !           267:                        switch(restype) {
        !           268:                        case SDOT:
        !           269:                                if(result->val->s.CDR==(lispval) 0) {
        !           270:                                        protect(newdoub());
        !           271:                                        np[-1].val->r = result->val->i*work->r;
        !           272:                                        result->val = np[-1].val;
        !           273:                                        np--;
        !           274:                                        restype = DOUB;
        !           275:                                } else 
        !           276:                                        error("Don't know how to make bignums into reals, yet",FALSE);
        !           277:                                break;
        !           278:                        case DOUB:
        !           279:                                result->val->r *= work->r;
        !           280:                                break;
        !           281:                        default:
        !           282:                                goto urk;
        !           283:                        }
        !           284:                        break;
        !           285:                default:
        !           286:                        error("Non-number to times",FALSE);
        !           287:                }
        !           288:        }
        !           289:        if(restype==DOUB || prunep==FALSE)
        !           290:                return(result->val);
        !           291:        else if (result->val->s.CDR==(lispval) 0)
        !           292:                return(inewint(result->val->s.I));
        !           293:        else {
        !           294:                struct sdot dummybig;
        !           295: 
        !           296:                dummybig.I = 0;
        !           297:                dummybig.CDR = (lispval) 0;
        !           298:                return(adbig(&dummybig,result->val));
        !           299:        }
        !           300:        urk:
        !           301:                error("Internal error in (add,sub,quo,times)",FALSE);
        !           302: }
        !           303: lispval
        !           304: Lquo()
        !           305: {
        !           306:        register lispval work;
        !           307:        register lispval result;
        !           308:        register struct argent *mynp;
        !           309:        register struct argent *oldnp, *lbot, *np;
        !           310:        int bigflag = 0, realflag = 0, itemp;
        !           311:        struct sdot dummybig;
        !           312:        lispval divbig(), *resaddr;
        !           313: 
        !           314:        mynp = lbot;
        !           315:        oldnp = np-1;
        !           316:        dummybig.CDR = (lispval) 0;
        !           317:        dummybig.I = 1;
        !           318:        if(mynp > oldnp) goto out;
        !           319:        work = (mynp++)->val;
        !           320:        itemp = TYPE(work);
        !           321:        switch(itemp) {
        !           322:        case INT:
        !           323:                if(mynp <= oldnp) dummybig.I = work->i;
        !           324:                else dummybig.I = 1/work->i;
        !           325:                break;
        !           326:        case DOUB:
        !           327:                realflag = 1;
        !           328:                protect(result = newdoub());
        !           329:                if(mynp <= oldnp) result->r = work->r;
        !           330:                else result->r = 1.0/work->r;
        !           331:                break;
        !           332:        case SDOT: /* must be fixed for the inverse case */
        !           333:                protect(work);
        !           334:                resaddr = &(np[-1].val);
        !           335:                bigflag = 1;
        !           336:                break;
        !           337:        default:
        !           338:                error("Don't know how to divide this type.",FALSE);
        !           339:        }
        !           340:        for(;mynp <= oldnp; mynp++) {
        !           341:                work = mynp->val;
        !           342:                itemp = TYPE(work);
        !           343:                switch(itemp) {
        !           344: 
        !           345:                case INT:
        !           346:                        if (work->i==0)
        !           347:                                kill(getpid(),8);
        !           348:                        if (realflag)
        !           349:                                result->r /= work->i;
        !           350:                        else if(bigflag) {
        !           351:                                dummybig.I = work->i;
        !           352:                                divbig(*resaddr, &dummybig, resaddr, 0);
        !           353:                        } else {
        !           354:                                dummybig.I /= work->i;
        !           355:                        }
        !           356:                        break;
        !           357:                case DOUB:
        !           358:                        if(realflag)
        !           359:                                result->r /= work->r;
        !           360:                        else if(bigflag)
        !           361:                                error("Don't know how to make bignums into reals, yet",FALSE);
        !           362:                        else {
        !           363:                                realflag = 1;
        !           364:                                result = newdoub();
        !           365:                                result->r = (double) dummybig.I / work->r;
        !           366:                                protect(result);
        !           367:                        }
        !           368:                        break;
        !           369:                case SDOT:
        !           370:                        if(realflag)
        !           371:                                error("Don't know how to divide reals by bignums ",FALSE);
        !           372:                        else if(bigflag)
        !           373:                                divbig(*resaddr, work, resaddr, 0);
        !           374:                        else {
        !           375:                                bigflag = 1;
        !           376:                                protect(newsdot());
        !           377:                                resaddr = &(np[-1].val);
        !           378:                                np[-1].val->i = dummybig.I;
        !           379:                                divbig(*resaddr, work, resaddr, 0);
        !           380:                        }
        !           381:                        break;
        !           382:                default:
        !           383:                        error("Don't know how to divide this type",FALSE);
        !           384: 
        !           385:                }
        !           386:        }
        !           387: out:
        !           388:        if(realflag)
        !           389:                return(result);
        !           390:        else if (bigflag)
        !           391:                return(*resaddr);
        !           392:        else {
        !           393:                result = inewint(  dummybig.I );
        !           394:                return(result);
        !           395:        }
        !           396: }

unix.superglobalmegacorp.com

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