summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2015-02-02 19:22:47 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2015-02-02 19:22:47 +0000
commita157b341b159badc71b8c015d7371cb337a5bd5e (patch)
treed4c94faf69d9aafc7c03bf188124a7d280ebe5b7
parent41e82296c4d3d88568f41e598a5c18759bda8ddd (diff)
Simplify and reindent make_pending(). No functional change
except that some error messages become less confusing. Now the function is almost readable (but still requires nineteen lines of comments for fourteen lines of code).
-rw-r--r--regress/usr.bin/mandoc/mdoc/Bl/break.out_lint4
-rw-r--r--regress/usr.bin/mandoc/mdoc/Op/break.out_lint2
-rw-r--r--usr.bin/mandoc/mdoc_macro.c107
3 files changed, 53 insertions, 60 deletions
diff --git a/regress/usr.bin/mandoc/mdoc/Bl/break.out_lint b/regress/usr.bin/mandoc/mdoc/Bl/break.out_lint
index 7be7b279797..c534bee29c1 100644
--- a/regress/usr.bin/mandoc/mdoc/Bl/break.out_lint
+++ b/regress/usr.bin/mandoc/mdoc/Bl/break.out_lint
@@ -4,10 +4,10 @@ mandoc: break.in:22:2: ERROR: skipping item outside list: It
mandoc: break.in:32:2: WARNING: blocks badly nested: Bl breaks Bd
mandoc: break.in:41:2: WARNING: blocks badly nested: Bl breaks Bd
mandoc: break.in:42:2: ERROR: skipping item outside list: It
-mandoc: break.in:49:2: WARNING: blocks badly nested: Bl breaks It
+mandoc: break.in:49:2: WARNING: blocks badly nested: Bl breaks Bo
mandoc: break.in:51:2: ERROR: inserting missing end of block: Sh breaks Bo
mandoc: break.in:51:2: ERROR: inserting missing end of block: Sh breaks It
-mandoc: break.in:54:2: WARNING: blocks badly nested: Bl breaks It
+mandoc: break.in:54:2: WARNING: blocks badly nested: Bl breaks Bo
mandoc: break.in:53:25: ERROR: appending missing end of block: Bo
mandoc: break.in:52:2: ERROR: appending missing end of block: Bl
mandoc: break.in:53:2: WARNING: empty list item: Bl -enum It
diff --git a/regress/usr.bin/mandoc/mdoc/Op/break.out_lint b/regress/usr.bin/mandoc/mdoc/Op/break.out_lint
index 879b003ff94..49c0fd12d2a 100644
--- a/regress/usr.bin/mandoc/mdoc/Op/break.out_lint
+++ b/regress/usr.bin/mandoc/mdoc/Op/break.out_lint
@@ -1,3 +1,3 @@
mandoc: break.in:9:2: WARNING: blocks badly nested: Op breaks Do
mandoc: break.in:15:7: WARNING: blocks badly nested: Op breaks Do
-mandoc: break.in:15:2: WARNING: blocks badly nested: Op breaks Op
+mandoc: break.in:15:2: WARNING: blocks badly nested: Op breaks Do
diff --git a/usr.bin/mandoc/mdoc_macro.c b/usr.bin/mandoc/mdoc_macro.c
index b8698053a17..e54625fa504 100644
--- a/usr.bin/mandoc/mdoc_macro.c
+++ b/usr.bin/mandoc/mdoc_macro.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mdoc_macro.c,v 1.124 2015/02/02 18:26:06 schwarze Exp $ */
+/* $OpenBSD: mdoc_macro.c,v 1.125 2015/02/02 19:22:46 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -469,71 +469,64 @@ make_pending(struct mdoc *mdoc, struct mdoc_node *breaker,
{
struct mdoc_node *n;
- /* Iterate backwards, searching for the breaker. */
+ mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, line, ppos,
+ "%s breaks %s", mdoc_macronames[breaker->tok],
+ mdoc_macronames[broken->tok]);
- for (n = broken->parent; ; n = n->parent) {
+ /*
+ * If the *broken block (Z) is already broken by a block (B)
+ * contained in the breaker (A), make the breaker pending
+ * on that inner breaker (B). Graphically,
+ *
+ * breaker=[A! broken=n=[B!->A (old broken=)[Z->B B] A] Z]
+ *
+ * In these graphics, "->" indicates the "pending" pointer and
+ * "!" indicates the MDOC_BREAK flag. Each of the cases gets
+ * one additional pointer (B->A) and one additional flag (A!).
+ */
- /*
- * If the *broken block (Z) is already broken and we
- * encounter its breaker (B), make the tok block (A)
- * pending on that inner breaker (B).
- * Graphically, [A n=[B! broken=[Z->B B] tok=A] Z]
- * becomes [A broken=[B! [Z->B B] tok=A] Z]
- * and finally [A! [B!->A [Z->B B] A] Z].
- * In these graphics, "->" indicates the "pending"
- * pointer and "!" indicates the MDOC_BREAK flag.
- * Each of the cases gets one additional pointer (B->A)
- * and one additional flag (A!).
- */
- if (n == broken->pending) {
+ for (n = broken->parent; ; n = n->parent)
+ if (n == broken->pending)
broken = n;
- continue;
- }
-
- if (n != breaker)
- continue;
+ else if (n == breaker)
+ break;
- /*
- * Found the breaker.
- * If another, outer breaker (X) is already pending on
- * the *broken block (B), we must not clobber the link
- * to the outer breaker, but make it pending on the
- * new, now inner breaker (A).
- * Graphically, [X! breaker=[A broken=[B->X X] tok=A] B]
- * becomes [X! breaker=[A->X broken=[B X] tok=A] B]
- * and finally [X! [A!->X [B->A X] A] B].
- */
- if (broken->pending) {
- struct mdoc_node *taker;
+ /*
+ * Found the breaker.
+ *
+ * If another, outer breaker (X) is already pending on
+ * the *broken block (B), we must not clobber the link
+ * to the outer breaker, but make it pending on the new,
+ * now inner breaker (A). Graphically,
+ *
+ * [X! n=breaker=[A!->X broken=[B(->X)->A X] A] B].
+ */
- /*
- * If the inner breaker (A) is already broken,
- * too, it cannot take on the outer breaker (X)
- * but must hand it on to its own breakers (Y):
- * [X! [Y! breaker=[A->Y Y] broken=[B->X X] tok=A] B]
- * [X! take=[Y!->X brea=[A->Y Y] brok=[B X] tok=A] B]
- * and finally [X! [Y!->X [A!->Y Y] [B->A X] A] B].
- */
- taker = breaker;
- while (taker->pending)
- taker = taker->pending;
- taker->pending = broken->pending;
- }
+ if (broken->pending != NULL) {
+ n = breaker;
/*
- * Now we have reduced the situation to the simplest
- * case, which is just breaker=[A broken=[B tok=A] B]
- * and becomes [A! [B->A A] B].
+ * If the inner breaker (A) is already broken, too,
+ * it cannot take on the outer breaker (X) but must
+ * hand it on to its own breakers (Y). Graphically,
+ *
+ * [X! n=[Y!->X breaker=[A!->Y Y] broken=[B(->X)->A X] A] B]
*/
- broken->pending = breaker;
- breaker->flags |= MDOC_BREAK;
- if (breaker->body != NULL)
- breaker->body->flags |= MDOC_BREAK;
- mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, line, ppos,
- "%s breaks %s", mdoc_macronames[breaker->tok],
- mdoc_macronames[broken->tok]);
- return;
+
+ while (n->pending)
+ n = n->pending;
+ n->pending = broken->pending;
}
+
+ /*
+ * Now we have reduced the situation to the simplest case:
+ * breaker=[A! broken=[B->A A] B].
+ */
+
+ broken->pending = breaker;
+ breaker->flags |= MDOC_BREAK;
+ if (breaker->body != NULL)
+ breaker->body->flags |= MDOC_BREAK;
}
static void