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