version 1.180, 2015/02/07 16:42:33 |
version 1.182, 2015/02/11 13:37:57 |
Line 630 blk_exp_close(MACRO_PROT_ARGS) |
|
Line 630 blk_exp_close(MACRO_PROT_ARGS) |
|
break; |
break; |
} |
} |
|
|
|
/* Explicit blocks close out description lines. */ |
|
|
|
if (n->tok == MDOC_Nd) { |
|
rew_last(mdoc, n); |
|
continue; |
|
} |
|
|
/* |
/* |
* When finding an open sub block, remember the last |
* When finding an open sub block, remember the last |
* open explicit block, or, in case there are only |
* open explicit block, or, in case there are only |
Line 1285 blk_part_exp(MACRO_PROT_ARGS) |
|
Line 1292 blk_part_exp(MACRO_PROT_ARGS) |
|
static void |
static void |
in_line_argn(MACRO_PROT_ARGS) |
in_line_argn(MACRO_PROT_ARGS) |
{ |
{ |
int la, flushed, j, maxargs, nl; |
|
enum margserr ac; |
|
struct mdoc_arg *arg; |
struct mdoc_arg *arg; |
char *p; |
char *p; |
|
enum margserr ac; |
enum mdoct ntok; |
enum mdoct ntok; |
|
int state; /* arg#; -1: not yet open; -2: closed */ |
|
int la, maxargs, nl; |
|
|
nl = mdoc->flags & MDOC_NEWLINE; |
nl = mdoc->flags & MDOC_NEWLINE; |
|
|
Line 1323 in_line_argn(MACRO_PROT_ARGS) |
|
Line 1331 in_line_argn(MACRO_PROT_ARGS) |
|
|
|
mdoc_argv(mdoc, line, tok, &arg, pos, buf); |
mdoc_argv(mdoc, line, tok, &arg, pos, buf); |
|
|
|
state = -1; |
p = NULL; |
p = NULL; |
flushed = j = 0; |
|
for (;;) { |
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_WORD && state == -1 && |
|
! (mdoc_macros[tok].flags & MDOC_IGNDELIM) && |
|
mdoc_isdelim(p) == DELIM_OPEN) { |
|
dword(mdoc, line, la, p, DELIM_OPEN, 0); |
|
continue; |
|
} |
|
|
|
if (state == -1 && tok != MDOC_In && |
|
tok != MDOC_St && tok != MDOC_Xr) { |
|
mdoc_elem_alloc(mdoc, line, ppos, tok, arg); |
|
state = 0; |
|
} |
|
|
if (ac == ARGS_PUNCT || ac == ARGS_EOLN) { |
if (ac == ARGS_PUNCT || ac == ARGS_EOLN) { |
if (j < 2 && tok == MDOC_Pf) |
if (abs(state) < 2 && tok == MDOC_Pf) |
mandoc_vmsg(MANDOCERR_PF_SKIP, |
mandoc_vmsg(MANDOCERR_PF_SKIP, |
mdoc->parse, line, ppos, "Pf %s", |
mdoc->parse, line, ppos, "Pf %s", |
p == NULL ? "at eol" : p); |
p == NULL ? "at eol" : p); |
break; |
break; |
} |
} |
|
|
if ( ! (mdoc_macros[tok].flags & MDOC_IGNDELIM) && |
if (state == maxargs) { |
ac != ARGS_QWORD && j == 0 && |
|
mdoc_isdelim(p) == DELIM_OPEN) { |
|
dword(mdoc, line, la, p, DELIM_OPEN, 0); |
|
continue; |
|
} else if (j == 0) |
|
mdoc_elem_alloc(mdoc, line, ppos, tok, arg); |
|
|
|
if (j == maxargs && ! flushed) { |
|
rew_elem(mdoc, tok); |
rew_elem(mdoc, tok); |
flushed = 1; |
state = -2; |
} |
} |
|
|
ntok = (ac == ARGS_QWORD || (tok == MDOC_Pf && j == 0)) ? |
ntok = (ac == ARGS_QWORD || (tok == MDOC_Pf && state == 0)) ? |
MDOC_MAX : 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 (state >= 0) { |
rew_elem(mdoc, tok); |
rew_elem(mdoc, tok); |
flushed = 1; |
state = -2; |
|
} |
mdoc_macro(mdoc, ntok, line, la, pos, buf); |
mdoc_macro(mdoc, ntok, line, la, pos, buf); |
j++; |
|
break; |
break; |
} |
} |
|
|
if ( ! (mdoc_macros[tok].flags & MDOC_IGNDELIM) && |
if (ac == ARGS_QWORD || |
ac != ARGS_QWORD && ! flushed && |
mdoc_macros[tok].flags & MDOC_IGNDELIM || |
mdoc_isdelim(p) != DELIM_NONE) { |
mdoc_isdelim(p) == DELIM_NONE) { |
|
if (state == -1) { |
|
mdoc_elem_alloc(mdoc, line, ppos, tok, arg); |
|
state = 1; |
|
} else if (state >= 0) |
|
state++; |
|
} else if (state >= 0) { |
rew_elem(mdoc, tok); |
rew_elem(mdoc, tok); |
flushed = 1; |
state = -2; |
} |
} |
|
|
dword(mdoc, line, la, p, DELIM_MAX, |
dword(mdoc, line, la, p, DELIM_MAX, |
MDOC_JOIN & mdoc_macros[tok].flags); |
MDOC_JOIN & mdoc_macros[tok].flags); |
j++; |
|
} |
} |
|
|
if (j == 0) { |
if (state == -1) { |
if (tok == MDOC_In || tok == MDOC_St || tok == MDOC_Xr) { |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
line, ppos, mdoc_macronames[tok]); |
line, ppos, mdoc_macronames[tok]); |
return; |
return; |
|
} |
|
mdoc_elem_alloc(mdoc, line, ppos, tok, arg); |
|
if (ac == ARGS_PUNCT && tok == MDOC_Pf) |
|
append_delims(mdoc, line, pos, buf); |
|
} |
} |
if ( ! flushed) |
|
|
if (state == 0 && tok == MDOC_Pf) |
|
append_delims(mdoc, line, pos, buf); |
|
if (state >= 0) |
rew_elem(mdoc, tok); |
rew_elem(mdoc, tok); |
if (nl) |
if (nl) |
append_delims(mdoc, line, pos, buf); |
append_delims(mdoc, line, pos, buf); |