version 1.155, 2014/11/30 02:36:38 |
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 672 macro_or_word(MACRO_PROT_ARGS, int parsed) |
|
Line 683 macro_or_word(MACRO_PROT_ARGS, int parsed) |
|
|
|
p = buf + ppos; |
p = buf + ppos; |
ntok = MDOC_MAX; |
ntok = MDOC_MAX; |
if (mdoc->flags & MDOC_PHRASELIT) |
if (*p == '"') |
/* nothing */; |
|
else if (*p == '"') |
|
p++; |
p++; |
else if (parsed) |
else if (parsed && ! (mdoc->flags & MDOC_PHRASELIT)) |
ntok = lookup(mdoc, tok, line, ppos, p); |
ntok = lookup(mdoc, tok, line, ppos, p); |
|
|
if (ntok == MDOC_MAX) { |
if (ntok == MDOC_MAX) { |
Line 1069 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 1396 in_line_argn(MACRO_PROT_ARGS) |
|
Line 1405 in_line_argn(MACRO_PROT_ARGS) |
|
char *p; |
char *p; |
enum mdoct ntok; |
enum mdoct ntok; |
|
|
nl = MDOC_NEWLINE & mdoc->flags; |
nl = mdoc->flags & MDOC_NEWLINE; |
|
|
/* |
/* |
* A line macro that has a fixed number of arguments (maxargs). |
* A line macro that has a fixed number of arguments (maxargs). |
Line 1428 in_line_argn(MACRO_PROT_ARGS) |
|
Line 1437 in_line_argn(MACRO_PROT_ARGS) |
|
|
|
mdoc_argv(mdoc, line, tok, &arg, pos, buf); |
mdoc_argv(mdoc, line, tok, &arg, pos, buf); |
|
|
for (flushed = j = 0; ; ) { |
p = NULL; |
|
flushed = j = 0; |
|
for (;;) { |
la = *pos; |
la = *pos; |
ac = mdoc_args(mdoc, line, pos, buf, tok, &p); |
ac = mdoc_args(mdoc, line, pos, buf, tok, &p); |
if (ac == ARGS_PUNCT || ac == ARGS_EOLN) |
if (ac == ARGS_PUNCT || ac == ARGS_EOLN) { |
|
if (j < 2 && tok == MDOC_Pf) |
|
mandoc_vmsg(MANDOCERR_PF_SKIP, |
|
mdoc->parse, line, ppos, "Pf %s", |
|
p == NULL ? "at eol" : p); |
break; |
break; |
|
} |
|
|
if ( ! (mdoc_macros[tok].flags & MDOC_IGNDELIM) && |
if ( ! (mdoc_macros[tok].flags & MDOC_IGNDELIM) && |
ac != ARGS_QWORD && j == 0 && |
ac != ARGS_QWORD && j == 0 && |
Line 1447 in_line_argn(MACRO_PROT_ARGS) |
|
Line 1463 in_line_argn(MACRO_PROT_ARGS) |
|
flushed = 1; |
flushed = 1; |
} |
} |
|
|
ntok = ac == ARGS_QWORD ? MDOC_MAX : |
ntok = (ac == ARGS_QWORD || (tok == MDOC_Pf && j == 0)) ? |
lookup(mdoc, tok, line, la, p); |
MDOC_MAX : lookup(mdoc, tok, line, la, p); |
|
|
if (ntok != MDOC_MAX) { |
if (ntok != MDOC_MAX) { |
if ( ! flushed) |
if ( ! flushed) |
Line 1471 in_line_argn(MACRO_PROT_ARGS) |
|
Line 1487 in_line_argn(MACRO_PROT_ARGS) |
|
j++; |
j++; |
} |
} |
|
|
if (j == 0) |
if (j == 0) { |
mdoc_elem_alloc(mdoc, line, ppos, tok, arg); |
mdoc_elem_alloc(mdoc, line, ppos, tok, arg); |
|
if (ac == ARGS_PUNCT && tok == MDOC_Pf) |
|
append_delims(mdoc, line, pos, buf); |
|
} |
if ( ! flushed) |
if ( ! flushed) |
rew_elem(mdoc, tok); |
rew_elem(mdoc, tok); |
if (nl) |
if (nl) |
Line 1540 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, |