+static void mparse_parse_buffer(struct mparse *, struct buf,
+ const char *);
+
+static const enum mandocerr mandoclimits[MANDOCLEVEL_MAX] = {
+ MANDOCERR_OK,
+ MANDOCERR_WARNING,
+ MANDOCERR_WARNING,
+ MANDOCERR_ERROR,
+ MANDOCERR_FATAL,
+ MANDOCERR_MAX,
+ MANDOCERR_MAX
+};
+
+static const char * const mandocerrs[MANDOCERR_MAX] = {
+ "ok",
+
+ "generic warning",
+
+ /* related to the prologue */
+ "missing .TH macro, using \"unknown 1\"",
+ "lower case character in document title",
+ "unknown manual section",
+ "unknown manual volume or arch",
+ "missing date, using today's date",
+ "cannot parse date, using it verbatim",
+ "prologue macros out of order",
+ "duplicate prologue macro",
+ "incomplete prologue, terminated by",
+ "skipping prologue macro in body",
+
+ /* related to document structure */
+ ".so is fragile, better use ln(1)",
+ "no document body",
+ "content before first section header",
+ "first section is not \"NAME\"",
+ "bad NAME section contents",
+ "sections out of conventional order",
+ "duplicate section title",
+ "unexpected section",
+
+ /* related to macros and nesting */
+ "obsolete macro",
+ "skipping paragraph macro",
+ "moving paragraph macro out of list",
+ "skipping no-space macro",
+ "blocks badly nested",
+ "nested displays are not portable",
+ "moving content out of list",
+ ".Vt block has child macro",
+ "fill mode already enabled, skipping .fi",
+ "fill mode already disabled, skipping .nf",
+ "line scope broken",
+
+ /* related to missing macro arguments */
+ "skipping empty macro",
+ "argument count wrong",
+ "missing display type",
+ "list type must come first",
+ "tag lists require a width argument",
+ "missing font type",
+
+ /* related to bad macro arguments */
+ "skipping argument",
+ "duplicate argument",
+ "duplicate display type",
+ "duplicate list type",
+ "unknown AT&T UNIX version",
+ "bad Boolean value",
+ "unknown font",
+ "unknown standard specifier",
+ "bad width argument",
+
+ /* related to plain text */
+ "blank line in non-literal context",
+ "tab in non-literal context",
+ "end of line whitespace",
+ "bad comment style",
+ "bad escape sequence",
+ "unterminated quoted string",
+
+ "generic error",
+
+ /* related to equations */
+ "unexpected equation scope closure",
+ "equation scope open on exit",
+ "overlapping equation scopes",
+ "unexpected end of equation",
+ "equation syntax error",
+
+ /* related to tables */
+ "bad table syntax",
+ "bad table option",
+ "bad table layout",
+ "no table layout cells specified",
+ "no table data cells specified",
+ "ignore data in cell",
+ "data block still open",
+ "ignoring extra data cells",
+
+ "input stack limit exceeded, infinite loop?",
+ "skipping bad character",
+ "escaped character not allowed in a name",
+ "manual name not yet set",
+ "skipping text before first section header",
+ "skipping unknown macro",
+ "NOT IMPLEMENTED, please use groff: skipping request",
+ "argument count wrong",
+ "skipping invalid content in .Rs block",
+ "skipping column outside column list",
+ "skipping end of block that is not open",
+ "missing end of block",
+ "scope open on exit",
+ "uname(3) system call failed",
+ "macro requires line argument(s)",
+ "macro requires body argument(s)",
+ "macro requires argument(s)",
+ "request requires a numeric argument",
+ "missing list type",
+ "line argument(s) will be lost",
+
+ "generic fatal error",
+
+ "input too large",
+ "not a manual",
+ "column syntax is inconsistent",
+ "NOT IMPLEMENTED: .Bd -file",
+ "argument count wrong, violates syntax",
+ "child violates parent syntax",
+ "argument count wrong, violates syntax",
+ "NOT IMPLEMENTED: .so with absolute path or \"..\"",
+ ".so request failed",
+ "no document prologue",
+ "static buffer exhausted",
+
+ /* system errors */
+ NULL,
+ "cannot stat file",
+ "cannot read file",
+};
+
+static const char * const mandoclevels[MANDOCLEVEL_MAX] = {
+ "SUCCESS",
+ "RESERVED",
+ "WARNING",
+ "ERROR",
+ "FATAL",
+ "BADARG",
+ "SYSERR"
+};
+