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