]> git.cameronkatri.com Git - mandoc.git/blobdiff - read.c
Switch to autogenerated dependency rules; they are less error-prone.
[mandoc.git] / read.c
diff --git a/read.c b/read.c
index e33ab91564bb4798787c2dee4d2413f61baf4fcd..95c0fe40890e4eb71823d567e6cc4eb8d3869420 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.60 2014/07/04 01:50:07 schwarze Exp $ */
+/*     $Id: read.c,v 1.78 2014/08/01 17:27:44 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -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);
@@ -123,41 +123,45 @@ static    const char * const      mandocerrs[MANDOCERR_MAX] = {
        "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",
+       "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, 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",
+       "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 \"\"",
 
        "generic error",
 
@@ -178,37 +182,33 @@ 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 first section header",
        "skipping unknown macro",
-       "NOT IMPLEMENTED, please use groff: skipping request",
-       "argument count wrong",
-       "skipping invalid content in .Rs block",
+       "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",
-       "request requires a numeric argument",
+       "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",
-       "line argument(s) will be lost",
+       "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 \"..\"",
        ".so request failed",
-       "no document prologue",
-       "static buffer exhausted",
 
        /* system errors */
        NULL,
@@ -260,18 +260,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;
        }
@@ -362,8 +353,8 @@ mparse_buf_r(struct mparse *curp, struct buf blk, int start)
 
                        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;
@@ -419,8 +410,8 @@ mparse_buf_r(struct mparse *curp, struct buf blk, int start)
 
                        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;
@@ -679,6 +670,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;
@@ -689,12 +693,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);
 }
 
@@ -778,7 +776,7 @@ out:
 
 struct mparse *
 mparse_alloc(int options, enum mandoclevel wlevel,
-               mandocmsg mmsg, char *defos)
+               mandocmsg mmsg, const char *defos)
 {
        struct mparse   *curp;
 
@@ -792,6 +790,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);
 }