Annotation of researchv10no/cmd/printf.c, revision 1.1.1.1

1.1       root        1: #define NEXT(p)        (*(p) ? *(p)++ : 0)
                      2: 
                      3: char fmtbuf[128];
                      4: 
                      5: double fnum; long lnum;
                      6: 
                      7: main(argc, argv)
                      8: char **argv;
                      9: {
                     10:        char *format = *++argv, **Argv;
                     11:        register char *fmt, *p;
                     12:        register c, i;
                     13:        ++argv;
                     14:        if (argc >= 2) do {
                     15:                Argv = argv;
                     16:                fmt = format;
                     17:                while (c = NEXT(fmt)) switch (c) {
                     18:                case '\\':
                     19:                        switch (c = NEXT(fmt)) {
                     20:                        case 'n':
                     21:                                putchar('\n'); break;
                     22:                        case 'r':
                     23:                                putchar('\r'); break;
                     24:                        case 't':
                     25:                                putchar('\t'); break;
                     26:                        case 'b':
                     27:                                putchar('\b'); break;
                     28:                        case '0': case '1': case '2': case '3':
                     29:                        case '4': case '5': case '6': case '7':
                     30:                                c -= '0';
                     31:                                for (i=0; i<2; i++)
                     32:                                        if (*fmt >= '0' && *fmt <= '7')
                     33:                                                c = (c << 3) + *fmt++ - '0';
                     34:                        default:
                     35:                                putchar(c); break;
                     36:                        }
                     37:                        break;
                     38:                case '%':
                     39:                        p = fmtbuf;
                     40:                        *p++ = c;
                     41:                        while (c && (c = NEXT(fmt))) switch (c) {
                     42:                        case '*':
                     43:                                atonum(NEXT(argv));
                     44:                                p += sprintf(p, "%d", lnum);
                     45:                                break;
                     46:                        case 'h': case 'l':
                     47:                                break;
                     48:                        case 'd': case 'o': case 'x':
                     49:                        case 'D': case 'O': case 'X':
                     50:                        case 'f': case 'e': case 'g':
                     51:                        case 'c': case 'u': case 'U':
                     52:                                *p++ = c; *p = 0;
                     53:                                if (atonum(NEXT(argv)))
                     54:                                        printf(fmtbuf, fnum);
                     55:                                else
                     56:                                        printf(fmtbuf, lnum);
                     57:                                c = 0; break;
                     58:                        case 's':
                     59:                                *p++ = c; *p = 0;
                     60:                                printf(fmtbuf, NEXT(argv));
                     61:                                c = 0; break;
                     62:                        case '%':
                     63:                                *p++ = c; *p = 0;
                     64:                                printf(fmtbuf);
                     65:                                c = 0; break;
                     66:                        default:
                     67:                                *p++ = c;
                     68:                        }
                     69:                        break;
                     70:                default:
                     71:                        putchar(c);
                     72:                        break;
                     73:                }
                     74:        } while (*argv && argv > Argv);
                     75:        exit(0);
                     76: }
                     77: 
                     78: double
                     79: pwrten(exp)
                     80: register exp;
                     81: {
                     82:        register double d;
                     83:        if (exp < 0) return 1.0/pwrten(-exp);
                     84:        if (exp == 0) return 1.0;
                     85:        if (exp == 1) return 10.0;
                     86:        d = pwrten(exp/2), d *= d;
                     87:        if (exp & 1) d *= 10.0;
                     88:        return d;
                     89: }
                     90: 
                     91: lexconst(n, ftype, exp)
                     92: register n, ftype, exp;
                     93: {
                     94:        if (ftype)
                     95:                fnum = (double)n * pwrten(exp);
                     96:        else
                     97:                lnum = n;
                     98:        return ftype;
                     99: }
                    100: 
                    101: enum States { start, intscan, hexscan, fracscan, expstart, expscan};
                    102: 
                    103: atonum(p)
                    104: register char *p;
                    105: {
                    106:        register state = (int)start, c;
                    107:        unsigned int i = 0, ioct = 0;
                    108:        unsigned int sign = 1, octal = 0, fexp = 0, sexp = 1, exp = 0;
                    109:        switch (c = *p++) {
                    110:        case '+': 
                    111:                c = *p++; break;
                    112:        case '-': 
                    113:                sign = -1, c = *p++; break;
                    114:        case '0': 
                    115:                ++octal, c = *p++; break;
                    116:        case '1': case '2': case '3': case '4': case '5': case '6':
                    117:        case '7': case '8': case '9': case '.': case 'e': case 'E':
                    118:                break;
                    119:        case '\'': case '"':
                    120:                return lexconst(*p++, 0, 0);
                    121:        default:
                    122:                return lexconst(c, 0, 0);
                    123:        }
                    124:        for (;; c = *p++) switch (state) {
                    125:        case start:
                    126:                if (octal && (c == 'x' || c == 'X')) {
                    127:                        state = (int)hexscan;
                    128:                        break;
                    129:                }
                    130:                state = (int)intscan;   /* fall through */
                    131:        case intscan:
                    132:                if (c >= '0' && c <= '9') {
                    133:                        i = 10*i + (c -= '0');
                    134:                        if (octal) ioct = 8*ioct + c;
                    135:                } else if (c == 'e' || c == 'E') {
                    136:                        state = (int)expstart;
                    137:                } else if (c == '.') {
                    138:                        state = (int)fracscan;
                    139:                } else {
                    140:                        return lexconst(sign*(octal ? ioct : i), 0, 0);
                    141:                }
                    142:                break;
                    143:        case hexscan:
                    144:                if (c >= '0' && c <= '9') {
                    145:                        i = 16*i + (c -= '0');
                    146:                } else if (c >= 'a' && c <= 'f') {
                    147:                        i = 16*i + (c -= 'a' - 10);
                    148:                } else if (c >= 'A' && c <= 'F') {
                    149:                        i = 16*i + (c -= 'A' - 10);
                    150:                } else {
                    151:                        return lexconst(sign*i, 0, 0);
                    152:                }
                    153:                break;
                    154:        case fracscan:
                    155:                if (c >= '0' && c <= '9') {
                    156:                        i = 10*i + (c -= '0');
                    157:                        --fexp;
                    158:                } else if (c == 'e' || c == 'E') {
                    159:                        state = (int)expstart;
                    160:                } else {
                    161:                        return lexconst(sign*i, 1, fexp);
                    162:                }
                    163:                break;
                    164:        case expstart:
                    165:                state = (int)expscan;
                    166:                if (c == '+') {
                    167:                        break;
                    168:                } else if (c == '-') {
                    169:                        sexp = -1;
                    170:                        break;
                    171:                }
                    172:        case expscan:
                    173:                if (c >= '0' && c <= '9') {
                    174:                        exp = 10*exp + (c -= '0');
                    175:                } else {
                    176:                        return lexconst(sign*i, 1, fexp + sexp*exp);
                    177:                }
                    178:                break;
                    179:        }
                    180: }

unix.superglobalmegacorp.com

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