n6.c - 9base - revived minimalist port of Plan 9 userland to Unix
 (HTM) git clone git://git.suckless.org/9base
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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 properly */
           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))) {        /* \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();
          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, savpts1;
          165 
          166         base = numtabp[ST].val = numtabp[ST].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;
          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 }