1 /* $Id: roff.h,v 1.58 2017/07/08 14:51:05 schwarze Exp $ */ 2 /* 3 * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 4 * Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 struct ohash; 20 struct mdoc_arg; 21 union mdoc_data; 22 23 enum roff_macroset { 24 MACROSET_NONE = 0, 25 MACROSET_MDOC, 26 MACROSET_MAN 27 }; 28 29 enum roff_sec { 30 SEC_NONE = 0, 31 SEC_NAME, 32 SEC_LIBRARY, 33 SEC_SYNOPSIS, 34 SEC_DESCRIPTION, 35 SEC_CONTEXT, 36 SEC_IMPLEMENTATION, /* IMPLEMENTATION NOTES */ 37 SEC_RETURN_VALUES, 38 SEC_ENVIRONMENT, 39 SEC_FILES, 40 SEC_EXIT_STATUS, 41 SEC_EXAMPLES, 42 SEC_DIAGNOSTICS, 43 SEC_COMPATIBILITY, 44 SEC_ERRORS, 45 SEC_SEE_ALSO, 46 SEC_STANDARDS, 47 SEC_HISTORY, 48 SEC_AUTHORS, 49 SEC_CAVEATS, 50 SEC_BUGS, 51 SEC_SECURITY, 52 SEC_CUSTOM, 53 SEC__MAX 54 }; 55 56 enum roff_type { 57 ROFFT_ROOT, 58 ROFFT_BLOCK, 59 ROFFT_HEAD, 60 ROFFT_BODY, 61 ROFFT_TAIL, 62 ROFFT_ELEM, 63 ROFFT_TEXT, 64 ROFFT_TBL, 65 ROFFT_EQN 66 }; 67 68 enum roff_tok { 69 ROFF_br = 0, 70 ROFF_ce, 71 ROFF_ft, 72 ROFF_ll, 73 ROFF_mc, 74 ROFF_po, 75 ROFF_rj, 76 ROFF_sp, 77 ROFF_ta, 78 ROFF_ti, 79 ROFF_MAX, 80 ROFF_ab, 81 ROFF_ad, 82 ROFF_af, 83 ROFF_aln, 84 ROFF_als, 85 ROFF_am, 86 ROFF_am1, 87 ROFF_ami, 88 ROFF_ami1, 89 ROFF_as, 90 ROFF_as1, 91 ROFF_asciify, 92 ROFF_backtrace, 93 ROFF_bd, 94 ROFF_bleedat, 95 ROFF_blm, 96 ROFF_box, 97 ROFF_boxa, 98 ROFF_bp, 99 ROFF_BP, 100 ROFF_break, 101 ROFF_breakchar, 102 ROFF_brnl, 103 ROFF_brp, 104 ROFF_brpnl, 105 ROFF_c2, 106 ROFF_cc, 107 ROFF_cf, 108 ROFF_cflags, 109 ROFF_ch, 110 ROFF_char, 111 ROFF_chop, 112 ROFF_class, 113 ROFF_close, 114 ROFF_CL, 115 ROFF_color, 116 ROFF_composite, 117 ROFF_continue, 118 ROFF_cp, 119 ROFF_cropat, 120 ROFF_cs, 121 ROFF_cu, 122 ROFF_da, 123 ROFF_dch, 124 ROFF_Dd, 125 ROFF_de, 126 ROFF_de1, 127 ROFF_defcolor, 128 ROFF_dei, 129 ROFF_dei1, 130 ROFF_device, 131 ROFF_devicem, 132 ROFF_di, 133 ROFF_do, 134 ROFF_ds, 135 ROFF_ds1, 136 ROFF_dwh, 137 ROFF_dt, 138 ROFF_ec, 139 ROFF_ecr, 140 ROFF_ecs, 141 ROFF_el, 142 ROFF_em, 143 ROFF_EN, 144 ROFF_eo, 145 ROFF_EP, 146 ROFF_EQ, 147 ROFF_errprint, 148 ROFF_ev, 149 ROFF_evc, 150 ROFF_ex, 151 ROFF_fallback, 152 ROFF_fam, 153 ROFF_fc, 154 ROFF_fchar, 155 ROFF_fcolor, 156 ROFF_fdeferlig, 157 ROFF_feature, 158 /* MAN_fi; ignored in mdoc(7) */ 159 ROFF_fkern, 160 ROFF_fl, 161 ROFF_flig, 162 ROFF_fp, 163 ROFF_fps, 164 ROFF_fschar, 165 ROFF_fspacewidth, 166 ROFF_fspecial, 167 ROFF_ftr, 168 ROFF_fzoom, 169 ROFF_gcolor, 170 ROFF_hc, 171 ROFF_hcode, 172 ROFF_hidechar, 173 ROFF_hla, 174 ROFF_hlm, 175 ROFF_hpf, 176 ROFF_hpfa, 177 ROFF_hpfcode, 178 ROFF_hw, 179 ROFF_hy, 180 ROFF_hylang, 181 ROFF_hylen, 182 ROFF_hym, 183 ROFF_hypp, 184 ROFF_hys, 185 ROFF_ie, 186 ROFF_if, 187 ROFF_ig, 188 /* MAN_in; ignored in mdoc(7) */ 189 ROFF_index, 190 ROFF_it, 191 ROFF_itc, 192 ROFF_IX, 193 ROFF_kern, 194 ROFF_kernafter, 195 ROFF_kernbefore, 196 ROFF_kernpair, 197 ROFF_lc, 198 ROFF_lc_ctype, 199 ROFF_lds, 200 ROFF_length, 201 ROFF_letadj, 202 ROFF_lf, 203 ROFF_lg, 204 ROFF_lhang, 205 ROFF_linetabs, 206 ROFF_lnr, 207 ROFF_lnrf, 208 ROFF_lpfx, 209 ROFF_ls, 210 ROFF_lsm, 211 ROFF_lt, 212 ROFF_mediasize, 213 ROFF_minss, 214 ROFF_mk, 215 ROFF_mso, 216 ROFF_na, 217 ROFF_ne, 218 /* MAN_nf; ignored in mdoc(7) */ 219 ROFF_nh, 220 ROFF_nhychar, 221 ROFF_nm, 222 ROFF_nn, 223 ROFF_nop, 224 ROFF_nr, 225 ROFF_nrf, 226 ROFF_nroff, 227 ROFF_ns, 228 ROFF_nx, 229 ROFF_open, 230 ROFF_opena, 231 ROFF_os, 232 ROFF_output, 233 ROFF_padj, 234 ROFF_papersize, 235 ROFF_pc, 236 ROFF_pev, 237 ROFF_pi, 238 ROFF_PI, 239 ROFF_pl, 240 ROFF_pm, 241 ROFF_pn, 242 ROFF_pnr, 243 ROFF_ps, 244 ROFF_psbb, 245 ROFF_pshape, 246 ROFF_pso, 247 ROFF_ptr, 248 ROFF_pvs, 249 ROFF_rchar, 250 ROFF_rd, 251 ROFF_recursionlimit, 252 ROFF_return, 253 ROFF_rfschar, 254 ROFF_rhang, 255 ROFF_rm, 256 ROFF_rn, 257 ROFF_rnn, 258 ROFF_rr, 259 ROFF_rs, 260 ROFF_rt, 261 ROFF_schar, 262 ROFF_sentchar, 263 ROFF_shc, 264 ROFF_shift, 265 ROFF_sizes, 266 ROFF_so, 267 ROFF_spacewidth, 268 ROFF_special, 269 ROFF_spreadwarn, 270 ROFF_ss, 271 ROFF_sty, 272 ROFF_substring, 273 ROFF_sv, 274 ROFF_sy, 275 ROFF_T_, 276 ROFF_tc, 277 ROFF_TE, 278 ROFF_TH, 279 ROFF_tkf, 280 ROFF_tl, 281 ROFF_tm, 282 ROFF_tm1, 283 ROFF_tmc, 284 ROFF_tr, 285 ROFF_track, 286 ROFF_transchar, 287 ROFF_trf, 288 ROFF_trimat, 289 ROFF_trin, 290 ROFF_trnt, 291 ROFF_troff, 292 ROFF_TS, 293 ROFF_uf, 294 ROFF_ul, 295 ROFF_unformat, 296 ROFF_unwatch, 297 ROFF_unwatchn, 298 ROFF_vpt, 299 ROFF_vs, 300 ROFF_warn, 301 ROFF_warnscale, 302 ROFF_watch, 303 ROFF_watchlength, 304 ROFF_watchn, 305 ROFF_wh, 306 ROFF_while, 307 ROFF_write, 308 ROFF_writec, 309 ROFF_writem, 310 ROFF_xflag, 311 ROFF_cblock, 312 ROFF_RENAMED, 313 ROFF_USERDEF, 314 TOKEN_NONE, 315 MDOC_Dd, 316 MDOC_Dt, 317 MDOC_Os, 318 MDOC_Sh, 319 MDOC_Ss, 320 MDOC_Pp, 321 MDOC_D1, 322 MDOC_Dl, 323 MDOC_Bd, 324 MDOC_Ed, 325 MDOC_Bl, 326 MDOC_El, 327 MDOC_It, 328 MDOC_Ad, 329 MDOC_An, 330 MDOC_Ap, 331 MDOC_Ar, 332 MDOC_Cd, 333 MDOC_Cm, 334 MDOC_Dv, 335 MDOC_Er, 336 MDOC_Ev, 337 MDOC_Ex, 338 MDOC_Fa, 339 MDOC_Fd, 340 MDOC_Fl, 341 MDOC_Fn, 342 MDOC_Ft, 343 MDOC_Ic, 344 MDOC_In, 345 MDOC_Li, 346 MDOC_Nd, 347 MDOC_Nm, 348 MDOC_Op, 349 MDOC_Ot, 350 MDOC_Pa, 351 MDOC_Rv, 352 MDOC_St, 353 MDOC_Va, 354 MDOC_Vt, 355 MDOC_Xr, 356 MDOC__A, 357 MDOC__B, 358 MDOC__D, 359 MDOC__I, 360 MDOC__J, 361 MDOC__N, 362 MDOC__O, 363 MDOC__P, 364 MDOC__R, 365 MDOC__T, 366 MDOC__V, 367 MDOC_Ac, 368 MDOC_Ao, 369 MDOC_Aq, 370 MDOC_At, 371 MDOC_Bc, 372 MDOC_Bf, 373 MDOC_Bo, 374 MDOC_Bq, 375 MDOC_Bsx, 376 MDOC_Bx, 377 MDOC_Db, 378 MDOC_Dc, 379 MDOC_Do, 380 MDOC_Dq, 381 MDOC_Ec, 382 MDOC_Ef, 383 MDOC_Em, 384 MDOC_Eo, 385 MDOC_Fx, 386 MDOC_Ms, 387 MDOC_No, 388 MDOC_Ns, 389 MDOC_Nx, 390 MDOC_Ox, 391 MDOC_Pc, 392 MDOC_Pf, 393 MDOC_Po, 394 MDOC_Pq, 395 MDOC_Qc, 396 MDOC_Ql, 397 MDOC_Qo, 398 MDOC_Qq, 399 MDOC_Re, 400 MDOC_Rs, 401 MDOC_Sc, 402 MDOC_So, 403 MDOC_Sq, 404 MDOC_Sm, 405 MDOC_Sx, 406 MDOC_Sy, 407 MDOC_Tn, 408 MDOC_Ux, 409 MDOC_Xc, 410 MDOC_Xo, 411 MDOC_Fo, 412 MDOC_Fc, 413 MDOC_Oo, 414 MDOC_Oc, 415 MDOC_Bk, 416 MDOC_Ek, 417 MDOC_Bt, 418 MDOC_Hf, 419 MDOC_Fr, 420 MDOC_Ud, 421 MDOC_Lb, 422 MDOC_Lp, 423 MDOC_Lk, 424 MDOC_Mt, 425 MDOC_Brq, 426 MDOC_Bro, 427 MDOC_Brc, 428 MDOC__C, 429 MDOC_Es, 430 MDOC_En, 431 MDOC_Dx, 432 MDOC__Q, 433 MDOC__U, 434 MDOC_Ta, 435 MDOC_MAX, 436 MAN_TH, 437 MAN_SH, 438 MAN_SS, 439 MAN_TP, 440 MAN_LP, 441 MAN_PP, 442 MAN_P, 443 MAN_IP, 444 MAN_HP, 445 MAN_SM, 446 MAN_SB, 447 MAN_BI, 448 MAN_IB, 449 MAN_BR, 450 MAN_RB, 451 MAN_R, 452 MAN_B, 453 MAN_I, 454 MAN_IR, 455 MAN_RI, 456 MAN_nf, 457 MAN_fi, 458 MAN_RE, 459 MAN_RS, 460 MAN_DT, 461 MAN_UC, 462 MAN_PD, 463 MAN_AT, 464 MAN_in, 465 MAN_OP, 466 MAN_EX, 467 MAN_EE, 468 MAN_UR, 469 MAN_UE, 470 MAN_MT, 471 MAN_ME, 472 MAN_MAX 473 }; 474 475 enum roff_next { 476 ROFF_NEXT_SIBLING = 0, 477 ROFF_NEXT_CHILD 478 }; 479 480 /* 481 * Indicates that a BODY's formatting has ended, but 482 * the scope is still open. Used for badly nested blocks. 483 */ 484 enum mdoc_endbody { 485 ENDBODY_NOT = 0, 486 ENDBODY_SPACE /* Is broken: append a space. */ 487 }; 488 489 struct roff_node { 490 struct roff_node *parent; /* Parent AST node. */ 491 struct roff_node *child; /* First child AST node. */ 492 struct roff_node *last; /* Last child AST node. */ 493 struct roff_node *next; /* Sibling AST node. */ 494 struct roff_node *prev; /* Prior sibling AST node. */ 495 struct roff_node *head; /* BLOCK */ 496 struct roff_node *body; /* BLOCK/ENDBODY */ 497 struct roff_node *tail; /* BLOCK */ 498 struct mdoc_arg *args; /* BLOCK/ELEM */ 499 union mdoc_data *norm; /* Normalized arguments. */ 500 char *string; /* TEXT */ 501 const struct tbl_span *span; /* TBL */ 502 struct eqn_box *eqn; /* EQN */ 503 int line; /* Input file line number. */ 504 int pos; /* Input file column number. */ 505 int flags; 506 #define NODE_VALID (1 << 0) /* Has been validated. */ 507 #define NODE_ENDED (1 << 1) /* Gone past body end mark. */ 508 #define NODE_EOS (1 << 2) /* At sentence boundary. */ 509 #define NODE_LINE (1 << 3) /* First macro/text on line. */ 510 #define NODE_SYNPRETTY (1 << 4) /* SYNOPSIS-style formatting. */ 511 #define NODE_BROKEN (1 << 5) /* Must validate parent when ending. */ 512 #define NODE_DELIMO (1 << 6) 513 #define NODE_DELIMC (1 << 7) 514 #define NODE_NOSRC (1 << 8) /* Generated node, not in input file. */ 515 #define NODE_NOPRT (1 << 9) /* Shall not print anything. */ 516 int prev_font; /* Before entering this node. */ 517 int aux; /* Decoded node data, type-dependent. */ 518 enum roff_tok tok; /* Request or macro ID. */ 519 enum roff_type type; /* AST node type. */ 520 enum roff_sec sec; /* Current named section. */ 521 enum mdoc_endbody end; /* BODY */ 522 }; 523 524 struct roff_meta { 525 char *msec; /* Manual section, usually a digit. */ 526 char *vol; /* Manual volume title. */ 527 char *os; /* Operating system. */ 528 char *arch; /* Machine architecture. */ 529 char *title; /* Manual title, usually CAPS. */ 530 char *name; /* Leading manual name. */ 531 char *date; /* Normalized date. */ 532 int hasbody; /* Document is not empty. */ 533 int rcsids; /* Bits indexed by enum mandoc_os. */ 534 enum mandoc_os os_e; /* Operating system. */ 535 }; 536 537 struct roff_man { 538 struct roff_meta meta; /* Document meta-data. */ 539 struct mparse *parse; /* Parse pointer. */ 540 struct roff *roff; /* Roff parser state data. */ 541 struct ohash *mdocmac; /* Mdoc macro lookup table. */ 542 struct ohash *manmac; /* Man macro lookup table. */ 543 const char *os_s; /* Default operating system. */ 544 struct roff_node *first; /* The first node parsed. */ 545 struct roff_node *last; /* The last node parsed. */ 546 struct roff_node *last_es; /* The most recent Es node. */ 547 int quick; /* Abort parse early. */ 548 int flags; /* Parse flags. */ 549 #define MDOC_LITERAL (1 << 1) /* In a literal scope. */ 550 #define MDOC_PBODY (1 << 2) /* In the document body. */ 551 #define MDOC_NEWLINE (1 << 3) /* First macro/text in a line. */ 552 #define MDOC_PHRASE (1 << 4) /* In a Bl -column phrase. */ 553 #define MDOC_PHRASELIT (1 << 5) /* Literal within a phrase. */ 554 #define MDOC_FREECOL (1 << 6) /* `It' invocation should close. */ 555 #define MDOC_SYNOPSIS (1 << 7) /* SYNOPSIS-style formatting. */ 556 #define MDOC_KEEP (1 << 8) /* In a word keep. */ 557 #define MDOC_SMOFF (1 << 9) /* Spacing is off. */ 558 #define MDOC_NODELIMC (1 << 10) /* Disable closing delimiter handling. */ 559 #define MAN_ELINE (1 << 11) /* Next-line element scope. */ 560 #define MAN_BLINE (1 << 12) /* Next-line block scope. */ 561 #define MDOC_PHRASEQF (1 << 13) /* Quote first word encountered. */ 562 #define MDOC_PHRASEQL (1 << 14) /* Quote last word of this phrase. */ 563 #define MDOC_PHRASEQN (1 << 15) /* Quote first word of the next phrase. */ 564 #define MAN_LITERAL MDOC_LITERAL 565 #define MAN_NEWLINE MDOC_NEWLINE 566 enum roff_macroset macroset; /* Kind of high-level macros used. */ 567 enum roff_sec lastsec; /* Last section seen. */ 568 enum roff_sec lastnamed; /* Last standard section seen. */ 569 enum roff_next next; /* Where to put the next node. */ 570 }; 571 572 extern const char *const *roff_name; 573 574 575 void deroff(char **, const struct roff_node *); 576 struct ohash *roffhash_alloc(enum roff_tok, enum roff_tok); 577 enum roff_tok roffhash_find(struct ohash *, const char *, size_t); 578 void roffhash_free(struct ohash *); 579 void roff_validate(struct roff_man *); 580