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