- struct mdoc_node *breaker;
-
- /*
- * Iterate backwards, searching for the block matching tok,
- * that is, the block breaking the *broken block.
- */
- for (breaker = broken->parent; breaker; breaker = breaker->parent) {
-
- /*
- * 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 breaker=[B! broken=[Z->B B] tok=A] Z]
- * becomes breaker=[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 (breaker == broken->pending) {
- broken = breaker;
- continue;
- }
-
- if (REWIND_THIS != rew_dohalt(tok, MDOC_BLOCK, breaker))
- continue;
- if (MDOC_BODY == broken->type)
- broken = broken->parent;
-
- /*
- * 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;
-
- /*
- * 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;
- }
-
- /*
- * 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].
- */
- broken->pending = breaker;
- breaker->flags |= MDOC_BREAK;
- mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, line, ppos,
- "%s breaks %s", mdoc_macronames[tok],
- mdoc_macronames[broken->tok]);
- return(1);