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