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