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