1*29779Sjaap #ifndef lint
2*29779Sjaap static char sccsid[]="@(#)n6.c 1.1 (CWI) 86/08/14";
3*29779Sjaap #endif
4*29779Sjaap
5*29779Sjaap #include "tdef.h"
6*29779Sjaap #include "tw.h"
7*29779Sjaap #include "ext.h"
8*29779Sjaap #include <ctype.h>
9*29779Sjaap
10*29779Sjaap /*
11*29779Sjaap * n6.c -- width functions, sizes and fonts
12*29779Sjaap */
13*29779Sjaap
14*29779Sjaap int bdtab[NFONT+1] ={ 0, 0, 0, 3, 3, 0, };
15*29779Sjaap int sbold = 0;
16*29779Sjaap int fontlab[NFONT+1] = { 0, 'R', 'I', 'B', PAIR('B','I'), 'S', 0 };
17*29779Sjaap
width(j)18*29779Sjaap width(j)
19*29779Sjaap register tchar j;
20*29779Sjaap {
21*29779Sjaap register i, k;
22*29779Sjaap
23*29779Sjaap if (j & (ZBIT|MOT)) {
24*29779Sjaap if (iszbit(j))
25*29779Sjaap return(0);
26*29779Sjaap if (isvmot(j))
27*29779Sjaap return(0);
28*29779Sjaap k = absmot(j);
29*29779Sjaap if (isnmot(j))
30*29779Sjaap k = -k;
31*29779Sjaap return(k);
32*29779Sjaap }
33*29779Sjaap i = cbits(j);
34*29779Sjaap if (i < ' ') {
35*29779Sjaap if (i == '\b')
36*29779Sjaap return(-widthp);
37*29779Sjaap if (i == PRESC)
38*29779Sjaap i = eschar;
39*29779Sjaap else if (iscontrol(i))
40*29779Sjaap return(0);
41*29779Sjaap }
42*29779Sjaap if (i==ohc)
43*29779Sjaap return(0);
44*29779Sjaap i = trtab[i];
45*29779Sjaap if (i < 32)
46*29779Sjaap return(0);
47*29779Sjaap k = t.width[i] * t.Char;
48*29779Sjaap widthp = k;
49*29779Sjaap return(k);
50*29779Sjaap }
51*29779Sjaap
52*29779Sjaap
setch()53*29779Sjaap tchar setch()
54*29779Sjaap {
55*29779Sjaap register j;
56*29779Sjaap char temp[10];
57*29779Sjaap register char *s;
58*29779Sjaap
59*29779Sjaap s = temp;
60*29779Sjaap if ((*s++ = getach()) == 0 || (*s++ = getach()) == 0)
61*29779Sjaap return(0);
62*29779Sjaap *s = '\0';
63*29779Sjaap if ((j = findch(temp)) > 0)
64*29779Sjaap return j | chbits;
65*29779Sjaap else
66*29779Sjaap return 0;
67*29779Sjaap }
68*29779Sjaap
setabs()69*29779Sjaap tchar setabs() /* set absolute char from \C'...' */
70*29779Sjaap { /* for now, a no-op */
71*29779Sjaap int i, n, nf;
72*29779Sjaap
73*29779Sjaap getch();
74*29779Sjaap n = 0;
75*29779Sjaap n = inumb(&n);
76*29779Sjaap getch();
77*29779Sjaap return ' ';
78*29779Sjaap }
79*29779Sjaap
findft(i)80*29779Sjaap findft(i)
81*29779Sjaap register int i;
82*29779Sjaap {
83*29779Sjaap register k;
84*29779Sjaap
85*29779Sjaap if ((k = i - '0') >= 0 && k <= nfonts && k < smnt)
86*29779Sjaap return(k);
87*29779Sjaap for (k = 0; fontlab[k] != i; k++)
88*29779Sjaap if (k > nfonts)
89*29779Sjaap return(-1);
90*29779Sjaap return(k);
91*29779Sjaap }
92*29779Sjaap
93*29779Sjaap
caseps()94*29779Sjaap caseps()
95*29779Sjaap {
96*29779Sjaap }
97*29779Sjaap
98*29779Sjaap
mchbits()99*29779Sjaap mchbits()
100*29779Sjaap {
101*29779Sjaap chbits = 0;
102*29779Sjaap setfbits(chbits, font);
103*29779Sjaap sps = width(' ' | chbits);
104*29779Sjaap }
105*29779Sjaap
106*29779Sjaap
setps()107*29779Sjaap setps()
108*29779Sjaap {
109*29779Sjaap register i, j;
110*29779Sjaap
111*29779Sjaap i = cbits(getch());
112*29779Sjaap if (isdigit(i)) { /* \sd or \sdd */
113*29779Sjaap i -= '0';
114*29779Sjaap if (i == 0) /* \s0 */
115*29779Sjaap ;
116*29779Sjaap else if (i <= 3 && isdigit(j = cbits(ch=getch()))) { /* \sdd */
117*29779Sjaap ch = 0;
118*29779Sjaap }
119*29779Sjaap } else if (i == '(') { /* \s(dd */
120*29779Sjaap getch();
121*29779Sjaap getch();
122*29779Sjaap } else if (i == '+' || i == '-') { /* \s+, \s- */
123*29779Sjaap j = cbits(getch());
124*29779Sjaap if (isdigit(j)) { /* \s+d, \s-d */
125*29779Sjaap ;
126*29779Sjaap } else if (j == '(') { /* \s+(dd, \s-(dd */
127*29779Sjaap getch();
128*29779Sjaap getch();
129*29779Sjaap }
130*29779Sjaap }
131*29779Sjaap }
132*29779Sjaap
133*29779Sjaap
oldsetps()134*29779Sjaap oldsetps()
135*29779Sjaap {
136*29779Sjaap int i, j, k;
137*29779Sjaap
138*29779Sjaap if (((i = cbits(getch())) == '+' || i == '-') && (j = cbits(ch = getch()) - '0') >= 0 && j <= 9) {
139*29779Sjaap if (i == '-')
140*29779Sjaap j = -j;
141*29779Sjaap ch = 0;
142*29779Sjaap return;
143*29779Sjaap }
144*29779Sjaap if ((i -= '0') == 0) {
145*29779Sjaap return;
146*29779Sjaap }
147*29779Sjaap if (i > 0 && i <= 9) {
148*29779Sjaap /* removed if (i <= 3 && */
149*29779Sjaap /* didn't work!!!! */
150*29779Sjaap if (i <= 3 && (j = cbits(ch = getch()) - '0') >= 0 && j <= 9) {
151*29779Sjaap i = 10 * i + j;
152*29779Sjaap ch = 0;
153*29779Sjaap }
154*29779Sjaap }
155*29779Sjaap }
156*29779Sjaap
157*29779Sjaap
setht()158*29779Sjaap tchar setht() /* set character height from \H'...' */
159*29779Sjaap {
160*29779Sjaap int n;
161*29779Sjaap tchar c;
162*29779Sjaap
163*29779Sjaap getch();
164*29779Sjaap n = inumb(&apts);
165*29779Sjaap getch();
166*29779Sjaap return(0);
167*29779Sjaap }
168*29779Sjaap
169*29779Sjaap
setslant()170*29779Sjaap tchar setslant() /* set slant from \S'...' */
171*29779Sjaap {
172*29779Sjaap int n;
173*29779Sjaap tchar c;
174*29779Sjaap
175*29779Sjaap getch();
176*29779Sjaap n = 0;
177*29779Sjaap n = inumb(&n);
178*29779Sjaap getch();
179*29779Sjaap return(0);
180*29779Sjaap }
181*29779Sjaap
182*29779Sjaap
caseft()183*29779Sjaap caseft()
184*29779Sjaap {
185*29779Sjaap skip();
186*29779Sjaap setfont(1);
187*29779Sjaap }
188*29779Sjaap
189*29779Sjaap
setfont(a)190*29779Sjaap setfont(a)
191*29779Sjaap int a;
192*29779Sjaap {
193*29779Sjaap register i, j;
194*29779Sjaap
195*29779Sjaap if (a)
196*29779Sjaap i = getrq();
197*29779Sjaap else
198*29779Sjaap i = getsn();
199*29779Sjaap if (!i || i == 'P') {
200*29779Sjaap j = font1;
201*29779Sjaap goto s0;
202*29779Sjaap }
203*29779Sjaap if (i == 'S' || i == '0')
204*29779Sjaap return;
205*29779Sjaap if ((j = findft(i, fontlab)) == -1)
206*29779Sjaap return;
207*29779Sjaap s0:
208*29779Sjaap font1 = font;
209*29779Sjaap font = j;
210*29779Sjaap mchbits();
211*29779Sjaap }
212*29779Sjaap
213*29779Sjaap
setwd()214*29779Sjaap setwd()
215*29779Sjaap {
216*29779Sjaap register base, wid;
217*29779Sjaap register tchar i;
218*29779Sjaap int delim, emsz, k;
219*29779Sjaap int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
220*29779Sjaap
221*29779Sjaap base = numtab[ST].val = numtab[ST].val = wid = numtab[CT].val = 0;
222*29779Sjaap if (ismot(i = getch()))
223*29779Sjaap return;
224*29779Sjaap delim = cbits(i);
225*29779Sjaap savhp = numtab[HP].val;
226*29779Sjaap numtab[HP].val = 0;
227*29779Sjaap savapts = apts;
228*29779Sjaap savapts1 = apts1;
229*29779Sjaap savfont = font;
230*29779Sjaap savfont1 = font1;
231*29779Sjaap savpts = pts;
232*29779Sjaap savpts1 = pts1;
233*29779Sjaap setwdf++;
234*29779Sjaap while (cbits(i = getch()) != delim && !nlflg) {
235*29779Sjaap k = width(i);
236*29779Sjaap wid += k;
237*29779Sjaap numtab[HP].val += k;
238*29779Sjaap if (!ismot(i)) {
239*29779Sjaap emsz = (INCH * pts + 36) / 72;
240*29779Sjaap } else if (isvmot(i)) {
241*29779Sjaap k = absmot(i);
242*29779Sjaap if (isnmot(i))
243*29779Sjaap k = -k;
244*29779Sjaap base -= k;
245*29779Sjaap emsz = 0;
246*29779Sjaap } else
247*29779Sjaap continue;
248*29779Sjaap if (base < numtab[SB].val)
249*29779Sjaap numtab[SB].val = base;
250*29779Sjaap if ((k = base + emsz) > numtab[ST].val)
251*29779Sjaap numtab[ST].val = k;
252*29779Sjaap }
253*29779Sjaap setn1(wid, 0, (tchar) 0);
254*29779Sjaap numtab[HP].val = savhp;
255*29779Sjaap apts = savapts;
256*29779Sjaap apts1 = savapts1;
257*29779Sjaap font = savfont;
258*29779Sjaap font1 = savfont1;
259*29779Sjaap pts = savpts;
260*29779Sjaap pts1 = savpts1;
261*29779Sjaap mchbits();
262*29779Sjaap setwdf = 0;
263*29779Sjaap }
264*29779Sjaap
265*29779Sjaap
vmot()266*29779Sjaap tchar vmot()
267*29779Sjaap {
268*29779Sjaap dfact = lss;
269*29779Sjaap vflag++;
270*29779Sjaap return(mot());
271*29779Sjaap }
272*29779Sjaap
273*29779Sjaap
hmot()274*29779Sjaap tchar hmot()
275*29779Sjaap {
276*29779Sjaap dfact = EM;
277*29779Sjaap return(mot());
278*29779Sjaap }
279*29779Sjaap
280*29779Sjaap
mot()281*29779Sjaap tchar mot()
282*29779Sjaap {
283*29779Sjaap register int j, n;
284*29779Sjaap register tchar i;
285*29779Sjaap
286*29779Sjaap j = HOR;
287*29779Sjaap getch(); /*eat delim*/
288*29779Sjaap if (n = atoi()) {
289*29779Sjaap if (vflag)
290*29779Sjaap j = VERT;
291*29779Sjaap i = makem(quant(n, j));
292*29779Sjaap } else
293*29779Sjaap i = 0;
294*29779Sjaap getch();
295*29779Sjaap vflag = 0;
296*29779Sjaap dfact = 1;
297*29779Sjaap return(i);
298*29779Sjaap }
299*29779Sjaap
300*29779Sjaap
sethl(k)301*29779Sjaap tchar sethl(k)
302*29779Sjaap int k;
303*29779Sjaap {
304*29779Sjaap register j;
305*29779Sjaap tchar i;
306*29779Sjaap
307*29779Sjaap j = t.Halfline;
308*29779Sjaap if (k == 'u')
309*29779Sjaap j = -j;
310*29779Sjaap else if (k == 'r')
311*29779Sjaap j = -2 * j;
312*29779Sjaap vflag++;
313*29779Sjaap i = makem(j);
314*29779Sjaap vflag = 0;
315*29779Sjaap return(i);
316*29779Sjaap }
317*29779Sjaap
318*29779Sjaap
makem(i)319*29779Sjaap tchar makem(i)
320*29779Sjaap int i;
321*29779Sjaap {
322*29779Sjaap register tchar j;
323*29779Sjaap
324*29779Sjaap if ((j = i) < 0)
325*29779Sjaap j = -j;
326*29779Sjaap j |= MOT;
327*29779Sjaap if (i < 0)
328*29779Sjaap j |= NMOT;
329*29779Sjaap if (vflag)
330*29779Sjaap j |= VMOT;
331*29779Sjaap return(j);
332*29779Sjaap }
333*29779Sjaap
334*29779Sjaap
getlg(i)335*29779Sjaap tchar getlg(i)
336*29779Sjaap tchar i;
337*29779Sjaap {
338*29779Sjaap return(i);
339*29779Sjaap }
340*29779Sjaap
341*29779Sjaap
caselg()342*29779Sjaap caselg()
343*29779Sjaap {
344*29779Sjaap }
345*29779Sjaap
346*29779Sjaap
casefp()347*29779Sjaap casefp()
348*29779Sjaap {
349*29779Sjaap register i, j;
350*29779Sjaap
351*29779Sjaap skip();
352*29779Sjaap if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
353*29779Sjaap return;
354*29779Sjaap if (skip() || !(j = getrq()))
355*29779Sjaap return;
356*29779Sjaap fontlab[i] = j;
357*29779Sjaap }
358*29779Sjaap
359*29779Sjaap
casecs()360*29779Sjaap casecs()
361*29779Sjaap {
362*29779Sjaap }
363*29779Sjaap
364*29779Sjaap
casebd()365*29779Sjaap casebd()
366*29779Sjaap {
367*29779Sjaap register i, j, k;
368*29779Sjaap
369*29779Sjaap k = 0;
370*29779Sjaap bd0:
371*29779Sjaap if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
372*29779Sjaap if (k)
373*29779Sjaap goto bd1;
374*29779Sjaap else
375*29779Sjaap return;
376*29779Sjaap }
377*29779Sjaap if (j == smnt) {
378*29779Sjaap k = smnt;
379*29779Sjaap goto bd0;
380*29779Sjaap }
381*29779Sjaap if (k) {
382*29779Sjaap sbold = j;
383*29779Sjaap j = k;
384*29779Sjaap }
385*29779Sjaap bd1:
386*29779Sjaap skip();
387*29779Sjaap noscale++;
388*29779Sjaap bdtab[j] = atoi();
389*29779Sjaap noscale = 0;
390*29779Sjaap }
391*29779Sjaap
392*29779Sjaap
casevs()393*29779Sjaap casevs()
394*29779Sjaap {
395*29779Sjaap register i;
396*29779Sjaap
397*29779Sjaap skip();
398*29779Sjaap vflag++;
399*29779Sjaap dfact = INCH; /*default scaling is points!*/
400*29779Sjaap dfactd = 72;
401*29779Sjaap res = VERT;
402*29779Sjaap i = inumb(&lss);
403*29779Sjaap if (nonumb)
404*29779Sjaap i = lss1;
405*29779Sjaap if (i < VERT)
406*29779Sjaap i = 0; /* was VERT */
407*29779Sjaap lss1 = lss;
408*29779Sjaap lss = i;
409*29779Sjaap }
410*29779Sjaap
411*29779Sjaap
412*29779Sjaap
413*29779Sjaap
casess()414*29779Sjaap casess()
415*29779Sjaap {
416*29779Sjaap }
417*29779Sjaap
418*29779Sjaap
xlss()419*29779Sjaap tchar xlss()
420*29779Sjaap {
421*29779Sjaap /* stores \x'...' into
422*29779Sjaap /* two successive tchars.
423*29779Sjaap /* the first contains HX, the second the value,
424*29779Sjaap /* encoded as a vertical motion.
425*29779Sjaap /* decoding is done in n2.c by pchar().
426*29779Sjaap */
427*29779Sjaap int i;
428*29779Sjaap
429*29779Sjaap getch();
430*29779Sjaap dfact = lss;
431*29779Sjaap i = quant(atoi(), VERT);
432*29779Sjaap dfact = 1;
433*29779Sjaap getch();
434*29779Sjaap if (i >= 0)
435*29779Sjaap *pbp++ = MOT | VMOT | i;
436*29779Sjaap else
437*29779Sjaap *pbp++ = MOT | VMOT | NMOT | -i;
438*29779Sjaap return(HX);
439*29779Sjaap }
440