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 fonts8 */10 int11 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 else42 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();102 }103 }104 }107 Tchar n_setht(void) /* set character height from \H'...' */108 {110 getch();111 inumb(&apts);112 getch();113 return(0);114 }117 Tchar n_setslant(void) /* set slant from \S'...' */118 {119 int n;121 getch();122 n = 0;123 n = inumb(&n);124 getch();125 return(0);126 }129 void n_caseft(void)130 {131 skip();132 setfont(1);133 }136 void n_setfont(int a)137 {138 int i, j;140 if (a)141 i = getrq();142 else143 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 }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;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 } else192 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 }211 Tchar n_vmot(void)212 {213 dfact = lss;214 vflag++;215 return n_mot();216 }219 Tchar n_hmot(void)220 {221 dfact = EM;222 return n_mot();223 }226 Tchar n_mot(void)227 {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 } else238 i = 0;239 getch();240 vflag = 0;241 dfact = 1;242 return(i);243 }246 Tchar n_sethl(int k)247 {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);260 }263 Tchar n_makem(int i)264 {265 Tchar j;267 if (i >= 0)268 j = i;269 else270 j = -i;271 j |= MOT;272 if (i < 0)273 j |= NMOT;274 if (vflag)275 j |= VMOT;276 return(j);277 }280 void n_casefp(void)281 {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;290 }294 void n_casebd(void)295 {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 else304 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 }322 void n_casevs(void)323 {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;338 }343 Tchar n_xlss(void)344 {345 /* stores \x'...' into346 /* 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 else361 *pbp++ = MOT | VMOT | NMOT | -i;362 return(HX);363 }