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