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