BSD 4 development
[unix-history] / usr / src / cmd / vpr / sidebyside.c
CommitLineData
3398ef49
BJ
1#include <stdio.h>
2/*
3 * sidebyside -- make wide listings by placing pages side by side
4 */
5int width = 90;
6
7#define LINELN 440
8#define EJLINE 86
9#define LMARG 10
10
11char screen[EJLINE][LINELN];
12char ul[EJLINE][LINELN];
13char anyul[EJLINE];
14int frame;
15int origin;
16int outline;
17int outcol;
18
19main(argc, argv)
20 int argc;
21 char *argv[];
22{
23
24 argc--, argv++;
25 while (argc > 0 && argv[0][0] == '-') {
26 switch (argv[0][1]) {
27
28 case 'w':
29 width = atoi(argv[0]+2);
30 break;
31
32 default:
33 fprintf(stderr, "usage: sidebyside [ -wwidth ] file ...\n");
34 break;
35 }
36 argc--, argv++;
37 }
38 clear(screen, EJLINE * LINELN);
39 origin = LMARG;
40 outcol = LMARG;
41 cutmark(LMARG);
42 do {
43 if (argc > 0) {
44 if (freopen(argv[0], "r", stdin) == NULL) {
45 perror(argv[0]);
46 argc--, argv++;
47 continue;
48 }
49 argc--, argv++;
50 }
51 process();
52 } while (argc > 0);
53 exit(0);
54}
55
56process()
57{
58 char linebuf[BUFSIZ];
59 register char *cp;
60 register int c;
61
62 while (fgets(linebuf, sizeof linebuf, stdin)) {
63 for (cp = linebuf; c = *cp; cp++) switch (c) {
64
65 case '\t':
66 do {
67 int ooutcol = outcol;
68 outchar(' ');
69 if (outcol == ooutcol)
70 break;
71 } while ((outcol - origin) % 8 != 0);
72 break;
73
74 case '\b':
75 if (outcol > origin)
76 outcol--;
77 break;
78
79 case '\r':
80 outcol = origin + LMARG;
81 break;
82
83 case '\f':
84 outline = EJLINE - 1;
85 /* fall into ... */
86
87 case '\n':
88 outline++;
89 if (outline == EJLINE) {
90 origin += width;
91 if (origin + width > LINELN) {
92 cutmark(origin);
93 oflush();
94 break;
95 }
96/*
97 if (origin * 2 + LMARG < LINELN && origin * 3 > LINELN) {
98 cutmark(origin);
99 origin += LMARG;
100 }
101*/
102 outline = 0;
103 cutmark(origin);
104 }
105 outcol = origin;
106 break;
107
108 default:
109 outchar(c);
110 break;
111 }
112 }
113 if (outline || origin != LMARG) {
114 cutmark(origin + width);
115 oflush();
116 }
117}
118
119outchar(c)
120 register int c;
121{
122 register char *cp = screen[outline];
123 register char *up;
124 register int d;
125
126 if (c < 040 || c >= 0177)
127 return;
128 if (outcol < LINELN) {
129 cp += outcol;
130 d = *cp;
131 if (d == ' ') {
132 *cp = c;
133 outcol++;
134 return;
135 }
136 if (d == '_' || c == '_') {
137 if (c == d) {
138 outcol++;
139 return;
140 }
141 if (anyul[outline] == 0)
142 clear(ul[outline], LINELN);
143 anyul[outline] = 1;
144 ul[outline][outcol] = '_';
145 if (c == '_')
146 c = d;
147 }
148 *cp = c;
149 outcol++;
150 }
151}
152
153oflush()
154{
155 register char *cp, *dp;
156 register int i, j, oc, dc, c;
157
158 frame++;
159/*
160 if (frame > 1) {
161 printf("\n\n\n");
162 for (j = 0; j < LINELN; j++)
163 putchar('_');
164 printf("\n");
165 }
166*/
167 printf("\n");
168 for (i = 0; i < EJLINE; i++) {
169 putline(screen[i]);
170 if (anyul[i]) {
171 putchar('\r');
172 putline(ul[i]);
173 anyul[i] = 0;
174 }
175 putchar('\n');
176 }
177 for (i = 0; i < LINELN; i++)
178 putchar('_');
179 putchar('\n');
180 clear(screen, EJLINE * LINELN);
181 outline = 0;
182 outcol = LMARG;
183 origin = LMARG;
184 cutmark(LMARG);
185}
186
187clear(cp, i)
188 register char *cp;
189 register int i;
190{
191
192 if (i > 0)
193 do
194 *cp++ = ' ';
195 while (--i);
196}
197
198cutmark(o)
199 register int o;
200{
201 register int i;
202
203 screen[0][o - LMARG] = '|';
204 screen[1][o - LMARG] = '|';
205 screen[EJLINE - 1][o - LMARG] = '|';
206 screen[EJLINE - 2][o - LMARG] = '|';
207}
208
209putline(cp)
210 register char *cp;
211{
212 register int j = LINELN;
213 register int c, oc, dc;
214
215 oc = dc = 0;
216 do {
217 if ((c = *cp++) == ' ') {
218 dc++;
219 continue;
220 }
221 while (((oc + 8) &~ 7) < dc) {
222 putchar('\t');
223 oc = (oc + 8) &~ 7;
224 }
225 while (oc < dc) {
226 putchar(' ');
227 oc++;
228 }
229 putchar(c);
230 oc++, dc++;
231 } while (--j != 0);
232}