1 #include <stdio.h>
2 /*
3  * sidebyside -- make wide listings by placing pages side by side
4  */
5 int	width = 90;
6 
7 #define	LINELN 440
8 #define	EJLINE	86
9 #define	LMARG	10
10 
11 char	screen[EJLINE][LINELN];
12 char	ul[EJLINE][LINELN];
13 char	anyul[EJLINE];
14 int	frame;
15 int	origin;
16 int	outline;
17 int	outcol;
18 
19 main(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 
56 process()
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 
119 outchar(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 
153 oflush()
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 
187 clear(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 
198 cutmark(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 
209 putline(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 }
233