Commit | Line | Data |
---|---|---|
3398ef49 BJ |
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 | } |