1 #ifndef lint 2 static char sccsid[]="@(#)n6.c 1.1 (CWI) 86/08/14"; 3 #endif 4 5 #include "tdef.h" 6 #include "tw.h" 7 #include "ext.h" 8 #include <ctype.h> 9 10 /* 11 * n6.c -- width functions, sizes and fonts 12 */ 13 14 int bdtab[NFONT+1] ={ 0, 0, 0, 3, 3, 0, }; 15 int sbold = 0; 16 int fontlab[NFONT+1] = { 0, 'R', 'I', 'B', PAIR('B','I'), 'S', 0 }; 17 18 width(j) 19 register tchar j; 20 { 21 register i, k; 22 23 if (j & (ZBIT|MOT)) { 24 if (iszbit(j)) 25 return(0); 26 if (isvmot(j)) 27 return(0); 28 k = absmot(j); 29 if (isnmot(j)) 30 k = -k; 31 return(k); 32 } 33 i = cbits(j); 34 if (i < ' ') { 35 if (i == '\b') 36 return(-widthp); 37 if (i == PRESC) 38 i = eschar; 39 else if (iscontrol(i)) 40 return(0); 41 } 42 if (i==ohc) 43 return(0); 44 i = trtab[i]; 45 if (i < 32) 46 return(0); 47 k = t.width[i] * t.Char; 48 widthp = k; 49 return(k); 50 } 51 52 53 tchar setch() 54 { 55 register j; 56 char temp[10]; 57 register char *s; 58 59 s = temp; 60 if ((*s++ = getach()) == 0 || (*s++ = getach()) == 0) 61 return(0); 62 *s = '\0'; 63 if ((j = findch(temp)) > 0) 64 return j | chbits; 65 else 66 return 0; 67 } 68 69 tchar setabs() /* set absolute char from \C'...' */ 70 { /* for now, a no-op */ 71 int i, n, nf; 72 73 getch(); 74 n = 0; 75 n = inumb(&n); 76 getch(); 77 return ' '; 78 } 79 80 findft(i) 81 register int i; 82 { 83 register k; 84 85 if ((k = i - '0') >= 0 && k <= nfonts && k < smnt) 86 return(k); 87 for (k = 0; fontlab[k] != i; k++) 88 if (k > nfonts) 89 return(-1); 90 return(k); 91 } 92 93 94 caseps() 95 { 96 } 97 98 99 mchbits() 100 { 101 chbits = 0; 102 setfbits(chbits, font); 103 sps = width(' ' | chbits); 104 } 105 106 107 setps() 108 { 109 register i, j; 110 111 i = cbits(getch()); 112 if (isdigit(i)) { /* \sd or \sdd */ 113 i -= '0'; 114 if (i == 0) /* \s0 */ 115 ; 116 else if (i <= 3 && isdigit(j = cbits(ch=getch()))) { /* \sdd */ 117 ch = 0; 118 } 119 } else if (i == '(') { /* \s(dd */ 120 getch(); 121 getch(); 122 } else if (i == '+' || i == '-') { /* \s+, \s- */ 123 j = cbits(getch()); 124 if (isdigit(j)) { /* \s+d, \s-d */ 125 ; 126 } else if (j == '(') { /* \s+(dd, \s-(dd */ 127 getch(); 128 getch(); 129 } 130 } 131 } 132 133 134 oldsetps() 135 { 136 int i, j, k; 137 138 if (((i = cbits(getch())) == '+' || i == '-') && (j = cbits(ch = getch()) - '0') >= 0 && j <= 9) { 139 if (i == '-') 140 j = -j; 141 ch = 0; 142 return; 143 } 144 if ((i -= '0') == 0) { 145 return; 146 } 147 if (i > 0 && i <= 9) { 148 /* removed if (i <= 3 && */ 149 /* didn't work!!!! */ 150 if (i <= 3 && (j = cbits(ch = getch()) - '0') >= 0 && j <= 9) { 151 i = 10 * i + j; 152 ch = 0; 153 } 154 } 155 } 156 157 158 tchar setht() /* set character height from \H'...' */ 159 { 160 int n; 161 tchar c; 162 163 getch(); 164 n = inumb(&apts); 165 getch(); 166 return(0); 167 } 168 169 170 tchar setslant() /* set slant from \S'...' */ 171 { 172 int n; 173 tchar c; 174 175 getch(); 176 n = 0; 177 n = inumb(&n); 178 getch(); 179 return(0); 180 } 181 182 183 caseft() 184 { 185 skip(); 186 setfont(1); 187 } 188 189 190 setfont(a) 191 int a; 192 { 193 register i, j; 194 195 if (a) 196 i = getrq(); 197 else 198 i = getsn(); 199 if (!i || i == 'P') { 200 j = font1; 201 goto s0; 202 } 203 if (i == 'S' || i == '0') 204 return; 205 if ((j = findft(i, fontlab)) == -1) 206 return; 207 s0: 208 font1 = font; 209 font = j; 210 mchbits(); 211 } 212 213 214 setwd() 215 { 216 register base, wid; 217 register tchar i; 218 int delim, emsz, k; 219 int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1; 220 221 base = numtab[ST].val = numtab[ST].val = wid = numtab[CT].val = 0; 222 if (ismot(i = getch())) 223 return; 224 delim = cbits(i); 225 savhp = numtab[HP].val; 226 numtab[HP].val = 0; 227 savapts = apts; 228 savapts1 = apts1; 229 savfont = font; 230 savfont1 = font1; 231 savpts = pts; 232 savpts1 = pts1; 233 setwdf++; 234 while (cbits(i = getch()) != delim && !nlflg) { 235 k = width(i); 236 wid += k; 237 numtab[HP].val += k; 238 if (!ismot(i)) { 239 emsz = (INCH * pts + 36) / 72; 240 } else if (isvmot(i)) { 241 k = absmot(i); 242 if (isnmot(i)) 243 k = -k; 244 base -= k; 245 emsz = 0; 246 } else 247 continue; 248 if (base < numtab[SB].val) 249 numtab[SB].val = base; 250 if ((k = base + emsz) > numtab[ST].val) 251 numtab[ST].val = k; 252 } 253 setn1(wid, 0, (tchar) 0); 254 numtab[HP].val = savhp; 255 apts = savapts; 256 apts1 = savapts1; 257 font = savfont; 258 font1 = savfont1; 259 pts = savpts; 260 pts1 = savpts1; 261 mchbits(); 262 setwdf = 0; 263 } 264 265 266 tchar vmot() 267 { 268 dfact = lss; 269 vflag++; 270 return(mot()); 271 } 272 273 274 tchar hmot() 275 { 276 dfact = EM; 277 return(mot()); 278 } 279 280 281 tchar mot() 282 { 283 register int j, n; 284 register tchar i; 285 286 j = HOR; 287 getch(); /*eat delim*/ 288 if (n = atoi()) { 289 if (vflag) 290 j = VERT; 291 i = makem(quant(n, j)); 292 } else 293 i = 0; 294 getch(); 295 vflag = 0; 296 dfact = 1; 297 return(i); 298 } 299 300 301 tchar sethl(k) 302 int k; 303 { 304 register j; 305 tchar i; 306 307 j = t.Halfline; 308 if (k == 'u') 309 j = -j; 310 else if (k == 'r') 311 j = -2 * j; 312 vflag++; 313 i = makem(j); 314 vflag = 0; 315 return(i); 316 } 317 318 319 tchar makem(i) 320 int i; 321 { 322 register tchar j; 323 324 if ((j = i) < 0) 325 j = -j; 326 j |= MOT; 327 if (i < 0) 328 j |= NMOT; 329 if (vflag) 330 j |= VMOT; 331 return(j); 332 } 333 334 335 tchar getlg(i) 336 tchar i; 337 { 338 return(i); 339 } 340 341 342 caselg() 343 { 344 } 345 346 347 casefp() 348 { 349 register i, j; 350 351 skip(); 352 if ((i = cbits(getch()) - '0') < 0 || i > nfonts) 353 return; 354 if (skip() || !(j = getrq())) 355 return; 356 fontlab[i] = j; 357 } 358 359 360 casecs() 361 { 362 } 363 364 365 casebd() 366 { 367 register i, j, k; 368 369 k = 0; 370 bd0: 371 if (skip() || !(i = getrq()) || (j = findft(i)) == -1) { 372 if (k) 373 goto bd1; 374 else 375 return; 376 } 377 if (j == smnt) { 378 k = smnt; 379 goto bd0; 380 } 381 if (k) { 382 sbold = j; 383 j = k; 384 } 385 bd1: 386 skip(); 387 noscale++; 388 bdtab[j] = atoi(); 389 noscale = 0; 390 } 391 392 393 casevs() 394 { 395 register i; 396 397 skip(); 398 vflag++; 399 dfact = INCH; /*default scaling is points!*/ 400 dfactd = 72; 401 res = VERT; 402 i = inumb(&lss); 403 if (nonumb) 404 i = lss1; 405 if (i < VERT) 406 i = 0; /* was VERT */ 407 lss1 = lss; 408 lss = i; 409 } 410 411 412 413 414 casess() 415 { 416 } 417 418 419 tchar xlss() 420 { 421 /* stores \x'...' into 422 /* two successive tchars. 423 /* the first contains HX, the second the value, 424 /* encoded as a vertical motion. 425 /* decoding is done in n2.c by pchar(). 426 */ 427 int i; 428 429 getch(); 430 dfact = lss; 431 i = quant(atoi(), VERT); 432 dfact = 1; 433 getch(); 434 if (i >= 0) 435 *pbp++ = MOT | VMOT | i; 436 else 437 *pbp++ = MOT | VMOT | NMOT | -i; 438 return(HX); 439 } 440