diff options
Diffstat (limited to 'src/cmd/troff/n6.c')
-rw-r--r-- | src/cmd/troff/n6.c | 362 |
1 files changed, 362 insertions, 0 deletions
diff --git a/src/cmd/troff/n6.c b/src/cmd/troff/n6.c new file mode 100644 index 00000000..e4affa17 --- /dev/null +++ b/src/cmd/troff/n6.c @@ -0,0 +1,362 @@ +#include "tdef.h" +#include "ext.h" +#include "fns.h" +#include <ctype.h> + +/* + * n6.c -- width functions, sizes and fonts +*/ + +n_width(Tchar j) +{ + int i, k; + + if (iszbit(j)) + return 0; + if (ismot(j)) { + if (isvmot(j)) + return(0); + k = absmot(j); + if (isnmot(j)) + k = -k; + return(k); + } + i = cbits(j); + if (i < ' ') { + if (i == '\b') + return(-widthp); + if (i == PRESC) + i = eschar; + else if (i == HX) + return(0); + } + if (i == ohc) + return(0); + i = trtab[i]; + if (i < ' ') + return(0); + if (i >= t.tfont.nchars) /* not on the font */ + k = t.Char; /* really ought to check properly */ + else + k = t.tfont.wp[i].wid * t.Char; + widthp = k; + return(k); +} + + +Tchar n_setch(int c) +{ + return t_setch(c); +} + +Tchar n_setabs(void) /* set absolute char from \N'...' */ +{ /* for now, a no-op */ + return t_setabs(); +} + +int n_findft(int i) +{ + int k; + + if ((k = i - '0') >= 0 && k <= nfonts && k < smnt) + return(k); + for (k = 0; fontlab[k] != i; k++) + if (k > nfonts) + return(-1); + return(k); +} + + + +void n_mchbits(void) +{ + chbits = 0; + setfbits(chbits, font); + sps = width(' ' | chbits); +} + + +void n_setps(void ) +{ + int i, j; + + i = cbits(getch()); + if (isdigit(i)) { /* \sd or \sdd */ + i -= '0'; + if (i == 0) /* \s0 */ + ; + else if (i <= 3 && (ch=getch()) && isdigit(cbits(ch))) { /* \sdd */ + ch = 0; + } + } else if (i == '(') { /* \s(dd */ + getch(); + getch(); + } else if (i == '+' || i == '-') { /* \s+, \s- */ + j = cbits(getch()); + if (isdigit(j)) { /* \s+d, \s-d */ + ; + } else if (j == '(') { /* \s+(dd, \s-(dd */ + getch(); + getch(); + } + } +} + + +Tchar n_setht(void) /* set character height from \H'...' */ +{ + + getch(); + inumb(&apts); + getch(); + return(0); +} + + +Tchar n_setslant(void) /* set slant from \S'...' */ +{ + int n; + + getch(); + n = 0; + n = inumb(&n); + getch(); + return(0); +} + + +void n_caseft(void) +{ + skip(); + setfont(1); +} + + +void n_setfont(int a) +{ + int i, j; + + if (a) + i = getrq(); + else + i = getsn(); + if (!i || i == 'P') { + j = font1; + goto s0; + } + if (i == 'S' || i == '0') + return; + if ((j = findft(i)) == -1) + return; +s0: + font1 = font; + font = j; + mchbits(); +} + + +void n_setwd(void) +{ + int base, wid; + Tchar i; + int delim, emsz, k; + int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1; + + base = numtabp[ST].val = numtabp[ST].val = wid = numtabp[CT].val = 0; + if (ismot(i = getch())) + return; + delim = cbits(i); + savhp = numtabp[HP].val; + numtabp[HP].val = 0; + savapts = apts; + savapts1 = apts1; + savfont = font; + savfont1 = font1; + savpts = pts; + savpts1 = pts1; + setwdf++; + while (cbits(i = getch()) != delim && !nlflg) { + k = width(i); + wid += k; + numtabp[HP].val += k; + if (!ismot(i)) { + emsz = (INCH * pts + 36) / 72; + } else if (isvmot(i)) { + k = absmot(i); + if (isnmot(i)) + k = -k; + base -= k; + emsz = 0; + } else + continue; + if (base < numtabp[SB].val) + numtabp[SB].val = base; + if ((k = base + emsz) > numtabp[ST].val) + numtabp[ST].val = k; + } + setn1(wid, 0, (Tchar) 0); + numtabp[HP].val = savhp; + apts = savapts; + apts1 = savapts1; + font = savfont; + font1 = savfont1; + pts = savpts; + pts1 = savpts1; + mchbits(); + setwdf = 0; +} + + +Tchar n_vmot(void) +{ + dfact = lss; + vflag++; + return n_mot(); +} + + +Tchar n_hmot(void) +{ + dfact = EM; + return n_mot(); +} + + +Tchar n_mot(void) +{ + int j, n; + Tchar i; + + j = HOR; + getch(); /*eat delim*/ + if (n = atoi0()) { + if (vflag) + j = VERT; + i = makem(quant(n, j)); + } else + i = 0; + getch(); + vflag = 0; + dfact = 1; + return(i); +} + + +Tchar n_sethl(int k) +{ + int j; + Tchar i; + + j = t.Halfline; + if (k == 'u') + j = -j; + else if (k == 'r') + j = -2 * j; + vflag++; + i = makem(j); + vflag = 0; + return(i); +} + + +Tchar n_makem(int i) +{ + Tchar j; + + if (i >= 0) + j = i; + else + j = -i; + j |= MOT; + if (i < 0) + j |= NMOT; + if (vflag) + j |= VMOT; + return(j); +} + + +void n_casefp(void) +{ + int i, j; + + skip(); + if ((i = cbits(getch()) - '0') < 0 || i > nfonts) + return; + if (skip() || !(j = getrq())) + return; + fontlab[i] = j; +} + + + +void n_casebd(void) +{ + int i, j, k; + + k = 0; +bd0: + if (skip() || !(i = getrq()) || (j = findft(i)) == -1) { + if (k) + goto bd1; + else + return; + } + if (j == smnt) { + k = smnt; + goto bd0; + } + if (k) { + sbold = j; + j = k; + } +bd1: + skip(); + noscale++; + bdtab[j] = atoi0(); + noscale = 0; +} + + +void n_casevs(void) +{ + int i; + + skip(); + vflag++; + dfact = INCH; /*default scaling is points!*/ + dfactd = 72; + res = VERT; + i = inumb(&lss); + if (nonumb) + i = lss1; + if (i < VERT) + i = VERT; /* was VERT */ + lss1 = lss; + lss = i; +} + + + + +Tchar n_xlss(void) +{ + /* stores \x'...' into + /* two successive Tchars. + /* the first contains HX, the second the value, + /* encoded as a vertical motion. + /* decoding is done in n2.c by pchar(). + */ + int i; + + getch(); + dfact = lss; + i = quant(atoi0(), VERT); + dfact = 1; + getch(); + if (i >= 0) + *pbp++ = MOT | VMOT | i; + else + *pbp++ = MOT | VMOT | NMOT | -i; + return(HX); +} |