|  | #include "tdef.h" | 
|  | #include "ext.h" | 
|  | #include "fns.h" | 
|  | #include <ctype.h> | 
|  |  | 
|  | /* | 
|  | * n6.c -- width functions, sizes and fonts | 
|  | */ | 
|  |  | 
|  | int | 
|  | 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[SB].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; | 
|  |  | 
|  | j = 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); | 
|  | } |