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