|
|
1.1 root 1: #include "tdef.h"
2: extern
3: #include "d.h"
4: extern
5: #include "v.h"
6: /*
7: troff10.c
8:
9: CAT interface
10: */
11:
12: #include <sgtty.h>
13: #include "ext.h"
14: int vpos = 0; /* absolute vertical position on page */
15: int hpos = 0; /* ditto horizontal */
16:
17: #define T_IESC 16
18:
19: short *chtab;
20: char *chname;
21: char *fontab[NFONT+1];
22: char *kerntab[NFONT+1];
23: char *fitab[NFONT+1];
24:
25: int Inch;
26: int Hor;
27: int Vert;
28: int Unitwidth;
29: int nfonts;
30: int nsizes;
31: int nchtab;
32:
33: /* these characters are used as various signals or values
34: /* in miscellaneous places.
35: /* values are set in specnames in t10.c
36: */
37:
38: int c_hyphen;
39: int c_emdash;
40: int c_rule;
41: int c_minus;
42: int c_narsp;
43: int c_hnarsp;
44: int c_fi;
45: int c_fl;
46: int c_ff;
47: int c_ffi;
48: int c_ffl;
49: int c_acute;
50: int c_grave;
51: int c_under;
52: int c_rooten;
53: int c_boxrule;
54: int c_lefthand;
55:
56: #include "dev.h"
57: struct dev dev;
58: struct font *fontbase[NFONT+1];
59:
60:
61: ptinit()
62: {
63: int i, fin, nw;
64: char *setbrk(), *filebase, *p;
65:
66: /* open table for device,
67: /* read in resolution, size info, font info, etc.
68: /* and set params
69: */
70: strcat(termtab, "/dev");
71: strcat(termtab, devname);
72: strcat(termtab, "/DESC.out"); /* makes "..../devXXX/DESC.out" */
73: if ((fin = open(termtab, 0)) < 0) {
74: fprintf(stderr, "troff: can't open tables for %s\n", termtab);
75: done3(1);
76: }
77: read(fin, &dev, sizeof(struct dev ));
78: Inch = dev.res;
79: Hor = dev.hor;
80: Vert = dev.vert;
81: Unitwidth = dev.unitwidth;
82: nfonts = dev.nfonts;
83: nsizes = dev.nsizes;
84: nchtab = dev.nchtab;
85: filebase = setbrk(dev.filesize + 2*EXTRAFONT); /* enough room for whole file */
86: read(fin, filebase, dev.filesize); /* all at once */
87: pstab = (short *) filebase;
88: chtab = pstab + nsizes + 1;
89: chname = (char *) (chtab + dev.nchtab);
90: p = chname + dev.lchname;
91: for (i = 1; i <= nfonts; i++) {
92: fontbase[i] = (struct font *) p;
93: nw = *p & BMASK; /* 1st thing is width count */
94: fontlab[i] = PAIR(fontbase[i]->namefont[0], fontbase[i]->namefont[1]);
95: /* for now, still 2 char names */
96: if (smnt == 0 && fontbase[i]->specfont == 1)
97: smnt = i; /* first special font */
98: p += sizeof(struct font); /* that's what's on the beginning */
99: fontab[i] = p;
100: kerntab[i] = p + nw;
101: fitab[i] = p + 3 * nw; /* skip width, kern, code */
102: p += 3 * nw + dev.nchtab + 128 - 32;
103: }
104: fontbase[0] = (struct font *) p; /* the last shall be first */
105: fontbase[0]->nwfont = EXTRAFONT - dev.nchtab - (128-32) - sizeof (struct font);
106: fontab[0] = p + sizeof (struct font);
107: close(fin);
108: /* there are a lot of things that used to be constant
109: /* that now require code to be executed.
110: */
111: sps = SPS;
112: ics = ICS;
113: for (i = 0; i < 16; i++)
114: tabtab[i] = DTAB * (i + 1);
115: pl = 11 * INCH;
116: po = PO;
117: spacesz = SS;
118: lss = lss1 = VS;
119: ll = ll1 = lt = lt1 = LL;
120: specnames(); /* install names like "hyphen", etc. */
121: if (ascii)
122: return;
123: fprintf(ptid, "x T %s\n", devname);
124: fprintf(ptid, "x res %d %d %d\n", Inch, Hor, Vert);
125: fprintf(ptid, "x init\n"); /* do initialization for particular device */
126: for (i = 1; i <= nfonts; i++)
127: fprintf(ptid, "x font %d %s\n", i, fontbase[i]->namefont);
128: /*
129: fprintf(ptid, "x xxx fonts=%d sizes=%d unit=%d\n", nfonts, nsizes, Unitwidth);
130: fprintf(ptid, "x xxx nchtab=%d lchname=%d nfitab=%d\n",
131: dev.nchtab, dev.lchname, dev.nchtab+128-32);
132: fprintf(ptid, "x xxx sizes:\nx xxx ");
133: for (i = 0; i < nsizes; i++)
134: fprintf(ptid, " %d", pstab[i]);
135: fprintf(ptid, "\nx xxx chars:\nx xxx ");
136: for (i = 0; i < dev.nchtab; i++)
137: fprintf(ptid, " %s", &chname[chtab[i]]);
138: fprintf(ptid, "\nx xxx\n");
139: */
140: }
141:
142: specnames()
143: {
144: static struct {
145: int *n;
146: char *v;
147: } spnames[] = {
148: &c_hyphen, "hy",
149: &c_emdash, "em",
150: &c_rule, "ru",
151: &c_minus, "\\-",
152: &c_narsp, "\\|",
153: &c_hnarsp, "\\^",
154: &c_fi, "fi",
155: &c_fl, "fl",
156: &c_ff, "ff",
157: &c_ffi, "Fi",
158: &c_ffl, "Fl",
159: &c_acute, "aa",
160: &c_grave, "ga",
161: &c_under, "ul",
162: &c_rooten, "rn",
163: &c_boxrule, "br",
164: &c_lefthand, "lh",
165: 0, 0
166: };
167: int i;
168:
169: for (i = 0; spnames[i].n; i++)
170: *spnames[i].n = findch(spnames[i].v);
171: }
172:
173: findch(s) /* find char s in chname */
174: register char *s;
175: {
176: register int i;
177:
178: for (i = 0; i < nchtab; i++)
179: if (strcmp(s, &chname[chtab[i]]) == 0)
180: return(i + 128);
181: return(0);
182: }
183:
184: ptout(i)
185: tchar i;
186: {
187: register dv, ik;
188: register tchar *k;
189: int temp, a, b;
190:
191: if (cbits(i) != '\n') {
192: *olinep++ = i;
193: return;
194: }
195: if (olinep == oline) {
196: lead += lss;
197: return;
198: }
199:
200: hpos = po; /* ??? */
201: esc = 0; /* ??? */
202: ptesc(); /* the problem is to get back to the left end of the line */
203: dv = 0;
204: for (k = oline; k < olinep; k++) {
205: if (ismot(*k) && isvmot(*k)) {
206: temp = absmot(*k);
207: if (isnmot(*k))
208: temp = -temp;
209: dv += temp;
210: }
211: }
212: if (dv) {
213: vflag++;
214: *olinep++ = makem(-dv);
215: vflag = 0;
216: }
217:
218: b = dip->blss + lss;
219: lead += dip->blss + lss;
220: dip->blss = 0;
221: for (k = oline; k < olinep; )
222: k += ptout0(k); /* now passing a pointer! */
223: olinep = oline;
224: lead += dip->alss;
225: a = dip->alss;
226: dip->alss = 0;
227: /*
228: fprintf(ptid, "x xxx end of line: hpos=%d, vpos=%d\n", hpos, vpos);
229: */
230: fprintf(ptid, "n%d %d\n", b, a); /* be nice to chuck */
231: }
232:
233: ptout0(pi)
234: tchar *pi;
235: {
236: register short j, k, w;
237: short z, dx, dy, dx2, dy2, n;
238: tchar i;
239: int outsize; /* size of object being printed */
240:
241: outsize = 1; /* default */
242: i = *pi;
243: k = cbits(i);
244: if (ismot(i)) {
245: j = absmot(i);
246: if (isnmot(i))
247: j = -j;
248: if (isvmot(i))
249: lead += j;
250: else
251: esc += j;
252: return(outsize);
253: }
254: if (k == CHARHT) {
255: fprintf(ptid, "x H %d\n", sbits(i));
256: return(outsize);
257: }
258: if (k == SLANT) {
259: fprintf(ptid, "x S %d\n", sfbits(i)-180);
260: return(outsize);
261: }
262: if (k == WORDSP) {
263: oput('w');
264: return(outsize);
265: }
266: if (k == FONTPOS) {
267: char temp[3];
268: n = i >> 16;
269: temp[0] = n & BMASK;
270: temp[1] = n >> BYTE;
271: temp[2] = 0;
272: ptfpcmd(0, temp, 0);
273: return(outsize);
274: }
275: xbitf = 2;
276: if (sfbits(i) == oldbits) {
277: xfont = pfont;
278: xpts = ppts;
279: xbitf = 0;
280: } else
281: xbits(i);
282: if (k < 040 && k != DRAWFCN)
283: return(outsize);
284: w = getcw(k - 32);
285: j = z = 0;
286: if (k != DRAWFCN) {
287: if (cs) {
288: if (bd)
289: w += (bd - 1) * HOR;
290: j = (cs - w) / 2;
291: w = cs - j;
292: if (bd)
293: w -= (bd - 1) * HOR;
294: }
295: if (iszbit(i)) {
296: if (cs)
297: w = -j;
298: else
299: w = 0;
300: z = 1;
301: }
302: }
303: esc += j;
304: if (xfont != mfont)
305: ptfont();
306: if (xpts != mpts)
307: ptps();
308: if (lead)
309: ptlead();
310: /* put out the real character here */
311: if (k == DRAWFCN) {
312: if (esc)
313: ptesc();
314: dx = absmot(pi[3]);
315: if (isnmot(pi[3]))
316: dx = -dx;
317: dy = absmot(pi[4]);
318: if (isnmot(pi[4]))
319: dy = -dy;
320: switch (cbits(pi[1])) {
321: case DRAWCIRCLE: /* circle */
322: fprintf(ptid, "D%c %d\n", DRAWCIRCLE, dx); /* dx is diameter */
323: w = 0;
324: hpos += dx;
325: break;
326: case DRAWELLIPSE:
327: fprintf(ptid, "D%c %d %d\n", DRAWELLIPSE, dx, dy);
328: w = 0;
329: hpos += dx;
330: break;
331: case DRAWLINE: /* line */
332: k = cbits(pi[2]);
333: fprintf(ptid, "D%c %d %d ", DRAWLINE, dx, dy);
334: if (k < 128)
335: fprintf(ptid, "%c\n", k);
336: else
337: fprintf(ptid, "%s\n", &chname[chtab[k - 128]]);
338: w = 0;
339: hpos += dx;
340: vpos += dy;
341: break;
342: case DRAWARC: /* arc */
343: dx2 = absmot(pi[5]);
344: if (isnmot(pi[5]))
345: dx2 = -dx2;
346: dy2 = absmot(pi[6]);
347: if (isnmot(pi[6]))
348: dy2 = -dy2;
349: fprintf(ptid, "D%c %d %d %d %d\n", DRAWARC,
350: dx, dy, dx2, dy2);
351: w = 0;
352: hpos += dx + dx2;
353: vpos += dy + dy2;
354: break;
355: case DRAWWIG: /* wiggly line */
356: fprintf(ptid, "D%c %d %d", DRAWWIG, dx, dy);
357: w = 0;
358: hpos += dx;
359: vpos += dy;
360: for (n = 5; cbits(pi[n]) != '.'; n += 2) {
361: dx = absmot(pi[n]);
362: if (isnmot(pi[n]))
363: dx = -dx;
364: dy = absmot(pi[n+1]);
365: if (isnmot(pi[n+1]))
366: dy = -dy;
367: fprintf(ptid, " %d %d", dx, dy);
368: hpos += dx;
369: vpos += dy;
370: }
371: fprintf(ptid, "\n");
372: break;
373: }
374: for (n = 3; cbits(pi[n]) != '.'; n++)
375: ;
376: outsize = n + 1;
377: } else if (k < 128) {
378: /* try to go faster and compress output */
379: /* by printing nnc for small positive motion followed by c */
380: /* kludgery; have to make sure set all the vars too */
381: if (esc > 0 && esc < 100) {
382: oput(esc / 10 + '0');
383: oput(esc % 10 + '0');
384: oput(k);
385: hpos += esc;
386: esc = 0;
387: } else {
388: if (esc)
389: ptesc();
390: fprintf(ptid, "c%c\n", k);
391: }
392: } else {
393: if (esc)
394: ptesc();
395: fprintf(ptid, "C%s\n", &chname[chtab[k - 128]]);
396: }
397: if (bd) {
398: bd -= HOR;
399: if (esc += bd)
400: ptesc();
401: if (k < 128) {
402: fprintf(ptid, "c%c\n", k);
403: } else
404: fprintf(ptid, "C%s\n", &chname[chtab[k - 128]]);
405: if (z)
406: esc -= bd;
407: }
408: esc += w;
409: return(outsize);
410: }
411:
412: ptps()
413: {
414: register i, j, k;
415:
416: i = xpts;
417: for (j = 0; i > (k = pstab[j]); j++)
418: if (!k) {
419: k = pstab[--j];
420: break;
421: }
422: fprintf(ptid, "s%d\n", k); /* really should put out string rep of size */
423: mpts = i;
424: }
425:
426: ptfont()
427: {
428: mfont = xfont;
429: fprintf(ptid, "f%d\n", xfont);
430: }
431:
432: ptfpcmd(f, s, d)
433: int f;
434: char *s, *d;
435: {
436: if (ascii)
437: return;
438: fprintf(ptid, "x font %d %s %s\n", f, s, d==0 ? "" : d);
439: ptfont(); /* make sure that it gets noticed */
440: }
441:
442: ptlead()
443: {
444: vpos += lead;
445: if (!ascii)
446: fprintf(ptid, "V%d\n", vpos);
447: lead = 0;
448: }
449:
450: ptesc()
451: {
452: hpos += esc;
453: if (esc > 0)
454: fprintf(ptid, "h%d", esc);
455: else
456: fprintf(ptid, "H%d\n", hpos);
457: esc = 0;
458: }
459:
460: newpage(n) /* called at end of each output page (we hope) */
461: {
462: ptlead();
463: vpos = 0;
464: if (ascii)
465: return;
466: flusho();
467: fprintf(ptid, "p%d\n", n); /* new page */
468: ptps();
469: ptfont();
470: }
471:
472: pttrailer()
473: {
474: fprintf(ptid, "x trailer\n");
475: }
476:
477: ptstop()
478: {
479: fprintf(ptid, "x stop\n");
480: }
481:
482: dostop()
483: {
484: if (ascii)
485: return;
486: ptlead();
487: vpos = 0;
488: /* fprintf(ptid, "x xxx end of page\n");*/
489: if (!nofeed)
490: pttrailer();
491: ptlead();
492: fprintf(ptid, "x pause\n");
493: flusho();
494: mpts = mfont = 0;
495: paper = 0;
496: esc = T_IESC; /* this is a dreg */
497: ptesc();
498: esc = po;
499: hpos = vpos = 0; /* probably in wrong place */
500: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.