date and time created 83/12/05 16:21:09 by ralph
[unix-history] / usr / src / old / vfilters / rvsort / rvsort.c
CommitLineData
c936af6c
SL
1#ifndef lint
2static char sccsid[] = "@(#)rvsort.c 4.2 (Berkeley) %G%";
3#endif
4
00bb50e7
BJ
5/*
6 * Sort troff output for versatec to reduce amount of reverse leading
7 */
8
9# include <stdio.h>
10
11#define NULL 0
12
13double atof();
14char *calloc();
15
16FILE *in,*out;
17
18struct achar *piles[500], *afreel;
19
20int skipfirst = 1; /* skip the first leading so start at top of page */
21int cpsize = 02; /* Funny sizes */
22struct point_sizes {
23 int stupid_code;
24 int real_code;
25} point_sizes[] = {
26 010, 6,
27 0, 7,
28 01, 8,
29 07, 9,
30 02, 10,
31 03, 11,
32 04, 12,
33 05, 14,
34 0211, 16,
35 06, 18,
36 0212, 20,
37 0213, 22,
38 0214, 24,
39 0215, 28,
40 0216, 36,
41 0, 0
42};
43
44int pagelength = 144 * 11; /* in Leading units */
45int pagemod; /* horizontal page number (for versatec) */
46#define MODOFF 3672 /* 432 * 8.5 */
47
48int esc, lead, back, verd, mcase, railmag;
49int col, row;
50
51int oback, omcase, orailmag, ocol, orow, overd;
52int opsize = 02;
53
54struct achar
55{
56 char code;
57 char psize;
58 short col;
59 short row;
60 char railmag;
61 char verd;
62 char back;
63 char mcase;
64 struct achar *next;
65};
66
67main(argc, argv)
68 int argc;
69 char *argv[];
70{
71 register i;
72
73 for(i = 3; i < 15; i++)
74 close(i);
75 while (argc > 1 && argv[1][0] == '-') {
76 switch (argv[1][1]) {
77 case 'l': {
78 float f = 144 * atof(argv[1] + 2);
79 if (f < 144) {
80 error("bad length");
81 exit(1);
82 }
83 pagelength = f;
84 break;
85 }
86 }
87 argc--; argv++;
88 }
89 out = stdout;
90 if(argc > 1) {
91 while(--argc) {
92 argv++;
93 if((in=fopen(argv[0], "r")) == NULL)
94 perror("vsort");
95 else {
96 ofile();
97 fclose(in);
98 }
99 }
100 } else {
101 in = stdin;
102 ofile();
103 }
104 exit(0);
105}
106
107ofile()
108{
109 register int c;
110 static int initialized;
111
112 while((c = getch()) != -1) {
113 if(!c)
114 continue;
115 if(c & 0200) { /* escape (left/right) */
116 esc += (~c) & 0177;
117 continue;
118 }
119 if(esc) {
120 if(back)
121 esc = -esc;
122 col += esc;
123 esc = 0;
124 }
125 if((c & 0377) < 0100) /* Purely for efficiency */
126 goto normal_char;
127 switch(c) {
128
129 case 0100:
130 if(initialized++) {
131 linesflush();
132 return;
133 }
134 row = 0;
135 col = 0; esc = 0;
136 lead = 0;
137 verd = 0; back = 0; mcase = 0;
138 railmag = 0;
139 ocol = 0;
140 orow = 0;
141 oback = 0; omcase = 0;
142 orailmag = 0;
143 if(loadfont(railmag, cpsize) < 0)
144 error("init");
145 putc(0100, out);
146 break;
147
148 case 0101: /* lower rail */
149 crail(railmag &= ~01);
150 break;
151
152 case 0102: /* upper rail */
153 crail(railmag |= 01);
154 break;
155
156 case 0103: /* upper mag */
157 crail(railmag |= 02);
158 break;
159
160 case 0104: /* lower mag */
161 crail(railmag &= ~02);
162 break;
163
164 case 0105: /* lower case */
165 mcase = 0;
166 break;
167
168 case 0106: /* upper case */
169 mcase = 1;
170 break;
171
172 case 0107: /* escape forward */
173 back = 0;
174 break;
175
176 case 0110: /* escape backwards */
177 back = 1;
178 break;
179
180 case 0111: /* stop */
181 break;
182
183 case 0112: /* lead forward */
184 verd = 0;
185 break;
186
187 case 0113: /* undefined */
188 break;
189
190 case 0114: /* lead backward */
191 verd = 1;
192 break;
193
194 case 0115: /* undefined */
195 case 0116:
196 case 0117:
197 break;
198
199 default:
200 if((c & 0340) == 0140) {/* leading */
201 lead = (~c) & 037;
202 if(verd)
203 lead = -lead;
204 if (skipfirst > 0) {
205 skipfirst--;
206 continue;
207 }
208 row += lead;
209 if (row >= pagelength)
210 allflush();
211 continue;
212 }
213 if((c & 0360)== 0120) { /* size change */
214 col += stupidadj(c & 017, cpsize);
215 loadfont(railmag, c & 017);
216 continue;
217 }
218 if(c & 0300)
219 continue;
220 normal_char:
221 c = (c & 077);
222 stuffc(c);
223 }
224 }
225 linesflush();
226 putc(0111, out);
227 putc(0111, out);
228 putc(0111, out);
229 putc(0111, out);
230 putc(0111, out);
231 putc(0111, out);
232 putc(0111, out);
233 putc(0111, out);
234}
235
236int peekc;
237
238getch()
239{
240 register c;
241
242 if(peekc) {
243 c = peekc;
244 peekc = 0;
245 return(c);
246 }
247 return(getc(in));
248}
249
250ungetc(c)
251{
252 peekc = c;
253}
254
255error(s)
256 char *s;
257{
258
259 fflush(out);
260 fprintf(stderr, "vsort: %s\n", s);
261}
262
263crail(nrail)
264 int nrail;
265{
266
267 railmag = nrail;
268 loadfont(nrail, cpsize);
269}
270
271loadfont(fnum, size)
272 int fnum;
273 int size;
274{
275
276 cpsize = size;
277 return(0);
278}
279
280stuffc(code)
281 register int code;
282{
283 register struct achar *ap, **bp;
284
285 if (col < 0 || col >= 500*8)
286 return;
287 if (afreel) {
288 ap = afreel;
289 afreel = ap->next;
290 } else
291 ap = (struct achar *)malloc(sizeof (*ap));
292 ap->row = row;
293 ap->col = col;
294 ap->psize = cpsize;
295 ap->verd = verd;
296 ap->back = back;
297 ap->mcase = mcase;
298 ap->code = code;
299 ap->railmag = railmag;
300 bp = &piles[col / 8];
301 ap->next = *bp;
302 *bp = ap;
303}
304
305allflush()
306{
307
308 linesflush();
309 if (row > orow)
310 ptlead(row - orow);
311 row -= pagelength;
312 orow = row;
313}
314
315
316linesflush()
317{
318 register struct achar **ap, *bp, *cp;
319 static notfirst;
320
321 if (notfirst)
322 putc(0115, out);
323 orow = 0;
324 ocol = 0;
325 notfirst = 1;
326 for (ap = &piles[0]; ap < &piles[500]; ap++) {
327 for (bp = *ap; bp; bp = cp) {
328 sendchar(bp);
329 cp = bp->next;
330 bp->next = afreel;
331 afreel = bp;
332 }
333 *ap = 0;
334 }
335}
336
337sendchar(cp)
338 register struct achar *cp;
339{
340 register int i;
341
342#ifdef DUMPCHAR
343 dumpchar(cp);
344#endif
345 if(cp->railmag != orailmag)
346 ptrail(cp->railmag);
347 if(cp->psize != opsize)
348 ptsize(cp->psize);
349 if(cp->mcase != omcase)
350 ptmcase();
351 if(cp->row != orow)
352 ptlead(cp->row - orow);
353 if(cp->col != ocol)
354 ptesc(cp->col - ocol);
355 if(cp->back != oback)
356 ptback();
357 putc(cp->code, out);
358 orow = cp->row;
359 orailmag = cp->railmag;
360 opsize = cp->psize;
361 omcase = cp->mcase;
362 ocol = cp->col;
363 oback = cp->back;
364}
365
366ptrail(rlmg)
367 register int rlmg;
368{
369
370 if((rlmg & 01) != (orailmag & 01))
371 putc((rlmg & 01) ? 0102:0101, out); /* rail */
372 if((rlmg & 02) != (orailmag & 02))
373 putc((rlmg & 02) ? 0103:0104, out); /* mag */
374}
375
376ptback()
377{
378
379 putc(oback ? 0107:0110, out);
380 oback = !oback;
381}
382
383ptsize(size)
384 register int size;
385{
386
387 putc(0120 | (size & 017), out);
388 ptesc(-stupidadj(size, opsize));
389}
390
391stupidadj(code, lcode)
392 register int code;
393 int lcode;
394{
395 register struct point_sizes *psp;
396 register struct point_sizes *lpsp;
397
398 psp = point_sizes;
399 while(psp->real_code != 0) {
400 if((psp->stupid_code & 017) == code)
401 break;
402 psp++;
403 }
404 lpsp = point_sizes;
405 while(lpsp->real_code != 0) {
406 if((lpsp->stupid_code & 017) == lcode)
407 break;
408 lpsp++;
409 }
410 code = 0;
411 if(!(lpsp->stupid_code & 0200) && (psp->stupid_code & 0200))
412 code = -55;
413 else
414 if((lpsp->stupid_code & 0200) && !(psp->stupid_code & 0200))
415 code = 55;
416 return(code);
417}
418
419ptmcase()
420{
421
422 putc(omcase ? 0105:0106, out);
423}
424
425ptesc(escc)
426 register int escc;
427{
428
429 if((escc < 0 && !oback ) || (escc >= 0 && oback))
430 ptback();
431 escc = abs(escc);
432 while(escc > 0177) {
433 putc(0200, out);
434 escc -= 0177;
435 }
436 if(escc)
437 putc(0200 | ((~escc) & 0177), out);
438}
439
440ptlead(leadd)
441 register int leadd;
442{
443
444 if (leadd == 0)
445 return;
446 if (leadd < 0) {
447 if (overd == 0)
448 putc(0114, out), overd = 1;
449 leadd = -leadd;
450 } else {
451 if (overd)
452 putc(0112, out), overd = 0;
453 }
454 if (leadd > 64) {
455 putc(0116, out);
456 putc(leadd / 64, out);
457 leadd %= 64;
458 }
459 while (leadd > 037) {
460 putc(0140, out);
461 leadd -= 037;
462 }
463 if (leadd)
464 putc(0140 | ((~leadd) & 037), out);
465}
466
467#ifdef DUMPLINE
468dumpchar(cp)
469register struct achar *cp;
470{
471
472 fprintf(stderr,
473"code %o psize %d col %d row %d railmag %d verd %d back %d mcase %d\n",
474 cp->code, cp->psize, cp->col, cp->row, cp->railmag, cp->verd,
475 cp->back, cp->mcase);
476}
477#endif