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

1.1       root        1: static char Sccsid[] = "a2.c @(#)a2.c  1.1     10/1/82 Berkeley ";
                      2: #include "apl.h"
                      3: #include "aplmap.h"
                      4: 
                      5: int chartab[];
                      6: char *ecvt();
                      7: 
                      8: ex_print()
                      9: {
                     10: 
                     11:        if(epr0())
                     12:                putchar('\n');
                     13: }
                     14: 
                     15: ex_hprint()
                     16: {
                     17: 
                     18:        epr0();
                     19:        pop();
                     20: }
                     21: 
                     22: epr0()
                     23: {
                     24:        register struct item *p;
                     25:        register data *dp;
                     26:        register i;
                     27:        int j;
                     28:        int param[4];
                     29: 
                     30:        p = fetch1();
                     31:        if(p->type == DU)
                     32:                return(0);
                     33:        if(p->size == 0)
                     34:                return(1);
                     35:        if(p->type == DA) {
                     36: 
                     37:                /* Use "epr1()" to figure out the maximum field width
                     38:                 * required by any of the values to be printed.
                     39:                 */
                     40: 
                     41:                for(i=0; i<4; i++)
                     42:                        param[i] = 0;
                     43:                dp = p->datap;
                     44:                for(i=0; i<p->size; i++)
                     45:                        epr1(*dp++, param);
                     46:                i = param[1] + param[2]; /* size if fp */
                     47:                if(i > thread.digits)
                     48:                        i += 100;               /* set "e" format flag */
                     49:                if(param[2])
                     50:                        i++;
                     51:                if(i > param[0]+5) {
                     52:                        i = param[0] + 5; /* size if ep */
                     53:                        param[1] = param[0];
                     54:                        param[2] = -1;
                     55:                }
                     56:                if(param[3])
                     57:                        i++;    /* sign */
                     58:                i++;            /* leading space */
                     59:                param[0] = i;
                     60:                dp = p->datap;
                     61:        }
                     62:        bidx(p);
                     63:        for(i=1; i<p->size; i++) {
                     64:                if(intflg)
                     65:                        break;
                     66:                if(p->type == CH) {
                     67:                        j = getdat(p);
                     68:                        putchar(j);
                     69:                } else
                     70:                        epr2(*dp++, param);
                     71:                for(j=p->rank-2; j>=0; j--)
                     72:                        if(i%idx.del[j] == 0)
                     73:                                putchar('\n');  /* end of dimension reached */
                     74:        }
                     75:        if(p->type == CH) {
                     76:                j = getdat(p);
                     77:                putchar(j);
                     78:        } else
                     79:                epr2(*dp, param);
                     80:        return(1);
                     81: }
                     82: 
                     83: epr1(d, param)
                     84: data d;
                     85: int *param;
                     86: {
                     87:        double f;
                     88:        register a;
                     89:        register char *c;
                     90:        int dp, sg;
                     91: 
                     92: 
                     93:        /* This routine figures out the field with required by the value
                     94:         * "d".  It adjusts the four elements of "param" so that they
                     95:         * contain the maximum of their old values or the requirements for
                     96:         * the current data item.
                     97:         *
                     98:         * param[0] = number of significant digits
                     99:         * param[1] = number of digits to left of decimal point
                    100:         * param[2] = number of digits to right of decimal point
                    101:         * param[3] = 0 if positive, 1 if negative
                    102:         */
                    103: 
                    104:        f = d;
                    105:        c = ecvt(f, thread.digits, &dp, &sg);
                    106:        if (f == zero)                  /* kludge due to change in ecvt */
                    107:                dp = 1;
                    108:        a = thread.digits;
                    109:        while(c[a-1]=='0' && a>1)
                    110:                a--;
                    111:        if(a > param[0])                /* sig digits */
                    112:                param[0] = a;
                    113:        a -= dp;
                    114:        if(a < 0)
                    115:                a = 0;
                    116:        if(a > param[2])                /* digits to right of dp */
                    117:                param[2] = a;
                    118:        if(dp > param[1])               /* digits to left of dp */
                    119:                param[1] = dp;
                    120:        param[3] |= sg;         /* and sign */
                    121: }
                    122: 
                    123: epr2(d, param)
                    124: int *param;
                    125: data d;
                    126: {
                    127:        register i;
                    128:        register char *c, *mc;
                    129:        double f;
                    130:        int dp, sg;
                    131: 
                    132:        if(param[0]+column > thread.width && !mencflg) {
                    133:                putchar('\n');
                    134:                putto(param[0]);
                    135:        }
                    136:        f = d;
                    137:        c = ecvt(f, thread.digits, &dp, &sg);
                    138:        if (f == zero)
                    139:                dp = 1;                 /* kludge due to change in ecvt */
                    140:        mc = c + thread.digits;
                    141:        putchar(' ');
                    142:        sg = sg? '-': ' ';      /* '-' used to be '"' */
                    143:        if(param[2] < 0) {
                    144:                if(param[3])
                    145:                        putchar(sg);
                    146:                for(i=0; i<param[1]; i++) {
                    147:                        putchar(*c++);
                    148:                        if(i == 0)
                    149:                                putchar('.');
                    150:                }
                    151:                putchar('e');
                    152:                dp--;
                    153:                if(dp < 0) {
                    154:                        putchar('-');   /* '=' used to be '"' */
                    155:                        dp = -dp;
                    156:                } else
                    157:                        putchar('+'); /* apl style plus sign, used to be ':' */
                    158:                putchar(dp/10 + '0');
                    159:                putchar(dp%10 + '0');
                    160:                return;
                    161:        }
                    162:        i = dp;
                    163:        if(i < 0)
                    164:                i = 0;
                    165:        for(; i<param[1]; i++)
                    166:                putchar(' ');
                    167:        if(param[3])
                    168:                putchar(sg);
                    169:        for(i=0; i<dp; i++)
                    170:                if(c >= mc)
                    171:                        putchar('0'); else
                    172:                        putchar(*c++);
                    173:        for(i=0; i<param[2]; i++) {
                    174:                if(i == 0)
                    175:                        putchar('.');
                    176:                if(dp < 0) {
                    177:                        putchar('0');
                    178:                        dp++;
                    179:                } else
                    180:                if(c >= mc)
                    181:                        putchar('0'); else
                    182:                        putchar(*c++);
                    183:        }
                    184: }
                    185: 
                    186: error(s)
                    187: char *s;
                    188: {
                    189:        register c;
                    190:        register char *cp, *cs;
                    191: 
                    192:        intflg = 0;
                    193:        if(ifile) {
                    194:                CLOSEF(ifile);
                    195:                ifile = 0;
                    196:        }
                    197:        cp = s;
                    198:        while(c = *cp++) {
                    199:                if(c >= 'A' && c <= 'Z') {
                    200:                        switch(c) {
                    201: 
                    202:                        case 'I':
                    203:                                cs = "\ninterrupt";
                    204:                                break;
                    205: 
                    206:                        case 'L':
                    207:                                cs = "L";
                    208:                                break;
                    209: 
                    210:                        case 'C':
                    211:                                cs = "conformability";
                    212:                                break;
                    213: 
                    214:                        case 'S':
                    215:                                cs = "syntax";
                    216:                                break;
                    217: 
                    218:                        case 'R':
                    219:                                cs = "rank";
                    220:                                break;
                    221: 
                    222:                        case 'X':
                    223:                                cs = "index";
                    224:                                break;
                    225: 
                    226:                        case 'Y':
                    227:                                cs = "character";
                    228:                                break;
                    229: 
                    230:                        case 'M':
                    231:                                cs = "memory";
                    232:                                break;
                    233: 
                    234:                        case 'D':
                    235:                                cs = "domain";
                    236:                                break;
                    237: 
                    238:                        case 'T':
                    239:                                cs = "type";
                    240:                                break;
                    241: 
                    242:                        case 'E':
                    243:                                cs = "error";
                    244:                                break;
                    245: 
                    246:                        case 'P':
                    247:                                cs = "programmer";
                    248:                                break;
                    249: 
                    250:                        case 'B':
                    251:                                cs = "botch";
                    252:                                break;
                    253: 
                    254:                        default:
                    255:                                putchar(c);
                    256:                                continue;
                    257:                        }
                    258:                        printf(cs);
                    259:                        continue;
                    260:                }
                    261:                putchar(c);
                    262:        }
                    263:        putchar('\n');
                    264:        if (prwsflg) exit(0);           /* if "prws", just exit */
                    265:        /*
                    266:         * produce traceback and mark state indicator.
                    267:         */
                    268:        tback(0);
                    269:        if(gsip)
                    270:                gsip->suspended = 1;
                    271:        else {
                    272:                while(sp > stack)
                    273:                        pop();          /* zap garbage */
                    274:                reset();
                    275:        }
                    276:        mainloop();                     /* reenter mainloop */
                    277: }
                    278: 
                    279: printf(f, a)
                    280: char *f;
                    281: {
                    282:        register char *s, *cp;
                    283:        register *p;
                    284: 
                    285:        s = f;
                    286:        p = &a;
                    287:        while(*s) {
                    288:                if(s[0] == '%')
                    289:                        switch(s[1]){
                    290:                        case 'd':
                    291:                                putn(*p++);
                    292:                                s += 2;
                    293:                                continue;
                    294:                        case 'o':
                    295:                                puto(*p++);
                    296:                                s += 2;
                    297:                                continue;
                    298:                        case 's':
                    299:                                cp = (char *)*p++;
                    300:                                s += 2;
                    301:                                while(*cp)
                    302:                                        putchar(*cp++);
                    303:                                continue;
                    304:                        case 'f':
                    305:                                putf(p);
                    306:                                p += 4; /* 4 words per floating arg */
                    307:                                s += 2;
                    308:                                continue;
                    309:                        }
                    310:                putchar(*s++);
                    311:        }
                    312: }
                    313: 
                    314: putn(n)
                    315: {
                    316:        register a;
                    317: 
                    318:        if(n < 0) {
                    319:                n = -n;
                    320:                if(n < 0) {
                    321:                        printf("32768");
                    322:                        return;
                    323:                }
                    324:                putchar('-');   /* apl minus sign, was '"' */
                    325:        }
                    326:        if(a=n/10)
                    327:                putn(a);
                    328:        putchar(n%10 + '0');
                    329: }
                    330: 
                    331: putf(p)
                    332: data *p;
                    333: {
                    334:        int param[4];
                    335:        register int i;
                    336: 
                    337:        param[1] = param[2] = param[3] = param[0] = 0;
                    338:        epr1(*p, param);
                    339:        i = param[1] + param[2]; /* size if fp */
                    340:        if(i > thread.digits)
                    341:                i += 100;
                    342:        if(param[2])
                    343:                i++;
                    344:        if(i > param[0]+5) {
                    345:                i = param[0] + 5; /* size if ep */
                    346:                param[1] = param[0];
                    347:                param[2] = -1;
                    348:        }
                    349:        if(param[3])
                    350:                i++;    /* sign */
                    351:        i++;            /* leading space */
                    352:        param[0] = i;
                    353:        epr2(*p, param);
                    354: /*
                    355:  *     register i,j;
                    356:  *
                    357:  *     i = *p;
                    358:  *     j = (*p * 1000.0) - (i * 1000.0);
                    359:  *     putn(i);
                    360:  *     putchar('.');
                    361:  *     putchar('0' + j/100);
                    362:  *     putchar('0' + (j/10)%10);
                    363:  *     putchar('0' + j%10);
                    364:  */
                    365: }
                    366: 
                    367: puto(n)
                    368: {
                    369:        if(n&0177770)
                    370:                puto( (n>>3) & 017777);
                    371:        putchar( '0' + (n&07));
                    372: }
                    373: 
                    374: getchar()
                    375: {
                    376:        int c;
                    377: 
                    378:        c = 0;
                    379:        if(READF(ifile, &c, 1) == 1 && echoflg == 1 && !ifile)
                    380:                        WRITEF(1, &c, 1);
                    381: 
                    382:        /* The following code converts the input character
                    383:         * to the ASCII equivalent (internal format) if
                    384:         * terminal character mapping is in force.
                    385:         */
                    386: 
                    387:        if (apl_term && c >= 041 && !ifile) c = map_ascii[(c&0177)-041];
                    388:        if (c && protofile && ifile == 0) WRITEF(protofile, &c, 1);
                    389: 
                    390:        return(c);
                    391: }
                    392: 
                    393: putchar(c)
                    394: {
                    395:        register i;
                    396: 
                    397: 
                    398:        /* This is the basic character output routine.  If "mencflg"
                    399:         * is zero, output is performed on file descriptor 1.  If
                    400:         * "menclfg" is non-zero, output is placed into the buffer
                    401:         * pointed to by "mencptr".
                    402:         */
                    403: 
                    404:        if(mencflg) {                   /* Format operator */
                    405:                if(c != '\n') {
                    406:                        mencflg = 1;
                    407:                        *mencptr++ = c;
                    408:                }
                    409:                else
                    410:                        if(mencflg > 1)
                    411:                                mencptr += rowsz;
                    412:                        else
                    413:                                mencflg = 2;
                    414:                return;
                    415:        }
                    416: 
                    417: 
                    418:        switch(c){                      /* Normal output */
                    419: 
                    420:        case '\0':
                    421:                return;
                    422: 
                    423:        case '\b':
                    424:                if(column)
                    425:                        column--;
                    426:                break;
                    427: 
                    428:        case '\t':
                    429:                column = (column+8) & ~7;
                    430:                break;
                    431: 
                    432:        case '\r':
                    433:        case '\n':
                    434:                column = 0;
                    435:                break;
                    436: 
                    437:        default:
                    438:                column++;
                    439:        }
                    440: 
                    441:        if (column > thread.width) printf("\n    ");    /* adjust for width */
                    442: 
                    443:        if(intflg == 0) {
                    444:                if(c & 0200) {
                    445:                        i = chartab[c & 0177];
                    446:                        putchar(i>>8);
                    447:                        c = i & 0177;
                    448:                        putchar('\b');
                    449:                }
                    450: 
                    451:                if(protofile)
                    452:                        WRITEF(protofile, &c, 1);
                    453: 
                    454: 
                    455:                /* The following code converts the internal value
                    456:                 * to the APL character for modified terminals
                    457:                 * if the APL conversion was requested.
                    458:                 */
                    459: 
                    460:                if (apl_term && c >= 041)
                    461:                        c = map_apl[c-041];
                    462: #ifdef PURDUE_EE
                    463:                if (apl_term && c == 010)
                    464:                        c = '^';
                    465: #endif
                    466: 
                    467:                WRITEF(1, &c, 1);
                    468: #ifdef NBUF
                    469:                if (c == '\n' && !prwsflg)
                    470:                        newbuf(files[1].fd_buf, 1);
                    471: #endif
                    472:        }
                    473: }
                    474: 
                    475: char *ty[] = {
                    476: 0,"DA","CH","LV","QD","QQ","IN","EL","NF","MF","DF","QC","QV","DU","QX","LB"
                    477: };
                    478: 
                    479: dstack()
                    480: {
                    481:        register struct item **p;
                    482:        register i,n;
                    483: 
                    484:        p = sp;
                    485:        n = 0;
                    486:        while(--p > stack){
                    487:                printf("\t%o:  sp[%d]:   type = ", p, --n);
                    488:                if((i=(*p)->type) >= 0 && i <= LBL && ty[i])
                    489:                        printf(ty[i]);
                    490:                else
                    491:                        printf("%d", (*p)->type);
                    492:                switch(i){
                    493:                default:
                    494:                        putchar('\n');
                    495:                        break;
                    496:                case LV:
                    497:                        printf(",  n = %s\n", ((struct nlist *)*p)->namep);
                    498:                        break;
                    499: 
                    500:                case CH:
                    501:                        if((*p)->size == 0)
                    502:                                goto nullone;
                    503:                        if((*p)->rank == 1){
                    504:                                printf(",  \"");
                    505:                                for(i=0; i<(*p)->size; i++)
                    506:                                        putchar(((struct chrstrct *)(*p)->datap)->c[i]);
                    507:                                printf("\"\n");
                    508:                        } else
                    509:                                goto rnk;
                    510:                        break;
                    511: 
                    512:                case DA:
                    513:                case LBL:
                    514:                        if((*p)->size == 0)
                    515:                                goto nullone;
                    516:                        if((*p)->rank == 0){
                    517:                                printf(",  v = %f\n", (*p)->datap[0]);
                    518:                        }
                    519:                        break;
                    520:                rnk:
                    521:                        printf(",  rank = %d\n", (*p)->rank);
                    522:                        break;
                    523: 
                    524:                nullone:
                    525:                        printf(",  <null>\n");
                    526:                        break;
                    527:                }
                    528:        }
                    529:        putchar('\n');
                    530: }
                    531: 

unix.superglobalmegacorp.com

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