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