]> git.cameronkatri.com Git - mandoc.git/blobdiff - read.c
Fix incorrectly swapped labels of left/right arrows; from bentley@.
[mandoc.git] / read.c
diff --git a/read.c b/read.c
index cd787ce84226723f002f1159cd98356115efeec7..bed97580f66f0e31959d62a25de603b016d93a00 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.174 2017/06/10 01:48:53 schwarze Exp $ */
+/*     $Id: read.c,v 1.191 2017/07/08 17:52:50 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -42,7 +42,6 @@
 #include "mdoc.h"
 #include "man.h"
 #include "libmandoc.h"
-#include "roff_int.h"
 
 #define        REPARSE_LIMIT   1000
 
@@ -53,10 +52,10 @@ struct      mparse {
        const char       *file; /* filename of current input file */
        struct buf       *primary; /* buffer currently being parsed */
        struct buf       *secondary; /* preprocessed copy of input */
-       const char       *defos; /* default operating system */
+       const char       *os_s; /* default operating system */
        mandocmsg         mmsg; /* warning/error message handler */
        enum mandoclevel  file_status; /* status of current parse */
-       enum mandoclevel  wlevel; /* ignore messages below this */
+       enum mandocerr    mmin; /* ignore messages below this */
        int               options; /* parser options */
        int               gzip; /* current input file is gzipped */
        int               filenc; /* encoding of the current file */
@@ -75,7 +74,7 @@ static        void      mparse_parse_buffer(struct mparse *, struct buf,
 
 static const enum mandocerr    mandoclimits[MANDOCLEVEL_MAX] = {
        MANDOCERR_OK,
-       MANDOCERR_STYLE,
+       MANDOCERR_OK,
        MANDOCERR_WARNING,
        MANDOCERR_ERROR,
        MANDOCERR_UNSUPP,
@@ -86,29 +85,46 @@ static      const enum mandocerr    mandoclimits[MANDOCLEVEL_MAX] = {
 static const char * const      mandocerrs[MANDOCERR_MAX] = {
        "ok",
 
+       "base system convention",
+
+       "Mdocdate found",
+       "Mdocdate missing",
+       "unknown architecture",
+       "operating system explicitly specified",
+       "RCS id missing",
+       "referenced manual not found",
+
        "generic style suggestion",
 
+       "legacy man(7) date format",
+       "lower case character in document title",
+       "duplicate RCS id",
+       "typo in section name",
+       "unterminated quoted argument",
        "useless macro",
        "consider using OS macro",
        "errnos out of order",
        "duplicate errno",
-       "description line ends with a full stop",
+       "trailing delimiter",
        "no blank before trailing delimiter",
+       "fill mode already enabled, skipping",
+       "fill mode already disabled, skipping",
+       "function name without markup",
+       "whitespace at end of input line",
+       "bad comment style",
 
        "generic warning",
 
        /* related to the prologue */
        "missing manual title, using UNTITLED",
        "missing manual title, using \"\"",
-       "lower case character in document title",
        "missing manual section, using \"\"",
        "unknown manual section",
        "missing date, using today's date",
        "cannot parse date, using it verbatim",
+       "date in the future, using it anyway",
        "missing Os macro, using \"\"",
-       "duplicate prologue macro",
        "late prologue macro",
-       "skipping late title macro",
        "prologue macros out of order",
 
        /* related to document structure */
@@ -126,6 +142,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "sections out of conventional order",
        "duplicate section title",
        "unexpected section",
+       "cross reference to self",
        "unusual Xr order",
        "unusual Xr punctuation",
        "AUTHORS section without An macro",
@@ -139,8 +156,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "blocks badly nested",
        "nested displays are not portable",
        "moving content out of list",
-       "fill mode already enabled, skipping",
-       "fill mode already disabled, skipping",
+       "first macro on line",
        "line scope broken",
        "skipping blank line in line scope",
 
@@ -157,6 +173,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "missing function name, using \"\"",
        "empty head in list item",
        "empty list item",
+       "missing argument, using next line",
        "missing font type, using \\fR",
        "unknown font type, using \\fR",
        "nothing follows prefix",
@@ -168,7 +185,6 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "missing eqn box, using \"\"",
 
        /* related to bad macro arguments */
-       "unterminated quoted argument",
        "duplicate argument",
        "skipping duplicate argument",
        "skipping duplicate display type",
@@ -187,9 +203,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        /* related to plain text */
        "blank line in fill mode, using .sp",
        "tab in filled text",
-       "whitespace at end of input line",
        "new sentence, new line",
-       "bad comment style",
        "invalid escape sequence",
        "undefined string, using \"\"",
 
@@ -215,6 +229,8 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
 
        /* related to document structure and macros */
        NULL,
+       "duplicate prologue macro",
+       "skipping late title macro",
        "input stack limit exceeded, infinite loop?",
        "skipping bad character",
        "skipping unknown macro",
@@ -326,7 +342,6 @@ choose_parser(struct mparse *curp)
 static int
 mparse_buf_r(struct mparse *curp, struct buf blk, size_t i, int start)
 {
-       const struct tbl_span   *span;
        struct buf       ln;
        const char      *save_file;
        char            *cp;
@@ -517,21 +532,7 @@ rerun:
                if (curp->man->macroset == MACROSET_NONE)
                        choose_parser(curp);
 
-               /*
-                * Lastly, push down into the parsers themselves.
-                * If libroff returns ROFF_TBL, then add it to the
-                * currently open parse.  Since we only get here if
-                * there does exist data (see tbl_data.c), we're
-                * guaranteed that something's been allocated.
-                * Do the same for ROFF_EQN.
-                */
-
-               if (rr == ROFF_TBL)
-                       while ((span = roff_span(curp->roff)) != NULL)
-                               roff_addtbl(curp->man, span);
-               else if (rr == ROFF_EQN)
-                       roff_addeqn(curp->man, roff_eqn(curp->roff));
-               else if ((curp->man->macroset == MACROSET_MDOC ?
+               if ((curp->man->macroset == MACROSET_MDOC ?
                    mdoc_parseln(curp->man, curp->line, ln.buf, of) :
                    man_parseln(curp->man, curp->line, ln.buf, of)) == 2)
                                break;
@@ -749,20 +750,20 @@ mparse_open(struct mparse *curp, const char *file)
 }
 
 struct mparse *
-mparse_alloc(int options, enum mandoclevel wlevel, mandocmsg mmsg,
-    const char *defos)
+mparse_alloc(int options, enum mandocerr mmin, mandocmsg mmsg,
+    enum mandoc_os os_e, const char *os_s)
 {
        struct mparse   *curp;
 
        curp = mandoc_calloc(1, sizeof(struct mparse));
 
        curp->options = options;
-       curp->wlevel = wlevel;
+       curp->mmin = mmin;
        curp->mmsg = mmsg;
-       curp->defos = defos;
+       curp->os_s = os_s;
 
        curp->roff = roff_alloc(curp, options);
-       curp->man = roff_man_alloc( curp->roff, curp, curp->defos,
+       curp->man = roff_man_alloc(curp->roff, curp, curp->os_s,
                curp->options & MPARSE_QUICK ? 1 : 0);
        if (curp->options & MPARSE_MDOC) {
                curp->man->macroset = MACROSET_MDOC;
@@ -774,6 +775,7 @@ mparse_alloc(int options, enum mandoclevel wlevel, mandocmsg mmsg,
                        curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX);
        }
        curp->man->first->tok = TOKEN_NONE;
+       curp->man->meta.os_e = os_e;
        return curp;
 }
 
@@ -849,13 +851,13 @@ mandoc_msg(enum mandocerr er, struct mparse *m,
 {
        enum mandoclevel level;
 
+       if (er < m->mmin && er != MANDOCERR_FILE)
+               return;
+
        level = MANDOCLEVEL_UNSUPP;
        while (er < mandoclimits[level])
                level--;
 
-       if (level < m->wlevel && er != MANDOCERR_FILE)
-               return;
-
        if (m->mmsg)
                (*m->mmsg)(er, level, m->file, ln, col, msg);