Bell 32V development
[unix-history] / usr / src / cmd / troff / n9.c
CommitLineData
efc13994
TL
1#include "tdef.h"
2extern
3#include "d.h"
4extern
5#include "v.h"
6#ifdef NROFF
7extern
8#include "tw.h"
9#endif
10/*
11troff9.c
12
13misc functions
14*/
15
16extern int cbuf[];
17extern int *cp;
18extern int ch;
19extern int chbits;
20extern int dfact;
21extern int vflag;
22extern int pts;
23extern int fc;
24extern int padc;
25extern int tabtab[];
26extern int nlflg;
27extern int lss;
28extern int tabch, ldrch;
29extern int tabc, dotc;
30extern int nchar, rchar;
31extern int xxx;
32
33setz(){
34 register i;
35
36 if(!((i = getch()) & MOT))i |= ZBIT;
37 return(i);
38}
39setline(){
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 }
53s0:
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 }
85s1:
86 *i++ = 0;
87 eat(delim);
88 cp = cbuf;
89}
90eat(c)
91int c;
92{
93 register i;
94
95 while(((i = getch() & CMASK) != c) &&
96 (i != '\n'));
97 return(i);
98}
99setov(){
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}
134setbra(){
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}
169setvline(){
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}
218casefc(){
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}
230setfield(x)
231int 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 }
325rtn:
326 fc = savfc; tabch = savtc; ldrch = savlc;
327 return(j);
328}