=================================================================== RCS file: /cvs/mandoc/read.c,v retrieving revision 1.3 retrieving revision 1.11 diff -u -p -r1.3 -r1.11 --- mandoc/read.c 2011/03/20 16:02:05 1.3 +++ mandoc/read.c 2011/04/04 23:04:38 1.11 @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.3 2011/03/20 16:02:05 kristaps Exp $ */ +/* $Id: read.c,v 1.11 2011/04/04 23:04:38 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze @@ -15,6 +15,10 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include @@ -31,7 +35,6 @@ #include "libmandoc.h" #include "mdoc.h" #include "man.h" -#include "roff.h" #ifndef MAP_FILE #define MAP_FILE 0 @@ -58,8 +61,6 @@ struct mparse { int reparse_count; /* finite interp. stack */ mandocmsg mmsg; /* warning/error message handler */ void *arg; /* argument to mmsg */ - mevt_open evt_open; /* file-open event */ - mevt_close evt_close; /* file-close event */ const char *file; }; @@ -81,6 +82,124 @@ static const enum mandocerr mandoclimits[MANDOCLEVEL_M MANDOCERR_MAX }; +static const char * const mandocerrs[MANDOCERR_MAX] = { + "ok", + + "generic warning", + + /* related to the prologue */ + "no title in document", + "document title should be all caps", + "unknown manual section", + "date missing, using today's date", + "cannot parse date, using it verbatim", + "prologue macros out of order", + "duplicate prologue macro", + "macro not allowed in prologue", + "macro not allowed in body", + + /* related to document structure */ + ".so is fragile, better use ln(1)", + "NAME section must come first", + "bad NAME section contents", + "manual name not yet set", + "sections out of conventional order", + "duplicate section name", + "section not in conventional manual section", + + /* related to macros and nesting */ + "skipping obsolete macro", + "skipping paragraph macro", + "skipping no-space macro", + "blocks badly nested", + "child violates parent syntax", + "nested displays are not portable", + "already in literal mode", + "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", + "skipping end of block that is not open", + + /* 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", + "unknown escape sequence", + "unterminated quoted string", + + "generic 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", + "skipping text before the first section header", + "skipping unknown macro", + "NOT IMPLEMENTED, please use groff: skipping request", + "argument count wrong", + "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)", + "missing list type", + "line argument(s) will be lost", + "body argument(s) will be lost", + + "generic fatal error", + + "not a manual", + "column syntax is inconsistent", + "NOT IMPLEMENTED: .Bd -file", + "line scope broken, syntax violated", + "argument count wrong, violates syntax", + "child violates parent syntax", + "argument count wrong, violates syntax", + "NOT IMPLEMENTED: .so with absolute path or \"..\"", + "no document body", + "no document prologue", + "static buffer exhausted", +}; + +static const char * const mandoclevels[MANDOCLEVEL_MAX] = { + "SUCCESS", + "RESERVED", + "WARNING", + "ERROR", + "FATAL", + "BADARG", + "SYSERR" +}; + static void resize_buf(struct buf *buf, size_t initial) { @@ -499,16 +618,11 @@ mparse_end(struct mparse *curp) return; } -#if 0 - /* FIXME: NOTE a parser may not have been assigned, yet. */ - if ( ! (curp->man || curp->mdoc)) { - /* FIXME: make into an mandoc.h error. */ - fprintf(stderr, "%s: Not a manual\n", curp->file); + mandoc_msg(MANDOCERR_NOTMANUAL, curp, 1, 0, NULL); curp->file_status = MANDOCLEVEL_FATAL; - goto cleanup; + return; } -#endif roff_endparse(curp->roff); } @@ -518,11 +632,6 @@ mparse_readfd_r(struct mparse *curp, int fd, const cha { const char *svfile; - if ( ! (*curp->evt_open)(curp->arg, file)) { - curp->file_status = MANDOCLEVEL_SYSERR; - return; - } - if (-1 == fd) if (-1 == (fd = open(file, O_RDONLY, 0))) { perror(file); @@ -541,7 +650,6 @@ mparse_readfd_r(struct mparse *curp, int fd, const cha if (STDIN_FILENO != fd && -1 == close(fd)) perror(file); - (*curp->evt_close)(curp->arg, file); curp->file = svfile; } @@ -554,19 +662,18 @@ mparse_readfd(struct mparse *curp, int fd, const char } struct mparse * -mparse_alloc(enum mparset inttype, mevt_open eopen, - mevt_close eclose, enum mandoclevel wlevel, mandocmsg mmsg, void *arg) +mparse_alloc(enum mparset inttype, enum mandoclevel wlevel, mandocmsg mmsg, void *arg) { struct mparse *curp; + assert(wlevel <= MANDOCLEVEL_FATAL); + curp = mandoc_calloc(1, sizeof(struct mparse)); curp->wlevel = wlevel; curp->mmsg = mmsg; curp->arg = arg; curp->inttype = inttype; - curp->evt_open = eopen; - curp->evt_close = eclose; curp->roff = roff_alloc(&curp->regs, curp); return(curp); @@ -608,8 +715,10 @@ void mparse_result(struct mparse *curp, struct mdoc **mdoc, struct man **man) { - *mdoc = curp->mdoc; - *man = curp->man; + if (mdoc) + *mdoc = curp->mdoc; + if (man) + *man = curp->man; } void @@ -639,8 +748,22 @@ mandoc_msg(enum mandocerr er, struct mparse *m, if (level < m->wlevel) return; - (*m->mmsg)(er, level, m->file, ln, col, msg); + if (m->mmsg) + (*m->mmsg)(er, level, m->file, ln, col, msg); if (m->file_status < level) m->file_status = level; +} + +const char * +mparse_strerror(enum mandocerr er) +{ + + return(mandocerrs[er]); +} + +const char * +mparse_strlevel(enum mandoclevel lvl) +{ + return(mandoclevels[lvl]); }