|
|
1.1 root 1: #include "tdef.h"
2: extern
3: #include "d.h"
4: extern
5: #include "v.h"
6: #ifdef NROFF
7: extern
8: #include "tw.h"
9: #endif
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 xfont;
22: extern int smnt;
23: extern int setwdf;
24: extern char trtab[];
25: extern int chbits;
26: extern int nonumb;
27: extern int noscale;
28: extern int font;
29: extern int font1;
30: extern int pts;
31: extern int sps;
32: extern int nlflg;
33: extern int nform;
34: extern int dfact;
35: extern int dfactd;
36: extern int lss;
37: extern int lss1;
38: extern int vflag;
39: extern int ch0;
40: extern int level;
41: extern int ch;
42: extern int res;
43: extern int xxx;
44: int fontlab[] = {'R','I','B','S',0};
45:
46: width(c)
47: int c;
48: {
49: register i,j,k;
50:
51: j = c;
52: k = 0;
53: if(j & MOT){
54: if(j & VMOT)goto rtn;
55: k = j & ~MOTV;
56: if(j & NMOT)k = -k;
57: goto rtn;
58: }
59: if((i = (j & CMASK)) == 010){
60: k = -widthp;
61: goto rtn;
62: }
63: if(i == PRESC)i = eschar;
64: if((i == ohc) ||
65: (i >= 0370))goto rtn;
66: if(j & ZBIT)goto rtn;
67: i = trtab[i] & BMASK;
68: if(i < 040)goto rtn;
69: k = (*(t.codetab[i-32]) & 0177) * t.Char;
70: widthp = k;
71: rtn:
72: return(k);
73: }
74: setch(){
75: register i,*j,k;
76: extern int chtab[];
77:
78: if((i = getrq()) == 0)return(0);
79: for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0);
80: k = *(++j) | chbits;
81: return(k);
82: }
83: find(i,j)
84: int i,j[];
85: {
86: register k;
87:
88: if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k);
89: for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1);
90: return(k);
91: }
92: mchbits(){
93: chbits = (((pts)<<2) | font) << (BYTE + 1);
94: sps = width(' ' | chbits);
95: }
96: setps(){
97: register i,j;
98:
99: if((((i=getch() & CMASK) == '+') || (i == '-')) &&
100: (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){
101: ch = 0;
102: return;
103: }
104: if((i -= '0') == 0){
105: return;
106: }
107: if((i > 0) && (i <= 9)){
108: if((i <= 3) &&
109: ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){
110: i = 10*i +j;
111: ch = 0;
112: }
113: }
114: }
115: caseft(){
116: skip();
117: setfont(1);
118: }
119: setfont(a)
120: int a;
121: {
122: register i,j;
123:
124: if(a)i = getrq();
125: else i = getsn();
126: if(!i || (i == 'P')){
127: j = font1;
128: goto s0;
129: }
130: if(i == 'S')return;
131: if((j = find(i,fontlab)) == -1)return;
132: s0:
133: font1 = font;
134: font = j;
135: mchbits();
136: }
137: setwd(){
138: register i, base, wid;
139: int delim, em, k;
140: int savlevel, savhp, savfont, savfont1;
141: int *savpinchar, *p, *q, tempinchar[LNSIZE]; /* XXX */
142:
143: base = v.st = v.sb = wid = v.ct = 0;
144: if((delim = getch() & CMASK) & MOT)return;
145: savhp = v.hp;
146: savpinchar = pinchar; /* XXX */
147: for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */
148: *q++ = *p++; /* XXX */
149: pinchar = inchar; /* XXX */
150: savlevel = level;
151: v.hp = level = 0;
152: savfont = font;
153: savfont1 = font1;
154: setwdf++;
155: while((((i = getch()) & CMASK) != delim) && !nlflg){
156: wid += width(i);
157: if(!(i & MOT)){
158: em = 2*t.Halfline;
159: }else if(i & VMOT){
160: k = i & ~MOTV;
161: if(i & NMOT)k = -k;
162: base -= k;
163: em = 0;
164: }else continue;
165: if(base < v.sb)v.sb = base;
166: if((k=base + em) > v.st)v.st = k;
167: }
168: nform = 0;
169: setn1(wid);
170: v.hp = savhp;
171: pinchar = savpinchar; /* XXX */
172: for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */
173: *p++ = *q++; /* XXX */
174: level = savlevel;
175: font = savfont;
176: font1 = savfont1;
177: mchbits();
178: setwdf = 0;
179: }
180: vmot(){
181: dfact = lss;
182: vflag++;
183: return(mot());
184: }
185: hmot(){
186: dfact = EM;
187: return(mot());
188: }
189: mot(){
190: register i, j;
191:
192: j = HOR;
193: getch(); /*eat delim*/
194: if(i = atoi()){
195: if(vflag)j = VERT;
196: i = makem(quant(i,j));
197: }
198: getch();
199: vflag = 0;
200: dfact = 1;
201: return(i);
202: }
203: sethl(k)
204: int k;
205: {
206: register i;
207:
208: i = t.Halfline;
209: if(k == 'u')i = -i;
210: else if(k == 'r')i = -2*i;
211: vflag++;
212: i = makem(i);
213: vflag = 0;
214: return(i);
215: }
216: makem(i)
217: int i;
218: {
219: register j;
220:
221: if((j = i) < 0)j = -j;
222: j = (j & ~MOTV) | MOT;
223: if(i < 0)j |= NMOT;
224: if(vflag)j |= VMOT;
225: return(j);
226: }
227: casefp(){
228: register i, j;
229:
230: skip();
231: if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3))return;
232: if(skip() || !(j = getrq()))return;
233: fontlab[i] = j;
234: }
235: casevs(){
236: register i;
237:
238: skip();
239: vflag++;
240: dfact = INCH; /*default scaling is points!*/
241: dfactd = 72;
242: res = VERT;
243: i = inumb(&lss);
244: if(nonumb)i = lss1;
245: if(i < VERT)i = VERT;
246: lss1 = lss;
247: lss = i;
248: }
249: xlss(){
250: register i, j;
251:
252: getch();
253: dfact = lss;
254: i = quant(atoi(),VERT);
255: dfact = 1;
256: getch();
257: if((j = i) < 0)j = -j;
258: ch0 = ((j & 03700)<<3) | HX;
259: if(i < 0)ch0 |= 040000;
260: return(((j & 077)<<9) | LX);
261: }
262: casefz(){}
263: caseps(){}
264: caselg(){}
265: casecs(){}
266: casebd(){}
267: casess(){}
268: getlg(i)
269: int i;
270: {
271: return(i);
272: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.