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