Annotation of 3BSD/cmd/apl/a1.c, revision 1.1.1.1

1.1       root        1: #include "apl.h"
                      2: 
                      3: char   *continu = "continue";
                      4: 
                      5: execute(s)
                      6: char *s;
                      7: {
                      8:        register i;
                      9:        register data *dp;
                     10:        register struct item *p;
                     11:        struct item *p1;
                     12:        int j;
                     13:        data (*f)(), d;
                     14: 
                     15: #ifdef SOMED
                     16:        if(debug)
                     17:                dump(s);
                     18: #endif
                     19: 
                     20: loop:
                     21:        i = *s++;
                     22: #ifdef FULLD
                     23:        if(debug) {
                     24:            extern char *opname[];
                     25:                if(i==-1)
                     26:                        aprintf("exec eof\n");
                     27:                else if(0<=i&&i<103) {
                     28:                        aprintf("exec "); aprintf(opname[i]); aputchar('\n');
                     29:                   } else
                     30:                        aprintf("exec %d\n",i);
                     31:        }
                     32: #endif
                     33: #ifdef SHORTD
                     34:        if(debug)
                     35:                aprintf("exec %d\n", i);
                     36: #endif
                     37:        switch(i) {
                     38: 
                     39:        default:
                     40:                error("exec B");
                     41: 
                     42:        case EOF:
                     43:                return;
                     44: 
                     45:        case EOL:
                     46:                pop();
                     47:                goto loop;
                     48: 
                     49:        case COMNT:
                     50:                push(newdat(DA,1,0));
                     51:                goto loop;
                     52: 
                     53:        case ADD:
                     54:        case SUB:
                     55:        case MUL:
                     56:        case DIV:
                     57:        case MOD:
                     58:        case MIN:
                     59:        case MAX:
                     60:        case PWR:
                     61:        case LOG:
                     62:        case CIR:
                     63:        case COMB:
                     64:        case AND:
                     65:        case OR:
                     66:        case NAND:
                     67:        case NOR:
                     68:        case LT:
                     69:        case LE:
                     70:        case EQ:
                     71:        case GE:
                     72:        case GT:
                     73:        case NE:
                     74:                f = exop[i];
                     75:                p = fetch2();
                     76:                p1 = sp[-2];
                     77:                if(p->type!=DA||p1->type!=DA) {
                     78:                        if(p->type==CH&&p1->type==CH) {
                     79:                                charfun(i, p, p1);
                     80:                                goto loop;
                     81:                        } else
                     82:                                error("dyadic T E");
                     83:                }
                     84:                if(!p->rank||p->rank==1&&p->size==1) {
                     85:                        d = p->datap[0];
                     86:                        pop();
                     87:                        p = p1;
                     88:                        dp = p->datap;
                     89:                        for(i=0; i<p->size; i++) {
                     90:                                *dp = (*f)(d, *dp);
                     91:                                dp++;
                     92:                        }
                     93:                        goto loop;
                     94:                }
                     95:                if(!p1->rank||p1->rank==1&&p1->size==1) {
                     96:                        sp--;
                     97:                        d = p1->datap[0];
                     98:                        pop();
                     99:                        push(p);
                    100:                        dp = p->datap;
                    101:                        for(i=0; i<p->size; i++) {
                    102:                                *dp = (*f)(*dp, d);
                    103:                                dp++;
                    104:                        }
                    105:                        goto loop;
                    106:                }
                    107:                if(p1->rank != p->rank)
                    108:                        error("dyadic C E");
                    109:                for(i=0; i<p->rank; i++)
                    110:                        if(p->dim[i] != p1->dim[i])
                    111:                                error("dyadic C E");
                    112:                dp = p1->datap;
                    113:                for(i=0; i<p->size; i++) {
                    114:                        *dp = (*f)(p->datap[i], *dp);
                    115:                        dp++;
                    116:                }
                    117:                pop();
                    118:                goto loop;
                    119: 
                    120: 
                    121: 
                    122:        case PLUS:
                    123:        case MINUS:
                    124:        case SGN:
                    125:        case RECIP:
                    126:        case ABS:
                    127:        case FLOOR:
                    128:        case CEIL:
                    129:        case EXP:
                    130:        case LOGE:
                    131:        case PI:
                    132:        case RAND:
                    133:        case FAC:
                    134:        case NOT:
                    135:                f = exop[i];
                    136:                p = fetch1();
                    137:                if(p->type != DA)
                    138:                        error("monadic T E");
                    139:                dp = p->datap;
                    140:                for(i=0; i<p->size; i++) {
                    141:                        *dp = (*f)(*dp);
                    142:                        dp++;
                    143:                }
                    144:                goto loop;
                    145: 
                    146:        case MEPS:      /*      execute         */
                    147:        case MENC:      /*      monadic encode  */
                    148:        case DRHO:
                    149:        case DIOT:
                    150:        case EPS:
                    151:        case REP:
                    152:        case BASE:
                    153:        case DEAL:
                    154:        case DTRN:
                    155:        case CAT:
                    156:        case CATK:
                    157:        case TAKE:
                    158:        case DROP:
                    159:        case DDOM:
                    160:        case MDOM:
                    161:        case GDU:
                    162:        case GDUK:
                    163:        case GDD:
                    164:        case GDDK:
                    165:        case COM:
                    166:        case COM0:
                    167:        case COMK:
                    168:        case EXD:
                    169:        case EXD0:
                    170:        case EXDK:
                    171:        case ROT:
                    172:        case ROT0:
                    173:        case ROTK:
                    174:        case MRHO:
                    175:        case MTRN:
                    176:        case RAV:
                    177:        case RAVK:
                    178:        case RED:
                    179:        case RED0:
                    180:        case REDK:
                    181:        case SCAN:
                    182:        case SCANK:
                    183:        case SCAN0:
                    184:        case REV:
                    185:        case REV0:
                    186:        case REVK:
                    187:        case ASGN:
                    188:        case INDEX:
                    189:        case ELID:
                    190:        case IPROD:
                    191:        case OPROD:
                    192:        case IMMED:
                    193:        case HPRINT:
                    194:        case PRINT:
                    195:        case MIOT:
                    196:        case MIBM:
                    197:        case DIBM:
                    198:        case BRAN0:
                    199:        case BRAN:
                    200:        case FUN:
                    201:        case ARG1:
                    202:        case ARG2:
                    203:        case AUTO:
                    204:        case REST:
                    205:                pcp = s;
                    206:                (*exop[i])();
                    207:                s = pcp;
                    208:                goto loop;
                    209: 
                    210:        case NAME:
                    211:                s += copy(IN, s, sp, 1);
                    212:                sp++;
                    213:                if(sp>staktop)
                    214:                        newstak();
                    215:                goto loop;
                    216: 
                    217:        case QUOT:
                    218:                j = CH;
                    219:                goto con;
                    220: 
                    221:        case CONST:
                    222:                j = DA;
                    223: 
                    224:        con:
                    225:                i = *s++;
                    226:                p = newdat(j, i==1?0:1, i);
                    227:                s += copy(j, s, p->datap, i);
                    228:                push(p);
                    229:                goto loop;
                    230: 
                    231:        case QUAD:
                    232:                push(newdat(QD,0,0));
                    233:                goto loop;
                    234: 
                    235:        case QQUAD:
                    236:                push(newdat(QQ,0,0));
                    237:                goto loop;
                    238: 
                    239:        case CQUAD:
                    240:                push(newdat(QC,0,0));
                    241:                goto loop;
                    242:        }
                    243: }
                    244: 
                    245: static int comop;
                    246: 
                    247: charfun(op, p, p1)
                    248: struct item *p, *p1;
                    249: {
                    250: register char c, *cxi;
                    251: register double *dxi;
                    252:         int i;
                    253: 
                    254:        comop = op;
                    255:        switch(op) {
                    256:           default:
                    257:                error("Y D E");
                    258:           case LT:
                    259:           case LE:
                    260:           case EQ:
                    261:           case GE:
                    262:           case GT:
                    263:           case NE:
                    264:                /* OK */;
                    265:        }
                    266:        if(!p->rank) {
                    267:                c = *((char*)(p->datap));
                    268:                cxi = (char*)(p1->datap);
                    269:                push(newdat(DA,p1->rank,p1->size));
                    270:                copy(IN, p1->dim, sp[-1]->dim, p1->rank);
                    271:                dxi = sp[-1]->datap;
                    272:                for(i=0; i<p1->size; i++)
                    273:                        *dxi++ = (double)charcom(c,*cxi++);
                    274:                goto done;
                    275:        }
                    276:        if(!p1->rank) {
                    277:                c = ((char*)(p1->datap))[0];
                    278:                cxi = (char*)(p->datap);
                    279:                push(newdat(DA,p->rank,p->size));
                    280:                copy(IN, p->dim, sp[-1]->dim, p->rank);
                    281:                dxi = sp[-1]->datap;
                    282:                for(i=0; i<p->size; i++)
                    283:                        *dxi++ = (double)charcom(*cxi++,c);
                    284:                goto done;
                    285:        }
                    286:        if(p1->rank != p->rank)
                    287:                error("dyadic Y C E");
                    288:        for(i=0; i<p->rank; i++)
                    289:                if(p->dim[i]!=p1->dim[i])
                    290:                        error("dyadic Y C E");
                    291:        cxi = (char*)(p1->datap);
                    292:        push(newdat(DA,p->rank,p->size));
                    293:        copy(IN, p->dim, sp[-1]->dim, p->rank);
                    294:        dxi = sp[-1]->datap;
                    295:        for(i=0; i<p->size; i++)
                    296:                *dxi++ = (double)charcom(((char*)(p->datap))[i],*cxi++);
                    297: done:  dealloc(sp[-2]);
                    298:        dealloc(sp[-3]);
                    299:        sp[-3] = sp[-1];
                    300:        sp -= 2;
                    301:        return;
                    302: }
                    303: 
                    304: charcom(c1, c2)
                    305: register char c1, c2;
                    306: {
                    307:        switch(comop) {
                    308:           case LE:
                    309:                return c1<=c2;
                    310:           case LT:
                    311:                return c1<c2;
                    312:           case EQ:
                    313:                return c1==c2;
                    314:           case NE:
                    315:                return c1!=c2;
                    316:           case GT:
                    317:                return c1>c2;
                    318:           case GE:
                    319:                return c1>=c2;
                    320:        }
                    321:        error("Y B");           /*  "Cannot happen"  */
                    322: }
                    323: 
                    324: int    ex_add(),       ex_plus(),      ex_sub(),       ex_minus(),
                    325:        ex_mul(),       ex_sgn(),       ex_div(),       ex_recip(),
                    326:        ex_mod(),       ex_abs(),       ex_min(),       ex_floor(),
                    327:        ex_max(),       ex_ceil(),      ex_pwr(),       ex_exp(),
                    328:        ex_log(),       ex_loge(),      ex_cir(),       ex_pi(),
                    329:        ex_comb(),      ex_fac(),       ex_deal(),      ex_rand(),
                    330:        ex_drho(),      ex_mrho(),      ex_diot(),      ex_miot(),
                    331:        ex_rot0(),      ex_rev0(),      ex_dtrn(),      ex_mtrn(),
                    332:        ex_dibm(),      ex_mibm(),      ex_gdu(),       ex_gduk(),
                    333:        ex_gdd(),       ex_gddk(),      ex_exd(),       ex_scan(),
                    334:        ex_exdk(),      ex_scnk(),      ex_iprod(),     ex_oprod(),
                    335:        ex_br0(),       ex_br(),        ex_ddom(),      ex_mdom(),
                    336:        ex_com(),       ex_red(),       ex_comk(),      ex_redk(),
                    337:        ex_rot(),       ex_rev(),       ex_rotk(),      ex_revk(),
                    338:        ex_cat(),       ex_rav(),       ex_catk(),      ex_ravk(),
                    339:        ex_print(),     ex_elid(),      ex_index(),     ex_hprint(),
                    340:        ex_lt(),        ex_le(),        ex_gt(),        ex_ge(),
                    341:        ex_eq(),        ex_ne(),        ex_and(),       ex_or(),
                    342:        ex_nand(),      ex_nor(),       ex_not(),       ex_eps(),
                    343:        ex_meps(),      ex_rep(),       ex_take(),      ex_drop(),
                    344:        ex_exd0(),      ex_asgn(),      ex_immed(),     ex_fun(),
                    345:        ex_arg1(),      ex_arg2(),      ex_auto(),      ex_rest(),
                    346:        ex_com0(),      ex_red0(),      ex_exd0(),      ex_scn0(),
                    347:        ex_base(),      ex_menc();
                    348: 
                    349: int (*exop[])() =
                    350: {
                    351:        0,              /* 0 */
                    352:        ex_add,         /* 1 */
                    353:        ex_plus,        /* 2 */
                    354:        ex_sub,         /* 3 */
                    355:        ex_minus,       /* 4 */
                    356:        ex_mul,         /* 5 */
                    357:        ex_sgn,         /* 6 */
                    358:        ex_div,         /* 7 */
                    359:        ex_recip,       /* 8 */
                    360:        ex_mod,         /* 9 */
                    361:        ex_abs,         /* 10 */
                    362:        ex_min,         /* 11 */
                    363:        ex_floor,       /* 12 */
                    364:        ex_max,         /* 13 */
                    365:        ex_ceil,        /* 14 */
                    366:        ex_pwr,         /* 15 */
                    367:        ex_exp,         /* 16 */
                    368:        ex_log,         /* 17 */
                    369:        ex_loge,        /* 18 */
                    370:        ex_cir,         /* 19 */
                    371:        ex_pi,          /* 20 */
                    372:        ex_comb,        /* 21 */
                    373:        ex_fac,         /* 22 */
                    374:        ex_deal,        /* 23 */
                    375:        ex_rand,        /* 24 */
                    376:        ex_drho,        /* 25 */
                    377:        ex_mrho,        /* 26 */
                    378:        ex_diot,        /* 27 */
                    379:        ex_miot,        /* 28 */
                    380:        ex_rot0,        /* 29 */
                    381:        ex_rev0,        /* 30 */
                    382:        ex_dtrn,        /* 31 */
                    383:        ex_mtrn,        /* 32 */
                    384:        ex_dibm,        /* 33 */
                    385:        ex_mibm,        /* 34 */
                    386:        ex_gdu,         /* 35 */
                    387:        ex_gduk,        /* 36 */
                    388:        ex_gdd,         /* 37 */
                    389:        ex_gddk,        /* 38 */
                    390:        ex_exd,         /* 39 */
                    391:        ex_scan,        /* 40 */
                    392:        ex_exdk,        /* 41 */
                    393:        ex_scnk,        /* 42 */
                    394:        ex_iprod,       /* 43 */
                    395:        ex_oprod,       /* 44 */
                    396:        0,              /* 45 */
                    397:        0,              /* 46 */
                    398:        ex_br0,         /* 47 */
                    399:        ex_br,          /* 48 */
                    400:        ex_ddom,        /* 49 */
                    401:        ex_mdom,        /* 50 */
                    402:        ex_com,         /* 51 */
                    403:        ex_red,         /* 52 */
                    404:        ex_comk,        /* 53 */
                    405:        ex_redk,        /* 54 */
                    406:        ex_rot,         /* 55 */
                    407:        ex_rev,         /* 56 */
                    408:        ex_rotk,        /* 57 */
                    409:        ex_revk,        /* 58 */
                    410:        ex_cat,         /* 59 */
                    411:        ex_rav,         /* 60 */
                    412:        ex_catk,        /* 61 */
                    413:        ex_ravk,        /* 62 */
                    414:        ex_print,       /* 63 */
                    415:        0,              /* 64 */
                    416:        ex_elid,        /* 65 */
                    417:        0,              /* 66 */
                    418:        0,              /* 67 */
                    419:        ex_index,       /* 68 */
                    420:        ex_hprint,      /* 69 */
                    421:        0,              /* 70 */
                    422:        ex_lt,          /* 71 */
                    423:        ex_le,          /* 72 */
                    424:        ex_gt,          /* 73 */
                    425:        ex_ge,          /* 74 */
                    426:        ex_eq,          /* 75 */
                    427:        ex_ne,          /* 76 */
                    428:        ex_and,         /* 77 */
                    429:        ex_or,          /* 78 */
                    430:        ex_nand,        /* 79 */
                    431:        ex_nor,         /* 80 */
                    432:        ex_not,         /* 81 */
                    433:        ex_eps,         /* 82 */
                    434:        ex_meps,        /* 83 */
                    435:        ex_rep,         /* 84 */
                    436:        ex_take,        /* 85 */
                    437:        ex_drop,        /* 86 */
                    438:        ex_exd0,        /* 87 */
                    439:        ex_asgn,        /* 88 */
                    440:        ex_immed,       /* 89 */
                    441:        0,              /* 90 */
                    442:        0,              /* 91 */
                    443:        ex_fun,         /* 92 */
                    444:        ex_arg1,        /* 93 */
                    445:        ex_arg2,        /* 94 */
                    446:        ex_auto,        /* 95 */
                    447:        ex_rest,        /* 96 */
                    448:        ex_com0,        /* 97 */
                    449:        ex_red0,        /* 98 */
                    450:        ex_exd0,        /* 99 */
                    451:        ex_scn0,        /*100 */
                    452:        ex_base,        /*101 */
                    453:        ex_menc,        /*102 */        /*      monadic encod   */
                    454: };

unix.superglobalmegacorp.com

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