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

1.1       root        1: /* C compiler: output functions */
                      2: 
                      3: #include "c.h"
                      4: 
                      5: static char buf1[4*1024], buf2[512];   /* output buffers */
                      6: static struct io {
                      7:        int fd;                         /* file descriptor */
                      8:        char *bp;                       /* buffer pointer */
                      9:        char *buffer;                   /* buffer proper */
                     10:        char *limit;                    /* high water limit */
                     11: } iob[] = {
                     12:        0, 0, 0, 0,
                     13:        1, buf1, buf1, buf1 + sizeof buf1 - 80,
                     14:        2, buf2, buf2, buf2 + sizeof buf2 - 80
                     15: }, *io[] = {
                     16:        &iob[0],                        /* used by stringf */
                     17:        &iob[1],                        /* output */
                     18:        &iob[2]                         /* standard error & other files; used by fprint */
                     19: };
                     20: static int fd = 1;                     /* current output file */
                     21: 
                     22: char *bp = buf1;                       /* current output buffer pointer */
                     23: 
                     24: /* outputInit - initialize output system */
                     25: void outputInit(fd) {
                     26:        io[1]->fd = fd;
                     27: }
                     28: 
                     29: /* fprint - formatted output to file descriptor f */
                     30: #ifdef __STDC__
                     31: void fprint(int f, char *fmt, ...) {
                     32: #else
                     33: void fprint(f, fmt, va_alist) char *fmt; va_dcl {
                     34: #endif
                     35:        va_list ap;
                     36: 
                     37:        va_init(ap, fmt);
                     38:        vfprint(f, fmt, ap);
                     39:        va_end(ap);
                     40: }
                     41: 
                     42: /* outflush - flush output buffer; writes last buffer first */
                     43: void outflush() {
                     44:        struct io *iop = io[fd];
                     45: 
                     46:        assert(fd);
                     47:        if (bp > iop->buffer)
                     48:                write(iop->fd, iop->buffer, bp - iop->buffer);
                     49:        bp = iop->bp = iop->buffer;
                     50: }
                     51: 
                     52: /* outs - output string s */
                     53: void outs(s) char *s; {
                     54:        char *p;
                     55: 
                     56:        for (p = bp; *p = *s++; p++)
                     57:                ;
                     58:        bp = p;
                     59:        if (bp > io[fd]->limit)
                     60:                outflush();
                     61: }
                     62: 
                     63: /* print - formatted output to standard output */
                     64: #ifdef __STDC__
                     65: void print(char *fmt, ...) {
                     66: #else
                     67: void print(fmt, va_alist) char *fmt; va_dcl {
                     68: #endif
                     69:        va_list ap;
                     70: 
                     71:        va_init(ap, fmt);
                     72:        vprint(fmt, ap);
                     73:        va_end(ap);
                     74: }
                     75: 
                     76: /* stringf - formatted output to a saved string */
                     77: #ifdef __STDC__
                     78: char *stringf(char *fmt, ...) {
                     79: #else
                     80: char *stringf(fmt, va_alist) char *fmt; va_dcl {
                     81: #endif
                     82:        char buf[1024];
                     83:        va_list ap;
                     84: 
                     85:        va_init(ap, fmt);
                     86:        fd = 0;
                     87:        io[1]->bp = bp;
                     88:        bp = io[0]->bp = io[0]->buffer = buf;
                     89:        io[0]->limit = buf + sizeof buf;
                     90:        vprint(fmt, ap);
                     91:        *bp = 0;
                     92:        bp = io[1]->bp;
                     93:        fd = 1;
                     94:        va_end(ap);
                     95:        return string(buf);
                     96: }
                     97: 
                     98: /* vfprint - formatted output to file descriptor f */
                     99: void vfprint(f, fmt, ap) char *fmt; va_list ap; {
                    100:        if (f == 1)
                    101:                vprint(fmt, ap);
                    102:        else {
                    103:                fd = 2;
                    104:                io[1]->bp = bp;
                    105:                io[2]->fd = f;
                    106:                bp = io[2]->bp;
                    107:                vprint(fmt, ap);
                    108:                outflush();
                    109:                bp = io[1]->bp;
                    110:                fd = 1;
                    111:        }
                    112: }
                    113: 
                    114: /* vprint - formatted output to standard output */
                    115: void vprint(fmt, ap) char *fmt; va_list ap; {
                    116:        for (; *fmt; fmt++)
                    117:                if (*fmt == '%')
                    118:                        switch (*++fmt) {
                    119:                        case 'c': { *bp++ = va_arg(ap, int);
                    120:  } break;
                    121:                        case 'd': { int n = va_arg(ap, int);
                    122:                                    unsigned m;
                    123:                                    char buf[25], *s = buf + sizeof buf;
                    124:                                    *--s = 0;
                    125:                                    if (n == INT_MIN)
                    126:                                        m = (unsigned)INT_MAX + 1;
                    127:                                    else if (n < 0)
                    128:                                        m = -n;
                    129:                                    else
                    130:                                        m = n;
                    131:                                    do
                    132:                                        *--s = m%10 + '0';
                    133:                                    while (m /= 10);
                    134:                                    if (n < 0)
                    135:                                        *--s = '-';
                    136:                                    outs(s);
                    137:  } break;
                    138:                        case 'o': { unsigned n = va_arg(ap, unsigned);
                    139:                                    char buf[25], *s = buf + sizeof buf;
                    140:                                    *--s = 0;
                    141:                                    do
                    142:                                        *--s = (n&7) + '0';
                    143:                                    while (n >>= 3);
                    144:                                    outs(s);
                    145:  } break;
                    146:                        case 'x': { unsigned n = va_arg(ap, unsigned);
                    147:                                    char buf[25], *s = buf + sizeof buf;
                    148:                                    *--s = 0;
                    149:                                    do
                    150:                                        *--s = "0123456789abcdef"[n&0xf];
                    151:                                    while (n >>= 4);
                    152:                                    outs(s);
                    153:  } break;
                    154:                        case 's': { char *s = va_arg(ap, char *);
                    155:                                    if (s)
                    156:                                        outs(s);
                    157:  } break;
                    158:                        case 'S': { char *s = va_arg(ap, char *);
                    159:                                    int n = va_arg(ap, int);
                    160:                                    if (s)
                    161:                                        while (n-- > 0)
                    162:                                                *bp++ = *s++;
                    163:  } break;
                    164:                        case 'k': { int t = va_arg(ap, int);
                    165:                                    static char *tokens[] = {
                    166: #define xx(a,b,c,d,e,f,g) g,
                    167: #define yy xx
                    168: #include "token.h"
                    169:                                        };
                    170:                                    assert(tokens[t&0177]);
                    171:                                    outs(tokens[t&0177]);
                    172:  } break;
                    173:                        case 't': { Type ty = va_arg(ap, Type);
                    174:                                    outtype(ty ? ty : voidtype);
                    175:  } break;
                    176:                        case 'w': { Coordinate *p = va_arg(ap, Coordinate *);
                    177:                                    if (p->file && *p->file)
                    178:                                        print("%s:", p->file);
                    179:                                    print("%d", p->y);
                    180:                                    break; } break;
                    181:                        default:  *bp++ = *fmt; break;
                    182:                        }
                    183:                else if ((*bp++ = *fmt) == '\n' && bp > io[fd]->limit)
                    184:                        outflush();
                    185: }
                    186: 

unix.superglobalmegacorp.com

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