Annotation of 3BSD/cmd/lisp/fex2.c, revision 1.1.1.1

1.1       root        1: #include "global.h"
                      2: #define NDOVARS 15
                      3: #include <assert.h>
                      4: /*
                      5:  * Ndo  maclisp do function.
                      6:  */
                      7: lispval
                      8: Ndo()
                      9: {
                     10:        register lispval current, where, handy;
                     11:        register struct nament *mybnp;
                     12:        register struct argent *lbot, *np;
                     13:        lispval atom, temp;
                     14:        lispval body, endtest, endform, varstuf, renewals[NDOVARS] ;
                     15:        struct argent *start, *last, *getem,  *savedlbot; 
                     16:        struct nament *savedbnp, *lastbnd;
                     17:        int count, index, saveme[SAVSIZE], virgin = 1;
                     18:        int myerrp; extern int errp;
                     19: 
                     20:        savedlbot = lbot;
                     21:        myerrp = errp;
                     22:        savedbnp = bnp;
                     23:        getexit(saveme);                /* common nonlocal return */
                     24:        if(retval = setexit()) {
                     25:                errp = myerrp;
                     26:                if(retval == BRRETN) {
                     27:                        resexit(saveme);
                     28:                        lbot = savedlbot;
                     29:                        popnames(savedbnp);
                     30:                        return((lispval) contval);
                     31:                } else {
                     32:                        resexit(saveme);
                     33:                        lbot = savedlbot;
                     34:                        reset(retval);
                     35:                }
                     36:        }
                     37:        current = lbot->val;
                     38:        varstuf = current->car;
                     39:        switch( TYPE(varstuf) ) {
                     40: 
                     41:        case ATOM:                      /* This is old style maclisp do;
                     42:                                           atom is var, cadr(current) = init;
                     43:                                           caddr(current) = repeat etc. */
                     44:                atom = varstuf;
                     45:                if(varstuf==nil) goto newstyle;
                     46:                bnp->atm = atom;        /* save current binding of atom */
                     47:                bnp++->val = atom->clb;
                     48:                if(bnp > bnplim)
                     49:                        binderr();
                     50:                current = current->cdr;
                     51:                atom->clb = eval(current->car);
                     52:                                        /* Init var.        */
                     53:                *renewals = (current = current->cdr)->car;
                     54:                                        /* get repeat form  */
                     55:                endtest = (current = current->cdr)->car;
                     56:                body = current->cdr;
                     57: 
                     58:                while(TRUE) {
                     59:                        if(eval(endtest)!=nil) {
                     60:                                resexit(saveme);
                     61:                                popnames(savedbnp);
                     62:                                return(nil);
                     63:                        }
                     64:                        doprog(body);
                     65:                        atom->clb = eval(*renewals);
                     66:                }
                     67:        
                     68: 
                     69:        newstyle:
                     70:        case DTPR:                      /* New style maclisp do; atom is
                     71:                                           list of things of the form
                     72:                                           (var init repeat)            */
                     73:                count = 0;
                     74:                start = np;
                     75:                for(where = varstuf; where != nil; where = where->cdr) {
                     76:                                        /* do inits and count do vars. */
                     77:                                        /* requires "simultaneous" eval
                     78:                                           of all inits                 */
                     79:                        handy = where->car->cdr;
                     80:                        temp = nil;
                     81:                        if(handy !=nil)
                     82:                                temp = eval(handy->car);
                     83:                        protect(temp);
                     84:                        count++;
                     85:                }
                     86:                if(count > NDOVARS)
                     87:                        error("More than 15 do vars",FALSE);
                     88:                bnp += count;
                     89:                if(bnp >= bnplim) {
                     90:                        bnp = savedbnp;
                     91:                        namerr();
                     92:                }
                     93:                last = np;
                     94:                where = varstuf;
                     95:                mybnp = savedbnp;
                     96:                getem = start;
                     97:                for(index = 0; index < count; index++) {
                     98: 
                     99:                        handy = where->car;
                    100:                                        /* get var name from group      */
                    101:                        atom = handy->car;
                    102:                        mybnp->atm = atom;
                    103:                        mybnp->val = atom->clb;
                    104:                                        /* Swap current binding of atom
                    105:                                           for init val pushed on stack */
                    106: 
                    107:                        atom->clb = getem++->val;
                    108:                                        /* As long as we are down here in the
                    109:                                           list, save repeat form       */
                    110:                        handy = handy->cdr->cdr;
                    111:                        if(handy==nil)
                    112:                                handy = CNIL;  /* be sure not to rebind later */
                    113:                        else
                    114:                                handy = handy->car;
                    115:                        renewals[index] = handy;
                    116: 
                    117:                                        /* more loop "increments" */
                    118:                        where = where->cdr;
                    119:                        mybnp++;
                    120:                }
                    121:                                        /* Examine End test and End form */
                    122:                current = current->cdr;
                    123:                handy = current->car;
                    124:                body = current->cdr;
                    125:                if (handy == nil) {
                    126:                        doprog(body);
                    127:                        popnames(savedbnp);
                    128:                        resexit(saveme);
                    129:                        return(nil);
                    130:                }
                    131:                endtest = handy->car;
                    132:                endform = handy->cdr;
                    133:                                        /* The following is the loop: */
                    134:        loop:
                    135:                if(eval(endtest)!=nil) {
                    136:                        for(handy = nil; endform!=nil; endform = endform->cdr){
                    137:                                handy = eval(endform->car);
                    138:                        }
                    139:                        resexit(saveme);
                    140:                        popnames(savedbnp);
                    141:                        return(handy);
                    142:                }
                    143:                doprog(body);
                    144:                                        /* Simultaneously eval repeat forms */
                    145:                for(index = 0; index < count; index++) {
                    146: 
                    147:                        temp = renewals[index];
                    148:                        if (temp == nil || temp == CNIL)
                    149:                                protect(temp);
                    150:                        else
                    151:                                protect(eval(temp));
                    152:                }
                    153:                getem = (np = last);
                    154:                                        /* now simult. rebind all the atoms */
                    155:                mybnp = savedbnp;
                    156:                for(index = 0; index < count; index++, getem++) {
                    157:                   if( (getem)->val != CNIL )  /* if this atom has a repeat form */
                    158:                        mybnp->atm->clb = (getem)->val;  /* rebind */
                    159:                        mybnp++;
                    160:                }
                    161:                goto loop;
                    162:        }
                    163: }
                    164: doprog(body)
                    165: register lispval body;
                    166:        {
                    167:        int     saveme[SAVSIZE];
                    168:        register lispval where, temp;
                    169:        /*register struct nament *savednp = np, *savedlbot = lbot;*/
                    170:        extern int errp; int myerrp = errp;
                    171:        struct nament *savedbnp = bnp;
                    172:        snpand(2);
                    173: 
                    174:        where = body;
                    175:        getexit(saveme);
                    176:        if(retval = setexit()) {
                    177:                errp = myerrp;
                    178:                switch (retval) {
                    179: 
                    180:                default:        resexit(saveme);
                    181:                                reset(retval);
                    182: 
                    183:                case BRGOTO:
                    184:                        for(where = body;
                    185:                                where->car != (lispval) contval; where = where->cdr) {
                    186: 
                    187:                                if(where==nil) {
                    188:                                        resexit(saveme);
                    189:                                        reset(retval);
                    190:                                }
                    191:                                /* np is automatically restored here by
                    192:                                   virtue of being a register */
                    193:                        }
                    194:                        popnames(savedbnp);
                    195:                }
                    196:        }
                    197:        while (TYPE(where) == DTPR) {
                    198:                temp = where->car;
                    199:                if((TYPE(temp))!=ATOM) eval(temp);
                    200:                where = where->cdr;
                    201:        }
                    202:        resexit(saveme);
                    203: }
                    204: lispval
                    205: Nprogv()
                    206: {
                    207:        register lispval argptr, where, handy, atoms;
                    208:        register struct argent *lbot, *np;
                    209:        struct argent *namptr, *start;
                    210:        struct nament *oldbnp = bnp;
                    211: 
                    212:        where = lbot->val;
                    213:        protect(eval(where->car));              /* list of vars */
                    214:        atoms = lbot[1].val;
                    215:        protect(eval((where = where->cdr)->car));
                    216:                                                /* list of vals */
                    217:        handy = lbot[2].val;
                    218:        start = np;
                    219:        for(;handy!=nil; handy = handy->cdr) {
                    220:                (np++)->val = eval(handy->car);
                    221:                TNP;
                    222:        }
                    223:        rebind(atoms,start);
                    224:        handy = nil;
                    225:        for(where = where->cdr; where != nil; where = where->cdr)
                    226:                handy = eval(where->car);
                    227:        popnames(oldbnp);
                    228:        return(handy);
                    229: }
                    230: 
                    231: lispval
                    232: Nprogn()
                    233: {
                    234:        register lispval result, where;
                    235:        snpand(2);
                    236: 
                    237:        result = nil;
                    238:        for(where = lbot->val; where != nil; where = where->cdr)
                    239:                result = eval(where->car);
                    240:        return(result);
                    241: 
                    242: 
                    243: }
                    244: lispval
                    245: Nprog2()
                    246: {
                    247:        register lispval result, where;
                    248:        snpand(2);
                    249: 
                    250:        where = lbot->val; 
                    251:        eval(where->car);
                    252:        result = eval((where = where->cdr)->car);
                    253:        protect(result);
                    254:        for(where = where->cdr; where != nil; where = where->cdr)
                    255:                eval(where->car);
                    256:        return(result);
                    257: }

unix.superglobalmegacorp.com

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