version 1.157, 2014/12/13 13:14:39 |
version 1.159, 2014/12/18 20:58:32 |
Line 478 make_pending(struct mdoc_node *broken, enum mdoct tok, |
|
Line 478 make_pending(struct mdoc_node *broken, enum mdoct tok, |
|
for (breaker = broken->parent; breaker; breaker = breaker->parent) { |
for (breaker = broken->parent; breaker; breaker = breaker->parent) { |
|
|
/* |
/* |
* If the *broken block had already been broken before |
* If the *broken block (Z) is already broken and we |
* and we encounter its breaker, make the tok block |
* encounter its breaker (B), make the tok block (A) |
* pending on the inner breaker. |
* pending on that inner breaker (B). |
* Graphically, "[A breaker=[B broken=[C->B B] tok=A] C]" |
* Graphically, [A breaker=[B! broken=[Z->B B] tok=A] Z] |
* becomes "[A broken=[B [C->B B] tok=A] C]" |
* becomes breaker=[A broken=[B! [Z->B B] tok=A] Z] |
* and finally "[A [B->A [C->B B] A] C]". |
* 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) { |
if (breaker == broken->pending) { |
broken = breaker; |
broken = breaker; |
Line 497 make_pending(struct mdoc_node *broken, enum mdoct tok, |
|
Line 501 make_pending(struct mdoc_node *broken, enum mdoct tok, |
|
|
|
/* |
/* |
* Found the breaker. |
* Found the breaker. |
* If another, outer breaker is already pending on |
* If another, outer breaker (X) is already pending on |
* the *broken block, we must not clobber the link |
* the *broken block (B), we must not clobber the link |
* to the outer breaker, but make it pending on the |
* to the outer breaker, but make it pending on the |
* new, now inner breaker. |
* new, now inner breaker (A). |
* Graphically, "[A breaker=[B broken=[C->A A] tok=B] C]" |
* Graphically, [X! breaker=[A broken=[B->X X] tok=A] B] |
* becomes "[A breaker=[B->A broken=[C A] tok=B] C]" |
* becomes [X! breaker=[A->X broken=[B X] tok=A] B] |
* and finally "[A [B->A [C->B A] B] C]". |
* and finally [X! [A!->X [B->A X] A] B]. |
*/ |
*/ |
if (broken->pending) { |
if (broken->pending) { |
struct mdoc_node *taker; |
struct mdoc_node *taker; |
|
|
/* |
/* |
* If the breaker had also been broken before, |
* If the inner breaker (A) is already broken, |
* it cannot take on the outer breaker itself, |
* too, it cannot take on the outer breaker (X) |
* but must hand it on to its own breakers. |
* but must hand it on to its own breakers (Y): |
* Graphically, this is the following situation: |
* [X! [Y! breaker=[A->Y Y] broken=[B->X X] tok=A] B] |
* "[A [B breaker=[C->B B] broken=[D->A A] tok=C] D]" |
* [X! take=[Y!->X brea=[A->Y Y] brok=[B X] tok=A] B] |
* "[A taker=[B->A breaker=[C->B B] [D->C A] C] D]" |
* and finally [X! [Y!->X [A!->Y Y] [B->A X] A] B]. |
*/ |
*/ |
taker = breaker; |
taker = breaker; |
while (taker->pending) |
while (taker->pending) |
taker = taker->pending; |
taker = taker->pending; |
taker->pending = broken->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; |
broken->pending = breaker; |
|
breaker->flags |= MDOC_BREAK; |
mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, line, ppos, |
mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, line, ppos, |
"%s breaks %s", mdoc_macronames[tok], |
"%s breaks %s", mdoc_macronames[tok], |
mdoc_macronames[broken->tok]); |
mdoc_macronames[broken->tok]); |
Line 1067 blk_full(MACRO_PROT_ARGS) |
|
Line 1078 blk_full(MACRO_PROT_ARGS) |
|
|
|
if (tok == MDOC_It) { |
if (tok == MDOC_It) { |
for (n = mdoc->last; n; n = n->parent) |
for (n = mdoc->last; n; n = n->parent) |
if (n->tok == MDOC_Bl && |
if (n->tok == MDOC_Bl && n->type == MDOC_BLOCK && |
! (n->flags & MDOC_VALID)) |
! (n->flags & (MDOC_VALID | MDOC_BREAK))) |
break; |
break; |
if (n == NULL) { |
if (n == NULL) { |
mandoc_vmsg(MANDOCERR_IT_STRAY, mdoc->parse, |
mandoc_vmsg(MANDOCERR_IT_STRAY, mdoc->parse, |
Line 1548 phrase_ta(MACRO_PROT_ARGS) |
|
Line 1559 phrase_ta(MACRO_PROT_ARGS) |
|
/* Make sure we are in a column list or ignore this macro. */ |
/* Make sure we are in a column list or ignore this macro. */ |
|
|
n = mdoc->last; |
n = mdoc->last; |
while (n != NULL && n->tok != MDOC_Bl) |
while (n != NULL && |
|
(n->tok != MDOC_Bl || n->flags & (MDOC_VALID | MDOC_BREAK))) |
n = n->parent; |
n = n->parent; |
if (n == NULL || n->norm->Bl.type != LIST_column) { |
if (n == NULL || n->norm->Bl.type != LIST_column) { |
mandoc_msg(MANDOCERR_TA_STRAY, mdoc->parse, |
mandoc_msg(MANDOCERR_TA_STRAY, mdoc->parse, |