|
|
1.1 root 1: /*
2: *
3: * ul - General underline filter. Converts underlines by
4: * the standard backspacing method to the code used by the
5: * particular terminal to underline.
6: *
7: */
8: #include <stdio.h>
9: char buf[BUFSIZ];
10: char isul[BUFSIZ];
11: char termcap[1024];
12: char ulbuf[BUFSIZ];
13: char *stul, *endul, *chul;
14: char *backspace;
15: char *termtype;
16: int outc();
17: char *tgetstr();
18: char *getenv();
19:
20: main(argc,argv) char **argv; {
21: register int i;
22: char *cp;
23: FILE *f;
24:
25: /* Figure out kind of terminal and set up special strings. */
26: termtype = getenv("TERM");
27: if (termtype == NULL)
28: termtype = "dumb";
29: while (argc >= 2 && argv[1][0] == '-') {
30: switch(argv[1][1]) {
31: case 't':
32: case 'T': /* for nroff compatibility */
33: if (argv[1][2])
34: termtype = &argv[1][2];
35: else {
36: termtype = argv[2];
37: argc--;
38: argv++;
39: }
40: break;
41: default:
42: printf("Bad switch: %s\n",argv[1]);
43: exit(1);
44: }
45: }
46: switch(tgetent(termcap, termtype)) {
47: case 1: /* All is well */
48: /* Terminals that don't need any help. */
49: if (tgetflag("ul") || tgetflag("os"))
50: execv("/bin/cat",argv);
51: cp = ulbuf;
52: if ((backspace = tgetstr("bc",&cp)) == NULL)
53: backspace = "\b";
54: /*
55: * Handle terminals that have start underline/stop
56: * underline sequences, as well as those with
57: * underline char sequences (we assume the sequence
58: * moves the cursor forward one character).
59: * If we can't find underline sequences, we
60: * settle for standout sequences.
61: */
62: if ( (chul=tgetstr("uc",&cp)) == NULL)
63: chul = "";
64: if ( (stul=tgetstr("us",&cp)) == NULL &&
65: (!*chul) && (stul=tgetstr("so",&cp)) == NULL)
66: stul = "";
67: if ( (endul=tgetstr("ue",&cp)) == NULL &&
68: (!*chul) && (endul=tgetstr("se",&cp)) == NULL)
69: endul = "";
70: break;
71: default:/* error opening/reading termcap */
72: fprintf(stderr,"trouble reading termcap");
73: /* fall through to ... */
74: case 0: /* No such terminal type - assume dumb */
75: stul = endul = chul = "";
76: break;
77: }
78: if (argc < 2) filter(stdin);
79: else for (i=1; i<argc; i++) {
80: f = fopen(argv[i],"r");
81: if (f == NULL) {
82: printf("Can't open %s\n",argv[i]);
83: exit(1);
84: } else filter(f);
85: }
86: exit(0);
87: }
88:
89: filter(f)
90: FILE *f;
91: {
92: register int p, n;
93: register char c;
94: int state;
95:
96: n = 0;
97: for (;;) {
98: p = 0;
99: for (p=0; p<n; p++) {
100: buf[p] = '\0';
101: isul[p] = 0;
102: }
103: p = n = 0;
104:
105: for (;;) {
106: c = getc(f);
107: if (c==EOF) break;
108: if (c=='\b') {
109: if (p > 0) {
110: p--;
111: }
112: } else if (c=='_' && isul[p]==0 && buf[p]) {
113: isul[p] = 1;
114: p++;
115: } else {
116: if (buf[p] == '_') {
117: isul[p] = 1;
118: }
119: buf[p] = c;
120: p++;
121: if (n < p) n = p;
122: }
123: if (c=='\n') break;
124: }
125:
126: state = 0;
127: for (p=0; p<n; p++) {
128: if (isul[p] != state)
129: tputs(isul[p] ? stul : endul, 1, outc);
130: state = isul[p];
131: outc(buf[p]);
132: if (isul[p] && *chul) {
133: printf("%s",backspace);
134: tputs(chul, 1, outc);
135: }
136: }
137: if (c==EOF) break;
138: }
139: }
140:
141: outc(c)
142: char c;
143: {
144: putchar(c);
145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.