]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_macro.c
When a full block macro gets closed out by a mismatching
[mandoc.git] / mdoc_macro.c
index 6e6fba3a8a573f56c83e68a7ccefe909d7e528e5..f46feeb0934553f72c7a61a058e1803336b0ed2f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_macro.c,v 1.163 2015/02/01 17:30:45 schwarze Exp $ */
+/*     $Id: mdoc_macro.c,v 1.165 2015/02/02 04:04:45 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1077,8 +1077,9 @@ blk_full(MACRO_PROT_ARGS)
 {
        int               la, nl, parsed;
        struct mdoc_arg  *arg;
-       struct mdoc_node *head; /* save of head macro */
-       struct mdoc_node *body; /* save of body macro */
+       struct mdoc_node *blk; /* Our own block. */
+       struct mdoc_node *head; /* Our own head. */
+       struct mdoc_node *body; /* Our own body. */
        struct mdoc_node *n;
        enum margserr     ac, lac;
        char             *p;
@@ -1118,7 +1119,7 @@ blk_full(MACRO_PROT_ARGS)
         */
 
        mdoc_argv(mdoc, line, tok, &arg, pos, buf);
-       mdoc_block_alloc(mdoc, line, ppos, tok, arg);
+       blk = mdoc_block_alloc(mdoc, line, ppos, tok, arg);
        head = body = NULL;
 
        /*
@@ -1218,6 +1219,8 @@ blk_full(MACRO_PROT_ARGS)
                        break;
        }
 
+       if (blk->flags & MDOC_VALID)
+               return;
        if (head == NULL)
                head = mdoc_head_alloc(mdoc, line, ppos, tok);
        if (nl)
@@ -1321,10 +1324,21 @@ blk_part_imp(MACRO_PROT_ARGS)
                }
        }
        assert(n == body);
-       rew_sub(MDOC_BODY, mdoc, tok, line, ppos);
+       rew_last(mdoc, body);
        if (nl)
                append_delims(mdoc, line, pos, buf);
-       rew_sub(MDOC_BLOCK, mdoc, tok, line, ppos);
+       rew_last(mdoc, blk);
+
+       /*
+        * The current block extends an enclosing block.
+        * Now that the current block ends, close the enclosing block, too.
+        */
+
+       while ((blk = blk->pending) != NULL) {
+               rew_last(mdoc, blk);
+               if (blk->type == MDOC_HEAD)
+                       mdoc_body_alloc(mdoc, blk->line, blk->pos, blk->tok);
+       }
 
        /* Move trailing .Ns out of scope. */