date and time created 83/04/03 18:19:06 by sam
[unix-history] / usr / src / old / roff / nroff / n6.c
CommitLineData
814d055b 1#ifndef lint
03ef7d51 2static char sccsid[] = "@(#)n6.c 4.2 %G%";
814d055b
RH
3#endif lint
4
5#include "tdef.h"
6extern
7#include "d.h"
8extern
9#include "v.h"
10#ifdef NROFF
11extern
12#include "tw.h"
13#endif
14
15/*
16troff6.c
17
18width functions, sizes and fonts
19*/
20
21extern int inchar[LNSIZE], *pinchar; /* XXX */
22extern int eschar;
23extern int widthp;
24extern int ohc;
25extern int xfont;
26extern int smnt;
27extern int setwdf;
28extern char trtab[];
29extern int chbits;
30extern int nonumb;
31extern int noscale;
32extern int font;
33extern int font1;
34extern int pts;
35extern int sps;
36extern int nlflg;
37extern int nform;
38extern int dfact;
39extern int dfactd;
40extern int lss;
41extern int lss1;
42extern int vflag;
43extern int ch0;
44extern int level;
45extern int ch;
46extern int res;
47extern int xxx;
48int fontlab[] = {'R','I','B','S',0};
49
50width(c)
51int 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;
78rtn:
79 return(k);
80}
81setch(){
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}
90find(i,j)
91int 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}
99mchbits(){
100 chbits = (((pts)<<2) | font) << (BYTE + 1);
101 sps = width(' ' | chbits);
102}
103setps(){
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}
122caseft(){
123 skip();
124 setfont(1);
125}
126setfont(a)
127int 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;
139s0:
140 font1 = font;
141 font = j;
142 mchbits();
143}
144setwd(){
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}
187vmot(){
188 dfact = lss;
189 vflag++;
190 return(mot());
191}
192hmot(){
193 dfact = EM;
194 return(mot());
195}
196mot(){
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}
210sethl(k)
211int 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}
223makem(i)
224int 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}
234casefp(){
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}
242casevs(){
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}
256xlss(){
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}
269casefz(){}
270caseps(){}
271caselg(){}
272casecs(){}
273casebd(){}
274casess(){}
275getlg(i)
276int i;
277{
278 return(i);
279}