1241675Suqs/* $Id: mandoc.h,v 1.99 2012/02/16 20:51:31 joerg Exp $ */ 2241675Suqs/* 3241675Suqs * Copyright (c) 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 MANDOC_H 18241675Suqs#define MANDOC_H 19241675Suqs 20241675Suqs#define ASCII_NBRSP 31 /* non-breaking space */ 21241675Suqs#define ASCII_HYPH 30 /* breakable hyphen */ 22241675Suqs 23241675Suqs/* 24241675Suqs * Status level. This refers to both internal status (i.e., whilst 25241675Suqs * running, when warnings/errors are reported) and an indicator of a 26241675Suqs * threshold of when to halt (when said internal state exceeds the 27241675Suqs * threshold). 28241675Suqs */ 29241675Suqsenum mandoclevel { 30241675Suqs MANDOCLEVEL_OK = 0, 31241675Suqs MANDOCLEVEL_RESERVED, 32241675Suqs MANDOCLEVEL_WARNING, /* warnings: syntax, whitespace, etc. */ 33241675Suqs MANDOCLEVEL_ERROR, /* input has been thrown away */ 34241675Suqs MANDOCLEVEL_FATAL, /* input is borked */ 35241675Suqs MANDOCLEVEL_BADARG, /* bad argument in invocation */ 36241675Suqs MANDOCLEVEL_SYSERR, /* system error */ 37241675Suqs MANDOCLEVEL_MAX 38241675Suqs}; 39241675Suqs 40241675Suqs/* 41241675Suqs * All possible things that can go wrong within a parse, be it libroff, 42241675Suqs * libmdoc, or libman. 43241675Suqs */ 44241675Suqsenum mandocerr { 45241675Suqs MANDOCERR_OK, 46241675Suqs 47241675Suqs MANDOCERR_WARNING, /* ===== start of warnings ===== */ 48241675Suqs 49241675Suqs /* related to the prologue */ 50241675Suqs MANDOCERR_NOTITLE, /* no title in document */ 51241675Suqs MANDOCERR_UPPERCASE, /* document title should be all caps */ 52241675Suqs MANDOCERR_BADMSEC, /* unknown manual section */ 53241675Suqs MANDOCERR_NODATE, /* date missing, using today's date */ 54241675Suqs MANDOCERR_BADDATE, /* cannot parse date, using it verbatim */ 55241675Suqs MANDOCERR_PROLOGOOO, /* prologue macros out of order */ 56241675Suqs MANDOCERR_PROLOGREP, /* duplicate prologue macro */ 57241675Suqs MANDOCERR_BADPROLOG, /* macro not allowed in prologue */ 58241675Suqs MANDOCERR_BADBODY, /* macro not allowed in body */ 59241675Suqs 60241675Suqs /* related to document structure */ 61241675Suqs MANDOCERR_SO, /* .so is fragile, better use ln(1) */ 62241675Suqs MANDOCERR_NAMESECFIRST, /* NAME section must come first */ 63241675Suqs MANDOCERR_BADNAMESEC, /* bad NAME section contents */ 64241675Suqs MANDOCERR_NONAME, /* manual name not yet set */ 65241675Suqs MANDOCERR_SECOOO, /* sections out of conventional order */ 66241675Suqs MANDOCERR_SECREP, /* duplicate section name */ 67241675Suqs MANDOCERR_SECMSEC, /* section not in conventional manual section */ 68241675Suqs 69241675Suqs /* related to macros and nesting */ 70241675Suqs MANDOCERR_MACROOBS, /* skipping obsolete macro */ 71241675Suqs MANDOCERR_IGNPAR, /* skipping paragraph macro */ 72241675Suqs MANDOCERR_IGNNS, /* skipping no-space macro */ 73241675Suqs MANDOCERR_SCOPENEST, /* blocks badly nested */ 74241675Suqs MANDOCERR_CHILD, /* child violates parent syntax */ 75241675Suqs MANDOCERR_NESTEDDISP, /* nested displays are not portable */ 76241675Suqs MANDOCERR_SCOPEREP, /* already in literal mode */ 77241675Suqs MANDOCERR_LINESCOPE, /* line scope broken */ 78241675Suqs 79241675Suqs /* related to missing macro arguments */ 80241675Suqs MANDOCERR_MACROEMPTY, /* skipping empty macro */ 81241675Suqs MANDOCERR_ARGCWARN, /* argument count wrong */ 82241675Suqs MANDOCERR_DISPTYPE, /* missing display type */ 83241675Suqs MANDOCERR_LISTFIRST, /* list type must come first */ 84241675Suqs MANDOCERR_NOWIDTHARG, /* tag lists require a width argument */ 85241675Suqs MANDOCERR_FONTTYPE, /* missing font type */ 86241675Suqs MANDOCERR_WNOSCOPE, /* skipping end of block that is not open */ 87241675Suqs 88241675Suqs /* related to bad macro arguments */ 89241675Suqs MANDOCERR_IGNARGV, /* skipping argument */ 90241675Suqs MANDOCERR_ARGVREP, /* duplicate argument */ 91241675Suqs MANDOCERR_DISPREP, /* duplicate display type */ 92241675Suqs MANDOCERR_LISTREP, /* duplicate list type */ 93241675Suqs MANDOCERR_BADATT, /* unknown AT&T UNIX version */ 94241675Suqs MANDOCERR_BADBOOL, /* bad Boolean value */ 95241675Suqs MANDOCERR_BADFONT, /* unknown font */ 96241675Suqs MANDOCERR_BADSTANDARD, /* unknown standard specifier */ 97241675Suqs MANDOCERR_BADWIDTH, /* bad width argument */ 98241675Suqs 99241675Suqs /* related to plain text */ 100241675Suqs MANDOCERR_NOBLANKLN, /* blank line in non-literal context */ 101241675Suqs MANDOCERR_BADTAB, /* tab in non-literal context */ 102241675Suqs MANDOCERR_EOLNSPACE, /* end of line whitespace */ 103241675Suqs MANDOCERR_BADCOMMENT, /* bad comment style */ 104241675Suqs MANDOCERR_BADESCAPE, /* unknown escape sequence */ 105241675Suqs MANDOCERR_BADQUOTE, /* unterminated quoted string */ 106241675Suqs 107241675Suqs /* related to equations */ 108241675Suqs MANDOCERR_EQNQUOTE, /* unexpected literal in equation */ 109241675Suqs 110241675Suqs MANDOCERR_ERROR, /* ===== start of errors ===== */ 111241675Suqs 112241675Suqs /* related to equations */ 113241675Suqs MANDOCERR_EQNNSCOPE, /* unexpected equation scope closure*/ 114241675Suqs MANDOCERR_EQNSCOPE, /* equation scope open on exit */ 115241675Suqs MANDOCERR_EQNBADSCOPE, /* overlapping equation scopes */ 116241675Suqs MANDOCERR_EQNEOF, /* unexpected end of equation */ 117241675Suqs MANDOCERR_EQNSYNT, /* equation syntax error */ 118241675Suqs 119241675Suqs /* related to tables */ 120241675Suqs MANDOCERR_TBL, /* bad table syntax */ 121241675Suqs MANDOCERR_TBLOPT, /* bad table option */ 122241675Suqs MANDOCERR_TBLLAYOUT, /* bad table layout */ 123241675Suqs MANDOCERR_TBLNOLAYOUT, /* no table layout cells specified */ 124241675Suqs MANDOCERR_TBLNODATA, /* no table data cells specified */ 125241675Suqs MANDOCERR_TBLIGNDATA, /* ignore data in cell */ 126241675Suqs MANDOCERR_TBLBLOCK, /* data block still open */ 127241675Suqs MANDOCERR_TBLEXTRADAT, /* ignoring extra data cells */ 128241675Suqs 129241675Suqs MANDOCERR_ROFFLOOP, /* input stack limit exceeded, infinite loop? */ 130241675Suqs MANDOCERR_BADCHAR, /* skipping bad character */ 131241675Suqs MANDOCERR_NAMESC, /* escaped character not allowed in a name */ 132241675Suqs MANDOCERR_NOTEXT, /* skipping text before the first section header */ 133241675Suqs MANDOCERR_MACRO, /* skipping unknown macro */ 134241675Suqs MANDOCERR_REQUEST, /* NOT IMPLEMENTED: skipping request */ 135241675Suqs MANDOCERR_ARGCOUNT, /* argument count wrong */ 136241675Suqs MANDOCERR_NOSCOPE, /* skipping end of block that is not open */ 137241675Suqs MANDOCERR_SCOPEBROKEN, /* missing end of block */ 138241675Suqs MANDOCERR_SCOPEEXIT, /* scope open on exit */ 139241675Suqs MANDOCERR_UNAME, /* uname(3) system call failed */ 140241675Suqs /* FIXME: merge following with MANDOCERR_ARGCOUNT */ 141241675Suqs MANDOCERR_NOARGS, /* macro requires line argument(s) */ 142241675Suqs MANDOCERR_NOBODY, /* macro requires body argument(s) */ 143241675Suqs MANDOCERR_NOARGV, /* macro requires argument(s) */ 144241675Suqs MANDOCERR_LISTTYPE, /* missing list type */ 145241675Suqs MANDOCERR_ARGSLOST, /* line argument(s) will be lost */ 146241675Suqs MANDOCERR_BODYLOST, /* body argument(s) will be lost */ 147241675Suqs 148241675Suqs MANDOCERR_FATAL, /* ===== start of fatal errors ===== */ 149241675Suqs 150241675Suqs MANDOCERR_NOTMANUAL, /* manual isn't really a manual */ 151241675Suqs MANDOCERR_COLUMNS, /* column syntax is inconsistent */ 152241675Suqs MANDOCERR_BADDISP, /* NOT IMPLEMENTED: .Bd -file */ 153241675Suqs MANDOCERR_SYNTARGVCOUNT, /* argument count wrong, violates syntax */ 154241675Suqs MANDOCERR_SYNTCHILD, /* child violates parent syntax */ 155241675Suqs MANDOCERR_SYNTARGCOUNT, /* argument count wrong, violates syntax */ 156241675Suqs MANDOCERR_SOPATH, /* NOT IMPLEMENTED: .so with absolute path or ".." */ 157241675Suqs MANDOCERR_NODOCBODY, /* no document body */ 158241675Suqs MANDOCERR_NODOCPROLOG, /* no document prologue */ 159241675Suqs MANDOCERR_MEM, /* static buffer exhausted */ 160241675Suqs MANDOCERR_MAX 161241675Suqs}; 162241675Suqs 163241675Suqsstruct tbl { 164241675Suqs char tab; /* cell-separator */ 165241675Suqs char decimal; /* decimal point */ 166241675Suqs int linesize; 167241675Suqs int opts; 168241675Suqs#define TBL_OPT_CENTRE (1 << 0) 169241675Suqs#define TBL_OPT_EXPAND (1 << 1) 170241675Suqs#define TBL_OPT_BOX (1 << 2) 171241675Suqs#define TBL_OPT_DBOX (1 << 3) 172241675Suqs#define TBL_OPT_ALLBOX (1 << 4) 173241675Suqs#define TBL_OPT_NOKEEP (1 << 5) 174241675Suqs#define TBL_OPT_NOSPACE (1 << 6) 175241675Suqs int cols; /* number of columns */ 176241675Suqs}; 177241675Suqs 178241675Suqsenum tbl_headt { 179241675Suqs TBL_HEAD_DATA, /* plug in data from tbl_dat */ 180241675Suqs TBL_HEAD_VERT, /* vertical spacer */ 181241675Suqs TBL_HEAD_DVERT /* double-vertical spacer */ 182241675Suqs}; 183241675Suqs 184241675Suqs/* 185241675Suqs * The head of a table specifies all of its columns. When formatting a 186241675Suqs * tbl_span, iterate over these and plug in data from the tbl_span when 187241675Suqs * appropriate, using tbl_cell as a guide to placement. 188241675Suqs */ 189241675Suqsstruct tbl_head { 190241675Suqs enum tbl_headt pos; 191241675Suqs int ident; /* 0 <= unique id < cols */ 192241675Suqs struct tbl_head *next; 193241675Suqs struct tbl_head *prev; 194241675Suqs}; 195241675Suqs 196241675Suqsenum tbl_cellt { 197241675Suqs TBL_CELL_CENTRE, /* c, C */ 198241675Suqs TBL_CELL_RIGHT, /* r, R */ 199241675Suqs TBL_CELL_LEFT, /* l, L */ 200241675Suqs TBL_CELL_NUMBER, /* n, N */ 201241675Suqs TBL_CELL_SPAN, /* s, S */ 202241675Suqs TBL_CELL_LONG, /* a, A */ 203241675Suqs TBL_CELL_DOWN, /* ^ */ 204241675Suqs TBL_CELL_HORIZ, /* _, - */ 205241675Suqs TBL_CELL_DHORIZ, /* = */ 206241675Suqs TBL_CELL_VERT, /* | */ 207241675Suqs TBL_CELL_DVERT, /* || */ 208241675Suqs TBL_CELL_MAX 209241675Suqs}; 210241675Suqs 211241675Suqs/* 212241675Suqs * A cell in a layout row. 213241675Suqs */ 214241675Suqsstruct tbl_cell { 215241675Suqs struct tbl_cell *next; 216241675Suqs enum tbl_cellt pos; 217241675Suqs size_t spacing; 218241675Suqs int flags; 219241675Suqs#define TBL_CELL_TALIGN (1 << 0) /* t, T */ 220241675Suqs#define TBL_CELL_BALIGN (1 << 1) /* d, D */ 221241675Suqs#define TBL_CELL_BOLD (1 << 2) /* fB, B, b */ 222241675Suqs#define TBL_CELL_ITALIC (1 << 3) /* fI, I, i */ 223241675Suqs#define TBL_CELL_EQUAL (1 << 4) /* e, E */ 224241675Suqs#define TBL_CELL_UP (1 << 5) /* u, U */ 225241675Suqs#define TBL_CELL_WIGN (1 << 6) /* z, Z */ 226241675Suqs struct tbl_head *head; 227241675Suqs}; 228241675Suqs 229241675Suqs/* 230241675Suqs * A layout row. 231241675Suqs */ 232241675Suqsstruct tbl_row { 233241675Suqs struct tbl_row *next; 234241675Suqs struct tbl_cell *first; 235241675Suqs struct tbl_cell *last; 236241675Suqs}; 237241675Suqs 238241675Suqsenum tbl_datt { 239241675Suqs TBL_DATA_NONE, /* has no data */ 240241675Suqs TBL_DATA_DATA, /* consists of data/string */ 241241675Suqs TBL_DATA_HORIZ, /* horizontal line */ 242241675Suqs TBL_DATA_DHORIZ, /* double-horizontal line */ 243241675Suqs TBL_DATA_NHORIZ, /* squeezed horizontal line */ 244241675Suqs TBL_DATA_NDHORIZ /* squeezed double-horizontal line */ 245241675Suqs}; 246241675Suqs 247241675Suqs/* 248241675Suqs * A cell within a row of data. The "string" field contains the actual 249241675Suqs * string value that's in the cell. The rest is layout. 250241675Suqs */ 251241675Suqsstruct tbl_dat { 252241675Suqs struct tbl_cell *layout; /* layout cell */ 253241675Suqs int spans; /* how many spans follow */ 254241675Suqs struct tbl_dat *next; 255241675Suqs char *string; /* data (NULL if not TBL_DATA_DATA) */ 256241675Suqs enum tbl_datt pos; 257241675Suqs}; 258241675Suqs 259241675Suqsenum tbl_spant { 260241675Suqs TBL_SPAN_DATA, /* span consists of data */ 261241675Suqs TBL_SPAN_HORIZ, /* span is horizontal line */ 262241675Suqs TBL_SPAN_DHORIZ /* span is double horizontal line */ 263241675Suqs}; 264241675Suqs 265241675Suqs/* 266241675Suqs * A row of data in a table. 267241675Suqs */ 268241675Suqsstruct tbl_span { 269241675Suqs struct tbl *tbl; 270241675Suqs struct tbl_head *head; 271241675Suqs struct tbl_row *layout; /* layout row */ 272241675Suqs struct tbl_dat *first; 273241675Suqs struct tbl_dat *last; 274241675Suqs int line; /* parse line */ 275241675Suqs int flags; 276241675Suqs#define TBL_SPAN_FIRST (1 << 0) 277241675Suqs#define TBL_SPAN_LAST (1 << 1) 278241675Suqs enum tbl_spant pos; 279241675Suqs struct tbl_span *next; 280241675Suqs}; 281241675Suqs 282241675Suqsenum eqn_boxt { 283241675Suqs EQN_ROOT, /* root of parse tree */ 284241675Suqs EQN_TEXT, /* text (number, variable, whatever) */ 285241675Suqs EQN_SUBEXPR, /* nested `eqn' subexpression */ 286241675Suqs EQN_LIST, /* subexpressions list */ 287241675Suqs EQN_MATRIX /* matrix subexpression */ 288241675Suqs}; 289241675Suqs 290241675Suqsenum eqn_markt { 291241675Suqs EQNMARK_NONE = 0, 292241675Suqs EQNMARK_DOT, 293241675Suqs EQNMARK_DOTDOT, 294241675Suqs EQNMARK_HAT, 295241675Suqs EQNMARK_TILDE, 296241675Suqs EQNMARK_VEC, 297241675Suqs EQNMARK_DYAD, 298241675Suqs EQNMARK_BAR, 299241675Suqs EQNMARK_UNDER, 300241675Suqs EQNMARK__MAX 301241675Suqs}; 302241675Suqs 303241675Suqsenum eqn_fontt { 304241675Suqs EQNFONT_NONE = 0, 305241675Suqs EQNFONT_ROMAN, 306241675Suqs EQNFONT_BOLD, 307241675Suqs EQNFONT_FAT, 308241675Suqs EQNFONT_ITALIC, 309241675Suqs EQNFONT__MAX 310241675Suqs}; 311241675Suqs 312241675Suqsenum eqn_post { 313241675Suqs EQNPOS_NONE = 0, 314241675Suqs EQNPOS_OVER, 315241675Suqs EQNPOS_SUP, 316241675Suqs EQNPOS_SUB, 317241675Suqs EQNPOS_TO, 318241675Suqs EQNPOS_FROM, 319241675Suqs EQNPOS__MAX 320241675Suqs}; 321241675Suqs 322241675Suqsenum eqn_pilet { 323241675Suqs EQNPILE_NONE = 0, 324241675Suqs EQNPILE_PILE, 325241675Suqs EQNPILE_CPILE, 326241675Suqs EQNPILE_RPILE, 327241675Suqs EQNPILE_LPILE, 328241675Suqs EQNPILE_COL, 329241675Suqs EQNPILE_CCOL, 330241675Suqs EQNPILE_RCOL, 331241675Suqs EQNPILE_LCOL, 332241675Suqs EQNPILE__MAX 333241675Suqs}; 334241675Suqs 335241675Suqs /* 336241675Suqs * A "box" is a parsed mathematical expression as defined by the eqn.7 337241675Suqs * grammar. 338241675Suqs */ 339241675Suqsstruct eqn_box { 340241675Suqs int size; /* font size of expression */ 341241675Suqs#define EQN_DEFSIZE INT_MIN 342241675Suqs enum eqn_boxt type; /* type of node */ 343241675Suqs struct eqn_box *first; /* first child node */ 344241675Suqs struct eqn_box *last; /* last child node */ 345241675Suqs struct eqn_box *next; /* node sibling */ 346241675Suqs struct eqn_box *parent; /* node sibling */ 347241675Suqs char *text; /* text (or NULL) */ 348241675Suqs char *left; 349241675Suqs char *right; 350241675Suqs enum eqn_post pos; /* position of next box */ 351241675Suqs enum eqn_markt mark; /* a mark about the box */ 352241675Suqs enum eqn_fontt font; /* font of box */ 353241675Suqs enum eqn_pilet pile; /* equation piling */ 354241675Suqs}; 355241675Suqs 356241675Suqs/* 357241675Suqs * An equation consists of a tree of expressions starting at a given 358241675Suqs * line and position. 359241675Suqs */ 360241675Suqsstruct eqn { 361241675Suqs char *name; /* identifier (or NULL) */ 362241675Suqs struct eqn_box *root; /* root mathematical expression */ 363241675Suqs int ln; /* invocation line */ 364241675Suqs int pos; /* invocation position */ 365241675Suqs}; 366241675Suqs 367241675Suqs/* 368241675Suqs * The type of parse sequence. This value is usually passed via the 369241675Suqs * mandoc(1) command line of -man and -mdoc. It's almost exclusively 370241675Suqs * -mandoc but the others have been retained for compatibility. 371241675Suqs */ 372241675Suqsenum mparset { 373241675Suqs MPARSE_AUTO, /* magically determine the document type */ 374241675Suqs MPARSE_MDOC, /* assume -mdoc */ 375241675Suqs MPARSE_MAN /* assume -man */ 376241675Suqs}; 377241675Suqs 378241675Suqsenum mandoc_esc { 379241675Suqs ESCAPE_ERROR = 0, /* bail! unparsable escape */ 380241675Suqs ESCAPE_IGNORE, /* escape to be ignored */ 381241675Suqs ESCAPE_SPECIAL, /* a regular special character */ 382241675Suqs ESCAPE_FONT, /* a generic font mode */ 383241675Suqs ESCAPE_FONTBOLD, /* bold font mode */ 384241675Suqs ESCAPE_FONTITALIC, /* italic font mode */ 385241675Suqs ESCAPE_FONTROMAN, /* roman font mode */ 386241675Suqs ESCAPE_FONTPREV, /* previous font mode */ 387241675Suqs ESCAPE_NUMBERED, /* a numbered glyph */ 388241675Suqs ESCAPE_UNICODE, /* a unicode codepoint */ 389241675Suqs ESCAPE_NOSPACE /* suppress space if the last on a line */ 390241675Suqs}; 391241675Suqs 392241675Suqstypedef void (*mandocmsg)(enum mandocerr, enum mandoclevel, 393241675Suqs const char *, int, int, const char *); 394241675Suqs 395241675Suqsstruct mparse; 396241675Suqsstruct mchars; 397241675Suqsstruct mdoc; 398241675Suqsstruct man; 399241675Suqs 400241675Suqs__BEGIN_DECLS 401241675Suqs 402241675Suqsvoid *mandoc_calloc(size_t, size_t); 403241675Suqsenum mandoc_esc mandoc_escape(const char **, const char **, int *); 404241675Suqsvoid *mandoc_malloc(size_t); 405241675Suqsvoid *mandoc_realloc(void *, size_t); 406241675Suqschar *mandoc_strdup(const char *); 407241675Suqschar *mandoc_strndup(const char *, size_t); 408241675Suqsstruct mchars *mchars_alloc(void); 409241675Suqsvoid mchars_free(struct mchars *); 410241675Suqschar mchars_num2char(const char *, size_t); 411241675Suqsint mchars_num2uc(const char *, size_t); 412241675Suqsint mchars_spec2cp(const struct mchars *, 413241675Suqs const char *, size_t); 414241675Suqsconst char *mchars_spec2str(const struct mchars *, 415241675Suqs const char *, size_t, size_t *); 416241675Suqsstruct mparse *mparse_alloc(enum mparset, 417241675Suqs enum mandoclevel, mandocmsg, void *); 418241675Suqsvoid mparse_free(struct mparse *); 419241675Suqsvoid mparse_keep(struct mparse *); 420241675Suqsenum mandoclevel mparse_readfd(struct mparse *, int, const char *); 421241675Suqsenum mandoclevel mparse_readmem(struct mparse *, const void *, size_t, 422241675Suqs const char *); 423241675Suqsvoid mparse_reset(struct mparse *); 424241675Suqsvoid mparse_result(struct mparse *, 425241675Suqs struct mdoc **, struct man **); 426241675Suqsconst char *mparse_getkeep(const struct mparse *); 427241675Suqsconst char *mparse_strerror(enum mandocerr); 428241675Suqsconst char *mparse_strlevel(enum mandoclevel); 429241675Suqs 430241675Suqs__END_DECLS 431241675Suqs 432241675Suqs#endif /*!MANDOC_H*/ 433