diff options
author | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2015-02-02 19:22:47 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2015-02-02 19:22:47 +0000 |
commit | a157b341b159badc71b8c015d7371cb337a5bd5e (patch) | |
tree | d4c94faf69d9aafc7c03bf188124a7d280ebe5b7 | |
parent | 41e82296c4d3d88568f41e598a5c18759bda8ddd (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_lint | 4 | ||||
-rw-r--r-- | regress/usr.bin/mandoc/mdoc/Op/break.out_lint | 2 | ||||
-rw-r--r-- | usr.bin/mandoc/mdoc_macro.c | 107 |
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 |