]> git.cameronkatri.com Git - mandoc.git/blobdiff - read.c
Fix a few lies; polish wording and formatting while here.
[mandoc.git] / read.c
diff --git a/read.c b/read.c
index 06802d1d5c748cc5f246e6a8aeda0db17787795c..d78a0b0d6dee2f406767662659abb47ad4cf9a31 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.42 2014/01/06 00:53:33 schwarze Exp $ */
+/*     $Id: read.c,v 1.46 2014/03/23 11:25:26 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -37,6 +37,7 @@
 #include <unistd.h>
 
 #include "mandoc.h"
+#include "mandoc_aux.h"
 #include "libmandoc.h"
 #include "mdoc.h"
 #include "man.h"
@@ -53,18 +54,18 @@ struct      mparse {
        enum mandoclevel  file_status; /* status of current parse */
        enum mandoclevel  wlevel; /* ignore messages below this */
        int               line; /* line number in the file */
-       enum mparset      inttype; /* which parser to use */
+       int               options; /* parser options */
        struct man       *pman; /* persistent man parser */
        struct mdoc      *pmdoc; /* persistent mdoc parser */
        struct man       *man; /* man parser */
        struct mdoc      *mdoc; /* mdoc parser */
        struct roff      *roff; /* roff parser (!NULL) */
+       char             *sodest; /* filename pointed to by .so */
        int               reparse_count; /* finite interp. stack */
        mandocmsg         mmsg; /* warning/error message handler */
        const char       *file; 
        struct buf       *secondary;
        char             *defos; /* default operating system */
-       int               quick; /* abort the parse early */
 };
 
 static void      resize_buf(struct buf *, size_t);
@@ -255,36 +256,36 @@ pset(const char *buf, int pos, struct mparse *curp)
                        return;
        }
 
-       switch (curp->inttype) {
-       case (MPARSE_MDOC):
+       if (MPARSE_MDOC & curp->options) {
                if (NULL == curp->pmdoc) 
-                       curp->pmdoc = mdoc_alloc(curp->roff, curp,
-                                       curp->defos, curp->quick);
+                       curp->pmdoc = mdoc_alloc(
+                           curp->roff, curp, curp->defos,
+                           MPARSE_QUICK & curp->options ? 1 : 0);
                assert(curp->pmdoc);
                curp->mdoc = curp->pmdoc;
                return;
-       case (MPARSE_MAN):
+       } else if (MPARSE_MAN & curp->options) {
                if (NULL == curp->pman) 
                        curp->pman = man_alloc(curp->roff, curp,
-                                       curp->quick);
+                           MPARSE_QUICK & curp->options ? 1 : 0);
                assert(curp->pman);
                curp->man = curp->pman;
                return;
-       default:
-               break;
        }
 
        if (pos >= 3 && 0 == memcmp(buf, ".Dd", 3))  {
                if (NULL == curp->pmdoc) 
-                       curp->pmdoc = mdoc_alloc(curp->roff, curp,
-                                       curp->defos, curp->quick);
+                       curp->pmdoc = mdoc_alloc(
+                           curp->roff, curp, curp->defos,
+                           MPARSE_QUICK & curp->options ? 1 : 0);
                assert(curp->pmdoc);
                curp->mdoc = curp->pmdoc;
                return;
        } 
 
        if (NULL == curp->pman) 
-               curp->pman = man_alloc(curp->roff, curp, curp->quick);
+               curp->pman = man_alloc(curp->roff, curp,
+                   MPARSE_QUICK & curp->options ? 1 : 0);
        assert(curp->pman);
        curp->man = curp->pman;
 }
@@ -491,6 +492,12 @@ rerun:
                        assert(MANDOCLEVEL_FATAL <= curp->file_status);
                        break;
                case (ROFF_SO):
+                       if (0 == (MPARSE_SO & curp->options) &&
+                           (i >= (int)blk.sz || '\0' == blk.buf[i])) {
+                               curp->sodest = mandoc_strdup(ln.buf + of);
+                               free(ln.buf);
+                               return;
+                       }
                        /*
                         * We remove `so' clauses from our lookaside
                         * buffer because we're going to descend into
@@ -677,7 +684,7 @@ mparse_end(struct mparse *curp)
                return;
        }
 
-       if ( ! (curp->man || curp->mdoc)) {
+       if ( ! (curp->mdoc || curp->man || curp->sodest)) {
                mandoc_msg(MANDOCERR_NOTMANUAL, curp, 1, 0, NULL);
                curp->file_status = MANDOCLEVEL_FATAL;
                return;
@@ -765,8 +772,8 @@ out:
 }
 
 struct mparse *
-mparse_alloc(enum mparset inttype, enum mandoclevel wlevel,
-               mandocmsg mmsg, char *defos, int quick)
+mparse_alloc(int options, enum mandoclevel wlevel,
+               mandocmsg mmsg, char *defos)
 {
        struct mparse   *curp;
 
@@ -774,13 +781,12 @@ mparse_alloc(enum mparset inttype, enum mandoclevel wlevel,
 
        curp = mandoc_calloc(1, sizeof(struct mparse));
 
+       curp->options = options;
        curp->wlevel = wlevel;
        curp->mmsg = mmsg;
-       curp->inttype = inttype;
        curp->defos = defos;
-       curp->quick = quick;
 
-       curp->roff = roff_alloc(inttype, curp);
+       curp->roff = roff_alloc(curp, options);
        return(curp);
 }
 
@@ -800,6 +806,9 @@ mparse_reset(struct mparse *curp)
        curp->file_status = MANDOCLEVEL_OK;
        curp->mdoc = NULL;
        curp->man = NULL;
+
+       free(curp->sodest);
+       curp->sodest = NULL;
 }
 
 void
@@ -816,13 +825,20 @@ mparse_free(struct mparse *curp)
                free(curp->secondary->buf);
 
        free(curp->secondary);
+       free(curp->sodest);
        free(curp);
 }
 
 void
-mparse_result(struct mparse *curp, struct mdoc **mdoc, struct man **man)
+mparse_result(struct mparse *curp,
+       struct mdoc **mdoc, struct man **man, char **sodest)
 {
 
+       if (sodest && NULL != (*sodest = curp->sodest)) {
+               *mdoc = NULL;
+               *man = NULL;
+               return;
+       }
        if (mdoc)
                *mdoc = curp->mdoc;
        if (man)