|
|
1.1 ! root 1: #include <stdio.h> ! 2: /* ! 3: * colcrt - replaces col for crts with new nroff esp. when using tbl. ! 4: * Bill Joy UCB July 14, 1977 ! 5: * ! 6: * This filter uses a screen buffer, 267 half-lines by 132 columns. ! 7: * It interprets the up and down sequences generated by the new ! 8: * nroff when used with tbl and by \u \d and \r. ! 9: * General overstriking doesn't work correctly. ! 10: * Underlining is split onto multiple lines, etc. ! 11: * ! 12: * Option - suppresses all underlining. ! 13: * Option -2 forces printing of all half lines. ! 14: */ ! 15: ! 16: char page[267][132]; ! 17: ! 18: int outline = 1; ! 19: int outcol; ! 20: ! 21: char buf[256]; ! 22: char suppresul; ! 23: char printall; ! 24: ! 25: char *progname; ! 26: FILE *f; ! 27: ! 28: main(argc, argv) ! 29: int argc; ! 30: char *argv[]; ! 31: { ! 32: register c; ! 33: register char *cp, *dp; ! 34: ! 35: argc--; ! 36: progname = *argv++; ! 37: while (argc > 0 && argv[0][0] == '-') { ! 38: switch (argv[0][1]) { ! 39: case 0: ! 40: suppresul = 1; ! 41: break; ! 42: case '2': ! 43: printall = 1; ! 44: break; ! 45: default: ! 46: printf("usage: %s [ - ] [ -2 ] [ file ... ]\n", progname); ! 47: fflush(stdout); ! 48: exit(1); ! 49: } ! 50: argc--; ! 51: argv++; ! 52: } ! 53: setbuf(stdout, buf); ! 54: do { ! 55: if (argc > 0) { ! 56: close(0); ! 57: if ((f=fopen(argv[0], "r") ! 58: ) < 0) { ! 59: fflush(stdout); ! 60: perror(argv[0]); ! 61: fflush(stdout); ! 62: exit (1); ! 63: } ! 64: argc--; ! 65: argv++; ! 66: } ! 67: for (;;) { ! 68: c = getc(stdin); ! 69: if (c == -1) { ! 70: pflush(outline); ! 71: fflush(stdout); ! 72: break; ! 73: } ! 74: switch (c) { ! 75: case '\n': ! 76: if (outline >= 265) ! 77: pflush(62); ! 78: outline += 2; ! 79: outcol = 0; ! 80: continue; ! 81: case '\016': ! 82: case '\017': ! 83: continue; ! 84: case 033: ! 85: c = getc(stdin); ! 86: switch (c) { ! 87: case '9': ! 88: if (outline >= 266) ! 89: pflush(62); ! 90: outline++; ! 91: continue; ! 92: case '8': ! 93: if (outline >= 1) ! 94: outline--; ! 95: continue; ! 96: case '7': ! 97: outline -= 2; ! 98: if (outline < 0) ! 99: outline = 0; ! 100: continue; ! 101: default: ! 102: continue; ! 103: } ! 104: case '\b': ! 105: if (outcol) ! 106: outcol--; ! 107: continue; ! 108: case '\t': ! 109: outcol += 8; ! 110: outcol &= ~7; ! 111: outcol--; ! 112: c = ' '; ! 113: default: ! 114: if (outcol >= 132) { ! 115: outcol++; ! 116: continue; ! 117: } ! 118: cp = &page[outline][outcol]; ! 119: outcol++; ! 120: if (c == '_') { ! 121: if (suppresul) ! 122: continue; ! 123: cp += 132; ! 124: c = '-'; ! 125: } ! 126: if (*cp == 0) { ! 127: *cp = c; ! 128: dp = cp - outcol; ! 129: for (cp--; cp >= dp && *cp == 0; cp--) ! 130: *cp = ' '; ! 131: } else ! 132: if (plus(c, *cp) || plus(*cp, c)) ! 133: *cp = '+'; ! 134: else if (*cp == ' ' || *cp == 0) ! 135: *cp = c; ! 136: continue; ! 137: } ! 138: } ! 139: } while (argc > 0); ! 140: fflush(stdout); ! 141: exit(0); ! 142: } ! 143: ! 144: plus(c, d) ! 145: char c, d; ! 146: { ! 147: ! 148: return (c == '|' && d == '-' || d == '_'); ! 149: } ! 150: ! 151: int first; ! 152: ! 153: pflush(ol) ! 154: int ol; ! 155: { ! 156: register int i, j; ! 157: register char *cp; ! 158: char lastomit; ! 159: int l; ! 160: ! 161: l = ol; ! 162: lastomit = 0; ! 163: if (l > 266) ! 164: l = 266; ! 165: else ! 166: l |= 1; ! 167: for (i = first | 1; i < l; i++) { ! 168: move(i, i - 1); ! 169: move(i, i + 1); ! 170: } ! 171: for (i = first; i < l; i++) { ! 172: cp = page[i]; ! 173: if (printall == 0 && lastomit == 0 && *cp == 0) { ! 174: lastomit = 1; ! 175: continue; ! 176: } ! 177: lastomit = 0; ! 178: printf("%s\n", cp); ! 179: } ! 180: copy(page, page[ol], (267 - ol) * 132); ! 181: clear(page[267- ol], ol * 132); ! 182: outline -= ol; ! 183: outcol = 0; ! 184: first = 1; ! 185: } ! 186: move(l, m) ! 187: int l, m; ! 188: { ! 189: register char *cp, *dp; ! 190: ! 191: for (cp = page[l], dp = page[m]; *cp; cp++, dp++) { ! 192: switch (*cp) { ! 193: case '|': ! 194: if (*dp != ' ' && *dp != '|' && *dp != 0) ! 195: return; ! 196: break; ! 197: case ' ': ! 198: break; ! 199: default: ! 200: return; ! 201: } ! 202: } ! 203: if (*cp == 0) { ! 204: for (cp = page[l], dp = page[m]; *cp; cp++, dp++) ! 205: if (*cp == '|') ! 206: *dp = '|'; ! 207: else if (*dp == 0) ! 208: *dp = ' '; ! 209: page[l][0] = 0; ! 210: } ! 211: } ! 212: ! 213: copy(to, from, i) ! 214: register char *to, *from; ! 215: register int i; ! 216: { ! 217: ! 218: if (i > 0) ! 219: do ! 220: *to++ = *from++; ! 221: while (--i); ! 222: } ! 223: ! 224: clear(at, cnt) ! 225: register char *at; ! 226: register int cnt; ! 227: { ! 228: ! 229: if (cnt > 0) ! 230: do ! 231: *at++ = 0; ! 232: while (--cnt); ! 233: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.