=================================================================== RCS file: /cvs/mandoc/read.c,v retrieving revision 1.50 retrieving revision 1.79 diff -u -p -r1.50 -r1.79 --- mandoc/read.c 2014/06/20 23:02:31 1.50 +++ mandoc/read.c 2014/08/06 15:09:05 1.79 @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.50 2014/06/20 23:02:31 schwarze Exp $ */ +/* $Id: read.c,v 1.79 2014/08/06 15:09:05 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -65,7 +65,7 @@ struct mparse { mandocmsg mmsg; /* warning/error message handler */ const char *file; struct buf *secondary; - char *defos; /* default operating system */ + const char *defos; /* default operating system */ }; static void resize_buf(struct buf *, size_t); @@ -93,69 +93,79 @@ static const char * const mandocerrs[MANDOCERR_MAX] = "generic warning", /* related to the prologue */ - "no TH macro in document", - "document title should be all caps", + "missing manual title, using UNTITLED", + "missing manual title, using \"\"", + "lower case character in document title", + "missing manual section, using \"\"", "unknown manual section", "unknown manual volume or arch", - "date missing, using today's date", + "missing date, using today's date", "cannot parse date, using it verbatim", - "prologue macros out of order", + "missing Os macro, using \"\"", "duplicate prologue macro", - "macro not allowed in prologue", - "macro not allowed in body", + "late prologue macro", + "skipping late title macro", + "prologue macros out of order", /* related to document structure */ ".so is fragile, better use ln(1)", "no document body", - "content before the first section header", - "NAME section must come first", + "content before first section header", + "first section is not \"NAME\"", "bad NAME section contents", "sections out of conventional order", - "duplicate section name", - "section header suited to sections 2, 3, and 9 only", + "duplicate section title", + "unexpected section", /* related to macros and nesting */ - "skipping obsolete macro", + "obsolete macro", "skipping paragraph macro", "moving paragraph macro out of list", "skipping no-space macro", "blocks badly nested", - "child violates parent syntax", "nested displays are not portable", - "already in literal mode", + "moving content out of list", + ".Vt block has child macro", + "fill mode already enabled, skipping", + "fill mode already disabled, skipping", "line scope broken", /* related to missing macro arguments */ + "skipping empty request", + "conditional request controls empty scope", "skipping empty macro", + "empty argument, using 0n", "argument count wrong", - "missing display type", - "list type must come first", - "tag lists require a width argument", - "missing font type", - "skipping end of block that is not open", + "missing display type, using -ragged", + "list type is not the first argument", + "missing -width in -tag list, using 8n", + "missing utility name, using \"\"", + "empty head in list item", + "empty list item", + "missing font type, using \\fR", + "unknown font type, using \\fR", + "missing -std argument, adding it", /* related to bad macro arguments */ - "skipping argument", + "unterminated quoted argument", "duplicate argument", - "duplicate display type", - "duplicate list type", + "skipping duplicate argument", + "skipping duplicate display type", + "skipping duplicate list type", + "skipping -width argument", "unknown AT&T UNIX version", - "bad Boolean value", - "unknown font", - "unknown standard specifier", - "bad width argument", + "invalid content in Rs block", + "invalid Boolean argument", + "unknown font, skipping request", /* related to plain text */ - "blank line in non-literal context", - "tab in non-literal context", - "end of line whitespace", + "blank line in fill mode, using .sp", + "tab in filled text", + "whitespace at end of input line", "bad comment style", - "bad escape sequence", - "unterminated quoted string", + "invalid escape sequence", + "undefined string, using \"\"", - /* related to equations */ - "unexpected literal in equation", - "generic error", /* related to equations */ @@ -175,42 +185,36 @@ static const char * const mandocerrs[MANDOCERR_MAX] = "data block still open", "ignoring extra data cells", + /* related to document structure and macros */ "input stack limit exceeded, infinite loop?", "skipping bad character", - "escaped character not allowed in a name", - "manual name not yet set", - "skipping text before the first section header", "skipping unknown macro", - "NOT IMPLEMENTED, please use groff: skipping request", - "argument count wrong", + "skipping item outside list", "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", - "body argument(s) will be lost", + "inserting missing end of block", + "appending missing end of block", + /* related to request and macro arguments */ + "escaped character not allowed in a name", + "argument count wrong", + "missing list type, using -item", + "missing manual name, using \"\"", + "uname(3) system call failed, using UNKNOWN", + "unknown standard specifier", + "skipping request without numeric argument", + "skipping all arguments", + "skipping excess arguments", + "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: Bd -file", "NOT IMPLEMENTED: .so with absolute path or \"..\"", - "no document prologue", - "static buffer exhausted", + ".so request failed", /* system errors */ - "cannot open file", + NULL, "cannot stat file", "cannot read file", }; @@ -259,18 +263,9 @@ pset(const char *buf, int pos, struct mparse *curp) } if (MPARSE_MDOC & curp->options) { - if (NULL == curp->pmdoc) - curp->pmdoc = mdoc_alloc( - curp->roff, curp, curp->defos, - MPARSE_QUICK & curp->options ? 1 : 0); - assert(curp->pmdoc); curp->mdoc = curp->pmdoc; return; } else if (MPARSE_MAN & curp->options) { - if (NULL == curp->pman) - curp->pman = man_alloc(curp->roff, curp, - MPARSE_QUICK & curp->options ? 1 : 0); - assert(curp->pman); curp->man = curp->pman; return; } @@ -361,8 +356,8 @@ mparse_buf_r(struct mparse *curp, struct buf blk, int if ( ! (isascii(c) && (isgraph(c) || isblank(c)))) { - mandoc_msg(MANDOCERR_BADCHAR, curp, - curp->line, pos, NULL); + mandoc_vmsg(MANDOCERR_BADCHAR, curp, + curp->line, pos, "0x%x", c); i++; ln.buf[pos++] = '?'; continue; @@ -418,8 +413,8 @@ mparse_buf_r(struct mparse *curp, struct buf blk, int if ( ! (isascii(c) && (isgraph(c) || isblank(c)))) { - mandoc_msg(MANDOCERR_BADCHAR, curp, - curp->line, pos, NULL); + mandoc_vmsg(MANDOCERR_BADCHAR, curp, + curp->line, pos, "0x%x", c); i += 2; ln.buf[pos++] = '?'; continue; @@ -506,8 +501,12 @@ rerun: if (curp->secondary) curp->secondary->sz -= pos + 1; mparse_readfd(curp, -1, ln.buf + of); - if (MANDOCLEVEL_FATAL <= curp->file_status) + if (MANDOCLEVEL_FATAL <= curp->file_status) { + mandoc_vmsg(MANDOCERR_SO_FAIL, + curp, curp->line, pos, + ".so %s", ln.buf + of); break; + } pos = 0; continue; default: @@ -674,6 +673,19 @@ mparse_end(struct mparse *curp) if (MANDOCLEVEL_FATAL <= curp->file_status) return; + if (curp->mdoc == NULL && + curp->man == NULL && + curp->sodest == NULL) { + if (curp->options & MPARSE_MDOC) + curp->mdoc = curp->pmdoc; + else { + if (curp->pman == NULL) + curp->pman = man_alloc(curp->roff, curp, + curp->options & MPARSE_QUICK ? 1 : 0); + curp->man = curp->pman; + } + } + if (curp->mdoc && ! mdoc_endparse(curp->mdoc)) { assert(MANDOCLEVEL_FATAL <= curp->file_status); return; @@ -684,12 +696,6 @@ mparse_end(struct mparse *curp) return; } - if ( ! (curp->mdoc || curp->man || curp->sodest)) { - mandoc_msg(MANDOCERR_NOTMANUAL, curp, 0, 0, NULL); - curp->file_status = MANDOCLEVEL_FATAL; - return; - } - roff_endparse(curp->roff); } @@ -773,7 +779,7 @@ out: struct mparse * mparse_alloc(int options, enum mandoclevel wlevel, - mandocmsg mmsg, char *defos) + mandocmsg mmsg, const char *defos) { struct mparse *curp; @@ -787,6 +793,14 @@ mparse_alloc(int options, enum mandoclevel wlevel, curp->defos = defos; curp->roff = roff_alloc(curp, options); + if (curp->options & MPARSE_MDOC) + curp->pmdoc = mdoc_alloc( + curp->roff, curp, curp->defos, + curp->options & MPARSE_QUICK ? 1 : 0); + if (curp->options & MPARSE_MAN) + curp->pman = man_alloc(curp->roff, curp, + curp->options & MPARSE_QUICK ? 1 : 0); + return(curp); }