1*0a6a1f1dSLionel Sambuc /* Id: mandoc.h,v 1.113 2014/01/02 16:29:55 schwarze Exp */ 2d65f6f70SBen Gras /* 3d65f6f70SBen Gras * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 4*0a6a1f1dSLionel Sambuc * Copyright (c) 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> 5d65f6f70SBen Gras * 6d65f6f70SBen Gras * Permission to use, copy, modify, and distribute this software for any 7d65f6f70SBen Gras * purpose with or without fee is hereby granted, provided that the above 8d65f6f70SBen Gras * copyright notice and this permission notice appear in all copies. 9d65f6f70SBen Gras * 10d65f6f70SBen Gras * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11d65f6f70SBen Gras * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12d65f6f70SBen Gras * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13d65f6f70SBen Gras * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14d65f6f70SBen Gras * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15d65f6f70SBen Gras * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16d65f6f70SBen Gras * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17d65f6f70SBen Gras */ 18d65f6f70SBen Gras #ifndef MANDOC_H 19d65f6f70SBen Gras #define MANDOC_H 20d65f6f70SBen Gras 21d65f6f70SBen Gras #define ASCII_NBRSP 31 /* non-breaking space */ 22d65f6f70SBen Gras #define ASCII_HYPH 30 /* breakable hyphen */ 23d65f6f70SBen Gras 24d65f6f70SBen Gras /* 25d65f6f70SBen Gras * Status level. This refers to both internal status (i.e., whilst 26d65f6f70SBen Gras * running, when warnings/errors are reported) and an indicator of a 27d65f6f70SBen Gras * threshold of when to halt (when said internal state exceeds the 28d65f6f70SBen Gras * threshold). 29d65f6f70SBen Gras */ 30d65f6f70SBen Gras enum mandoclevel { 31d65f6f70SBen Gras MANDOCLEVEL_OK = 0, 32d65f6f70SBen Gras MANDOCLEVEL_RESERVED, 33d65f6f70SBen Gras MANDOCLEVEL_WARNING, /* warnings: syntax, whitespace, etc. */ 34d65f6f70SBen Gras MANDOCLEVEL_ERROR, /* input has been thrown away */ 35d65f6f70SBen Gras MANDOCLEVEL_FATAL, /* input is borked */ 36d65f6f70SBen Gras MANDOCLEVEL_BADARG, /* bad argument in invocation */ 37d65f6f70SBen Gras MANDOCLEVEL_SYSERR, /* system error */ 38d65f6f70SBen Gras MANDOCLEVEL_MAX 39d65f6f70SBen Gras }; 40d65f6f70SBen Gras 41d65f6f70SBen Gras /* 42d65f6f70SBen Gras * All possible things that can go wrong within a parse, be it libroff, 43d65f6f70SBen Gras * libmdoc, or libman. 44d65f6f70SBen Gras */ 45d65f6f70SBen Gras enum mandocerr { 46d65f6f70SBen Gras MANDOCERR_OK, 47d65f6f70SBen Gras 48d65f6f70SBen Gras MANDOCERR_WARNING, /* ===== start of warnings ===== */ 49d65f6f70SBen Gras 50d65f6f70SBen Gras /* related to the prologue */ 51d65f6f70SBen Gras MANDOCERR_NOTITLE, /* no title in document */ 52d65f6f70SBen Gras MANDOCERR_UPPERCASE, /* document title should be all caps */ 53d65f6f70SBen Gras MANDOCERR_BADMSEC, /* unknown manual section */ 54*0a6a1f1dSLionel Sambuc MANDOCERR_BADVOLARCH, /* unknown manual volume or arch */ 5592395e9cSLionel Sambuc MANDOCERR_NODATE, /* date missing, using today's date */ 5692395e9cSLionel Sambuc MANDOCERR_BADDATE, /* cannot parse date, using it verbatim */ 57d65f6f70SBen Gras MANDOCERR_PROLOGOOO, /* prologue macros out of order */ 58d65f6f70SBen Gras MANDOCERR_PROLOGREP, /* duplicate prologue macro */ 59d65f6f70SBen Gras MANDOCERR_BADPROLOG, /* macro not allowed in prologue */ 60d65f6f70SBen Gras MANDOCERR_BADBODY, /* macro not allowed in body */ 61d65f6f70SBen Gras 62d65f6f70SBen Gras /* related to document structure */ 63d65f6f70SBen Gras MANDOCERR_SO, /* .so is fragile, better use ln(1) */ 64d65f6f70SBen Gras MANDOCERR_NAMESECFIRST, /* NAME section must come first */ 65d65f6f70SBen Gras MANDOCERR_BADNAMESEC, /* bad NAME section contents */ 66d65f6f70SBen Gras MANDOCERR_SECOOO, /* sections out of conventional order */ 67d65f6f70SBen Gras MANDOCERR_SECREP, /* duplicate section name */ 68*0a6a1f1dSLionel Sambuc MANDOCERR_SECMSEC, /* section header suited to sections ... */ 69d65f6f70SBen Gras 70d65f6f70SBen Gras /* related to macros and nesting */ 71d65f6f70SBen Gras MANDOCERR_MACROOBS, /* skipping obsolete macro */ 72d65f6f70SBen Gras MANDOCERR_IGNPAR, /* skipping paragraph macro */ 73*0a6a1f1dSLionel Sambuc MANDOCERR_MOVEPAR, /* moving paragraph macro out of list */ 7492395e9cSLionel Sambuc MANDOCERR_IGNNS, /* skipping no-space macro */ 75d65f6f70SBen Gras MANDOCERR_SCOPENEST, /* blocks badly nested */ 76d65f6f70SBen Gras MANDOCERR_CHILD, /* child violates parent syntax */ 77d65f6f70SBen Gras MANDOCERR_NESTEDDISP, /* nested displays are not portable */ 78d65f6f70SBen Gras MANDOCERR_SCOPEREP, /* already in literal mode */ 7992395e9cSLionel Sambuc MANDOCERR_LINESCOPE, /* line scope broken */ 80d65f6f70SBen Gras 81d65f6f70SBen Gras /* related to missing macro arguments */ 82d65f6f70SBen Gras MANDOCERR_MACROEMPTY, /* skipping empty macro */ 83d65f6f70SBen Gras MANDOCERR_ARGCWARN, /* argument count wrong */ 84d65f6f70SBen Gras MANDOCERR_DISPTYPE, /* missing display type */ 85d65f6f70SBen Gras MANDOCERR_LISTFIRST, /* list type must come first */ 86d65f6f70SBen Gras MANDOCERR_NOWIDTHARG, /* tag lists require a width argument */ 87d65f6f70SBen Gras MANDOCERR_FONTTYPE, /* missing font type */ 8892395e9cSLionel Sambuc MANDOCERR_WNOSCOPE, /* skipping end of block that is not open */ 89d65f6f70SBen Gras 90d65f6f70SBen Gras /* related to bad macro arguments */ 91d65f6f70SBen Gras MANDOCERR_IGNARGV, /* skipping argument */ 92d65f6f70SBen Gras MANDOCERR_ARGVREP, /* duplicate argument */ 93d65f6f70SBen Gras MANDOCERR_DISPREP, /* duplicate display type */ 94d65f6f70SBen Gras MANDOCERR_LISTREP, /* duplicate list type */ 95d65f6f70SBen Gras MANDOCERR_BADATT, /* unknown AT&T UNIX version */ 96d65f6f70SBen Gras MANDOCERR_BADBOOL, /* bad Boolean value */ 97d65f6f70SBen Gras MANDOCERR_BADFONT, /* unknown font */ 98d65f6f70SBen Gras MANDOCERR_BADSTANDARD, /* unknown standard specifier */ 99d65f6f70SBen Gras MANDOCERR_BADWIDTH, /* bad width argument */ 100d65f6f70SBen Gras 101d65f6f70SBen Gras /* related to plain text */ 102d65f6f70SBen Gras MANDOCERR_NOBLANKLN, /* blank line in non-literal context */ 103d65f6f70SBen Gras MANDOCERR_BADTAB, /* tab in non-literal context */ 104d65f6f70SBen Gras MANDOCERR_EOLNSPACE, /* end of line whitespace */ 105d65f6f70SBen Gras MANDOCERR_BADCOMMENT, /* bad comment style */ 106d65f6f70SBen Gras MANDOCERR_BADESCAPE, /* unknown escape sequence */ 107d65f6f70SBen Gras MANDOCERR_BADQUOTE, /* unterminated quoted string */ 108d65f6f70SBen Gras 10992395e9cSLionel Sambuc /* related to equations */ 11092395e9cSLionel Sambuc MANDOCERR_EQNQUOTE, /* unexpected literal in equation */ 111d65f6f70SBen Gras 112d65f6f70SBen Gras MANDOCERR_ERROR, /* ===== start of errors ===== */ 113d65f6f70SBen Gras 11492395e9cSLionel Sambuc /* related to equations */ 11592395e9cSLionel Sambuc MANDOCERR_EQNNSCOPE, /* unexpected equation scope closure*/ 11692395e9cSLionel Sambuc MANDOCERR_EQNSCOPE, /* equation scope open on exit */ 11792395e9cSLionel Sambuc MANDOCERR_EQNBADSCOPE, /* overlapping equation scopes */ 11892395e9cSLionel Sambuc MANDOCERR_EQNEOF, /* unexpected end of equation */ 11992395e9cSLionel Sambuc MANDOCERR_EQNSYNT, /* equation syntax error */ 12092395e9cSLionel Sambuc 121d65f6f70SBen Gras /* related to tables */ 122d65f6f70SBen Gras MANDOCERR_TBL, /* bad table syntax */ 123d65f6f70SBen Gras MANDOCERR_TBLOPT, /* bad table option */ 124d65f6f70SBen Gras MANDOCERR_TBLLAYOUT, /* bad table layout */ 125d65f6f70SBen Gras MANDOCERR_TBLNOLAYOUT, /* no table layout cells specified */ 126d65f6f70SBen Gras MANDOCERR_TBLNODATA, /* no table data cells specified */ 127d65f6f70SBen Gras MANDOCERR_TBLIGNDATA, /* ignore data in cell */ 128d65f6f70SBen Gras MANDOCERR_TBLBLOCK, /* data block still open */ 12992395e9cSLionel Sambuc MANDOCERR_TBLEXTRADAT, /* ignoring extra data cells */ 130d65f6f70SBen Gras 131d65f6f70SBen Gras MANDOCERR_ROFFLOOP, /* input stack limit exceeded, infinite loop? */ 132d65f6f70SBen Gras MANDOCERR_BADCHAR, /* skipping bad character */ 13392395e9cSLionel Sambuc MANDOCERR_NAMESC, /* escaped character not allowed in a name */ 134*0a6a1f1dSLionel Sambuc MANDOCERR_NONAME, /* manual name not yet set */ 135d65f6f70SBen Gras MANDOCERR_NOTEXT, /* skipping text before the first section header */ 136d65f6f70SBen Gras MANDOCERR_MACRO, /* skipping unknown macro */ 137d65f6f70SBen Gras MANDOCERR_REQUEST, /* NOT IMPLEMENTED: skipping request */ 138d65f6f70SBen Gras MANDOCERR_ARGCOUNT, /* argument count wrong */ 139*0a6a1f1dSLionel Sambuc MANDOCERR_STRAYTA, /* skipping column outside column list */ 140d65f6f70SBen Gras MANDOCERR_NOSCOPE, /* skipping end of block that is not open */ 141d65f6f70SBen Gras MANDOCERR_SCOPEBROKEN, /* missing end of block */ 142d65f6f70SBen Gras MANDOCERR_SCOPEEXIT, /* scope open on exit */ 143d65f6f70SBen Gras MANDOCERR_UNAME, /* uname(3) system call failed */ 144d65f6f70SBen Gras /* FIXME: merge following with MANDOCERR_ARGCOUNT */ 145d65f6f70SBen Gras MANDOCERR_NOARGS, /* macro requires line argument(s) */ 146d65f6f70SBen Gras MANDOCERR_NOBODY, /* macro requires body argument(s) */ 147d65f6f70SBen Gras MANDOCERR_NOARGV, /* macro requires argument(s) */ 148*0a6a1f1dSLionel Sambuc MANDOCERR_NUMERIC, /* request requires a numeric argument */ 149d65f6f70SBen Gras MANDOCERR_LISTTYPE, /* missing list type */ 150d65f6f70SBen Gras MANDOCERR_ARGSLOST, /* line argument(s) will be lost */ 151d65f6f70SBen Gras MANDOCERR_BODYLOST, /* body argument(s) will be lost */ 152d65f6f70SBen Gras 153d65f6f70SBen Gras MANDOCERR_FATAL, /* ===== start of fatal errors ===== */ 154d65f6f70SBen Gras 155*0a6a1f1dSLionel Sambuc MANDOCERR_TOOLARGE, /* input too large */ 15692395e9cSLionel Sambuc MANDOCERR_NOTMANUAL, /* manual isn't really a manual */ 157d65f6f70SBen Gras MANDOCERR_COLUMNS, /* column syntax is inconsistent */ 158d65f6f70SBen Gras MANDOCERR_BADDISP, /* NOT IMPLEMENTED: .Bd -file */ 159d65f6f70SBen Gras MANDOCERR_SYNTARGVCOUNT, /* argument count wrong, violates syntax */ 160d65f6f70SBen Gras MANDOCERR_SYNTCHILD, /* child violates parent syntax */ 161d65f6f70SBen Gras MANDOCERR_SYNTARGCOUNT, /* argument count wrong, violates syntax */ 162d65f6f70SBen Gras MANDOCERR_SOPATH, /* NOT IMPLEMENTED: .so with absolute path or ".." */ 163d65f6f70SBen Gras MANDOCERR_NODOCBODY, /* no document body */ 164d65f6f70SBen Gras MANDOCERR_NODOCPROLOG, /* no document prologue */ 165d65f6f70SBen Gras MANDOCERR_MEM, /* static buffer exhausted */ 166*0a6a1f1dSLionel Sambuc 167*0a6a1f1dSLionel Sambuc /* ===== system errors ===== */ 168*0a6a1f1dSLionel Sambuc 169*0a6a1f1dSLionel Sambuc MANDOCERR_SYSOPEN, /* cannot open file */ 170*0a6a1f1dSLionel Sambuc MANDOCERR_SYSSTAT, /* cannot stat file */ 171*0a6a1f1dSLionel Sambuc MANDOCERR_SYSREAD, /* cannot read file */ 172*0a6a1f1dSLionel Sambuc 173d65f6f70SBen Gras MANDOCERR_MAX 174d65f6f70SBen Gras }; 175d65f6f70SBen Gras 176*0a6a1f1dSLionel Sambuc struct tbl_opts { 177d65f6f70SBen Gras char tab; /* cell-separator */ 178d65f6f70SBen Gras char decimal; /* decimal point */ 179d65f6f70SBen Gras int linesize; 180d65f6f70SBen Gras int opts; 181d65f6f70SBen Gras #define TBL_OPT_CENTRE (1 << 0) 182d65f6f70SBen Gras #define TBL_OPT_EXPAND (1 << 1) 183d65f6f70SBen Gras #define TBL_OPT_BOX (1 << 2) 184d65f6f70SBen Gras #define TBL_OPT_DBOX (1 << 3) 185d65f6f70SBen Gras #define TBL_OPT_ALLBOX (1 << 4) 186d65f6f70SBen Gras #define TBL_OPT_NOKEEP (1 << 5) 187d65f6f70SBen Gras #define TBL_OPT_NOSPACE (1 << 6) 188d65f6f70SBen Gras int cols; /* number of columns */ 189d65f6f70SBen Gras }; 190d65f6f70SBen Gras 191d65f6f70SBen Gras /* 192d65f6f70SBen Gras * The head of a table specifies all of its columns. When formatting a 193d65f6f70SBen Gras * tbl_span, iterate over these and plug in data from the tbl_span when 194d65f6f70SBen Gras * appropriate, using tbl_cell as a guide to placement. 195d65f6f70SBen Gras */ 196d65f6f70SBen Gras struct tbl_head { 197d65f6f70SBen Gras int ident; /* 0 <= unique id < cols */ 198*0a6a1f1dSLionel Sambuc int vert; /* width of preceding vertical line */ 199d65f6f70SBen Gras struct tbl_head *next; 200d65f6f70SBen Gras struct tbl_head *prev; 201d65f6f70SBen Gras }; 202d65f6f70SBen Gras 203d65f6f70SBen Gras enum tbl_cellt { 204d65f6f70SBen Gras TBL_CELL_CENTRE, /* c, C */ 205d65f6f70SBen Gras TBL_CELL_RIGHT, /* r, R */ 206d65f6f70SBen Gras TBL_CELL_LEFT, /* l, L */ 207d65f6f70SBen Gras TBL_CELL_NUMBER, /* n, N */ 208d65f6f70SBen Gras TBL_CELL_SPAN, /* s, S */ 209d65f6f70SBen Gras TBL_CELL_LONG, /* a, A */ 210d65f6f70SBen Gras TBL_CELL_DOWN, /* ^ */ 211d65f6f70SBen Gras TBL_CELL_HORIZ, /* _, - */ 212d65f6f70SBen Gras TBL_CELL_DHORIZ, /* = */ 213d65f6f70SBen Gras TBL_CELL_MAX 214d65f6f70SBen Gras }; 215d65f6f70SBen Gras 216d65f6f70SBen Gras /* 217d65f6f70SBen Gras * A cell in a layout row. 218d65f6f70SBen Gras */ 219d65f6f70SBen Gras struct tbl_cell { 220d65f6f70SBen Gras struct tbl_cell *next; 221*0a6a1f1dSLionel Sambuc int vert; /* width of preceding vertical line */ 222d65f6f70SBen Gras enum tbl_cellt pos; 22392395e9cSLionel Sambuc size_t spacing; 224d65f6f70SBen Gras int flags; 225d65f6f70SBen Gras #define TBL_CELL_TALIGN (1 << 0) /* t, T */ 226d65f6f70SBen Gras #define TBL_CELL_BALIGN (1 << 1) /* d, D */ 227d65f6f70SBen Gras #define TBL_CELL_BOLD (1 << 2) /* fB, B, b */ 228d65f6f70SBen Gras #define TBL_CELL_ITALIC (1 << 3) /* fI, I, i */ 229d65f6f70SBen Gras #define TBL_CELL_EQUAL (1 << 4) /* e, E */ 230d65f6f70SBen Gras #define TBL_CELL_UP (1 << 5) /* u, U */ 231d65f6f70SBen Gras #define TBL_CELL_WIGN (1 << 6) /* z, Z */ 232d65f6f70SBen Gras struct tbl_head *head; 233d65f6f70SBen Gras }; 234d65f6f70SBen Gras 235d65f6f70SBen Gras /* 236d65f6f70SBen Gras * A layout row. 237d65f6f70SBen Gras */ 238d65f6f70SBen Gras struct tbl_row { 239d65f6f70SBen Gras struct tbl_row *next; 240d65f6f70SBen Gras struct tbl_cell *first; 241d65f6f70SBen Gras struct tbl_cell *last; 242d65f6f70SBen Gras }; 243d65f6f70SBen Gras 244d65f6f70SBen Gras enum tbl_datt { 24592395e9cSLionel Sambuc TBL_DATA_NONE, /* has no data */ 24692395e9cSLionel Sambuc TBL_DATA_DATA, /* consists of data/string */ 24792395e9cSLionel Sambuc TBL_DATA_HORIZ, /* horizontal line */ 24892395e9cSLionel Sambuc TBL_DATA_DHORIZ, /* double-horizontal line */ 24992395e9cSLionel Sambuc TBL_DATA_NHORIZ, /* squeezed horizontal line */ 25092395e9cSLionel Sambuc TBL_DATA_NDHORIZ /* squeezed double-horizontal line */ 251d65f6f70SBen Gras }; 252d65f6f70SBen Gras 253d65f6f70SBen Gras /* 254d65f6f70SBen Gras * A cell within a row of data. The "string" field contains the actual 255d65f6f70SBen Gras * string value that's in the cell. The rest is layout. 256d65f6f70SBen Gras */ 257d65f6f70SBen Gras struct tbl_dat { 25892395e9cSLionel Sambuc struct tbl_cell *layout; /* layout cell */ 25992395e9cSLionel Sambuc int spans; /* how many spans follow */ 260d65f6f70SBen Gras struct tbl_dat *next; 26192395e9cSLionel Sambuc char *string; /* data (NULL if not TBL_DATA_DATA) */ 262d65f6f70SBen Gras enum tbl_datt pos; 263d65f6f70SBen Gras }; 264d65f6f70SBen Gras 265d65f6f70SBen Gras enum tbl_spant { 266d65f6f70SBen Gras TBL_SPAN_DATA, /* span consists of data */ 267d65f6f70SBen Gras TBL_SPAN_HORIZ, /* span is horizontal line */ 268d65f6f70SBen Gras TBL_SPAN_DHORIZ /* span is double horizontal line */ 269d65f6f70SBen Gras }; 270d65f6f70SBen Gras 271d65f6f70SBen Gras /* 272d65f6f70SBen Gras * A row of data in a table. 273d65f6f70SBen Gras */ 274d65f6f70SBen Gras struct tbl_span { 275*0a6a1f1dSLionel Sambuc struct tbl_opts *opts; 276d65f6f70SBen Gras struct tbl_head *head; 27792395e9cSLionel Sambuc struct tbl_row *layout; /* layout row */ 278d65f6f70SBen Gras struct tbl_dat *first; 279d65f6f70SBen Gras struct tbl_dat *last; 28092395e9cSLionel Sambuc int line; /* parse line */ 281d65f6f70SBen Gras int flags; 282d65f6f70SBen Gras #define TBL_SPAN_FIRST (1 << 0) 283d65f6f70SBen Gras #define TBL_SPAN_LAST (1 << 1) 284d65f6f70SBen Gras enum tbl_spant pos; 285d65f6f70SBen Gras struct tbl_span *next; 286d65f6f70SBen Gras }; 287d65f6f70SBen Gras 28892395e9cSLionel Sambuc enum eqn_boxt { 28992395e9cSLionel Sambuc EQN_ROOT, /* root of parse tree */ 29092395e9cSLionel Sambuc EQN_TEXT, /* text (number, variable, whatever) */ 29192395e9cSLionel Sambuc EQN_SUBEXPR, /* nested `eqn' subexpression */ 29292395e9cSLionel Sambuc EQN_LIST, /* subexpressions list */ 29392395e9cSLionel Sambuc EQN_MATRIX /* matrix subexpression */ 29492395e9cSLionel Sambuc }; 29592395e9cSLionel Sambuc 29692395e9cSLionel Sambuc enum eqn_markt { 29792395e9cSLionel Sambuc EQNMARK_NONE = 0, 29892395e9cSLionel Sambuc EQNMARK_DOT, 29992395e9cSLionel Sambuc EQNMARK_DOTDOT, 30092395e9cSLionel Sambuc EQNMARK_HAT, 30192395e9cSLionel Sambuc EQNMARK_TILDE, 30292395e9cSLionel Sambuc EQNMARK_VEC, 30392395e9cSLionel Sambuc EQNMARK_DYAD, 30492395e9cSLionel Sambuc EQNMARK_BAR, 30592395e9cSLionel Sambuc EQNMARK_UNDER, 30692395e9cSLionel Sambuc EQNMARK__MAX 30792395e9cSLionel Sambuc }; 30892395e9cSLionel Sambuc 30992395e9cSLionel Sambuc enum eqn_fontt { 31092395e9cSLionel Sambuc EQNFONT_NONE = 0, 31192395e9cSLionel Sambuc EQNFONT_ROMAN, 31292395e9cSLionel Sambuc EQNFONT_BOLD, 31392395e9cSLionel Sambuc EQNFONT_FAT, 31492395e9cSLionel Sambuc EQNFONT_ITALIC, 31592395e9cSLionel Sambuc EQNFONT__MAX 31692395e9cSLionel Sambuc }; 31792395e9cSLionel Sambuc 31892395e9cSLionel Sambuc enum eqn_post { 31992395e9cSLionel Sambuc EQNPOS_NONE = 0, 32092395e9cSLionel Sambuc EQNPOS_OVER, 32192395e9cSLionel Sambuc EQNPOS_SUP, 32292395e9cSLionel Sambuc EQNPOS_SUB, 32392395e9cSLionel Sambuc EQNPOS_TO, 32492395e9cSLionel Sambuc EQNPOS_FROM, 32592395e9cSLionel Sambuc EQNPOS__MAX 32692395e9cSLionel Sambuc }; 32792395e9cSLionel Sambuc 32892395e9cSLionel Sambuc enum eqn_pilet { 32992395e9cSLionel Sambuc EQNPILE_NONE = 0, 33092395e9cSLionel Sambuc EQNPILE_PILE, 33192395e9cSLionel Sambuc EQNPILE_CPILE, 33292395e9cSLionel Sambuc EQNPILE_RPILE, 33392395e9cSLionel Sambuc EQNPILE_LPILE, 33492395e9cSLionel Sambuc EQNPILE_COL, 33592395e9cSLionel Sambuc EQNPILE_CCOL, 33692395e9cSLionel Sambuc EQNPILE_RCOL, 33792395e9cSLionel Sambuc EQNPILE_LCOL, 33892395e9cSLionel Sambuc EQNPILE__MAX 339d65f6f70SBen Gras }; 340d65f6f70SBen Gras 341d65f6f70SBen Gras /* 34292395e9cSLionel Sambuc * A "box" is a parsed mathematical expression as defined by the eqn.7 34392395e9cSLionel Sambuc * grammar. 344d65f6f70SBen Gras */ 34592395e9cSLionel Sambuc struct eqn_box { 34692395e9cSLionel Sambuc int size; /* font size of expression */ 34792395e9cSLionel Sambuc #define EQN_DEFSIZE INT_MIN 34892395e9cSLionel Sambuc enum eqn_boxt type; /* type of node */ 34992395e9cSLionel Sambuc struct eqn_box *first; /* first child node */ 35092395e9cSLionel Sambuc struct eqn_box *last; /* last child node */ 35192395e9cSLionel Sambuc struct eqn_box *next; /* node sibling */ 35292395e9cSLionel Sambuc struct eqn_box *parent; /* node sibling */ 35392395e9cSLionel Sambuc char *text; /* text (or NULL) */ 35492395e9cSLionel Sambuc char *left; 35592395e9cSLionel Sambuc char *right; 35692395e9cSLionel Sambuc enum eqn_post pos; /* position of next box */ 35792395e9cSLionel Sambuc enum eqn_markt mark; /* a mark about the box */ 35892395e9cSLionel Sambuc enum eqn_fontt font; /* font of box */ 35992395e9cSLionel Sambuc enum eqn_pilet pile; /* equation piling */ 360d65f6f70SBen Gras }; 361d65f6f70SBen Gras 362d65f6f70SBen Gras /* 36392395e9cSLionel Sambuc * An equation consists of a tree of expressions starting at a given 36492395e9cSLionel Sambuc * line and position. 365d65f6f70SBen Gras */ 36692395e9cSLionel Sambuc struct eqn { 36792395e9cSLionel Sambuc char *name; /* identifier (or NULL) */ 36892395e9cSLionel Sambuc struct eqn_box *root; /* root mathematical expression */ 36992395e9cSLionel Sambuc int ln; /* invocation line */ 37092395e9cSLionel Sambuc int pos; /* invocation position */ 371d65f6f70SBen Gras }; 372d65f6f70SBen Gras 373d65f6f70SBen Gras /* 37492395e9cSLionel Sambuc * The type of parse sequence. This value is usually passed via the 37592395e9cSLionel Sambuc * mandoc(1) command line of -man and -mdoc. It's almost exclusively 37692395e9cSLionel Sambuc * -mandoc but the others have been retained for compatibility. 377d65f6f70SBen Gras */ 37892395e9cSLionel Sambuc enum mparset { 37992395e9cSLionel Sambuc MPARSE_AUTO, /* magically determine the document type */ 38092395e9cSLionel Sambuc MPARSE_MDOC, /* assume -mdoc */ 38192395e9cSLionel Sambuc MPARSE_MAN /* assume -man */ 382d65f6f70SBen Gras }; 383d65f6f70SBen Gras 38492395e9cSLionel Sambuc enum mandoc_esc { 38592395e9cSLionel Sambuc ESCAPE_ERROR = 0, /* bail! unparsable escape */ 38692395e9cSLionel Sambuc ESCAPE_IGNORE, /* escape to be ignored */ 38792395e9cSLionel Sambuc ESCAPE_SPECIAL, /* a regular special character */ 38892395e9cSLionel Sambuc ESCAPE_FONT, /* a generic font mode */ 38992395e9cSLionel Sambuc ESCAPE_FONTBOLD, /* bold font mode */ 39092395e9cSLionel Sambuc ESCAPE_FONTITALIC, /* italic font mode */ 391*0a6a1f1dSLionel Sambuc ESCAPE_FONTBI, /* bold italic font mode */ 39292395e9cSLionel Sambuc ESCAPE_FONTROMAN, /* roman font mode */ 39392395e9cSLionel Sambuc ESCAPE_FONTPREV, /* previous font mode */ 39492395e9cSLionel Sambuc ESCAPE_NUMBERED, /* a numbered glyph */ 39592395e9cSLionel Sambuc ESCAPE_UNICODE, /* a unicode codepoint */ 396*0a6a1f1dSLionel Sambuc ESCAPE_NOSPACE, /* suppress space if the last on a line */ 397*0a6a1f1dSLionel Sambuc ESCAPE_SKIPCHAR /* skip the next character */ 39892395e9cSLionel Sambuc }; 39992395e9cSLionel Sambuc 40092395e9cSLionel Sambuc typedef void (*mandocmsg)(enum mandocerr, enum mandoclevel, 40192395e9cSLionel Sambuc const char *, int, int, const char *); 40292395e9cSLionel Sambuc 40392395e9cSLionel Sambuc struct mparse; 40492395e9cSLionel Sambuc struct mchars; 40592395e9cSLionel Sambuc struct mdoc; 40692395e9cSLionel Sambuc struct man; 40792395e9cSLionel Sambuc 408d65f6f70SBen Gras __BEGIN_DECLS 409d65f6f70SBen Gras 41092395e9cSLionel Sambuc void *mandoc_calloc(size_t, size_t); 41192395e9cSLionel Sambuc enum mandoc_esc mandoc_escape(const char **, const char **, int *); 41292395e9cSLionel Sambuc void *mandoc_malloc(size_t); 41392395e9cSLionel Sambuc void *mandoc_realloc(void *, size_t); 41492395e9cSLionel Sambuc char *mandoc_strdup(const char *); 41592395e9cSLionel Sambuc char *mandoc_strndup(const char *, size_t); 41692395e9cSLionel Sambuc struct mchars *mchars_alloc(void); 41792395e9cSLionel Sambuc void mchars_free(struct mchars *); 41892395e9cSLionel Sambuc char mchars_num2char(const char *, size_t); 41992395e9cSLionel Sambuc int mchars_num2uc(const char *, size_t); 42092395e9cSLionel Sambuc int mchars_spec2cp(const struct mchars *, 42192395e9cSLionel Sambuc const char *, size_t); 42292395e9cSLionel Sambuc const char *mchars_spec2str(const struct mchars *, 42392395e9cSLionel Sambuc const char *, size_t, size_t *); 424*0a6a1f1dSLionel Sambuc struct mparse *mparse_alloc(enum mparset, enum mandoclevel, 425*0a6a1f1dSLionel Sambuc mandocmsg, void *, char *); 42692395e9cSLionel Sambuc void mparse_free(struct mparse *); 42792395e9cSLionel Sambuc void mparse_keep(struct mparse *); 42892395e9cSLionel Sambuc enum mandoclevel mparse_readfd(struct mparse *, int, const char *); 42992395e9cSLionel Sambuc enum mandoclevel mparse_readmem(struct mparse *, const void *, size_t, 43092395e9cSLionel Sambuc const char *); 43192395e9cSLionel Sambuc void mparse_reset(struct mparse *); 43292395e9cSLionel Sambuc void mparse_result(struct mparse *, 43392395e9cSLionel Sambuc struct mdoc **, struct man **); 43492395e9cSLionel Sambuc const char *mparse_getkeep(const struct mparse *); 43592395e9cSLionel Sambuc const char *mparse_strerror(enum mandocerr); 43692395e9cSLionel Sambuc const char *mparse_strlevel(enum mandoclevel); 437d65f6f70SBen Gras 438d65f6f70SBen Gras __END_DECLS 439d65f6f70SBen Gras 440d65f6f70SBen Gras #endif /*!MANDOC_H*/ 441