]> git.cameronkatri.com Git - mandoc.git/blobdiff - read.c
The CommonMark specification allows list markers fo the form "number) "
[mandoc.git] / read.c
diff --git a/read.c b/read.c
index 5c8af39778818883220bc6a9f3dec7665301c100..883f5412750893b9e4525ffb25ec57068d3be809 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.159 2017/02/03 17:56:59 schwarze Exp $ */
+/*     $Id: read.c,v 1.163 2017/03/07 20:00:08 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -30,7 +30,6 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <stdarg.h>
-#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -48,8 +47,8 @@
 #define        REPARSE_LIMIT   1000
 
 struct mparse {
-       struct roff_man  *man; /* man parser */
        struct roff      *roff; /* roff parser (!NULL) */
+       struct roff_man  *man; /* man parser */
        char             *sodest; /* filename pointed to by .so */
        const char       *file; /* filename of current input file */
        struct buf       *primary; /* buffer currently being parsed */
@@ -67,7 +66,7 @@ struct        mparse {
 
 static void      choose_parser(struct mparse *);
 static void      resize_buf(struct buf *, size_t);
-static void      mparse_buf_r(struct mparse *, struct buf, size_t, int);
+static int       mparse_buf_r(struct mparse *, struct buf, size_t, int);
 static int       read_whole_file(struct mparse *, const char *, int,
                                struct buf *, int *);
 static void      mparse_end(struct mparse *);
@@ -114,6 +113,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "bad NAME section content",
        "missing comma before name",
        "missing description line, using \"\"",
+       "description line outside NAME section",
        "sections out of conventional order",
        "duplicate section title",
        "unexpected section",
@@ -310,7 +310,7 @@ choose_parser(struct mparse *curp)
  * macros, inline equations, and input line traps)
  * and indirectly (for .so file inclusion).
  */
-static void
+static int
 mparse_buf_r(struct mparse *curp, struct buf blk, size_t i, int start)
 {
        const struct tbl_span   *span;
@@ -511,13 +511,16 @@ rerun:
 
                switch (rr) {
                case ROFF_REPARSE:
-                       if (REPARSE_LIMIT >= ++curp->reparse_count)
-                               mparse_buf_r(curp, ln, of, 0);
-                       else
+                       if (++curp->reparse_count > REPARSE_LIMIT)
                                mandoc_msg(MANDOCERR_ROFFLOOP, curp,
                                    curp->line, pos, NULL);
-                       pos = 0;
-                       continue;
+                       else if (mparse_buf_r(curp, ln, of, 0) == 1 ||
+                           start == 1) {
+                               pos = 0;
+                               continue;
+                       }
+                       free(ln.buf);
+                       return 0;
                case ROFF_APPEND:
                        pos = strlen(ln.buf);
                        continue;
@@ -531,7 +534,7 @@ rerun:
                            (i >= blk.sz || blk.buf[i] == '\0')) {
                                curp->sodest = mandoc_strdup(ln.buf + of);
                                free(ln.buf);
-                               return;
+                               return 1;
                        }
                        /*
                         * We remove `so' clauses from our lookaside
@@ -597,18 +600,18 @@ rerun:
        }
 
        free(ln.buf);
+       return 1;
 }
 
 static int
 read_whole_file(struct mparse *curp, const char *file, int fd,
                struct buf *fb, int *with_mmap)
 {
+       struct stat      st;
        gzFile           gz;
        size_t           off;
        ssize_t          ssz;
 
-       struct stat      st;
-
        if (fstat(fd, &st) == -1)
                err((int)MANDOCLEVEL_SYSERR, "%s", file);
 
@@ -830,13 +833,14 @@ mparse_reset(struct mparse *curp)
 {
        roff_reset(curp->roff);
        roff_man_reset(curp->man);
+
+       free(curp->sodest);
+       curp->sodest = NULL;
+
        if (curp->secondary)
                curp->secondary->sz = 0;
 
        curp->file_status = MANDOCLEVEL_OK;
-
-       free(curp->sodest);
-       curp->sodest = NULL;
        curp->gzip = 0;
 }
 
@@ -845,8 +849,7 @@ mparse_free(struct mparse *curp)
 {
 
        roff_man_free(curp->man);
-       if (curp->roff)
-               roff_free(curp->roff);
+       roff_free(curp->roff);
        if (curp->secondary)
                free(curp->secondary->buf);