attempt to De-Athenify
[unix-history] / usr / src / old / vfilters / sidebyside / sidebyside.c
CommitLineData
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
19char 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 25static 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 */
32int width = 90;
33
34#define LINELN 440
35#define EJLINE 86
36#define LMARG 10
37
38char screen[EJLINE][LINELN];
39char ul[EJLINE][LINELN];
40char anyul[EJLINE];
41int frame;
42int origin;
43int outline;
44int outcol;
45
46main(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
83process()
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
146outchar(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
180oflush()
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
214clear(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
225cutmark(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
236putline(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}