|
|
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[-1]);
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: #define nilstr(x) (x == NULL || *x == '\0')
78: if (nilstr(chul)&&nilstr(stul)&&nilstr(endul)&&tgetflag("ul"))
79: execv("/bin/cat",argv[-1]);
80: break;
81:
82: default:
83: fprintf(stderr,"ul: trouble reading termcap\n");
84: /* fall through to ... */
85:
86: case 0:
87: /* No such terminal type - assume dumb */
88: stul = endul = chul = "";
89: break;
90: }
91: fflush (stderr);
92: if (argc == 0)
93: filter(stdin);
94: else for (i=0; i<argc; i++) {
95: f = fopen(argv[i],"r");
96: if (f == NULL) {
97: perror(argv[i]);
98: exit(1);
99: } else
100: filter(f);
101: }
102: exit(0);
103: }
104:
105: filter(f)
106: FILE *f;
107: {
108: register int p, n;
109: register char c;
110: int state;
111:
112: n = 0;
113: for (;;) {
114: p = 0;
115: for (p=0; p<n; p++) {
116: buf[p] = '\0';
117: isul[p] = 0;
118: }
119: p = n = 0;
120:
121: for (;;) {
122: c = getc(f);
123: if (c==EOF)
124: break;
125: if (c=='\b') {
126: if (p > 0) {
127: p--;
128: }
129: } else if (c=='_' && isul[p]==0 && buf[p]) {
130: isul[p] = 1;
131: p++;
132: } else {
133: if (buf[p] == '_')
134: isul[p] = 1;
135: buf[p] = c;
136: p++;
137: if (n < p)
138: n = p;
139: }
140: if (c=='\n')
141: break;
142: }
143:
144: state = 0;
145: for (p=0; p<n; p++) {
146: if (isul[p] != state)
147: tputs(isul[p] ? stul : endul, 1, outc);
148: state = isul[p];
149: putchar(buf[p]);
150: if (isul[p] && *chul) {
151: printf("%s",backspace);
152: tputs(chul, 1, outc);
153: }
154: }
155: if (c==EOF) break;
156: }
157: }
158:
159: outc(c)
160: char c;
161: {
162: putchar(c);
163: }
164:
165: #define BACKSPACE 0
166: #define QUOTE 0200
167:
168: char linebuf[BUFSIZ], genbuf[BUFSIZ];
169: char *strcpy();
170:
171: iul(argc, argv)
172: int argc;
173: char *argv[];
174: {
175: register c;
176: register char *lp;
177:
178: do {
179: if (argc > 0) {
180: if (freopen(argv[0], "r", stdin) == NULL) {
181: perror(argv[0]);
182: exit(1);
183: }
184: argc--; argv++;
185: }
186: while (fgets(linebuf, sizeof linebuf, stdin) != 0) {
187: for (lp = linebuf; *lp; lp++)
188: continue;
189: *--lp = 0;
190: doulg();
191: dographic();
192: if (genbuf[0])
193: printf("\n%s", genbuf);
194: putchar('\n');
195: fflush(stdout);
196: }
197: } while (argc > 0);
198: exit(0);
199: }
200:
201: dographic()
202: {
203: register char *lp;
204: register c;
205:
206: for (lp = linebuf; c = *lp++;) {
207: switch (c) {
208: case '\b':
209: if (BACKSPACE == 0)
210: c = '?';
211: break;
212: default:
213: if (c < ' ' || c == 0177)
214: c = '?';
215: break;
216: case '\t':
217: break;
218: }
219: putchar(c);
220: }
221: }
222:
223: doulg()
224: {
225: register char *lp, *gp;
226: char *maxgp;
227: register c;
228: char csw;
229: int col;
230:
231: gp = genbuf;
232: *gp = 0;
233: maxgp = gp;
234: col = 0;
235: for (lp = linebuf; c = *lp++;) {
236: switch (c) {
237: case '\t':
238: while ((col & 7) != 7) {
239: *gp++ = ' ';
240: if (gp >= &genbuf[BUFSIZ - 2])
241: goto ovflo;
242: col++;
243: }
244: break;
245: default:
246: if (gp >= maxgp)
247: break;
248: c |= (*gp & QUOTE);
249: break;
250: case '_':
251: if (gp >= maxgp)
252: c = QUOTE;
253: else
254: c = *gp | QUOTE;
255: break;
256: case '\b':
257: if (gp > genbuf) {
258: gp--;
259: col--;
260: }
261: continue;
262: }
263: if (gp >= &genbuf[BUFSIZ - 2]) {
264: ovflo:
265: fprintf(stderr, "ul: line too long\n");
266: exit(1);
267: }
268: *gp++ = c;
269: if (gp > maxgp)
270: maxgp = gp;
271: col++;
272: }
273: *maxgp = 0;
274: strcpy(linebuf, genbuf);
275: for (lp = linebuf, gp = genbuf; c = *lp; gp++, lp++)
276: if (c & QUOTE) {
277: c &= 0177;
278: if (c == 0)
279: *lp = '_', *gp = ' ';
280: else
281: *lp = c, *gp = '-';
282: } else
283: *gp = ' ';
284: --gp;
285: while (gp >= genbuf && *gp == ' ')
286: --gp;
287: gp[1] = 0;
288: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.