]> git.cameronkatri.com Git - mandoc.git/commitdiff
When deciding whether two consecutive macros are on the same input line,
authorIngo Schwarze <schwarze@openbsd.org>
Tue, 24 Dec 2013 19:11:45 +0000 (19:11 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Tue, 24 Dec 2013 19:11:45 +0000 (19:11 +0000)
we have to compare the line where the first one *ends* (not where it begins)
to the line where the second one starts.
This fixes the bug that .Bk allowed output line breaks right after block
macros spanning more than one input line, even when the next macro follows
on the same line.

mdoc.c
mdoc.h
mdoc_html.c
mdoc_macro.c
mdoc_term.c
tree.c

diff --git a/mdoc.c b/mdoc.c
index 228728fccf9986c9fe066d3525b22da6cf00ecd6..87b358797b45a581fe93f8f7a1af88721b5594ee 100644 (file)
--- a/mdoc.c
+++ b/mdoc.c
@@ -1,4 +1,4 @@
-/*     $Id: mdoc.c,v 1.205 2013/10/21 23:47:58 schwarze Exp $ */
+/*     $Id: mdoc.c,v 1.206 2013/12/24 19:11:46 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -434,6 +434,7 @@ node_alloc(struct mdoc *mdoc, int line, int pos,
        p->sec = mdoc->lastsec;
        p->line = line;
        p->pos = pos;
+       p->lastline = line;
        p->tok = tok;
        p->type = type;
 
diff --git a/mdoc.h b/mdoc.h
index cc807d778e69db8a8b2786e3466f5611a175c3d3..d0153b4480617b2b7bba39a4c2563e26205cddc0 100644 (file)
--- a/mdoc.h
+++ b/mdoc.h
@@ -1,4 +1,4 @@
-/*     $Id: mdoc.h,v 1.124 2012/11/16 17:16:55 schwarze Exp $ */
+/*     $Id: mdoc.h,v 1.125 2013/12/24 19:11:45 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -351,6 +351,7 @@ struct      mdoc_node {
        int               nchild; /* number children */
        int               line; /* parse line */
        int               pos; /* parse column */
+       int               lastline; /* the node ends on this line */
        enum mdoct        tok; /* tok or MDOC__MAX if none */
        int               flags;
 #define        MDOC_VALID       (1 << 0) /* has been validated */
index ba93749b549c3940aca15ea6224f557fc5851617..151657fbe6ffd245102dd801b9fc3f2c436cc331 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_html.c,v 1.184 2012/11/17 00:26:33 schwarze Exp $ */
+/*     $Id: mdoc_html.c,v 1.185 2013/12/24 19:11:46 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -459,15 +459,11 @@ print_mdoc_node(MDOC_ARGS)
                break;
        }
 
-       if (HTML_KEEP & h->flags) {
-               if (n->prev && n->prev->line != n->line) {
+       if (HTML_KEEP & h->flags || MDOC_SYNPRETTY & n->flags) {
+               if (n->prev ? (n->prev->lastline != n->line) :
+                   (n->parent && n->parent->line != n->line)) {
                        h->flags &= ~HTML_KEEP;
                        h->flags |= HTML_PREKEEP;
-               } else if (NULL == n->prev) {
-                       if (n->parent && n->parent->line != n->line) {
-                               h->flags &= ~HTML_KEEP;
-                               h->flags |= HTML_PREKEEP;
-                       }
                }
        }
 
index 4a018eedcfd3b1121bfe10cb02062d9f34cb0b81..cbf90d2c57d37d992acc601e5f3fc7332937b81b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_macro.c,v 1.123 2013/10/21 23:47:58 schwarze Exp $ */
+/*     $Id: mdoc_macro.c,v 1.124 2013/12/24 19:11:46 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -561,6 +561,9 @@ rew_sub(enum mdoc_type t, struct mdoc *mdoc,
                case (REWIND_NONE):
                        return(1);
                case (REWIND_THIS):
+                       n->lastline = line -
+                           (MDOC_NEWLINE & mdoc->flags &&
+                            ! (MDOC_EXPLICIT & mdoc_macros[tok].flags));
                        break;
                case (REWIND_FORCE):
                        mandoc_vmsg(MANDOCERR_SCOPEBROKEN, mdoc->parse, 
@@ -569,6 +572,8 @@ rew_sub(enum mdoc_type t, struct mdoc *mdoc,
                                        mdoc_macronames[n->tok]);
                        /* FALLTHROUGH */
                case (REWIND_MORE):
+                       n->lastline = line -
+                           (MDOC_NEWLINE & mdoc->flags ? 1 : 0);
                        n = n->parent;
                        continue;
                case (REWIND_LATER):
index 7207df398f0c803a29e812f668832890686f342e..08bf9fe4c802116265d4fe0eed079925a3d6e2a0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.251 2013/12/23 02:20:09 schwarze Exp $ */
+/*     $Id: mdoc_term.c,v 1.252 2013/12/24 19:11:46 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -313,7 +313,7 @@ print_mdoc_node(DECL_ARGS)
         */
 
        if (TERMP_KEEP & p->flags || MDOC_SYNPRETTY & n->flags) {
-               if (n->prev ? (n->prev->line != n->line) :
+               if (n->prev ? (n->prev->lastline != n->line) :
                    (n->parent && n->parent->line != n->line)) {
                        p->flags &= ~TERMP_KEEP;
                        p->flags |= TERMP_PREKEEP;
diff --git a/tree.c b/tree.c
index 08a76b80eda76593381b19421a19fce397bc6208..fdb70e1b9338cec63ad223d6ff5a396242683efb 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -1,6 +1,7 @@
-/*     $Id: tree.c,v 1.49 2013/09/15 17:33:57 schwarze Exp $ */
+/*     $Id: tree.c,v 1.50 2013/12/24 19:11:46 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2013 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -163,7 +164,10 @@ print_mdoc(const struct mdoc_node *n, int indent)
                putchar(' ');
                if (MDOC_LINE & n->flags)
                        putchar('*');
-               printf("%d:%d\n", n->line, n->pos);
+               printf("%d:%d", n->line, n->pos);
+               if (n->lastline != n->line)
+                       printf("-%d", n->lastline);
+               putchar('\n');
        }
 
        if (n->child)