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