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