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

1.1       root        1: #include "apl.h"
                      2: 
                      3: funedit(an_editor)
                      4: register char *an_editor;
                      5: {
                      6: register struct item *p;
                      7: register f;
                      8: int     a, q;
                      9: 
                     10:        p = sp[-1];
                     11:        if(p->type != LV)
                     12:                error("ed B");
                     13:        f = fork();
                     14:        if(f==0) {
                     15:                for(f=3; f<7; f++)
                     16:                        close(f);
                     17:                execl(an_editor+4, an_editor+9, p->namep, 0);
                     18:                execl(an_editor, an_editor+9, p->namep, 0);
                     19:                aprintf("exec failure: ");
                     20:                aprintf(an_editor);
                     21:                exit(0);
                     22:        }
                     23:        if(f==-1)
                     24:                error("try again");
                     25:        a = signal(2, 1);
                     26:        while((q=wait(&integ))!=f)
                     27:                if(q==-1)
                     28:                        break;
                     29:        signal(2, a);
                     30:        funload(0);
                     31: }
                     32: 
                     33: funload(s)
                     34: {
                     35:        register struct item *p;
                     36:        register int *f;
                     37: 
                     38:        p = sp[-1];
                     39:        sp--;
                     40:        if(p->type != LV)
                     41:                error("fnl B");
                     42:        f = open(p->namep, 0);
                     43:        if((int)f <= 0)
                     44:                error("cannot open");
                     45:        switch(s) {
                     46: case 0:
                     47:                fundef(f);
                     48:                return;
                     49: case 2:
                     50:                clear();
                     51: case 1:
                     52:                wsload(f);
                     53:                aputchar('\n');
                     54:        }
                     55: }
                     56: 
                     57: fundef(f)
                     58: {
                     59:        short i;
                     60:        register char *a, *c;
                     61:        struct nlist *np;
                     62:        int  oifile;
                     63:        long    b[256]; 
                     64:        char    bbuf[BUFSIZ];
                     65: 
                     66:        oifile = ifile;
                     67:        ifile = f;
                     68:        a = rline(0);
                     69:        if(a == 0)
                     70:                error("fnd eof");
                     71:        c = compile(a, 2);
                     72:        afree(a);
                     73:        if(c == 0)
                     74:                goto out;
                     75:        copy(IN, c+1, &np, 1);
                     76:        erase(np);
                     77:        np->use = c->c[0];
                     78:        fstat(wfile, b);
                     79:        np->label = b[4];
                     80:        lseek(wfile, 0,2);
                     81:        lseek(ifile, 0, 0);
                     82:        while((a=read(ifile, bbuf, BUFSIZ)) > 0)
                     83:                write(wfile, bbuf, a);
                     84:        write(wfile, '\0', 1);
                     85: out:
                     86:        close(ifile);
                     87:        ifile = oifile;
                     88: }
                     89: 
                     90: struct lablist labldefs = { 0, 0, 0 };
                     91: 
                     92: funcomp(np)
                     93: struct nlist *np;
                     94: {
                     95:        register a, c, *p;
                     96:        int err, size;
                     97:        int oifile;
                     98: 
                     99:        ifile = dup(wfile);
                    100:        lseek(ifile, np->label, 0);
                    101:        size = 0;
                    102:        err = 0;
                    103:        labldefs.nextll = 0;
                    104:        now_xeq.name = np->namep;
                    105:        now_xeq.line = 0;
                    106:        afree(rline(0));                /* Rather inefficient */
                    107: pass1A:
                    108:        now_xeq.line = size++;
                    109:        if((a=rline(0))==0) {
                    110:                lseek(ifile, np->label, 0);
                    111:                size = 0;
                    112:                now_xeq.line = -1;
                    113:                goto pass1B;
                    114:        }
                    115:        lablchk(a,size);
                    116:        afree(a);
                    117:        goto pass1A;
                    118: 
                    119: pass1B:
                    120:        ++now_xeq.line;
                    121:        a = rline(0);
                    122:        if(a == 0) {
                    123:                if(err)
                    124:                        goto out;
                    125:                p = alloc((size+2)*SINT);
                    126:                *p = size;
                    127:                size = 0;
                    128:                now_xeq.line = -1;
                    129:                lseek(ifile, np->label, 0);
                    130:                err++;
                    131:                goto pass2;
                    132:        }
                    133:        c = compile(a, size==0? 3: 5);
                    134:        size++;
                    135:        afree(a);
                    136:        if(c == 0) {
                    137:                err++;
                    138:                goto pass1B;
                    139:        }
                    140:        afree(c);
                    141:        goto pass1B;
                    142: 
                    143: pass2:
                    144:        ++now_xeq.line;
                    145:        a = rline(0);
                    146:        if(a == 0)
                    147:                goto pass3;
                    148:        c = compile(a, size==0? 3: 5);
                    149:        size++;
                    150:        afree(a);
                    151:        if(c == 0)
                    152:                goto out;
                    153:        p[size] = c;
                    154:        goto pass2;
                    155: 
                    156: pass3:
                    157:        now_xeq.line = 0;
                    158:        lseek(ifile, np->label, 0);
                    159:        a = rline(0);
                    160:        if(a == 0)
                    161:                goto out;
                    162:        c = compile(a, 4);
                    163:        afree(a);
                    164:        if(c == 0)
                    165:                goto out;
                    166:        p[size+1] = c;
                    167: #ifdef SOMED
                    168:        if(debug) {
                    169:                dump(p[1]);
                    170:                dump(c);
                    171:        }
                    172: #endif
                    173:        np->itemp = p;
                    174:        err = 0;
                    175: 
                    176: out:
                    177:        unlabel();
                    178:        close(ifile);
                    179:        ifile = oifile;
                    180:        if(err)
                    181:                error("syntax");
                    182: }
                    183: 
                    184: lablchk(line,line_no)
                    185: register char *line;
                    186: {
                    187: register struct lablist *lblthru = &labldefs;
                    188: register char *match;
                    189: int     i, len;
                    190: 
                    191:        match = line;
                    192:        while(*match++==' ')
                    193:                continue;
                    194:        line = --match;
                    195:        if(!alpha(*match++))
                    196:                return;
                    197:        len = 1;
                    198:        while(alpha(*match)||digit(*match))
                    199:                ++len, ++match;
                    200:        while(*match++==' ')
                    201:                continue;
                    202:        --match;
                    203:        if(*match++!='>')
                    204:                return;
                    205:        match[-1] = '\0';
                    206:        while(lblthru->nextll) {
                    207:                if(equal(line,lblthru->lname)) {
                    208:                        xeq_mark();
                    209:                        aprintf(lblthru->lname);
                    210:                        aprintf("> ");
                    211:                        error("dup label");
                    212:                }
                    213:                lblthru = lblthru->nextll;
                    214:        }
                    215:        lblthru = lblthru->nextll = alloc(sizeof(struct lablist));
                    216:        lblthru->lno    = line_no;
                    217:        lblthru->lname  = alloc(match-line);
                    218:        lblthru->nextll = 0;
                    219:        match = line;
                    220:        line = lblthru->lname;
                    221:        for(i=0; i<len; ++i)
                    222:                *line++ = *match++;
                    223:        *line = '\0';
                    224: }
                    225: 
                    226: unlabel()
                    227: {
                    228: register struct lablist *lblthru, *nextdef;
                    229: 
                    230:        lblthru = labldefs.nextll;
                    231:        while(lblthru) {
                    232:                afree(lblthru->lname);
                    233:                lblthru = lblthru->nextll;
                    234:        }
                    235:        lblthru = &labldefs;
                    236:        while(nextdef=lblthru->nextll) {
                    237:                lblthru = nextdef->nextll;
                    238:                afree(nextdef);
                    239:                if(!lblthru)
                    240:                        goto quit;
                    241:        }
                    242: quit:
                    243:        labldefs.nextll = 0;
                    244: }
                    245: 
                    246: ex_fun()
                    247: {
                    248:        struct nlist *np;
                    249:        register *p, s;
                    250:        int oldflc, oldpcp;
                    251: 
                    252:        pcp += copy(IN, pcp, &np, 1);
                    253:        if(np->itemp == 0)
                    254:                funcomp(np);
                    255:        switch(np->use) {
                    256:            default:
                    257:                error("arg B");
                    258:            case NF:
                    259:                break;
                    260:            case DF:
                    261:                insulate(-2);
                    262:            case MF:
                    263:                insulate(-1);
                    264:        }
                    265:        p = np->itemp;
                    266:        oldflc = funlc;
                    267:        oldpcp = pcp;
                    268:        funlc = 0;
                    269:        s = *p;
                    270: loop:
                    271:        funlc++;
                    272:        now_xeq.name = np->namep;
                    273:        now_xeq.line = funlc;
                    274:        execute(p[funlc]);
                    275:        if(intflg)
                    276:                error("I");
                    277:        if(funlc <= 0 || funlc >= s) {
                    278:                execute(p[s+1]);
                    279:                funlc = oldflc;
                    280:                pcp = oldpcp;
                    281:                now_xeq.name = now_xeq.line = 0;
                    282:                return;
                    283:        }
                    284:        pop();
                    285:        goto loop;
                    286: }
                    287: 
                    288: insulate(arg)
                    289: {
                    290: register s, p;
                    291: 
                    292:        p = sp[arg];
                    293:        switch(p->type) {
                    294:            case DA:
                    295:            case CH:
                    296:                p->index = 0;
                    297:                return;
                    298:            case LV:
                    299:                p = p->itemp;
                    300:                s = newdat(p->type, p->rank, p->size);
                    301:                copy(IN, p->dim, s->dim, p->rank);
                    302:                copy(p->type, p->datap, s->datap, p->size);
                    303:                sp[arg] = s;
                    304:                return;
                    305:            default:
                    306:                error("ins B");
                    307:        }
                    308: }
                    309: 
                    310: ex_arg1()
                    311: {
                    312:        register struct item *p;
                    313:        struct nlist *np;
                    314: 
                    315:        pcp += copy(IN, pcp, &np, 1);
                    316:        p = fetch1();
                    317:        sp[-1] = np->itemp;
                    318:        np->itemp = p;
                    319:        np->use = DA;
                    320: }
                    321: 
                    322: ex_arg2()
                    323: {
                    324:        register struct item *p;
                    325:        struct nlist *np;
                    326: 
                    327:        pcp += copy(IN, pcp, &np, 1);
                    328:        p = fetch(sp[-2]);
                    329:        sp[-2] = np->itemp;
                    330:        np->itemp = p;
                    331:        np->use = DA;
                    332: }
                    333: 
                    334: ex_auto()
                    335: {
                    336:        struct nlist *np;
                    337: 
                    338:        pcp += copy(IN, pcp, &np, 1);
                    339:        push(np->itemp);
                    340:        np->itemp = 0;
                    341:        np->use = 0;
                    342: }
                    343: 
                    344: ex_rest()
                    345: {
                    346:        register struct item *p;
                    347:        struct nlist *np;
                    348: 
                    349:        p = fetch1();
                    350:        pcp += copy(IN, pcp, &np, 1);
                    351:        erase(np);
                    352:        np->itemp = sp[-2];
                    353:        np->use = 0;
                    354:        if(np->itemp)
                    355:                np->use = DA;
                    356:        sp--;
                    357:        sp[-1] = p;
                    358: }
                    359: 
                    360: ex_br0()
                    361: {
                    362: 
                    363:        funlc = 0;
                    364:        ex_elid();
                    365: }
                    366: 
                    367: ex_br()
                    368: {
                    369:        register struct item *p;
                    370: 
                    371:        p = fetch1();
                    372:        if(p->size == 0)
                    373:                return;
                    374:        if(p->size != 1)
                    375:                error("branch C");
                    376:        funlc = fix(getdat(p));
                    377: }

unix.superglobalmegacorp.com

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