Introduction
Introduction Statistics Contact Development Disclaimer Help
n6.c - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
n6.c (4870B)
---
1 #include "tdef.h"
2 #include "ext.h"
3 #include "fns.h"
4 #include <ctype.h>
5
6 /*
7 * n6.c -- width functions, sizes and fonts
8 */
9
10 int
11 n_width(Tchar j)
12 {
13 int i, k;
14
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 prop…
41 else
42 k = t.tfont.wp[i].wid * t.Char;
43 widthp = k;
44 return(k);
45 }
46
47
48 Tchar n_setch(int c)
49 {
50 return t_setch(c);
51 }
52
53 Tchar n_setabs(void) /* set absolute char from \N'...' */
54 { /* for now, a no-op */
55 return t_setabs();
56 }
57
58 int n_findft(int i)
59 {
60 int k;
61
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 }
69
70
71
72 void n_mchbits(void)
73 {
74 chbits = 0;
75 setfbits(chbits, font);
76 sps = width(' ' | chbits);
77 }
78
79
80 void n_setps(void )
81 {
82 int i, j;
83
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))) {…
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();
102 }
103 }
104 }
105
106
107 Tchar n_setht(void) /* set character height from \H'...' …
108 {
109
110 getch();
111 inumb(&apts);
112 getch();
113 return(0);
114 }
115
116
117 Tchar n_setslant(void) /* set slant from \S'...' */
118 {
119 int n;
120
121 getch();
122 n = 0;
123 n = inumb(&n);
124 getch();
125 return(0);
126 }
127
128
129 void n_caseft(void)
130 {
131 skip();
132 setfont(1);
133 }
134
135
136 void n_setfont(int a)
137 {
138 int i, j;
139
140 if (a)
141 i = getrq();
142 else
143 i = getsn();
144 if (!i || i == 'P') {
145 j = font1;
146 goto s0;
147 }
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();
156 }
157
158
159 void n_setwd(void)
160 {
161 int base, wid;
162 Tchar i;
163 int delim, emsz, k;
164 int savhp, savapts, savapts1, savfont, savfont1, savpts, …
165
166 base = numtabp[ST].val = numtabp[ST].val = wid = numtabp[CT].val…
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;
197 }
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;
208 }
209
210
211 Tchar n_vmot(void)
212 {
213 dfact = lss;
214 vflag++;
215 return n_mot();
216 }
217
218
219 Tchar n_hmot(void)
220 {
221 dfact = EM;
222 return n_mot();
223 }
224
225
226 Tchar n_mot(void)
227 {
228 int j, n;
229 Tchar i;
230
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);
243 }
244
245
246 Tchar n_sethl(int k)
247 {
248 int j;
249 Tchar i;
250
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);
260 }
261
262
263 Tchar n_makem(int i)
264 {
265 Tchar j;
266
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);
277 }
278
279
280 void n_casefp(void)
281 {
282 int i, j;
283
284 skip();
285 if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
286 return;
287 if (skip() || !(j = getrq()))
288 return;
289 fontlab[i] = j;
290 }
291
292
293
294 void n_casebd(void)
295 {
296 int i, j, k;
297
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;
305 }
306 if (j == smnt) {
307 k = smnt;
308 goto bd0;
309 }
310 if (k) {
311 sbold = j;
312 j = k;
313 }
314 bd1:
315 skip();
316 noscale++;
317 bdtab[j] = atoi0();
318 noscale = 0;
319 }
320
321
322 void n_casevs(void)
323 {
324 int i;
325
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;
338 }
339
340
341
342
343 Tchar n_xlss(void)
344 {
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;
352
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);
363 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.