summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2013-12-24 19:10:35 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2013-12-24 19:10:35 +0000
commit3043e4d18d3f19a38b74cbce28987b0e5218d43a (patch)
treeb1f31bc1e515eb02c3fed99281265babdc0d543b
parentcd429ee8cd9d937595d233fa7eb6aa5c6828878d (diff)
When deciding whether two consecutive macros are on the same input line,
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.
-rw-r--r--regress/usr.bin/mandoc/mdoc/Bk/inputlines.in3
-rw-r--r--regress/usr.bin/mandoc/mdoc/Bk/inputlines.out_ascii6
-rw-r--r--usr.bin/mandoc/mdoc.c3
-rw-r--r--usr.bin/mandoc/mdoc.h3
-rw-r--r--usr.bin/mandoc/mdoc_html.c12
-rw-r--r--usr.bin/mandoc/mdoc_macro.c7
-rw-r--r--usr.bin/mandoc/mdoc_term.c4
-rw-r--r--usr.bin/mandoc/tree.c8
8 files changed, 28 insertions, 18 deletions
diff --git a/regress/usr.bin/mandoc/mdoc/Bk/inputlines.in b/regress/usr.bin/mandoc/mdoc/Bk/inputlines.in
index 6d9f4272a4f..50db65fb1ee 100644
--- a/regress/usr.bin/mandoc/mdoc/Bk/inputlines.in
+++ b/regress/usr.bin/mandoc/mdoc/Bk/inputlines.in
@@ -18,8 +18,6 @@
.Oo No a Oc Oo No b Oc Oc Pq "break after first Oo"
.Ek
.Pp
-.\" XXX does not work yet
-.ig
.Nm
.Ar x x x x x x x x x x x x x x x x x x x x x x x x x x x
.Bk -words
@@ -34,7 +32,6 @@
.Oc Oo No b Oc Oc Pq "break before first Oc"
.Ek
.Pp
-..
.Nm
.Ar x x x x x x x x x x x x x x x x x x x x x x x x x x x
.Bk -words
diff --git a/regress/usr.bin/mandoc/mdoc/Bk/inputlines.out_ascii b/regress/usr.bin/mandoc/mdoc/Bk/inputlines.out_ascii
index c6c1deba57a..52da2ec6e77 100644
--- a/regress/usr.bin/mandoc/mdoc/Bk/inputlines.out_ascii
+++ b/regress/usr.bin/mandoc/mdoc/Bk/inputlines.out_ascii
@@ -10,6 +10,12 @@ SSYYNNOOPPSSIISS
BBkk--iinnppuuttlliinneess _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x
[[a] [b]] (break after first Oo)
+ BBkk--iinnppuuttlliinneess _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x
+ [[a] [b]] (break after second Oo)
+
+ BBkk--iinnppuuttlliinneess _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x
+ [[a] [b]] (break before first Oc)
+
BBkk--iinnppuuttlliinneess _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x _x [[a]
[b]] (break after first Oc)
diff --git a/usr.bin/mandoc/mdoc.c b/usr.bin/mandoc/mdoc.c
index 3464c0b48c2..6c8ad34b404 100644
--- a/usr.bin/mandoc/mdoc.c
+++ b/usr.bin/mandoc/mdoc.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc.c,v 1.95 2013/10/21 23:32:32 schwarze Exp $ */
+/* $Id: mdoc.c,v 1.96 2013/12/24 19:10:34 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -430,6 +430,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/usr.bin/mandoc/mdoc.h b/usr.bin/mandoc/mdoc.h
index bdd289b7249..763cc2a9c95 100644
--- a/usr.bin/mandoc/mdoc.h
+++ b/usr.bin/mandoc/mdoc.h
@@ -1,4 +1,4 @@
-/* $Id: mdoc.h,v 1.48 2012/11/16 17:16:29 schwarze Exp $ */
+/* $Id: mdoc.h,v 1.49 2013/12/24 19:10:34 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 */
diff --git a/usr.bin/mandoc/mdoc_html.c b/usr.bin/mandoc/mdoc_html.c
index d1c544e177a..ec49796ead2 100644
--- a/usr.bin/mandoc/mdoc_html.c
+++ b/usr.bin/mandoc/mdoc_html.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_html.c,v 1.67 2012/11/17 00:25:20 schwarze Exp $ */
+/* $Id: mdoc_html.c,v 1.68 2013/12/24 19:10:34 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -455,15 +455,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;
- }
}
}
diff --git a/usr.bin/mandoc/mdoc_macro.c b/usr.bin/mandoc/mdoc_macro.c
index 276e5a2c24d..759adc273b6 100644
--- a/usr.bin/mandoc/mdoc_macro.c
+++ b/usr.bin/mandoc/mdoc_macro.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_macro.c,v 1.80 2013/10/21 23:32:32 schwarze Exp $ */
+/* $Id: mdoc_macro.c,v 1.81 2013/12/24 19:10:34 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -557,6 +557,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,
@@ -565,6 +568,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):
diff --git a/usr.bin/mandoc/mdoc_term.c b/usr.bin/mandoc/mdoc_term.c
index fdf0b2b3858..a2626ac51bc 100644
--- a/usr.bin/mandoc/mdoc_term.c
+++ b/usr.bin/mandoc/mdoc_term.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_term.c,v 1.153 2013/12/23 02:19:57 schwarze Exp $ */
+/* $Id: mdoc_term.c,v 1.154 2013/12/24 19:10:34 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -309,7 +309,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/usr.bin/mandoc/tree.c b/usr.bin/mandoc/tree.c
index dad34f56702..ef4eed4ecd6 100644
--- a/usr.bin/mandoc/tree.c
+++ b/usr.bin/mandoc/tree.c
@@ -1,6 +1,7 @@
-/* $Id: tree.c,v 1.18 2013/09/15 17:33:47 schwarze Exp $ */
+/* $Id: tree.c,v 1.19 2013/12/24 19:10:34 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
@@ -159,7 +160,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)