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