]> 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 3e5d41161a0cb944f86934ead5f46f9984eef429..883f5412750893b9e4525ffb25ec57068d3be809 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.161 2017/02/18 17:29:28 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>
@@ -66,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 *);
@@ -113,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",
@@ -309,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;
@@ -510,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;
@@ -530,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
@@ -596,6 +600,7 @@ rerun:
        }
 
        free(ln.buf);
+       return 1;
 }
 
 static int