|
|
1.1 root 1: static char *sccsid = "@(#)ul.c 4.1 (Berkeley) 10/1/80";
2: /*
3: * ul
4: */
5: #include <stdio.h>
6:
7: char buf[BUFSIZ];
8: char isul[BUFSIZ];
9: char termcap[1024];
10: char ulbuf[BUFSIZ];
11: char *stul, *endul, *chul;
12: char *backspace;
13: char *termtype;
14: int outc();
15: char *tgetstr();
16: char *getenv();
17:
18: main(argc, argv)
19: int argc;
20: char **argv;
21: {
22: register int i;
23: char *cp;
24: FILE *f;
25:
26: argc--, argv++;
27: termtype = getenv("TERM");
28: if (termtype == NULL)
29: termtype = "dumb";
30: while (argc > 0 && argv[0][0] == '-') {
31: switch(argv[0][1]) {
32:
33: case 't':
34: case 'T': /* for nroff compatibility */
35: if (argv[0][2])
36: termtype = &argv[0][2];
37: else {
38: termtype = argv[1];
39: argc--;
40: argv++;
41: }
42: break;
43: case 'i':
44: argc--, argv++;
45: iul(argc, argv);
46: exit(0);
47:
48: default:
49: printf("Usage: ul [ -i ] [ -tTerm ] file...\n");
50: exit(1);
51: }
52: }
53: switch(tgetent(termcap, termtype)) {
54:
55: case 1:
56: if (tgetflag("os"))
57: execv("/bin/cat",argv);
58: cp = ulbuf;
59: if ((backspace = tgetstr("bc",&cp)) == NULL)
60: backspace = "\b";
61: /*
62: * Handle terminals that have start underline/stop
63: * underline sequences, as well as those with
64: * underline char sequences (we assume the sequence
65: * moves the cursor forward one character).
66: * If we can't find underline sequences, we
67: * settle for standout sequences.
68: */
69: if ((chul=tgetstr("uc",&cp)) == NULL)
70: chul = "";
71: if ((stul=tgetstr("us",&cp)) == NULL && !tgetflag("ul") &&
72: (!*chul) && (stul=tgetstr("so",&cp)) == NULL)
73: stul = "";
74: if ((endul=tgetstr("ue",&cp)) == NULL && !tgetflag("ul") &&
75: (!*chul) && (endul=tgetstr("se",&cp)) == NULL)
76: endul = "";
77: if (chul==0&&stul==0&&endul==0&&tgetflag("ul"))
78: execv("/bin/cat",argv);
79: break;
80:
81: default:
82: fprintf(stderr,"trouble reading termcap");
83: /* fall through to ... */
84:
85: case 0:
86: /* No such terminal type - assume dumb */
87: stul = endul = chul = "";
88: break;
89: }
90: if (argc == 0)
91: filter(stdin);
92: else for (i=0; i<argc; i++) {
93: f = fopen(argv[i],"r");
94: if (f == NULL) {
95: perror(argv[i]);
96: exit(1);
97: } else
98: filter(f);
99: }
100: exit(0);
101: }
102:
103: filter(f)
104: FILE *f;
105: {
106: register int p, n;
107: register char c;
108: int state;
109:
110: n = 0;
111: for (;;) {
112: p = 0;
113: for (p=0; p<n; p++) {
114: buf[p] = '\0';
115: isul[p] = 0;
116: }
117: p = n = 0;
118:
119: for (;;) {
120: c = getc(f);
121: if (c==EOF)
122: break;
123: if (c=='\b') {
124: if (p > 0) {
125: p--;
126: }
127: } else if (c=='_' && isul[p]==0 && buf[p]) {
128: isul[p] = 1;
129: p++;
130: } else {
131: if (buf[p] == '_')
132: isul[p] = 1;
133: buf[p] = c;
134: p++;
135: if (n < p)
136: n = p;
137: }
138: if (c=='\n')
139: break;
140: }
141:
142: state = 0;
143: for (p=0; p<n; p++) {
144: if (isul[p] != state)
145: tputs(isul[p] ? stul : endul, 1, outc);
146: state = isul[p];
147: putchar(buf[p]);
148: if (isul[p] && *chul) {
149: printf("%s",backspace);
150: tputs(chul, 1, outc);
151: }
152: }
153: if (c==EOF) break;
154: }
155: }
156:
157: outc(c)
158: char c;
159: {
160: putchar(c);
161: }
162:
163: #define BACKSPACE 0
164: #define QUOTE 0200
165:
166: char linebuf[BUFSIZ], genbuf[BUFSIZ];
167: char *strcpy();
168:
169: iul(argc, argv)
170: int argc;
171: char *argv[];
172: {
173: register c;
174: register char *lp;
175:
176: do {
177: if (argc > 0) {
178: if (freopen(argv[0], "r", stdin) == NULL) {
179: perror(argv[0]);
180: exit(1);
181: }
182: argc--; argv++;
183: }
184: while (fgets(linebuf, sizeof linebuf, stdin) != 0) {
185: for (lp = linebuf; *lp; lp++)
186: continue;
187: *--lp = 0;
188: doulg();
189: dographic();
190: if (genbuf[0])
191: printf("\n%s", genbuf);
192: putchar('\n');
193: fflush(stdout);
194: }
195: } while (argc > 0);
196: exit(0);
197: }
198:
199: dographic()
200: {
201: register char *lp;
202: register c;
203:
204: for (lp = linebuf; c = *lp++;) {
205: switch (c) {
206: case '\b':
207: if (BACKSPACE == 0)
208: c = '?';
209: break;
210: default:
211: if (c < ' ' || c == 0177)
212: c = '?';
213: break;
214: case '\t':
215: break;
216: }
217: putchar(c);
218: }
219: }
220:
221: doulg()
222: {
223: register char *lp, *gp;
224: char *maxgp;
225: register c;
226: char csw;
227: int col;
228:
229: gp = genbuf;
230: *gp = 0;
231: maxgp = gp;
232: col = 0;
233: for (lp = linebuf; c = *lp++;) {
234: switch (c) {
235: case '\t':
236: while ((col & 7) != 7) {
237: *gp++ = ' ';
238: if (gp >= &genbuf[BUFSIZ - 2])
239: goto ovflo;
240: col++;
241: }
242: break;
243: default:
244: if (gp >= maxgp)
245: break;
246: c |= (*gp & QUOTE);
247: break;
248: case '_':
249: if (gp >= maxgp)
250: c = QUOTE;
251: else
252: c = *gp | QUOTE;
253: break;
254: case '\b':
255: if (gp > genbuf) {
256: gp--;
257: col--;
258: }
259: continue;
260: }
261: if (gp >= &genbuf[BUFSIZ - 2]) {
262: ovflo:
263: fprintf(stderr, "Line too long\n");
264: exit(1);
265: }
266: *gp++ = c;
267: if (gp > maxgp)
268: maxgp = gp;
269: col++;
270: }
271: *maxgp = 0;
272: strcpy(linebuf, genbuf);
273: for (lp = linebuf, gp = genbuf; c = *lp; gp++, lp++)
274: if (c & QUOTE) {
275: c &= 0177;
276: if (c == 0)
277: *lp = '_', *gp = ' ';
278: else
279: *lp = c, *gp = '-';
280: } else
281: *gp = ' ';
282: --gp;
283: while (gp >= genbuf && *gp == ' ')
284: --gp;
285: gp[1] = 0;
286: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.