Annotation of 43BSD/bin/adb/output.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)output.c   4.4 4/26/85";
                      3: #endif
                      4: /*
                      5:  *
                      6:  *     UNIX debugger
                      7:  *
                      8:  */
                      9: 
                     10: #include "defs.h"
                     11: #include <stdio.h>
                     12: 
                     13: 
                     14: INT            mkfault;
                     15: INT            infile;
                     16: INT            outfile = 1;
                     17: L_INT          maxpos;
                     18: L_INT          maxoff;
                     19: INT            radix = 16;
                     20: 
                     21: CHAR           printbuf[MAXLIN];
                     22: CHAR           *printptr = printbuf;
                     23: CHAR           *digitptr;
                     24: MSG            TOODEEP;
                     25: 
                     26: 
                     27: eqstr(s1, s2)
                     28:        REG STRING      s1, s2;
                     29: {
                     30:        REG STRING       es1;
                     31:        WHILE *s1++ == *s2
                     32:        DO IF *s2++ == 0
                     33:           THEN return(1);
                     34:           FI
                     35:        OD
                     36:        return(0);
                     37: }
                     38: 
                     39: length(s)
                     40:        REG STRING              s;
                     41: {
                     42:        INT             n = 0;
                     43:        WHILE *s++ DO n++; OD
                     44:        return(n);
                     45: }
                     46: 
                     47: printc(c)
                     48:        CHAR            c;
                     49: {
                     50:        CHAR            d;
                     51:        STRING          q;
                     52:        INT             posn, tabs, p;
                     53: 
                     54:        IF mkfault
                     55:        THEN    return;
                     56:        ELIF (*printptr=c)==EOR
                     57:        THEN tabs=0; posn=0; q=printbuf;
                     58:             FOR p=0; p<printptr-printbuf; p++
                     59:             DO d=printbuf[p];
                     60:                IF (p&7)==0 ANDF posn
                     61:                THEN tabs++; posn=0;
                     62:                FI
                     63:                IF d==SP
                     64:                THEN posn++;
                     65:                ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
                     66:                     WHILE posn>0 DO *q++=SP; posn--; OD
                     67:                     *q++=d;
                     68:                FI
                     69:             OD
                     70:             *q++=EOR;
                     71: #ifdef EDDT
                     72:                printptr=printbuf; do putchar(*printptr++); while (printptr<q);
                     73: #else
                     74:             write(outfile,printbuf,q-printbuf);
                     75: #endif
                     76:             printptr=printbuf;
                     77:        ELIF c==TB
                     78:        THEN *printptr++=SP;
                     79:             WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
                     80:        ELIF c
                     81:        THEN printptr++;
                     82:        FI
                     83:        IF printptr >= &printbuf[MAXLIN-9] THEN
                     84:                write(outfile, printbuf, printptr - printbuf);
                     85:                printptr = printbuf;
                     86:        FI
                     87: }
                     88: 
                     89: charpos()
                     90: {      return(printptr-printbuf);
                     91: }
                     92: 
                     93: flushbuf()
                     94: {      IF printptr!=printbuf
                     95:        THEN printc(EOR);
                     96:        FI
                     97: }
                     98: 
                     99: printf(fmat,a1)
                    100:        STRING          fmat;
                    101:        STRING          *a1;
                    102: {
                    103:        STRING          fptr, s;
                    104:        INT             *vptr;
                    105:        L_INT           *dptr;
                    106:        L_REAL          *rptr;
                    107:        INT             width, prec;
                    108:        CHAR            c, adj;
                    109:        INT             x, decpt, n;
                    110:        L_INT           lx;
                    111:        CHAR            digits[64];
                    112: 
                    113:        fptr = fmat; dptr = vptr = &a1;
                    114: 
                    115:        WHILE c = *fptr++
                    116:        DO  IF c!='%'
                    117:            THEN printc(c);
                    118:            ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
                    119:                 width=convert(&fptr);
                    120:                 IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
                    121:                 digitptr=digits;
                    122: #ifndef vax
                    123:                 dptr=rptr=vptr; lx = *dptr; x = *vptr++;
                    124: #else
                    125:                 rptr=dptr; x = shorten(lx = *dptr++);
                    126: #endif
                    127:                 s=0;
                    128:                 switch (c = *fptr++) {
                    129: 
                    130:                    case 'd':
                    131:                    case 'u':
                    132:                        printnum(x,c,10); break;
                    133:                    case 'o':
                    134: #ifndef vax
                    135:                        printoct(0,x,0); break;
                    136: #else
                    137:                        printoct(itol(0,x),0); break;
                    138: #endif
                    139:                    case 'q':
                    140:                        lx=x; printoct(lx,-1); break;
                    141:                    case 'x':
                    142: #ifndef vax
                    143:                        printdbl(0,x,c,16); break;
                    144: #else
                    145:                        printdbl(itol(0,x),c,16); break;
                    146: #endif
                    147:                        case 'r':
                    148:                        printdbl(lx=x,c,radix); break;
                    149:                        case 'R':
                    150:                        printdbl(lx,c,radix); vptr++; break;
                    151:                    case 'Y':
                    152:                        printdate(lx); vptr++; break;
                    153:                    case 'D':
                    154:                    case 'U':
                    155:                        printdbl(lx,c,10); vptr++; break;
                    156:                    case 'O':
                    157:                        printoct(lx,0); vptr++; break;
                    158:                    case 'Q':
                    159:                        printoct(lx,-1); vptr++; break;
                    160:                    case 'X':
                    161:                        printdbl(lx,'x',16); vptr++; break;
                    162:                    case 'c':
                    163:                        printc(x); break;
                    164:                    case 's':
                    165: #ifndef vax
                    166:                        s=x; break;
                    167: #else
                    168:                        s=lx; break;
                    169: #endif
                    170: #ifndef EDDT
                    171:                    case 'f':
                    172:                    case 'F':
                    173: #ifdef vax
                    174:                        dptr++;
                    175:                        sprintf(s=digits,"%+.16e",*rptr,*(rptr+4)); prec= -1; break;
                    176: #else
                    177:                        vptr += 7;
                    178:                        s=ecvt(*rptr, prec, &decpt, &n);
                    179:                        *digitptr++=(n?'-':'+');
                    180:                        *digitptr++ = (decpt<=0 ? '0' : *s++);
                    181:                        IF decpt>0 THEN decpt--; FI
                    182:                        *digitptr++ = '.';
                    183:                        WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD
                    184:                        WHILE *--digitptr=='0' DONE
                    185:                        digitptr += (digitptr-digits>=3 ? 1 : 2);
                    186:                        IF decpt
                    187:                        THEN *digitptr++ = 'e'; printnum(decpt,'d',10);
                    188:                        FI
                    189:                        s=0; prec = -1; break;
                    190: #endif
                    191: #endif
                    192:                    case 'm':
                    193:                        vptr--; break;
                    194:                    case 'M':
                    195:                        width=x; break;
                    196:                    case 'T':
                    197:                    case 't':
                    198:                        IF c=='T'
                    199:                        THEN width=x;
                    200: #ifndef vax
                    201:                        ELSE vptr--;
                    202: #else
                    203:                        ELSE dptr--;
                    204: #endif
                    205:                        FI
                    206:                        IF width
                    207:                        THEN width -= charpos()%width;
                    208:                        FI
                    209:                        break;
                    210:                    default:
                    211: #ifndef vax
                    212:                        printc(c); vptr--;
                    213: #else
                    214:                        printc(c); dptr--;
                    215: #endif
                    216:                }
                    217: 
                    218:                IF s==0
                    219:                THEN *digitptr=0; s=digits;
                    220:                FI
                    221:                n=length(s);
                    222:                n=(prec<n ANDF prec>=0 ? prec : n);
                    223:                width -= n;
                    224:                IF adj=='r'
                    225:                THEN WHILE width-- > 0
                    226:                     DO printc(SP); OD
                    227:                FI
                    228:                WHILE n-- DO printc(*s++); OD
                    229:                WHILE width-- > 0 DO printc(SP); OD
                    230:                digitptr=digits;
                    231:            FI
                    232:        OD
                    233: }
                    234: 
                    235: printdate(tvec)
                    236:        L_INT           tvec;
                    237: {
                    238:        REG INT         i;
                    239:        REG STRING      timeptr;
                    240: #ifndef EDDT
                    241:        timeptr = ctime(&tvec);
                    242: #else
                    243:        timeptr="????????????????????????";
                    244: #endif
                    245:        FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
                    246:        FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
                    247: } /*printdate*/
                    248: 
                    249: prints(s)
                    250: char *s;
                    251: {      printf("%s",s);
                    252: }
                    253: 
                    254: newline()
                    255: {
                    256:        printc(EOR);
                    257: }
                    258: 
                    259: convert(cp)
                    260: REG STRING     *cp;
                    261: {
                    262:        REG CHAR        c;
                    263:        INT             n;
                    264:        n=0;
                    265:        WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
                    266:        (*cp)--;
                    267:        return(n);
                    268: }
                    269: 
                    270: printnum(n,fmat,base)
                    271:        REG INT         n;
                    272: {
                    273:        REG CHAR        k;
                    274:        REG INT         *dptr;
                    275:        INT             digs[15];
                    276:        dptr=digs;
                    277:        IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI
                    278:        n &= 0xffff;
                    279:        WHILE n
                    280:        DO  *dptr++ = ((POS)(n&0xffff))%base;
                    281:            n=((POS)(n&0xffff))/base;
                    282:        OD
                    283:        IF dptr==digs THEN *dptr++=0; FI
                    284:        WHILE dptr!=digs
                    285:        DO  k = *--dptr;
                    286:            *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
                    287:        OD
                    288: }
                    289: 
                    290: printoct(o,s)
                    291:        L_INT           o;
                    292:        INT             s;
                    293: {
                    294:        INT             i;
                    295:        L_INT           po = o;
                    296:        CHAR            digs[12];
                    297: 
                    298:        IF s
                    299:        THEN IF po<0
                    300:             THEN po = -po; *digitptr++='-';
                    301:             ELSE IF s>0 THEN *digitptr++='+'; FI
                    302:             FI
                    303:        FI
                    304:        FOR i=0;i<=11;i++
                    305:        DO digs[i] = po&7; po >>= 3; OD
                    306:        digs[10] &= 03; digs[11]=0;
                    307:        FOR i=11;i>=0;i--
                    308:        DO IF digs[i] THEN break; FI OD
                    309:        FOR i++;i>=0;i--
                    310:        DO *digitptr++=digs[i]+'0'; OD
                    311: }
                    312: 
                    313: #ifndef vax
                    314: printdbl(lx,ly,fmat,base)
                    315: INT lx, ly; char fmat; int base;
                    316: #else
                    317: printdbl(lxy,fmat,base)
                    318: L_INT lxy; char fmat; int base;
                    319: #endif
                    320: {      int digs[20]; int *dptr; char k;
                    321: #ifndef MULD2
                    322:        register char *cp1;
                    323:        cp1=digs; if ((lxy&0xFFFF0000L)==0xFFFF0000L) {*cp1++='-'; lxy= -lxy;}
                    324:        sprintf(cp1,base==16 ? "%x" : "%D",lxy);
                    325:        cp1=digs; while (*digitptr++= *cp1++); --digitptr;
                    326: #else
                    327:        L_REAL f ,g; long q;
                    328: #ifdef vax
                    329:        INT lx,ly;
                    330:        ly=lxy; lx=(lxy>>16)&0xFFFF;
                    331: #endif
                    332:        dptr=digs;
                    333:        IF fmat=='D' ORF fmat=='r'
                    334:        THEN    f=itol(lx,ly);
                    335:                IF f<0 THEN *digitptr++='-'; f = -f; FI
                    336:        ELSE
                    337:                IF lx==-1
                    338:                THEN *digitptr++='-'; f=leng(-ly);
                    339:                ELSE f=leng(lx); f *= itol(1,0); f += leng(ly);
                    340:                FI
                    341:                IF fmat=='x' THEN *digitptr++='#'; FI
                    342:        FI
                    343:        WHILE f
                    344:        DO  q=f/base; g=q;
                    345:            *dptr++ = f-g*base;
                    346:            f=q;
                    347:        OD
                    348:        IF dptr==digs ORF dptr[-1]>9 THEN *dptr++=0; FI
                    349:        WHILE dptr!=digs
                    350:        DO  k = *--dptr;
                    351:            *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
                    352:        OD
                    353: #endif
                    354: }
                    355: 
                    356: #define        MAXIFD  5
                    357: struct {
                    358:        int     fd;
                    359:        int     r9;
                    360: } istack[MAXIFD];
                    361: int    ifiledepth;
                    362: 
                    363: iclose(stack, err)
                    364: {
                    365:        IF err
                    366:        THEN    IF infile
                    367:                THEN    close(infile); infile=0;
                    368:                FI
                    369:                WHILE --ifiledepth >= 0
                    370:                DO      IF istack[ifiledepth].fd
                    371:                        THEN    close(istack[ifiledepth].fd);
                    372:                        FI
                    373:                OD
                    374:                ifiledepth = 0;
                    375:        ELIF stack == 0
                    376:        THEN    IF infile
                    377:                THEN    close(infile); infile=0;
                    378:                FI
                    379:        ELIF stack > 0
                    380:        THEN    IF ifiledepth >= MAXIFD
                    381:                THEN    error(TOODEEP);
                    382:                FI
                    383:                istack[ifiledepth].fd = infile;
                    384:                istack[ifiledepth].r9 = var[9];
                    385:                ifiledepth++;
                    386:                infile = 0;
                    387:        ELSE    IF infile
                    388:                THEN    close(infile); infile=0;
                    389:                FI
                    390:                IF ifiledepth > 0
                    391:                THEN    infile = istack[--ifiledepth].fd;
                    392:                        var[9] = istack[ifiledepth].r9;
                    393:                FI
                    394:        FI
                    395: }
                    396: 
                    397: oclose()
                    398: {
                    399:        IF outfile!=1
                    400:        THEN    flushbuf(); close(outfile); outfile=1;
                    401:        FI
                    402: }
                    403: 
                    404: endline()
                    405: {
                    406: 
                    407:        if (maxpos <= charpos())
                    408:                printf("\n");
                    409: }

unix.superglobalmegacorp.com

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