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