Annotation of 43BSD/contrib/apl/src/a1.c, revision 1.1.1.1

1.1       root        1: static char Sccsid[] = "a1.c @(#)a1.c  1.1     10/1/82 Berkeley ";
                      2: #include "apl.h"
                      3: 
                      4: execute(s)
                      5: char *s;
                      6: {
                      7:        register i;
                      8:        register data *dp;
                      9:        register struct item *p;
                     10:        struct item *p1;
                     11:        int j;
                     12:        data (*f)(), d;
                     13:        extern char *opname[];
                     14:        char *psiskp();
                     15: 
                     16:        if(debug)
                     17:                dump(s,0);
                     18: 
                     19: loop:
                     20:        i = *s++;
                     21:        if(i != EOF)
                     22:                i &= 0377;
                     23:        lastop = i;
                     24:        if(debug && i >= 0)
                     25:                printf("        exec %s\n", opname[i]);
                     26:        switch(i) {
                     27: 
                     28:        default:
                     29:                error("exec B");
                     30: 
                     31:        case EOF:
                     32:                return;
                     33: 
                     34:        case EOL:
                     35:                pop();
                     36:                goto loop;
                     37: 
                     38:        case COMNT:
                     39:                *sp++ = newdat(DA, 1, 0);
                     40:                goto loop;
                     41: 
                     42:        case ADD:
                     43:        case SUB:
                     44:        case MUL:
                     45:        case DIV:
                     46:        case MOD:
                     47:        case MIN:
                     48:        case MAX:
                     49:        case PWR:
                     50:        case LOG:
                     51:        case CIR:
                     52:        case COMB:
                     53:        case AND:
                     54:        case OR:
                     55:        case NAND:
                     56:        case NOR:
                     57:                f = exop[i];
                     58:                p = fetch2();
                     59:                p1 = sp[-2];
                     60:                ex_dscal(0, f, p, p1);
                     61:                goto loop;
                     62: 
                     63: 
                     64:        case LT:
                     65:        case LE:
                     66:        case EQ:
                     67:        case GE:
                     68:        case GT:
                     69:        case NE:
                     70:                f = exop[i];
                     71:                p = fetch2();
                     72:                p1 = sp[-2];
                     73:                ex_dscal(1, f, p, p1);
                     74:                goto loop;
                     75: 
                     76: 
                     77:        case PLUS:
                     78:        case MINUS:
                     79:        case SGN:
                     80:        case RECIP:
                     81:        case ABS:
                     82:        case FLOOR:
                     83:        case CEIL:
                     84:        case EXP:
                     85:        case LOGE:
                     86:        case PI:
                     87:        case RAND:
                     88:        case FAC:
                     89:        case NOT:
                     90:                f = exop[i];
                     91:                p = fetch1();
                     92:                if(p->type != DA)
                     93:                        error("monadic T");
                     94:                dp = p->datap;
                     95:                for(i=0; i<p->size; i++) {
                     96:                        *dp = (*f)(*dp);
                     97:                        dp++;
                     98:                }
                     99:                goto loop;
                    100: 
                    101:        case MEPS:      /*      execute         */
                    102:        case MENC:      /*      monadic encode  */
                    103:        case DRHO:
                    104:        case DIOT:
                    105:        case EPS:
                    106:        case REP:
                    107:        case BASE:
                    108:        case DEAL:
                    109:        case DTRN:
                    110:        case CAT:
                    111:        case CATK:
                    112:        case TAKE:
                    113:        case DROP:
                    114:        case DDOM:
                    115:        case MDOM:
                    116:        case GDU:
                    117:        case GDUK:
                    118:        case GDD:
                    119:        case GDDK:
                    120:        case COM:
                    121:        case COM0:
                    122:        case COMK:
                    123:        case EXD:
                    124:        case EXD0:
                    125:        case EXDK:
                    126:        case ROT:
                    127:        case ROT0:
                    128:        case ROTK:
                    129:        case MRHO:
                    130:        case MTRN:
                    131:        case RAV:
                    132:        case RAVK:
                    133:        case RED:
                    134:        case RED0:
                    135:        case REDK:
                    136:        case SCAN:
                    137:        case SCANK:
                    138:        case SCAN0:
                    139:        case REV:
                    140:        case REV0:
                    141:        case REVK:
                    142:        case ASGN:
                    143:        case INDEX:
                    144:        case ELID:
                    145:        case IPROD:
                    146:        case OPROD:
                    147:        case IMMED:
                    148:        case HPRINT:
                    149:        case PRINT:
                    150:        case MIOT:
                    151:        case MIBM:
                    152:        case DIBM:
                    153:        case BRAN0:
                    154:        case BRAN:
                    155:        case FUN:
                    156:        case ARG1:
                    157:        case ARG2:
                    158:        case AUTO:
                    159:        case REST:
                    160:        case QRUN:
                    161:        case QEXEC:
                    162:        case FDEF:
                    163:        case QFORK:
                    164:        case QEXIT:
                    165:        case QWAIT:
                    166:        case QREAD:
                    167:        case QWRITE:
                    168:        case QUNLNK:
                    169:        case QRD:
                    170:        case QDUP:
                    171:        case QAP:
                    172:        case QKILL:
                    173:        case QSEEK:
                    174:        case QOPEN:
                    175:        case QCREAT:
                    176:        case QCLOSE:
                    177:        case QCHDIR:
                    178:        case QPIPE:
                    179:        case QCRP:
                    180:        case MFMT:
                    181:        case DFMT:
                    182:        case QNC:
                    183:        case NILRET:
                    184:        case LABEL:
                    185:        case SICLR:
                    186:        case SICLR0:
                    187:        case QSIGNL:
                    188:        case QFLOAT:
                    189:        case QNL:
                    190:                pcp = s;
                    191:                (*exop[i])();
                    192:                s = pcp;
                    193:                goto loop;
                    194: 
                    195:        case RVAL:              /* de-referenced LVAL */
                    196:                s += copy(IN, s, &p1, 1);
                    197:                if(((struct nlist *)p1)->use != DA)
                    198:                        ex_nilret();            /* no fn rslt */
                    199:                else
                    200:                        *sp++ = fetch(p1);
                    201:                goto loop;
                    202: 
                    203:        case NAME:
                    204:                s += copy(IN, s, sp, 1);
                    205:                sp++;
                    206:                goto loop;
                    207: 
                    208:        case QUOT:
                    209:                j = CH;
                    210:                goto con;
                    211: 
                    212:        case CONST:
                    213:                j = DA;
                    214: 
                    215:        con:
                    216:                i = *s++;
                    217:                p = newdat(j, i==1?0:1, i);
                    218:                s += copy(j, s, p->datap, i);
                    219:                *sp++ = p;
                    220:                goto loop;
                    221: 
                    222:        case QUAD:
                    223:                *sp++ = newdat(QD, 0, 0);
                    224:                goto loop;
                    225: 
                    226:        case XQUAD:
                    227:                *sp++ = newdat(QX, 0, 0);
                    228:                goto loop;
                    229: 
                    230:        case QQUAD:
                    231:                *sp++ = newdat(QQ, 0, 0);
                    232:                goto loop;
                    233: 
                    234:        case CQUAD:
                    235:                *sp++ = newdat(QC, 0, 0);
                    236:                goto loop;
                    237: 
                    238:        case PSI1:
                    239:                p = fetch1();
                    240:                if (p->size != 0){
                    241:                        pop();
                    242:                        goto loop;
                    243:                }
                    244:                else  s = psiskp (s);
                    245:                        goto loop;
                    246:        case ISP1:
                    247:                p = fetch1();
                    248:                if (p->size == 0){
                    249:                        pop();
                    250:                        goto loop;
                    251:                }
                    252:                else  s = psiskp (s);
                    253:                goto loop;
                    254: 
                    255:        case PSI2:
                    256:        case ISP2:
                    257:                goto loop;
                    258:        }
                    259: }
                    260: 
                    261: char *
                    262: psiskp (s)
                    263: char *s;
                    264: {
                    265:        register i;
                    266:        register struct item *p;
                    267:        register cnt;
                    268: 
                    269:        pop();
                    270:        cnt = 1;
                    271: psilp:
                    272:        i = *s++;
                    273:        switch (i){
                    274:        default:
                    275:                goto psilp;
                    276:        case  NAME:
                    277:                s += copy(IN,s,sp,1);
                    278:                sp++;
                    279:                pop();
                    280:                goto psilp;
                    281:        case  QUOT:
                    282:                i = *s++;
                    283:                s += i;
                    284:                goto psilp;
                    285:        case  CONST:
                    286:                i = *s++;
                    287:                s += i * SDAT;
                    288:                goto psilp;
                    289:        case  PSI1:
                    290:        case  ISP1:
                    291:                cnt++;
                    292:                goto psilp;
                    293: 
                    294:        case  PSI2:
                    295:        case  ISP2:
                    296:                if((--cnt) == 0) {
                    297:                        *sp++ = newdat (DA, 1, 0);
                    298:                        return (s);
                    299:                }
                    300:                goto psilp;
                    301:        }
                    302: }
                    303: 
                    304: ex_dscal(m, f, p1, p2)
                    305: int (*f)();
                    306: struct item *p1, *p2;
                    307: {
                    308:        if(p1->type != p2->type)
                    309:                        error("dyadic C");
                    310:        if(p1->type == CH )
                    311:                if(m)
                    312:                        ex_cdyad(f, p1, p2);
                    313:                else
                    314:                        error("dyadic T");
                    315:        else
                    316:                ex_ddyad(f, p1, p2);
                    317: }
                    318: 
                    319: ex_ddyad(f, ap, ap1)
                    320: data (*f)();
                    321: struct item *ap, *ap1;
                    322: {
                    323:        register i;
                    324:        register struct item *p;
                    325:        register data *dp;
                    326:        struct item *p1;
                    327:        data d;
                    328: 
                    329: 
                    330:        /* Conform arguments to function if necessary.  If they
                    331:         * do not conform and one argument is a scalar, extend
                    332:         * it into an array with the same dimensions as the
                    333:         * other argument.  If neither argument is a scalar, but
                    334:         * one is a 1-element vector, extend its shape to match
                    335:         * the other argument.
                    336:         */
                    337: 
                    338:        p = ap;
                    339:        p1 = ap1;
                    340: 
                    341:        if(p->rank < 2 && p->size == 1 && p1->rank != 0){
                    342:                d = p->datap[0];
                    343:                pop();
                    344:                p = p1;
                    345:                dp = p->datap;
                    346:                for(i=0; i<p->size; i++) {
                    347:                        *dp = (*f)(d, *dp);
                    348:                        dp++;
                    349:                }
                    350:                return;
                    351:        }
                    352:        if(p1->rank < 2 && p1->size == 1) {
                    353:                sp--;
                    354:                d = p1->datap[0];
                    355:                pop();
                    356:                *sp++ = p;
                    357:                dp = p->datap;
                    358:                for(i=0; i<p->size; i++) {
                    359:                        *dp = (*f)(*dp, d);
                    360:                        dp++;
                    361:                }
                    362:                return;
                    363:        }
                    364:        if(p1->rank != p->rank)
                    365:                error("dyadic C");
                    366:        for(i=0; i<p->rank; i++)
                    367:                if(p->dim[i] != p1->dim[i])
                    368:                        error("dyadic C");
                    369:        dp = p1->datap;
                    370:        for(i=0; i<p->size; i++) {
                    371:                *dp = (*f)(p->datap[i], *dp);
                    372:                dp++;
                    373:        }
                    374:        pop();
                    375: }
                    376: 
                    377: ex_cdyad(f, ap, ap1)
                    378: data (*f)();
                    379: struct item *ap, *ap1;
                    380: {
                    381:        register i;
                    382:        register struct item *p;
                    383:        register char *cp;
                    384:        struct item *p1;
                    385:        data d1, d2;
                    386: 
                    387:        p = ap;
                    388:        p1 = ap1;
                    389:        if(p->rank == 0 || p->size == 1) {
                    390:                d1 = ((struct chrstrct *)p->datap)->c[0];
                    391:                pop();
                    392:                p = p1;
                    393:                cp = (char *)p->datap;
                    394:                for(i=0; i<p->size; i++) {
                    395:                        d2 = *cp;
                    396:                        *cp = (*f)(d1, d2);
                    397:                        cp++;
                    398:                }
                    399:        } else if(p1->rank == 0 || p1->size == 1) {
                    400:                sp--;
                    401:                d1 = ((struct chrstrct *)p1->datap)->c[0];
                    402:                pop();
                    403:                *sp++ = p;
                    404:                cp = (char *)p->datap;
                    405:                for(i=0; i<p->size; i++) {
                    406:                        d2 = *cp;
                    407:                        *cp = (*f)(d2, d1);
                    408:                        cp++;
                    409:                }
                    410:        } else {
                    411:                if(p1->rank != p->rank)
                    412:                        error("dyadic C");
                    413:                for(i=0; i<p->rank; i++)
                    414:                        if(p->dim[i] != p1->dim[i])
                    415:                                error("dyadic C");
                    416:                cp = (char *)p1->datap;
                    417:                for(i=0; i<p->size; i++) {
                    418:                        d1 = ((struct chrstrct *)p->datap)->c[i];
                    419:                        d2 = *cp;
                    420:                        *cp = (*f)(d1, d2);
                    421:                        cp++;
                    422:                }
                    423:                p = p1;
                    424:                pop();
                    425:        }
                    426:        /*
                    427:         * now convert the character vector to
                    428:         * a numeric array.  Someday, we can make this a
                    429:         * call to whomever creates "logical" type data.
                    430:         */
                    431:        p1 = p;
                    432:        cp = (char *)p->datap;
                    433:        p = newdat(DA, p->rank, p->size);
                    434:        for(i=0; i<p->rank; i++)
                    435:                p->dim[i] = p1->dim[i];
                    436:        for(i=0; i<p->size; i++)
                    437:                p->datap[i] = (*cp++) & 0377;
                    438:        pop();
                    439:        *sp++ = p;
                    440: }
                    441: 
                    442: /*
                    443:  *   exop[] moved to seperate file "at.c"
                    444:  *   (a1.c had a "symbol table overflow".)
                    445:  */
                    446: 
                    447: ex_botch()
                    448: {
                    449:        error("exec P E");
                    450: }

unix.superglobalmegacorp.com

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