|
|
1.1 ! root 1: #include <stdio.h> ! 2: /* ! 3: * expand - expand tabs to equivalent spaces ! 4: */ ! 5: char obuf[BUFSIZ]; ! 6: int nstops; ! 7: int tabstops[100]; ! 8: ! 9: main(argc, argv) ! 10: int argc; ! 11: char *argv[]; ! 12: { ! 13: register int c, column; ! 14: register int n; ! 15: ! 16: setbuf(stdout, obuf); ! 17: argc--, argv++; ! 18: do { ! 19: while (argc > 0 && argv[0][0] == '-') { ! 20: getstops(argv[0]); ! 21: argc--, argv++; ! 22: } ! 23: if (argc > 0) { ! 24: if (freopen(argv[0], "r", stdin) == NULL) { ! 25: perror(argv[0]); ! 26: exit(1); ! 27: } ! 28: argc--, argv++; ! 29: } ! 30: column = 0; ! 31: for (;;) { ! 32: c = getc(stdin); ! 33: if (c == -1) ! 34: break; ! 35: switch (c) { ! 36: ! 37: case '\t': ! 38: if (nstops == 0) { ! 39: do { ! 40: putchar(' '); ! 41: column++; ! 42: } while (column & 07); ! 43: continue; ! 44: } ! 45: if (nstops == 1) { ! 46: do { ! 47: putchar(' '); ! 48: column++; ! 49: } while (((column - 1) % tabstops[0]) != (tabstops[0] - 1)); ! 50: continue; ! 51: } ! 52: for (n = 0; n < nstops; n++) ! 53: if (tabstops[n] > column) ! 54: break; ! 55: if (n == nstops) { ! 56: putchar(' '); ! 57: column++; ! 58: continue; ! 59: } ! 60: while (column < tabstops[n]) { ! 61: putchar(' '); ! 62: column++; ! 63: } ! 64: continue; ! 65: ! 66: case '\b': ! 67: if (column) ! 68: column--; ! 69: putchar('\b'); ! 70: continue; ! 71: ! 72: default: ! 73: putchar(c); ! 74: column++; ! 75: continue; ! 76: ! 77: case '\n': ! 78: putchar(c); ! 79: column = 0; ! 80: continue; ! 81: } ! 82: } ! 83: } while (argc > 0); ! 84: exit(0); ! 85: } ! 86: ! 87: getstops(cp) ! 88: register char *cp; ! 89: { ! 90: register int i; ! 91: ! 92: nstops = 0; ! 93: cp++; ! 94: for (;;) { ! 95: i = 0; ! 96: while (*cp >= '0' && *cp <= '9') ! 97: i = i * 10 + *cp++ - '0'; ! 98: if (i <= 0 || i > 256) { ! 99: bad: ! 100: fprintf(stderr, "Bad tab stop spec\n"); ! 101: exit(1); ! 102: } ! 103: if (nstops > 0 && i <= tabstops[nstops]) ! 104: goto bad; ! 105: tabstops[nstops++] = i; ! 106: if (*cp == 0) ! 107: break; ! 108: if (*cp++ != ',') ! 109: goto bad; ! 110: } ! 111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.