1 /* 2 * @(#)tdef.h 2.4 (Berkeley) 11/3/90 3 */ 4 5 /* starting values for typesetting parameters: */ 6 7 #define PS 10 /* default point size */ 8 #define FT 1 /* default font position */ 9 #define ULFONT 2 /* default underline font */ 10 #define BDFONT 3 /* default emboldening font */ 11 #define BIFONT 4 /* default bold italic font */ 12 #define LL (unsigned) 65*INCH/10 /* line length; 39picas=6.5in */ 13 #define VS ((12*INCH)/72) /* initial vert space */ 14 15 #ifdef NROFF 16 # define EM t.Em 17 # define HOR t.Adj 18 # define VERT t.Vert 19 # define INCH 240 /* increments per inch */ 20 # define SPS INCH/10 /* space size */ 21 # define SS INCH/10 /* " */ 22 # define TRAILER 0 23 # define PO 0 /* page offset */ 24 # define ASCII 1 25 # define LG 0 26 # define DTAB 0 /* set at 8 Ems at init time */ 27 # define ICS 2*SPS 28 #endif 29 #ifndef NROFF /* TROFF */ 30 /* Inch is set by ptinit() when troff started. 31 /* all derived values set then too 32 */ 33 # define INCH Inch /* troff resolution -- number of goobies/inch */ 34 # define POINT (INCH/72) /* goobies per point (1/72 inch) */ 35 # define HOR Hor /* horizontal resolution in goobies */ 36 # define VERT Vert /* vertical resolution in goobies */ 37 # define SPS (EM/3) /* space size */ 38 # define SS 12 /* space size in 36ths of an em */ 39 # define PO (INCH) /* page offset 1 inch */ 40 /* # define EM (POINT * pts) */ 41 #define EM (((long) INCH * pts + 36) / 72) /* don't lose significance */ 42 #define EMPTS(pts) (((long) INCH * (pts) + 36) / 72) 43 # define ASCII 0 44 # define LG 1 45 # define DTAB (INCH/2) 46 # define ICS 3*SPS 47 #endif 48 49 /* These "characters" are used to encode various internal functions 50 /* Some make use of the fact that most ascii characters between 51 /* 0 and 040 don't have any graphic or other function. 52 /* The few that do have a purpose (e.g., \n, \b, \t, ... 53 /* are avoided by the ad hoc choices here. 54 /* See ifilt[] in n1.c for others -- 1, 2, 3, 5, 6, 7, 010, 011, 012 55 */ 56 57 #define LEADER 001 58 #define IMP 004 /* impossible char; glues things together */ 59 #define TAB 011 60 #define RPT 014 /* next character is to be repeated many times */ 61 #define CHARHT 015 /* size field sets character height */ 62 #define SLANT 016 /* size field sets amount of slant */ 63 #define DRAWFCN 017 /* next several chars describe arb drawing fcn */ 64 /* line: 'l' dx dy char */ 65 /* circle: 'c' r */ 66 /* ellipse: 'e' rx ry */ 67 /* arc: 'a' dx dy r */ 68 /* wiggly line '~' x y x y ... */ 69 #define DRAWLINE 'l' 70 #define DRAWCIRCLE 'c' /* circle */ 71 #define DRAWELLIPSE 'e' 72 #define DRAWARC 'a' /* arbitrary arc */ 73 #define DRAWSPLINE '~' /* quadratic B spline */ 74 75 #define LEFT 020 /* \{ */ 76 #define RIGHT 021 /* \} */ 77 #define FILLER 022 /* \& and similar purposes */ 78 #define XON 023 /* \X'...' starts here */ 79 #define OHC 024 /* optional hyphenation character \% */ 80 #define CONT 025 /* \c character */ 81 #define PRESC 026 /* printable escape */ 82 #define UNPAD 027 /* unpaddable blank */ 83 #define XPAR 030 /* transparent mode indicator */ 84 #define FLSS 031 85 #define WORDSP 032 /* paddable word space */ 86 #define ESC 033 87 #define XOFF 034 /* \X'...' ends here */ 88 89 #define iscontrol(n) (n==035 || n==036) /* used to test the next two */ 90 #define HX 035 /* next character is value of \x'...' */ 91 #define MAXFONTS 99 /* Max number of mounted fonts (in fontab) */ 92 93 #define HYPHEN c_hyphen 94 #define EMDASH c_emdash /* \(em */ 95 #define RULE c_rule /* \(ru */ 96 #define MINUS c_minus /* minus sign on current font */ 97 #define LIG_FI c_fi /* \(ff */ 98 #define LIG_FL c_fl /* \(fl */ 99 #define LIG_FF c_ff /* \(ff */ 100 #define LIG_FFI c_ffi /* \(Fi */ 101 #define LIG_FFL c_ffl /* \(Fl */ 102 #define ACUTE c_acute /* acute accent \(aa */ 103 #define GRAVE c_grave /* grave accent \(ga */ 104 #define UNDERLINE c_under /* \(ul */ 105 #define ROOTEN c_rooten /* root en \(rn */ 106 #define BOXRULE c_boxrule /* box rule \(br */ 107 #define LEFTHAND c_lefthand /* left hand for word overflow */ 108 #define DAGGER c_dagger /* dagger for footnotes */ 109 110 /* array sizes, and similar limits: */ 111 112 #define NFONT 128 /* maximum number of fonts (including specials) */ 113 #define NN 400 /* number registers */ 114 #define NNAMES 15 /* predefined reg names */ 115 #define NIF 15 /* if-else nesting */ 116 #define NS 128 /* name buffer */ 117 #define NTM 256 /* tm buffer */ 118 #define NEV 3 /* environments */ 119 #define EVLSZ 10 /* size of ev stack */ 120 #define DSIZE 2048 /* disk sector size in chars */ 121 122 #define NM 500 /* requests + macros */ 123 #define DELTA 8192 /* delta core bytes */ 124 #define NHYP 10 /* max hyphens per word */ 125 #define NHEX 128 /* byte size of exception word list */ 126 #define NTAB 40 /* tab stops */ 127 #define NSO 5 /* "so" depth */ 128 #define WDSIZE 270 /* word buffer size */ 129 #define LNSIZE 1024 /* line buffer size */ 130 #define NDI 5 /* number of diversions */ 131 #define NTRTAB 512 /* number of items in trtab[] */ 132 #define NWIDCACHE 512 /* number of items in widcache[] */ 133 #define NTRAP 20 /* number of traps */ 134 #define NPN 20 /* numbers in "-o" */ 135 #define FBUFSZ 256 /* field buf size words */ 136 #define IBUFSZ 8192 /* bytes */ 137 #define NC 1024 /* cbuf size words */ 138 #define NOV 10 /* number of overstrike chars */ 139 #define NPP 10 /* pads per field */ 140 141 /* 142 Internal character representation: 143 Internally, every character is carried around as 144 a 32 bit cookie, called a "tchar" (typedef long). 145 Bits are numbered 31..0 from left to right. 146 If bit 15 is 1, the character is motion, with 147 if bit 16 it's vertical motion 148 if bit 17 it's negative motion 149 If bit 15 is 0, the character is a real character. 150 if bit 31 zero motion 151 bits 30..24 size 152 bits 23..16 font 153 bit 8 absolute char number in 7..0 154 This implies at most 256-32 characters in a single font, 155 which is going to be a problem somewhere 156 */ 157 158 /* in the following, "L" should really be a tchar, but ... */ 159 160 #define MOT (01L<<15) /* motion character indicator */ 161 #define MOTV (07L<<15) /* clear for motion part */ 162 #define VMOT (01L<<16) /* vert motion bit */ 163 #define NMOT (01L<<17) /* negative motion indicator*/ 164 #define MAXMOT 32767 /* bad way to write this!!! */ 165 #define ismot(n) ((n) & MOT) 166 #define isvmot(n) ((n) & VMOT) /* must have tested MOT previously */ 167 #define isnmot(n) ((n) & NMOT) /* ditto */ 168 #define absmot(n) (unsigned)(0177777 & (n) & ~MOT) /* (short) is cheap mask */ 169 170 #define ZBIT (01L << 31) /* zero width char */ 171 #define iszbit(n) ((n) & ZBIT) 172 #define ABSCHAR 0400 /* absolute char number in this font */ 173 174 #define SMASK (0177L << 24) 175 #define FMASK (0377L << 16) 176 #define SFMASK (SMASK|FMASK) /* size and font in a tchar */ 177 #define sbits(n) (((n) >> 24) & 0177) 178 #define fbits(n) (((n) >> 16) & 0377) 179 #define sfbits(n) (unsigned)(0177777 & (((n) & SFMASK) >> 16)) 180 #define cbits(n) (unsigned)(0177777 & (n)) /* isolate bottom 16 bits */ 181 #define absbits(n) (cbits(n) & ~ABSCHAR) 182 183 #define setsbits(n,s) n = (n & ~SMASK) | (tchar)(s) << 24 184 #define setfbits(n,f) n = (n & ~FMASK) | (tchar)(f) << 16 185 #define setsfbits(n,sf) n = (n & ~SFMASK) | (tchar)(sf) << 16 186 #define setcbits(n,c) n = (n & ~077777L | (c)) /* set character bits */ 187 188 #define BYTEMASK 0377 189 #define BYTE 8 190 191 #define ZONE 5 /* 5 hrs for EST */ 192 #define TABMASK 037777 193 #define RTAB (unsigned) 0100000 194 #define CTAB 040000 195 196 #define TABBIT 02 /* bits in gchtab */ 197 #define LDRBIT 04 198 #define FCBIT 010 199 200 #define PAIR(A,B) (A|(B<<BYTE)) 201 202 #define oput(c) putc(c, ptid) 203 204 /* 205 * "temp file" parameters. macros and strings 206 * are stored in an array of linked blocks, 207 * which may be in memory if INCORE is set during 208 * compilation, or otherwise in a file. 209 * The numerology is delicate if filep is 16 bits: 210 #define BLK 128 211 #define NBLIST 512 212 * i.e., the product is 16 bits long. 213 214 * If filep is an unsigned long (and if your 215 * compiler will let you say that) then NBLIST 216 * can be a lot bigger. Of course that makes 217 * the file or core image a lot bigger too, 218 * and means you don't detect missing diversion 219 * terminations as quickly... . 220 * It also means that you may have trouble running 221 * on non-swapping systems, since the core image 222 * will be over 1Mb. 223 224 * In any case, both must be powers of 2. 225 */ 226 227 typedef unsigned int filep; /* this is good for 32 bit machines */ 228 229 #define BLK 128 /* alloc block in tchars */ 230 #ifdef SMALLER 231 232 #define NBLIST 1024 233 234 #else 235 236 #define NBLIST 2048 /* allocation list. smallish machines use 1024, bigger use 2048 */ 237 238 #endif 239 240 typedef long tchar; /* as an experiment */ 241 242 extern tchar getch(), getch0(); 243 extern tchar rbf(), rbf0(); 244 extern tchar mot(), hmot(), vmot(); 245 extern tchar makem(), sethl(); 246 extern tchar popi(); 247 extern tchar getlg(); 248 extern tchar xlss(); 249 extern tchar setfield(); 250 extern tchar setz(); 251 extern tchar setch(); 252 extern tchar setht(), setslant(); 253 254 extern long atoi0(); 255 256 extern int Inch, Hor, Vert, Unitwidth; 257 258 /* these characters are used as various signals or values 259 /* in miscellaneous places. 260 /* values are set in specnames in t10.c 261 */ 262 263 extern int c_hyphen; 264 extern int c_emdash; 265 extern int c_rule; 266 extern int c_minus; 267 extern int c_fi; 268 extern int c_fl; 269 extern int c_ff; 270 extern int c_ffi; 271 extern int c_ffl; 272 extern int c_acute; 273 extern int c_grave; 274 extern int c_under; 275 extern int c_rooten; 276 extern int c_boxrule; 277 extern int c_lefthand; 278 extern int c_dagger; 279 280 struct d { /* diversion */ 281 filep op; 282 int dnl; 283 int dimac; 284 int ditrap; 285 int ditf; 286 int alss; 287 int blss; 288 int nls; 289 int mkline; 290 int maxl; 291 int hnl; 292 int curd; 293 }; 294 295 struct s { /* stack frame */ 296 int nargs; 297 struct s *pframe; 298 filep pip; 299 int pnchar; 300 tchar prchar; 301 int ppendt; 302 tchar pch; 303 tchar *lastpbp; 304 int mname; 305 }; 306 307 extern struct contab { 308 unsigned short rq; 309 struct contab *link; 310 int (*f)(); 311 unsigned mx; 312 } contab[NM]; 313 314 extern struct numtab { 315 short r; /* name */ 316 short fmt; 317 short inc; 318 int val; 319 struct numtab *link; 320 } numtab[NN]; 321 322 #define PN 0 323 #define NL 1 324 #define YR 2 325 #define HP 3 326 #define CT 4 327 #define DN 5 328 #define MO 6 329 #define DY 7 330 #define DW 8 331 #define LN 9 332 #define DL 10 333 #define ST 11 334 #define SB 12 335 #define CD 13 336 #define PID 14 337 338 /* the infamous environment block */ 339 340 #define ics (env->_ics) 341 #define sps (env->_sps) 342 #define spacesz (env->_spacesz) 343 #define lss (env->_lss) 344 #define lss1 (env->_lss1) 345 #define ll (env->_ll) 346 #define ll1 (env->_ll1) 347 #define lt (env->_lt) 348 #define lt1 (env->_lt1) 349 #define ic (env->_ic) 350 #define icf (env->_icf) 351 #define chbits (env->_chbits) 352 #define spbits (env->_spbits) 353 #define nmbits (env->_nmbits) 354 #define apts (env->_apts) 355 #define apts1 (env->_apts1) 356 #define pts (env->_pts) 357 #define pts1 (env->_pts1) 358 #define font (env->_font) 359 #define font1 (env->_font1) 360 #define ls (env->_ls) 361 #define ls1 (env->_ls1) 362 #define ad (env->_ad) 363 #define nms (env->_nms) 364 #define ndf (env->_ndf) 365 #define fi (env->_fi) 366 #define cc (env->_cc) 367 #define c2 (env->_c2) 368 #define ohc (env->_ohc) 369 #define tdelim (env->_tdelim) 370 #define hyf (env->_hyf) 371 #define hyoff (env->_hyoff) 372 #define hyalg (env->_hyalg) 373 #define hyalg1 (env->_hyalg1) 374 #define thresh (env->_thresh) 375 #define un1 (env->_un1) 376 #define tabc (env->_tabc) 377 #define dotc (env->_dotc) 378 #define adsp (env->_adsp) 379 #define adrem (env->_adrem) 380 #define lastl (env->_lastl) 381 #define nel (env->_nel) 382 #define admod (env->_admod) 383 #define wordp (env->_wordp) 384 #define spflg (env->_spflg) 385 #define linep (env->_linep) 386 #define wdend (env->_wdend) 387 #define wdstart (env->_wdstart) 388 #define wne (env->_wne) 389 #define ne (env->_ne) 390 #define nc (env->_nc) 391 #define nb (env->_nb) 392 #define lnmod (env->_lnmod) 393 #define nwd (env->_nwd) 394 #define nn (env->_nn) 395 #define ni (env->_ni) 396 #define ul (env->_ul) 397 #define cu (env->_cu) 398 #define ce (env->_ce) 399 #define in (env->_in) 400 #define in1 (env->_in1) 401 #define un (env->_un) 402 #define wch (env->_wch) 403 #define pendt (env->_pendt) 404 #define pendw (env->_pendw) 405 #define pendnf (env->_pendnf) 406 #define spread (env->_spread) 407 #define it (env->_it) 408 #define itmac (env->_itmac) 409 #define lnsize (env->_lnsize) 410 #define hyptr (env->_hyptr) 411 #define tabtab (env->_tabtab) 412 #define line (env->_line) 413 #define word (env->_word) 414 415 /* 416 * Note (jaap) 417 * If this structure changes in ni.c, you should change 418 * this as well 419 */ 420 struct env { 421 int _ics; 422 int _sps; 423 int _spacesz; 424 int _lss; 425 int _lss1; 426 int _ll; 427 int _ll1; 428 int _lt; 429 int _lt1; 430 tchar _ic; 431 int _icf; 432 tchar _chbits; 433 tchar _spbits; 434 tchar _nmbits; 435 int _apts; 436 int _apts1; 437 int _pts; 438 int _pts1; 439 int _font; 440 int _font1; 441 int _ls; 442 int _ls1; 443 int _ad; 444 int _nms; 445 int _ndf; 446 int _fi; 447 int _cc; 448 int _c2; 449 int _ohc; 450 int _tdelim; 451 int _hyf; 452 int _hyoff; 453 int _hyalg; 454 int _hyalg1; 455 int _thresh; 456 int _un1; 457 int _tabc; 458 int _dotc; 459 int _adsp; 460 int _adrem; 461 int _lastl; 462 int _nel; 463 int _admod; 464 tchar *_wordp; 465 int _spflg; 466 tchar *_linep; 467 tchar *_wdend; 468 tchar *_wdstart; 469 int _wne; 470 int _ne; 471 int _nc; 472 int _nb; 473 int _lnmod; 474 int _nwd; 475 int _nn; 476 int _ni; 477 int _ul; 478 int _cu; 479 int _ce; 480 int _in; 481 int _in1; 482 int _un; 483 int _wch; 484 int _pendt; 485 tchar *_pendw; 486 int _pendnf; 487 int _spread; 488 int _it; 489 int _itmac; 490 int _lnsize; 491 tchar *_hyptr[NHYP]; 492 int _tabtab[NTAB]; 493 tchar _line[LNSIZE]; 494 tchar _word[WDSIZE]; 495 }; 496 497 extern struct env *env; 498 extern struct env env_array[]; 499 500 /* 501 * All changes will come after this comment (jaap) 502 */ 503 504 /* 505 * hyphenation dependent stuff (jaap) 506 */ 507 #define THRESH 160 /*digram goodness threshold (from n8.c, (jaap))*/ 508 #define DUTCH_THRESH 3 /* for recursive bestesplits (jaap) */ 509 510 #define ORIGINAL 0 /* original (American) English) algorithm */ 511 #define DUTCH 1 /* second hyphenation routine (bestesplits) */ 512 #define MAXDIALECTS 1 /* number of hyphenation algorithms */ 513 514 /* 515 * define enough space for the fontcache. EXTRAFONT is maximum space 516 * currently to be used by a font. The space for the fonttab is 517 * for the "logical to physical font table mapping addition (jaap). 518 */ 519 #define MAXCHARS 255 /* current maximum of characters in a font */ 520 521 #ifdef CWI 522 #define EXTRAFONT (3*MAXCHARS * sizeof(char) + dev.nchtab + (128-32) \ 523 * sizeof(char) + sizeof(struct Font) + 255 * sizeof(short)) 524 #else 525 #define EXTRAFONT (3*MAXCHARS * sizeof(char) + dev.nchtab + (128-32) \ 526 * sizeof(char) + sizeof(struct Font)) 527 #endif 528 529 #include <stdio.h> 530 #define fdprintf fprintf 531 #define flusho() 532