Commit | Line | Data |
---|---|---|
efc13994 TL |
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 | troff9.c | |
12 | ||
13 | misc functions | |
14 | */ | |
15 | ||
16 | extern int cbuf[]; | |
17 | extern int *cp; | |
18 | extern int ch; | |
19 | extern int chbits; | |
20 | extern int dfact; | |
21 | extern int vflag; | |
22 | extern int pts; | |
23 | extern int fc; | |
24 | extern int padc; | |
25 | extern int tabtab[]; | |
26 | extern int nlflg; | |
27 | extern int lss; | |
28 | extern int tabch, ldrch; | |
29 | extern int tabc, dotc; | |
30 | extern int nchar, rchar; | |
31 | extern int xxx; | |
32 | ||
33 | setz(){ | |
34 | register i; | |
35 | ||
36 | if(!((i = getch()) & MOT))i |= ZBIT; | |
37 | return(i); | |
38 | } | |
39 | setline(){ | |
40 | register *i, length, c; | |
41 | int w, cnt, delim, rem, temp; | |
42 | ||
43 | if((delim = getch()) & MOT)return; | |
44 | else delim &= CMASK; | |
45 | vflag = 0; | |
46 | dfact = EM; | |
47 | length = quant(atoi(),HOR); | |
48 | dfact = 1; | |
49 | if(!length){ | |
50 | eat(delim); | |
51 | return; | |
52 | } | |
53 | s0: | |
54 | if(((c = getch()) & CMASK) == delim){ | |
55 | ch = c; | |
56 | c = 0204 | chbits; | |
57 | }else if((c & CMASK) == FILLER)goto s0; | |
58 | w = width(c); | |
59 | i = cbuf; | |
60 | if(length < 0){ | |
61 | *i++ = makem(length); | |
62 | length = -length; | |
63 | } | |
64 | if(!(cnt = length/w)){ | |
65 | *i++ = makem(-(temp = ((w-length)/2))); | |
66 | *i++ = c; | |
67 | *i++ = makem(-(w - length - temp)); | |
68 | goto s1; | |
69 | } | |
70 | if(rem = length%w){ | |
71 | switch(c & CMASK){ | |
72 | case 0204: /*rule*/ | |
73 | case 0224: /*underrule*/ | |
74 | case 0276: /*root en*/ | |
75 | *i++ = c | ZBIT; | |
76 | default: | |
77 | *i++ = makem(rem); | |
78 | } | |
79 | } | |
80 | if(cnt){ | |
81 | *i++ = RPT; | |
82 | *i++ = cnt; | |
83 | *i++ = c; | |
84 | } | |
85 | s1: | |
86 | *i++ = 0; | |
87 | eat(delim); | |
88 | cp = cbuf; | |
89 | } | |
90 | eat(c) | |
91 | int c; | |
92 | { | |
93 | register i; | |
94 | ||
95 | while(((i = getch() & CMASK) != c) && | |
96 | (i != '\n')); | |
97 | return(i); | |
98 | } | |
99 | setov(){ | |
100 | register i, j, k; | |
101 | int *p, delim, o[NOV], w[NOV]; | |
102 | ||
103 | if((delim = getch()) & MOT)return; | |
104 | else delim &= CMASK; | |
105 | for(k=0; (k<NOV) && ((j=(i = getch()) & CMASK) != delim) && | |
106 | (j != '\n'); k++){ | |
107 | o[k] = i; | |
108 | w[k] = width(i); | |
109 | } | |
110 | o[k] = w[k] = 0; | |
111 | if(o[0])for(j=1; j;){ | |
112 | j = 0; | |
113 | for(k=1; o[k] ; k++){ | |
114 | if(w[k-1] < w[k]){ | |
115 | j++; | |
116 | i = w[k]; | |
117 | w[k] = w[k-1]; | |
118 | w[k-1] = i; | |
119 | i = o[k]; | |
120 | o[k] = o[k-1]; | |
121 | o[k-1] = i; | |
122 | } | |
123 | } | |
124 | }else return; | |
125 | p = cbuf; | |
126 | for(k=0; o[k]; k++){ | |
127 | *p++ = o[k]; | |
128 | *p++ = makem(-((w[k]+w[k+1])/2)); | |
129 | } | |
130 | *p++ = makem(w[0]/2); | |
131 | *p = 0; | |
132 | cp = cbuf; | |
133 | } | |
134 | setbra(){ | |
135 | register i, *j, k; | |
136 | int cnt, delim, dwn; | |
137 | ||
138 | if((delim = getch()) & MOT)return; | |
139 | else delim &= CMASK; | |
140 | j = cbuf + 1; | |
141 | cnt = 0; | |
142 | #ifdef NROFF | |
143 | dwn = (2*t.Halfline) | MOT | VMOT; | |
144 | #endif | |
145 | #ifndef NROFF | |
146 | dwn = EM | MOT | VMOT; | |
147 | #endif | |
148 | while(((k = (i = getch()) & CMASK) != delim) && (k != '\n') && | |
149 | (j <= (cbuf+NC-4))){ | |
150 | *j++ = i | ZBIT; | |
151 | *j++ = dwn; | |
152 | cnt++; | |
153 | } | |
154 | if(--cnt < 0)return; | |
155 | else if (!cnt){ | |
156 | ch = *(j-2); | |
157 | return; | |
158 | } | |
159 | *j = 0; | |
160 | #ifdef NROFF | |
161 | *--j = *cbuf = (cnt*t.Halfline) | MOT | NMOT | VMOT; | |
162 | #endif | |
163 | #ifndef NROFF | |
164 | *--j = *cbuf = (cnt*EM)/2 | MOT | NMOT | VMOT; | |
165 | #endif | |
166 | *--j &= ~ZBIT; | |
167 | cp = cbuf; | |
168 | } | |
169 | setvline(){ | |
170 | register i, c, *k; | |
171 | int cnt, neg, rem, ver, delim; | |
172 | ||
173 | if((delim = getch()) & MOT)return; | |
174 | else delim &= CMASK; | |
175 | dfact = lss; | |
176 | vflag++; | |
177 | i = quant(atoi(),VERT); | |
178 | dfact = 1; | |
179 | if(!i){ | |
180 | eat(delim); | |
181 | vflag = 0; | |
182 | return; | |
183 | } | |
184 | if(((c = getch()) & CMASK) == delim){ | |
185 | c = 0337 | chbits; /*default box rule*/ | |
186 | }else getch(); | |
187 | c |= ZBIT; | |
188 | neg = 0; | |
189 | if(i < 0){ | |
190 | i = -i; | |
191 | neg = NMOT; | |
192 | } | |
193 | #ifdef NROFF | |
194 | ver = 2*t.Halfline; | |
195 | #endif | |
196 | #ifndef NROFF | |
197 | ver = EM; | |
198 | #endif | |
199 | cnt = i/ver; | |
200 | rem = makem(i%ver) | neg; | |
201 | ver = makem(ver) | neg; | |
202 | k = cbuf; | |
203 | if(!neg)*k++ = ver; | |
204 | if(rem & ~MOTV){ | |
205 | *k++ = c; | |
206 | *k++ = rem; | |
207 | } | |
208 | while((k < (cbuf+NC-3)) && cnt--){ | |
209 | *k++ = c; | |
210 | *k++ = ver; | |
211 | } | |
212 | *(k-2) &= ~ZBIT; | |
213 | if(!neg)k--; | |
214 | *k = 0; | |
215 | cp = cbuf; | |
216 | vflag = 0; | |
217 | } | |
218 | casefc(){ | |
219 | register i; | |
220 | ||
221 | fc = IMP; | |
222 | padc = ' '; | |
223 | if(skip() || | |
224 | ((i = getch()) & MOT) || | |
225 | ((i &= CMASK) == '\n'))return; | |
226 | fc = i; | |
227 | if(skip() || (ch & MOT) || ((ch &= CMASK) == fc))return; | |
228 | padc = ch; | |
229 | } | |
230 | setfield(x) | |
231 | int x; | |
232 | { | |
233 | register i, j, *fp; | |
234 | int length, ws, npad, temp, type; | |
235 | int **pp, *padptr[NPP]; | |
236 | static int fbuf[FBUFSZ]; | |
237 | int savfc, savtc, savlc; | |
238 | ||
239 | if(x == tabch) rchar = tabc | chbits; | |
240 | else if(x == ldrch) rchar = dotc | chbits; | |
241 | temp = npad = ws = 0; | |
242 | savfc = fc; savtc = tabch; savlc = ldrch; | |
243 | tabch = ldrch = fc = IMP; | |
244 | for(j=0;;j++){ | |
245 | if((tabtab[j] & TMASK)== 0){ | |
246 | if(x==savfc)prstr("Zero field width.\n"); | |
247 | j = 0; | |
248 | goto rtn; | |
249 | } | |
250 | if((length = ((tabtab[j] & TMASK) - v.hp)) > 0 )break; | |
251 | } | |
252 | type = tabtab[j] & (~TMASK); | |
253 | fp = fbuf; | |
254 | pp = padptr; | |
255 | if(x == savfc){while(1){ | |
256 | if(((j = (i = getch()) & CMASK)) == padc){ | |
257 | npad++; | |
258 | *pp++ = fp; | |
259 | if(pp > (padptr + NPP - 1))break; | |
260 | goto s1; | |
261 | }else if(j == savfc) break; | |
262 | else if(j == '\n'){ | |
263 | temp = j; | |
264 | nlflg = 0; | |
265 | break; | |
266 | } | |
267 | ws += width(i); | |
268 | s1: | |
269 | *fp++ = i; | |
270 | if(fp > (fbuf + FBUFSZ -3))break; | |
271 | } | |
272 | if(!npad){ | |
273 | npad++; | |
274 | *pp++ = fp; | |
275 | *fp++ = 0; | |
276 | } | |
277 | *fp++ = temp; | |
278 | *fp++ = 0; | |
279 | temp = i = (j = length-ws)/npad; | |
280 | i = (i/HOR)*HOR; | |
281 | if((j -= i*npad) <0)j = -j; | |
282 | i = makem(i); | |
283 | if(temp <0)i |= NMOT; | |
284 | for(;npad > 0; npad--){ | |
285 | *(*--pp) = i; | |
286 | if(j){ | |
287 | j -= HOR; | |
288 | (*(*pp)) += HOR; | |
289 | } | |
290 | } | |
291 | cp = fbuf; | |
292 | j = 0; | |
293 | }else if(type == 0){ | |
294 | /*plain tab or leader*/ | |
295 | if((j = width(rchar)) == 0)nchar = 0; | |
296 | else{ | |
297 | nchar = length /j; | |
298 | length %= j; | |
299 | } | |
300 | if(length)j = length | MOT; | |
301 | else j = getch0(); | |
302 | }else{ | |
303 | /*center tab*/ | |
304 | /*right tab*/ | |
305 | while(((j = (i = getch()) & CMASK) != savtc) && | |
306 | (j != '\n') && (j != savlc)){ | |
307 | ws += width(i); | |
308 | *fp++ = i; | |
309 | if(fp > (fbuf +FBUFSZ - 3)) break; | |
310 | } | |
311 | *fp++ = i; | |
312 | *fp++ = 0; | |
313 | if(type == RTAB)length -= ws; | |
314 | else length -= ws/2; /*CTAB*/ | |
315 | if(((j = width(rchar)) == 0) || (length <= 0))nchar = 0; | |
316 | else{ | |
317 | nchar = length/j; | |
318 | length %= j; | |
319 | } | |
320 | length = (length/HOR)*HOR; | |
321 | j = makem(length); | |
322 | cp = fbuf; | |
323 | nlflg = 0; | |
324 | } | |
325 | rtn: | |
326 | fc = savfc; tabch = savtc; ldrch = savlc; | |
327 | return(j); | |
328 | } |