1241675Suqs/* $Id: mdoc.h,v 1.122 2011/03/22 14:05:45 kristaps Exp $ */ 2241675Suqs/* 3241675Suqs * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 4241675Suqs * 5241675Suqs * Permission to use, copy, modify, and distribute this software for any 6241675Suqs * purpose with or without fee is hereby granted, provided that the above 7241675Suqs * copyright notice and this permission notice appear in all copies. 8241675Suqs * 9241675Suqs * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10241675Suqs * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11241675Suqs * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12241675Suqs * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13241675Suqs * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14241675Suqs * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15241675Suqs * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16241675Suqs */ 17241675Suqs#ifndef MDOC_H 18241675Suqs#define MDOC_H 19241675Suqs 20241675Suqsenum mdoct { 21241675Suqs MDOC_Ap = 0, 22241675Suqs MDOC_Dd, 23241675Suqs MDOC_Dt, 24241675Suqs MDOC_Os, 25241675Suqs MDOC_Sh, 26241675Suqs MDOC_Ss, 27241675Suqs MDOC_Pp, 28241675Suqs MDOC_D1, 29241675Suqs MDOC_Dl, 30241675Suqs MDOC_Bd, 31241675Suqs MDOC_Ed, 32241675Suqs MDOC_Bl, 33241675Suqs MDOC_El, 34241675Suqs MDOC_It, 35241675Suqs MDOC_Ad, 36241675Suqs MDOC_An, 37241675Suqs MDOC_Ar, 38241675Suqs MDOC_Cd, 39241675Suqs MDOC_Cm, 40241675Suqs MDOC_Dv, 41241675Suqs MDOC_Er, 42241675Suqs MDOC_Ev, 43241675Suqs MDOC_Ex, 44241675Suqs MDOC_Fa, 45241675Suqs MDOC_Fd, 46241675Suqs MDOC_Fl, 47241675Suqs MDOC_Fn, 48241675Suqs MDOC_Ft, 49241675Suqs MDOC_Ic, 50241675Suqs MDOC_In, 51241675Suqs MDOC_Li, 52241675Suqs MDOC_Nd, 53241675Suqs MDOC_Nm, 54241675Suqs MDOC_Op, 55241675Suqs MDOC_Ot, 56241675Suqs MDOC_Pa, 57241675Suqs MDOC_Rv, 58241675Suqs MDOC_St, 59241675Suqs MDOC_Va, 60241675Suqs MDOC_Vt, 61241675Suqs MDOC_Xr, 62241675Suqs MDOC__A, 63241675Suqs MDOC__B, 64241675Suqs MDOC__D, 65241675Suqs MDOC__I, 66241675Suqs MDOC__J, 67241675Suqs MDOC__N, 68241675Suqs MDOC__O, 69241675Suqs MDOC__P, 70241675Suqs MDOC__R, 71241675Suqs MDOC__T, 72241675Suqs MDOC__V, 73241675Suqs MDOC_Ac, 74241675Suqs MDOC_Ao, 75241675Suqs MDOC_Aq, 76241675Suqs MDOC_At, 77241675Suqs MDOC_Bc, 78241675Suqs MDOC_Bf, 79241675Suqs MDOC_Bo, 80241675Suqs MDOC_Bq, 81241675Suqs MDOC_Bsx, 82241675Suqs MDOC_Bx, 83241675Suqs MDOC_Db, 84241675Suqs MDOC_Dc, 85241675Suqs MDOC_Do, 86241675Suqs MDOC_Dq, 87241675Suqs MDOC_Ec, 88241675Suqs MDOC_Ef, 89241675Suqs MDOC_Em, 90241675Suqs MDOC_Eo, 91241675Suqs MDOC_Fx, 92241675Suqs MDOC_Ms, 93241675Suqs MDOC_No, 94241675Suqs MDOC_Ns, 95241675Suqs MDOC_Nx, 96241675Suqs MDOC_Ox, 97241675Suqs MDOC_Pc, 98241675Suqs MDOC_Pf, 99241675Suqs MDOC_Po, 100241675Suqs MDOC_Pq, 101241675Suqs MDOC_Qc, 102241675Suqs MDOC_Ql, 103241675Suqs MDOC_Qo, 104241675Suqs MDOC_Qq, 105241675Suqs MDOC_Re, 106241675Suqs MDOC_Rs, 107241675Suqs MDOC_Sc, 108241675Suqs MDOC_So, 109241675Suqs MDOC_Sq, 110241675Suqs MDOC_Sm, 111241675Suqs MDOC_Sx, 112241675Suqs MDOC_Sy, 113241675Suqs MDOC_Tn, 114241675Suqs MDOC_Ux, 115241675Suqs MDOC_Xc, 116241675Suqs MDOC_Xo, 117241675Suqs MDOC_Fo, 118241675Suqs MDOC_Fc, 119241675Suqs MDOC_Oo, 120241675Suqs MDOC_Oc, 121241675Suqs MDOC_Bk, 122241675Suqs MDOC_Ek, 123241675Suqs MDOC_Bt, 124241675Suqs MDOC_Hf, 125241675Suqs MDOC_Fr, 126241675Suqs MDOC_Ud, 127241675Suqs MDOC_Lb, 128241675Suqs MDOC_Lp, 129241675Suqs MDOC_Lk, 130241675Suqs MDOC_Mt, 131241675Suqs MDOC_Brq, 132241675Suqs MDOC_Bro, 133241675Suqs MDOC_Brc, 134241675Suqs MDOC__C, 135241675Suqs MDOC_Es, 136241675Suqs MDOC_En, 137241675Suqs MDOC_Dx, 138241675Suqs MDOC__Q, 139241675Suqs MDOC_br, 140241675Suqs MDOC_sp, 141241675Suqs MDOC__U, 142241675Suqs MDOC_Ta, 143241675Suqs MDOC_MAX 144241675Suqs}; 145241675Suqs 146241675Suqsenum mdocargt { 147241675Suqs MDOC_Split, /* -split */ 148241675Suqs MDOC_Nosplit, /* -nospli */ 149241675Suqs MDOC_Ragged, /* -ragged */ 150241675Suqs MDOC_Unfilled, /* -unfilled */ 151241675Suqs MDOC_Literal, /* -literal */ 152241675Suqs MDOC_File, /* -file */ 153241675Suqs MDOC_Offset, /* -offset */ 154241675Suqs MDOC_Bullet, /* -bullet */ 155241675Suqs MDOC_Dash, /* -dash */ 156241675Suqs MDOC_Hyphen, /* -hyphen */ 157241675Suqs MDOC_Item, /* -item */ 158241675Suqs MDOC_Enum, /* -enum */ 159241675Suqs MDOC_Tag, /* -tag */ 160241675Suqs MDOC_Diag, /* -diag */ 161241675Suqs MDOC_Hang, /* -hang */ 162241675Suqs MDOC_Ohang, /* -ohang */ 163241675Suqs MDOC_Inset, /* -inset */ 164241675Suqs MDOC_Column, /* -column */ 165241675Suqs MDOC_Width, /* -width */ 166241675Suqs MDOC_Compact, /* -compact */ 167241675Suqs MDOC_Std, /* -std */ 168241675Suqs MDOC_Filled, /* -filled */ 169241675Suqs MDOC_Words, /* -words */ 170241675Suqs MDOC_Emphasis, /* -emphasis */ 171241675Suqs MDOC_Symbolic, /* -symbolic */ 172241675Suqs MDOC_Nested, /* -nested */ 173241675Suqs MDOC_Centred, /* -centered */ 174241675Suqs MDOC_ARG_MAX 175241675Suqs}; 176241675Suqs 177241675Suqsenum mdoc_type { 178241675Suqs MDOC_TEXT, 179241675Suqs MDOC_ELEM, 180241675Suqs MDOC_HEAD, 181241675Suqs MDOC_TAIL, 182241675Suqs MDOC_BODY, 183241675Suqs MDOC_BLOCK, 184241675Suqs MDOC_TBL, 185241675Suqs MDOC_EQN, 186241675Suqs MDOC_ROOT 187241675Suqs}; 188241675Suqs 189241675Suqs/* 190241675Suqs * Section (named/unnamed) of `Sh'. Note that these appear in the 191241675Suqs * conventional order imposed by mdoc.7. In the case of SEC_NONE, no 192241675Suqs * section has been invoked (this shouldn't happen). SEC_CUSTOM refers 193241675Suqs * to other sections. 194241675Suqs */ 195241675Suqsenum mdoc_sec { 196241675Suqs SEC_NONE = 0, 197241675Suqs SEC_NAME, /* NAME */ 198241675Suqs SEC_LIBRARY, /* LIBRARY */ 199241675Suqs SEC_SYNOPSIS, /* SYNOPSIS */ 200241675Suqs SEC_DESCRIPTION, /* DESCRIPTION */ 201241675Suqs SEC_IMPLEMENTATION, /* IMPLEMENTATION NOTES */ 202241675Suqs SEC_RETURN_VALUES, /* RETURN VALUES */ 203241675Suqs SEC_ENVIRONMENT, /* ENVIRONMENT */ 204241675Suqs SEC_FILES, /* FILES */ 205241675Suqs SEC_EXIT_STATUS, /* EXIT STATUS */ 206241675Suqs SEC_EXAMPLES, /* EXAMPLES */ 207241675Suqs SEC_DIAGNOSTICS, /* DIAGNOSTICS */ 208241675Suqs SEC_COMPATIBILITY, /* COMPATIBILITY */ 209241675Suqs SEC_ERRORS, /* ERRORS */ 210241675Suqs SEC_SEE_ALSO, /* SEE ALSO */ 211241675Suqs SEC_STANDARDS, /* STANDARDS */ 212241675Suqs SEC_HISTORY, /* HISTORY */ 213241675Suqs SEC_AUTHORS, /* AUTHORS */ 214241675Suqs SEC_CAVEATS, /* CAVEATS */ 215241675Suqs SEC_BUGS, /* BUGS */ 216241675Suqs SEC_SECURITY, /* SECURITY */ 217241675Suqs SEC_CUSTOM, 218241675Suqs SEC__MAX 219241675Suqs}; 220241675Suqs 221241675Suqsstruct mdoc_meta { 222241675Suqs char *msec; /* `Dt' section (1, 3p, etc.) */ 223241675Suqs char *vol; /* `Dt' volume (implied) */ 224241675Suqs char *arch; /* `Dt' arch (i386, etc.) */ 225241675Suqs char *date; /* `Dd' normalised date */ 226241675Suqs char *title; /* `Dt' title (FOO, etc.) */ 227241675Suqs char *os; /* `Os' system (OpenBSD, etc.) */ 228241675Suqs char *name; /* leading `Nm' name */ 229241675Suqs}; 230241675Suqs 231241675Suqs/* 232241675Suqs * An argument to a macro (multiple values = `-column xxx yyy'). 233241675Suqs */ 234241675Suqsstruct mdoc_argv { 235241675Suqs enum mdocargt arg; /* type of argument */ 236241675Suqs int line; 237241675Suqs int pos; 238241675Suqs size_t sz; /* elements in "value" */ 239241675Suqs char **value; /* argument strings */ 240241675Suqs}; 241241675Suqs 242241675Suqs/* 243241675Suqs * Reference-counted macro arguments. These are refcounted because 244241675Suqs * blocks have multiple instances of the same arguments spread across 245241675Suqs * the HEAD, BODY, TAIL, and BLOCK node types. 246241675Suqs */ 247241675Suqsstruct mdoc_arg { 248241675Suqs size_t argc; 249241675Suqs struct mdoc_argv *argv; 250241675Suqs unsigned int refcnt; 251241675Suqs}; 252241675Suqs 253241675Suqs/* 254241675Suqs * Indicates that a BODY's formatting has ended, but the scope is still 255241675Suqs * open. Used for syntax-broken blocks. 256241675Suqs */ 257241675Suqsenum mdoc_endbody { 258241675Suqs ENDBODY_NOT = 0, 259241675Suqs ENDBODY_SPACE, /* is broken: append a space */ 260241675Suqs ENDBODY_NOSPACE /* is broken: don't append a space */ 261241675Suqs}; 262241675Suqs 263241675Suqsenum mdoc_list { 264241675Suqs LIST__NONE = 0, 265241675Suqs LIST_bullet, /* -bullet */ 266241675Suqs LIST_column, /* -column */ 267241675Suqs LIST_dash, /* -dash */ 268241675Suqs LIST_diag, /* -diag */ 269241675Suqs LIST_enum, /* -enum */ 270241675Suqs LIST_hang, /* -hang */ 271241675Suqs LIST_hyphen, /* -hyphen */ 272241675Suqs LIST_inset, /* -inset */ 273241675Suqs LIST_item, /* -item */ 274241675Suqs LIST_ohang, /* -ohang */ 275241675Suqs LIST_tag, /* -tag */ 276241675Suqs LIST_MAX 277241675Suqs}; 278241675Suqs 279241675Suqsenum mdoc_disp { 280241675Suqs DISP__NONE = 0, 281241675Suqs DISP_centred, /* -centered */ 282241675Suqs DISP_ragged, /* -ragged */ 283241675Suqs DISP_unfilled, /* -unfilled */ 284241675Suqs DISP_filled, /* -filled */ 285241675Suqs DISP_literal /* -literal */ 286241675Suqs}; 287241675Suqs 288241675Suqsenum mdoc_auth { 289241675Suqs AUTH__NONE = 0, 290241675Suqs AUTH_split, /* -split */ 291241675Suqs AUTH_nosplit /* -nosplit */ 292241675Suqs}; 293241675Suqs 294241675Suqsenum mdoc_font { 295241675Suqs FONT__NONE = 0, 296241675Suqs FONT_Em, /* Em, -emphasis */ 297241675Suqs FONT_Li, /* Li, -literal */ 298241675Suqs FONT_Sy /* Sy, -symbolic */ 299241675Suqs}; 300241675Suqs 301241675Suqsstruct mdoc_bd { 302241675Suqs const char *offs; /* -offset */ 303241675Suqs enum mdoc_disp type; /* -ragged, etc. */ 304241675Suqs int comp; /* -compact */ 305241675Suqs}; 306241675Suqs 307241675Suqsstruct mdoc_bl { 308241675Suqs const char *width; /* -width */ 309241675Suqs const char *offs; /* -offset */ 310241675Suqs enum mdoc_list type; /* -tag, -enum, etc. */ 311241675Suqs int comp; /* -compact */ 312241675Suqs size_t ncols; /* -column arg count */ 313241675Suqs const char **cols; /* -column val ptr */ 314241675Suqs}; 315241675Suqs 316241675Suqsstruct mdoc_bf { 317241675Suqs enum mdoc_font font; /* font */ 318241675Suqs}; 319241675Suqs 320241675Suqsstruct mdoc_an { 321241675Suqs enum mdoc_auth auth; /* -split, etc. */ 322241675Suqs}; 323241675Suqs 324241675Suqsstruct mdoc_rs { 325241675Suqs int quote_T; /* whether to quote %T */ 326241675Suqs}; 327241675Suqs 328241675Suqs/* 329241675Suqs * Consists of normalised node arguments. These should be used instead 330241675Suqs * of iterating through the mdoc_arg pointers of a node: defaults are 331241675Suqs * provided, etc. 332241675Suqs */ 333241675Suqsunion mdoc_data { 334241675Suqs struct mdoc_an An; 335241675Suqs struct mdoc_bd Bd; 336241675Suqs struct mdoc_bf Bf; 337241675Suqs struct mdoc_bl Bl; 338241675Suqs struct mdoc_rs Rs; 339241675Suqs}; 340241675Suqs 341241675Suqs/* 342241675Suqs * Single node in tree-linked AST. 343241675Suqs */ 344241675Suqsstruct mdoc_node { 345241675Suqs struct mdoc_node *parent; /* parent AST node */ 346241675Suqs struct mdoc_node *child; /* first child AST node */ 347241675Suqs struct mdoc_node *last; /* last child AST node */ 348241675Suqs struct mdoc_node *next; /* sibling AST node */ 349241675Suqs struct mdoc_node *prev; /* prior sibling AST node */ 350241675Suqs int nchild; /* number children */ 351241675Suqs int line; /* parse line */ 352241675Suqs int pos; /* parse column */ 353241675Suqs enum mdoct tok; /* tok or MDOC__MAX if none */ 354241675Suqs int flags; 355241675Suqs#define MDOC_VALID (1 << 0) /* has been validated */ 356241675Suqs#define MDOC_EOS (1 << 2) /* at sentence boundary */ 357241675Suqs#define MDOC_LINE (1 << 3) /* first macro/text on line */ 358241675Suqs#define MDOC_SYNPRETTY (1 << 4) /* SYNOPSIS-style formatting */ 359241675Suqs#define MDOC_ENDED (1 << 5) /* rendering has been ended */ 360241675Suqs#define MDOC_DELIMO (1 << 6) 361241675Suqs#define MDOC_DELIMC (1 << 7) 362241675Suqs enum mdoc_type type; /* AST node type */ 363241675Suqs enum mdoc_sec sec; /* current named section */ 364241675Suqs union mdoc_data *norm; /* normalised args */ 365241675Suqs /* FIXME: these can be union'd to shave a few bytes. */ 366241675Suqs struct mdoc_arg *args; /* BLOCK/ELEM */ 367241675Suqs struct mdoc_node *pending; /* BLOCK */ 368241675Suqs struct mdoc_node *head; /* BLOCK */ 369241675Suqs struct mdoc_node *body; /* BLOCK */ 370241675Suqs struct mdoc_node *tail; /* BLOCK */ 371241675Suqs char *string; /* TEXT */ 372241675Suqs const struct tbl_span *span; /* TBL */ 373241675Suqs const struct eqn *eqn; /* EQN */ 374241675Suqs enum mdoc_endbody end; /* BODY */ 375241675Suqs}; 376241675Suqs 377241675Suqs/* Names of macros. Index is enum mdoct. */ 378241675Suqsextern const char *const *mdoc_macronames; 379241675Suqs 380241675Suqs/* Names of macro args. Index is enum mdocargt. */ 381241675Suqsextern const char *const *mdoc_argnames; 382241675Suqs 383241675Suqs__BEGIN_DECLS 384241675Suqs 385241675Suqsstruct mdoc; 386241675Suqs 387241675Suqsconst struct mdoc_node *mdoc_node(const struct mdoc *); 388241675Suqsconst struct mdoc_meta *mdoc_meta(const struct mdoc *); 389241675Suqs 390241675Suqs__END_DECLS 391241675Suqs 392241675Suqs#endif /*!MDOC_H*/ 393