Blob


1 #include "tdef.h"
2 #include "ext.h"
3 #include "fns.h"
4 #include <ctype.h>
6 /*
7 * n6.c -- width functions, sizes and fonts
8 */
10 int
11 n_width(Tchar j)
12 {
13 int i, k;
15 if (iszbit(j))
16 return 0;
17 if (ismot(j)) {
18 if (isvmot(j))
19 return(0);
20 k = absmot(j);
21 if (isnmot(j))
22 k = -k;
23 return(k);
24 }
25 i = cbits(j);
26 if (i < ' ') {
27 if (i == '\b')
28 return(-widthp);
29 if (i == PRESC)
30 i = eschar;
31 else if (i == HX)
32 return(0);
33 }
34 if (i == ohc)
35 return(0);
36 i = trtab[i];
37 if (i < ' ')
38 return(0);
39 if (i >= t.tfont.nchars) /* not on the font */
40 k = t.Char; /* really ought to check properly */
41 else
42 k = t.tfont.wp[i].wid * t.Char;
43 widthp = k;
44 return(k);
45 }
48 Tchar n_setch(int c)
49 {
50 return t_setch(c);
51 }
53 Tchar n_setabs(void) /* set absolute char from \N'...' */
54 { /* for now, a no-op */
55 return t_setabs();
56 }
58 int n_findft(int i)
59 {
60 int k;
62 if ((k = i - '0') >= 0 && k <= nfonts && k < smnt)
63 return(k);
64 for (k = 0; fontlab[k] != i; k++)
65 if (k > nfonts)
66 return(-1);
67 return(k);
68 }
72 void n_mchbits(void)
73 {
74 chbits = 0;
75 setfbits(chbits, font);
76 sps = width(' ' | chbits);
77 }
80 void n_setps(void )
81 {
82 int i, j;
84 i = cbits(getch());
85 if (isdigit(i)) { /* \sd or \sdd */
86 i -= '0';
87 if (i == 0) /* \s0 */
88 ;
89 else if (i <= 3 && (ch=getch()) && isdigit(cbits(ch))) { /* \sdd */
90 ch = 0;
91 }
92 } else if (i == '(') { /* \s(dd */
93 getch();
94 getch();
95 } else if (i == '+' || i == '-') { /* \s+, \s- */
96 j = cbits(getch());
97 if (isdigit(j)) { /* \s+d, \s-d */
98 ;
99 } else if (j == '(') { /* \s+(dd, \s-(dd */
100 getch();
101 getch();
107 Tchar n_setht(void) /* set character height from \H'...' */
110 getch();
111 inumb(&apts);
112 getch();
113 return(0);
117 Tchar n_setslant(void) /* set slant from \S'...' */
119 int n;
121 getch();
122 n = 0;
123 n = inumb(&n);
124 getch();
125 return(0);
129 void n_caseft(void)
131 skip();
132 setfont(1);
136 void n_setfont(int a)
138 int i, j;
140 if (a)
141 i = getrq();
142 else
143 i = getsn();
144 if (!i || i == 'P') {
145 j = font1;
146 goto s0;
148 if (i == 'S' || i == '0')
149 return;
150 if ((j = findft(i)) == -1)
151 return;
152 s0:
153 font1 = font;
154 font = j;
155 mchbits();
159 void n_setwd(void)
161 int base, wid;
162 Tchar i;
163 int delim, emsz, k;
164 int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
166 base = numtabp[ST].val = numtabp[SB].val = wid = numtabp[CT].val = 0;
167 if (ismot(i = getch()))
168 return;
169 delim = cbits(i);
170 savhp = numtabp[HP].val;
171 numtabp[HP].val = 0;
172 savapts = apts;
173 savapts1 = apts1;
174 savfont = font;
175 savfont1 = font1;
176 savpts = pts;
177 savpts1 = pts1;
178 setwdf++;
179 while (cbits(i = getch()) != delim && !nlflg) {
180 k = width(i);
181 wid += k;
182 numtabp[HP].val += k;
183 if (!ismot(i)) {
184 emsz = (INCH * pts + 36) / 72;
185 } else if (isvmot(i)) {
186 k = absmot(i);
187 if (isnmot(i))
188 k = -k;
189 base -= k;
190 emsz = 0;
191 } else
192 continue;
193 if (base < numtabp[SB].val)
194 numtabp[SB].val = base;
195 if ((k = base + emsz) > numtabp[ST].val)
196 numtabp[ST].val = k;
198 setn1(wid, 0, (Tchar) 0);
199 numtabp[HP].val = savhp;
200 apts = savapts;
201 apts1 = savapts1;
202 font = savfont;
203 font1 = savfont1;
204 pts = savpts;
205 pts1 = savpts1;
206 mchbits();
207 setwdf = 0;
211 Tchar n_vmot(void)
213 dfact = lss;
214 vflag++;
215 return n_mot();
219 Tchar n_hmot(void)
221 dfact = EM;
222 return n_mot();
226 Tchar n_mot(void)
228 int j, n;
229 Tchar i;
231 j = HOR;
232 getch(); /*eat delim*/
233 if (n = atoi0()) {
234 if (vflag)
235 j = VERT;
236 i = makem(quant(n, j));
237 } else
238 i = 0;
239 getch();
240 vflag = 0;
241 dfact = 1;
242 return(i);
246 Tchar n_sethl(int k)
248 int j;
249 Tchar i;
251 j = t.Halfline;
252 if (k == 'u')
253 j = -j;
254 else if (k == 'r')
255 j = -2 * j;
256 vflag++;
257 i = makem(j);
258 vflag = 0;
259 return(i);
263 Tchar n_makem(int i)
265 Tchar j;
267 if (i >= 0)
268 j = i;
269 else
270 j = -i;
271 j |= MOT;
272 if (i < 0)
273 j |= NMOT;
274 if (vflag)
275 j |= VMOT;
276 return(j);
280 void n_casefp(void)
282 int i, j;
284 skip();
285 if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
286 return;
287 if (skip() || !(j = getrq()))
288 return;
289 fontlab[i] = j;
294 void n_casebd(void)
296 int i, j, k;
298 j = k = 0;
299 bd0:
300 if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
301 if (k)
302 goto bd1;
303 else
304 return;
306 if (j == smnt) {
307 k = smnt;
308 goto bd0;
310 if (k) {
311 sbold = j;
312 j = k;
314 bd1:
315 skip();
316 noscale++;
317 bdtab[j] = atoi0();
318 noscale = 0;
322 void n_casevs(void)
324 int i;
326 skip();
327 vflag++;
328 dfact = INCH; /*default scaling is points!*/
329 dfactd = 72;
330 res = VERT;
331 i = inumb(&lss);
332 if (nonumb)
333 i = lss1;
334 if (i < VERT)
335 i = VERT; /* was VERT */
336 lss1 = lss;
337 lss = i;
343 Tchar n_xlss(void)
345 /* stores \x'...' into
346 /* two successive Tchars.
347 /* the first contains HX, the second the value,
348 /* encoded as a vertical motion.
349 /* decoding is done in n2.c by pchar().
350 */
351 int i;
353 getch();
354 dfact = lss;
355 i = quant(atoi0(), VERT);
356 dfact = 1;
357 getch();
358 if (i >= 0)
359 *pbp++ = MOT | VMOT | i;
360 else
361 *pbp++ = MOT | VMOT | NMOT | -i;
362 return(HX);