Annotation of researchv10no/cmd/xref/output.c, revision 1.1.1.1

1.1       root        1: #include       "output.h"
                      2: 
                      3: 
                      4: #define MAXLIN 256
                      5: 
                      6: TYPE L_INT     EXPR;
                      7: INT            mkfault;
                      8: INT            outfile = 1;
                      9: CHAR           *digitptr;
                     10: CHAR           printbuf[MAXLIN];
                     11: CHAR           *printptr = printbuf;
                     12: 
                     13: printc(c)
                     14:        CHAR            c;
                     15: {
                     16:        REG STRING      q;
                     17:        CHAR            d;
                     18:        INT             posn, tabs, p;
                     19: 
                     20:        IF mkfault
                     21:        THEN    return;
                     22:        ELIF (*printptr=c)==NL
                     23:        THEN    tabs=0; posn=0; q=printbuf;
                     24:                FOR p=0; p<printptr-printbuf; p++
                     25:                DO      d=printbuf[p];
                     26:                        IF (p&7)==0 ANDF posn>1
                     27:                        THEN    tabs++; posn=0;
                     28:                        FI
                     29:                        IF d==SP
                     30:                        THEN    posn++;
                     31:                        ELSE    WHILE tabs>0 DO *q++=TB; tabs--; OD
                     32:                                WHILE posn>0 DO *q++=SP; posn--; OD
                     33:                                *q++=d;
                     34:                        FI
                     35:                OD
                     36:                *q++=NL;
                     37:                write(outfile,printbuf,q-printbuf);
                     38:                printptr=printbuf;
                     39:        ELIF c==TB
                     40:        THEN    *printptr++=SP;
                     41:                WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
                     42:        ELIF c
                     43:        THEN    printptr++;
                     44:        FI
                     45: }
                     46: 
                     47: print(format, value)
                     48:        STRING          format;
                     49:        INT             value;
                     50: {
                     51:        STRING          scan = format;
                     52:        STRING          s;
                     53:        INT             width, prec;
                     54:        CHAR            c, adj;
                     55:        INT             decpt, n;
                     56:        CHAR            digits[64];
                     57:        EXPR            e = value.p_expr;
                     58:        POS             i = value.p_int;
                     59: 
                     60:        WHILE c = *scan++
                     61:        DO IF c!='%'
                     62:           THEN printc(c);
                     63:           ELSE IF (adj = *scan)=='-' THEN scan++; FI
                     64:                width=convert(&scan);
                     65:                IF *scan=='.' THEN scan++; prec=convert(&scan); ELSE prec = -1; FI
                     66:                digitptr=digits;
                     67:                s=0;
                     68:                SWITCH c = *scan++ IN
                     69: 
                     70:                    case 'd':
                     71:                        e=i;
                     72:                    case 'D':
                     73:                        printn(e,-1,10); break;
                     74: 
                     75:                    case 'u':
                     76:                        e=i;
                     77:                    case 'U':
                     78:                        printn(e,0,10); break;
                     79: 
                     80:                    case 'o':
                     81:                        e=i;
                     82:                    case 'O':
                     83:                        printn(e,0,8); break;
                     84: 
                     85:                    case 'q':
                     86:                        e=i;
                     87:                    case 'Q':
                     88:                        printn(e,-1,8); break;
                     89: 
                     90:                    case 'x':
                     91:                        e=i;
                     92:                    case 'e':
                     93:                    case 'X':
                     94:                        printn(e,0,16); break;
                     95: 
                     96:                    case 'Y':
                     97:                        printd(e); break;
                     98: 
                     99:                    case 'c':
                    100:                        printc(value.p_char); break;
                    101: 
                    102:                    case 's':
                    103:                        s=value.p_string; break;
                    104: 
                    105:                    case 'f':
                    106:                    case 'F':
                    107:                        s=ecvt(value.p_real, prec, &decpt, &n);
                    108:                        *digitptr++=(n?'-':'+');
                    109:                        *digitptr++ = (decpt<=0 ? '0' : *s++);
                    110:                        IF decpt>0 THEN decpt--; FI
                    111:                        *digitptr++ = '.';
                    112:                        WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD
                    113:                        WHILE *--digitptr=='0' DONE
                    114:                        digitptr += (digitptr-digits>=3 ? 1 : 2);
                    115:                        IF decpt
                    116:                        THEN *digitptr++ = 'e'; printn((L_INT)(decpt),-1,10);
                    117:                        FI
                    118:                        s=0; prec = -1; break;
                    119: 
                    120:                    case 'm':
                    121:                        break;
                    122: 
                    123:                    case 'M':
                    124:                        width=i; break;
                    125: 
                    126:                    case 'T':
                    127:                        width=i;
                    128: 
                    129:                    case 't':
                    130:                        IF width
                    131:                        THEN width -= charpos()%width;
                    132:                        FI
                    133:                        break;
                    134: 
                    135:                    default:
                    136:                        printc(c);
                    137:                ENDSW
                    138: 
                    139:                IF s==0
                    140:                THEN    *digitptr=0; s=digits;
                    141:                FI
                    142:                n=length(s);
                    143:                n=(prec<n ANDF prec>=0 ? prec : n);
                    144:                width -= n;
                    145:                IF adj!='-'
                    146:                THEN    WHILE width-- > 0
                    147:                        DO printc(SP); OD
                    148:                FI
                    149:                WHILE n-- DO printc(*s++); OD
                    150:                WHILE width-- > 0 DO printc(SP); OD
                    151:                digitptr=digits;
                    152:           FI
                    153:        OD
                    154: }
                    155: 
                    156: LOCAL  printd(tvec)
                    157:        L_INT           tvec;
                    158: {
                    159:        REG INT         i;
                    160:        REG STRING      timeptr = ctime(&tvec);
                    161: 
                    162:        FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
                    163:        FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
                    164: } /*printd*/
                    165: 
                    166: prints(s)
                    167:        REG STRING      s;
                    168: {
                    169:        REG CHAR        c;
                    170: 
                    171:        WHILE c = *s++ DO printc(c); OD
                    172: }
                    173: 
                    174: LOCAL  convert(cp)
                    175:        REG STRING      *cp;
                    176: {
                    177:        REG CHAR        c;
                    178:        INT             n = 0;
                    179: 
                    180:        WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
                    181:        (*cp)--;
                    182:        return(n);
                    183: }
                    184: 
                    185: LOCAL  printn(n, sgn, base)
                    186:        EXPR            n;
                    187:        INT             sgn;
                    188: {
                    189:        REG INT         k;
                    190:        INT             digs[15];
                    191:        REG INT         *dptr = digs;
                    192: 
                    193:        IF n<0 ANDF sgn<0 THEN n = -n; *digitptr++ = '-'; FI
                    194:        IF base==8 ANDF n THEN *digitptr++='0';
                    195:        ELIF base==16 THEN *digitptr++='#';
                    196:        FI
                    197:        WHILE n
                    198:        DO *dptr++=divide(&n,base);
                    199:        OD
                    200:        IF dptr==digs THEN *dptr++=0; FI
                    201:        WHILE dptr!=digs
                    202:        DO  k = *--dptr;
                    203:            *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
                    204:        OD
                    205: }
                    206: 
                    207: charpos()
                    208: {
                    209:        return(printptr-printbuf);
                    210: }
                    211: 
                    212: flushbuf()
                    213: {
                    214:        IF printptr!=printbuf
                    215:        THEN    newline();
                    216:        FI
                    217: }
                    218: 
                    219: newline()
                    220: {
                    221:        printc(NL);
                    222: }
                    223: 
                    224: eqstr(s1, s2)
                    225:        REG STRING      s1, s2;
                    226: {
                    227:        REG STRING       es1 = s1+8;
                    228: 
                    229:        IF *s1=='~' ORF *s1=='_'
                    230:        THEN IF *s2 != *s1 THEN s1++; FI
                    231:        FI
                    232:        WHILE *s1++ == *s2
                    233:        DO IF *s2++ == 0 ORF s1>=es1
                    234:           THEN return(1);
                    235:           FI
                    236:        OD
                    237:        return(0);
                    238: }

unix.superglobalmegacorp.com

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