|
|
1.1 root 1: #include "tdef.hd"
2: #include "strs.hd"
3:
4: /*
5: troff6.c
6:
7: width functions, sizes and fonts
8: */
9:
10: #ifndef INCORE
11: extern struct envblock eblock;
12: #else
13: extern struct envblock eblock[NEV];
14: extern int ev;
15: #endif
16: extern struct datablock dblock;
17:
18: #ifdef ebcdic
19: extern char *fname();
20: #endif
21: extern int *cstk[], cstkl;
22: extern int tch[];
23: extern int ch_CMASK;
24: extern long atoi0();
25: extern int eschar;
26: extern int widthp;
27: extern int xpts;
28: extern int xfont;
29: extern int code;
30: extern int smnt;
31: extern int setwdf;
32: extern int cs;
33: extern int ccs;
34: extern int xbitf;
35: extern int mfont;
36: extern int mpts;
37: extern int pfont;
38: extern int ppts;
39: extern int oldbits;
40: extern int nonumb;
41: extern int noscale;
42: extern int nlflg;
43: extern int nform;
44: extern int dfact;
45: extern int vflag;
46: extern int lg;
47: extern char fontfile[];
48: extern int ffi;
49: extern int bd;
50: extern int level;
51: extern int ch;
52: extern int res;
53: extern filedes ptid;
54: extern char ftR[],ftI[],ftB[],ftS[];
55: int trflg;
56: char *fontab[] = {ftR, ftI, ftB, ftS};
57: int fontlab[] = {'R','I','B','S',0};
58: char pstab[] = {6,7,8,9,10,11,12,14,16,18,20,22,24,28,36,0};
59: char psctab[] = {010,000,001,007,002,003,004,005,0211,006,
60: 0212,0213,0214,0215,0216,0};
61: int cstab[4], ccstab[4];
62: int bdtab[4];
63: int sbold = 0;
64: int spsz = 0;
65: struct fz {
66: char sign;
67: char size;
68: int fzinc;
69: } fz[4];
70: width(c)
71: int c;
72: {
73: register i,j,k;
74:
75: j = c;
76: k = 0;
77: if(j & MOT){
78: if(j & VMOT)goto rtn;
79: k = j & ~MOTV;
80: if(j & NMOT)k = -k;
81: goto rtn;
82: }
83: if((i = (j & CMASK)) == 010){
84: k = -widthp;
85: goto rtn;
86: }
87: if(i == PRESC)i = eschar;
88: if((i == ohc) ||
89: (i >= 0370))goto rtn;
90: if((j>>BYTE) == oldbits){
91: xfont = pfont;
92: xpts = ppts;
93: }else xbits(j);
94: if(j & ZBIT)goto rtn;
95: if(!trflg)i = trtab[i] & BMASK;
96: if((i -= 32) < 0)goto rtn;
97: k = getcw(i);
98: if(bd)k += bd - 1;
99: if(cs)k = cs;
100: widthp = k;
101: rtn:
102: xbitf = trflg = 0;
103: return(k);
104: }
105: getcw(i)
106: int i;
107: {
108: register j,k;
109: register char *p;
110: int x;
111: extern char codetab[];
112:
113: bd = 0;
114: if((code = codetab[i]) & 0200){
115: if(smnt){
116: p = fontab[smnt-1];
117: if(xfont == (sbold-1))bd = bdtab[smnt-1];
118: goto g0;
119: }
120: code = 0;
121: k = 36;
122: goto g1;
123: }
124: p = fontab[xfont];
125: g0:
126: if(!i)k = spacesz;
127: else k = *(p + i) & BMASK;
128: if(setwdf)v_ct |= ((k>>6) & 3);
129: g1:
130: k = (j = (k&077)*(xpts&077))/6;
131: if((j%6) >= 3)k++;
132: if(cs = cstab[xfont]){
133: if(ccs = ccstab[xfont])x = ccs; else x = xpts;
134: cs = (j = (cs&077)*(x&077))/6;
135: if((j%6) >= 3)cs++;
136: }
137: if(!bd)bd = bdtab[xfont];
138: return(k);
139: }
140: xbits(i)
141: int i;
142: {
143: register j, k;
144:
145: j = i >> BYTE;
146: xfont = (j>>1) & 03;
147: if(k = (j>>3) & 017){
148: xpts = pstab[--k];
149: if(psctab[k] < 0)xpts |= DBL;
150: oldbits = j;
151: pfont = xfont;
152: ppts = xpts;
153: goto rtn;
154: }
155: switch(xbitf){
156: case 0:
157: xfont = font;
158: xpts = pts;
159: break;
160: case 1:
161: xfont = pfont;
162: xpts = ppts;
163: break;
164: case 2:
165: xfont = mfont;
166: xpts = mpts;
167: }
168: rtn:
169: xbitf = 0;
170: }
171: setch(){
172: register i,*j,k;
173: extern int chtab[];
174:
175: if((i = getrq()) == 0)return(0);
176: for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0);
177: k = *(++j) | chbits;
178: return(k);
179: }
180: find(i,j)
181: int i,j[];
182: {
183: register k;
184:
185: if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k);
186: for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1);
187: return(k);
188: }
189: caseps(){
190: register i;
191:
192: if(skip())i = apts1;
193: else{
194: noscale++;
195: i = inumb(&apts);
196: noscale = 0;
197: if(nonumb)return;
198: }
199: casps1(i);
200: }
201: casps1(i)
202: int i;
203: {
204: if(i <= 0)return;
205: if(fz[font].size){
206: i = getfz(font, i);
207: }
208: apts1 = apts;
209: apts = i;
210: pts1 = pts;
211: pts = findps(i & 077);
212: mchbits();
213: }
214: findps(i)
215: int i;
216: {
217: register j, k;
218:
219: for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
220: if(psctab[j] < 0)k |= DBL;
221: return(k);
222: }
223: mchbits(){
224: register i, j, k;
225:
226: spbits = 0;
227: i = pts & 077;
228: for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
229: chbits = (((++j)<<2) | font) << (BYTE + 1);
230: sps = width(' ' | chbits);
231: if(font == (spsz-1)){
232: i = findps(getfz(smnt-1, apts + fz[font].fzinc));
233: for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
234: spbits = (((++j)<<2) | font) << (BYTE + 1);
235: }
236: }
237: getfz(x,y)
238: int x, y;
239: {
240: register i, j;
241:
242: i = fz[x].size;
243: j = fz[x].sign;
244: if(i || j){
245: if(j == '+')i += y;
246: else if(j == '-')i = y - i;
247: }
248: fz[x].fzinc = y - i;
249: return(i);
250: }
251: setps(){
252: register i,j;
253:
254: if((((i=getch() & CMASK) == '+') || (i == '-')) &&
255: (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){
256: if(i == '-')j = -j;
257: ch = 0;
258: casps1(apts+j);
259: return;
260: }
261: if((i -= '0') == 0){
262: casps1(apts1);
263: return;
264: }
265: if((i > 0) && (i <= 9)){
266: if((i <= 3) &&
267: ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){
268: i = 10*i +j;
269: ch = 0;
270: }
271: casps1(i);
272: }
273: }
274: caseft(){
275: skip();
276: setfont(1);
277: }
278: setfont(a)
279: int a;
280: {
281: register i,j;
282:
283: if(a)i = getrq();
284: else i = getsn();
285: if(!i || (i == 'P'))
286: j = font1;
287: else if ((i == 'S') || ((j = find(i,fontlab)) == -1)) return;
288: font1 = font;
289: font = j;
290: i = 0;
291: if(fz[font1].size){
292: i++;
293: casps1(apts + fz[font1].fzinc);
294: }else if(fz[font].size){
295: i++;
296: casps1(apts);
297: }
298: if(!i)mchbits();
299: }
300: setwd(){
301: register i, base, wid;
302: int delim, em, k;
303: int savlevel, savhp, savapts, savapts1, savfont, savfont1,
304: savpts, savpts1;
305:
306: base = v_st = v_sb = wid = v_ct = 0;
307: if((delim = getch() & CMASK) & MOT)return;
308: savhp = v_hp;
309: savlevel = level;
310: v_hp = level = 0;
311: savapts = apts;
312: savapts1 = apts1;
313: savfont = font;
314: savfont1 = font1;
315: savpts = pts;
316: savpts1 = pts1;
317: setwdf++;
318: while ((i = getch()) && (ch_CMASK != delim) && !nlflg) {
319: wid += width(i);
320: if(!(i & MOT)){
321: em = (xpts & 077)*6;
322: }else if(i & VMOT){
323: k = i & ~MOTV;
324: if(i & NMOT)k = -k;
325: base -= k;
326: em = 0;
327: }else continue;
328: if(base < v_sb)v_sb = base;
329: if((k=base + em) > v_st)v_st = k;
330: }
331: nform = 0;
332: setn1(wid);
333: v_hp = savhp;
334: level = savlevel;
335: apts = savapts;
336: apts1 = savapts1;
337: font = savfont;
338: font1 = savfont1;
339: pts = savpts;
340: pts1 = savpts1;
341: mchbits();
342: setwdf = 0;
343: }
344: mot(){
345: register i, j;
346:
347: j = HOR;
348: getch(); /*eat delim*/
349: if(i = atoi()){
350: if(vflag)j = VERT;
351: i = makem(quant(i,j));
352: }
353: getch();
354: vflag = 0;
355: dfact = 1;
356: return(i);
357: }
358: sethl(k)
359: int k;
360: {
361: register i;
362:
363: i = 3 * (pts & 077);
364: if(k == 'u')i = -i;
365: else if(k == 'r')i = -2*i;
366: vflag++;
367: i = makem(i);
368: vflag = 0;
369: return(i);
370: }
371: makem(i)
372: int i;
373: {
374: register j;
375:
376: if((j = i) < 0)j = -j;
377: j = (j & ~MOTV) | MOT;
378: if(i < 0)j |= NMOT;
379: if(vflag)j |= VMOT;
380: return(j);
381: }
382: getlg(i)
383: int i;
384: {
385: register j, k;
386:
387: switch((j = getch0()) & CMASK){
388: case 'f':
389: if(lg!=2){switch((k =getch0()) & CMASK){
390: case 'i':
391: j = 0214;
392: break;
393: case 'l':
394: j = 0215;
395: break;
396: default:
397: setch0(k);
398: j = 0213;
399: }
400: }else j = 0213;
401: break;
402: case 'l':
403: j = 0212;
404: break;
405: case 'i':
406: j = 0211;
407: break;
408: default:
409: setch0(j);
410: j = i;
411: }
412: return((i & ~CMASK) | j);
413: }
414: caselg(){
415:
416: lg = 1;
417: if(skip())return;
418: lg = atoi();
419: }
420: casefp(){
421: register i, j;
422: int chr;
423:
424: skip();
425: if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)) {
426: prstr("fp: bad font position\n");
427: return; }
428: if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;}
429: fontfile[ffi] = j & BMASK;
430: fontfile[ffi+1] = j>>BYTE;
431: #ifdef tso
432: if (fontfile[ffi+1]) {
433: fontfile[ffi+2] = '.'; /* fudge file name (to ftxx.f) */
434: fontfile[ffi+3] = 'f'; }
435: else {
436: fontfile[ffi+1] = '.';
437: fontfile[ffi+2] = 'f'; }
438: #endif
439: getfont(i,0); /* read in font table */
440: if(i == (smnt-1)){smnt = 0; sbold = 0; spsz = 0;}
441: if((fontlab[i] = j) == 'S')smnt = i + 1;
442: bdtab[i] = cstab[i] = ccstab[i] = 0;
443: fz[i].fzinc = fz[i].sign = fz[i].size = 0;
444: #ifndef tso
445: if(ptid != 1){
446: #endif
447: prstr("Mount font ");
448: aprstr(&fontfile[ffi]);
449: prstr(" on ");
450: chr = PAIR((i + '1'),0);
451: aprstr(&chr);
452: prstr("\n");
453: #ifndef tso
454: }
455: #endif
456: }
457: getfont(pos,new)
458: int pos,new;
459: {
460: register filedes k;
461:
462: #ifdef unix
463: if((k = open(fontfile,0)) < 0){
464: #endif
465: #ifdef tso
466: if ((k = fopen(fname(fontfile),"r,BINARY"))==NULL) {
467: #endif
468: if (!new) prstr("Non-existent font type");
469: else prstr("Unknown output device");
470: c0:
471: prstr("\n");
472: done(-1);
473: }
474: #ifdef unix
475: if(read(k,fontab[pos],256-32) != 256-32){
476: #endif
477: #ifdef tso
478: if (fread((char *)fontab[pos],1,256-32,k) != 256-32) {
479: #endif
480: prstr("Cannot read font file");
481: goto c0;
482: }
483: #ifdef unix
484: close(k);
485: #endif
486: #ifdef tso
487: fclose(k);
488: #endif
489: }
490: casecs(){
491: register i, j;
492:
493: noscale++;
494: skip();
495: if(!(i=getrq()) ||
496: ((i = find(i,fontlab)) < 0))goto rtn;
497: skip();
498: cstab[i] = atoi();
499: skip();
500: j = atoi();
501: if(!nonumb)ccstab[i] = findps(j);
502: rtn:
503: noscale = 0;
504: }
505: casebd(){
506: register i, j, k;
507:
508: k = 0;
509: bd0:
510: if(skip() || !(i = getrq()) ||
511: ((j = find(i,fontlab)) == -1)){
512: if(k)goto bd1;
513: else return;
514: }
515: if(j == (smnt-1)){
516: k = smnt;
517: goto bd0;
518: }
519: if(k){
520: sbold = j + 1;
521: j = k -1;
522: }
523: bd1:
524: skip();
525: noscale++;
526: bdtab[j] = atoi();
527: noscale = 0;
528: }
529: casevs(){
530: register i;
531:
532: skip();
533: vflag++;
534: dfact = 6; /*default scaling is points!*/
535: res = VERT;
536: i = inumb(&lss);
537: if(nonumb)i = lss1;
538: if(i < VERT)i = VERT;
539: lss1 = lss;
540: lss = i;
541: }
542: casess(){
543: register i;
544:
545: noscale++;
546: skip();
547: if(i = atoi()){
548: spacesz = i& 0177;
549: sps = width(' ' | chbits);
550: }
551: noscale = 0;
552: }
553: xlss(){
554: register i, j;
555:
556: getch();
557: dfact = lss;
558: i = quant(atoi(),VERT);
559: dfact = 1;
560: getch();
561: if((j = i) < 0)j = -j;
562: setch0(((j & 03700)<<3) | HX);
563: if(i < 0) setch0(tch[0] | 040000);
564: return(((j & 077)<<9) | LX);
565: }
566:
567: casepi() {}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.