version 1.219, 2014/07/06 19:09:00 |
version 1.220, 2014/07/07 11:35:06 |
Line 847 roff_cblock(ROFF_ARGS) |
|
Line 847 roff_cblock(ROFF_ARGS) |
|
|
|
switch (r->last->tok) { |
switch (r->last->tok) { |
case ROFF_am: |
case ROFF_am: |
|
/* ROFF_am1 is remapped to ROFF_am in roff_block(). */ |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case ROFF_ami: |
case ROFF_ami: |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case ROFF_am1: |
|
/* FALLTHROUGH */ |
|
case ROFF_de: |
case ROFF_de: |
/* ROFF_de1 is remapped to ROFF_de in roff_block(). */ |
/* ROFF_de1 is remapped to ROFF_de in roff_block(). */ |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
Line 919 roff_ccond(struct roff *r, int ln, int ppos) |
|
Line 918 roff_ccond(struct roff *r, int ln, int ppos) |
|
static enum rofferr |
static enum rofferr |
roff_block(ROFF_ARGS) |
roff_block(ROFF_ARGS) |
{ |
{ |
char *name, *cp; |
const char *name; |
|
char *iname, *cp; |
size_t namesz; |
size_t namesz; |
|
|
name = cp = *bufp + pos; |
/* Ignore groff compatibility mode for now. */ |
namesz = 0; |
|
|
|
if (ROFF_ig != tok) { |
if (ROFF_de1 == tok) |
if ('\0' == *cp) { |
tok = ROFF_de; |
mandoc_msg(MANDOCERR_REQ_EMPTY, r->parse, |
else if (ROFF_am1 == tok) |
ln, ppos, roffs[tok].name); |
tok = ROFF_am; |
return(ROFF_IGN); |
|
} |
|
|
|
/* |
/* Parse the macro name argument. */ |
* Re-write `de1', since we don't really care about |
|
* groff's strange compatibility mode, into `de'. |
|
*/ |
|
|
|
if (ROFF_de1 == tok) |
cp = *bufp + pos; |
tok = ROFF_de; |
if (ROFF_ig == tok) { |
else if (ROFF_de != tok) |
iname = NULL; |
mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos, |
namesz = 0; |
roffs[tok].name); |
} else { |
|
iname = cp; |
namesz = roff_getname(r, &cp, ln, ppos); |
namesz = roff_getname(r, &cp, ln, ppos); |
name[namesz] = '\0'; |
iname[namesz] = '\0'; |
|
} |
|
|
|
/* Resolve the macro name argument if it is indirect. */ |
|
|
|
if (namesz && (ROFF_dei == tok || ROFF_ami == tok)) { |
|
if (NULL == (name = roff_getstrn(r, iname, namesz))) { |
|
mandoc_vmsg(MANDOCERR_STR_UNDEF, |
|
r->parse, ln, (int)(iname - *bufp), |
|
"%.*s", (int)namesz, iname); |
|
namesz = 0; |
|
} else |
|
namesz = strlen(name); |
} else |
} else |
name = NULL; |
name = iname; |
|
|
|
if (0 == namesz && ROFF_ig != tok) { |
|
mandoc_msg(MANDOCERR_REQ_EMPTY, r->parse, |
|
ln, ppos, roffs[tok].name); |
|
return(ROFF_IGN); |
|
} |
|
|
roffnode_push(r, tok, name, ln, ppos); |
roffnode_push(r, tok, name, ln, ppos); |
|
|
/* |
/* |
Line 956 roff_block(ROFF_ARGS) |
|
Line 968 roff_block(ROFF_ARGS) |
|
* appended from roff_block_text() in multiline mode. |
* appended from roff_block_text() in multiline mode. |
*/ |
*/ |
|
|
if (namesz && ROFF_de == tok) |
if (ROFF_de == tok || ROFF_dei == tok) |
roff_setstrn(&r->strtab, name, namesz, "", 0, 0); |
roff_setstrn(&r->strtab, name, namesz, "", 0, 0); |
|
|
if ('\0' == *cp) |
if ('\0' == *cp) |
return(ROFF_IGN); |
return(ROFF_IGN); |
|
|
/* If present, process the custom end-of-line marker. */ |
/* Get the custom end marker. */ |
|
|
name = cp; |
iname = cp; |
namesz = roff_getname(r, &cp, ln, ppos); |
namesz = roff_getname(r, &cp, ln, ppos); |
|
|
|
/* Resolve the end marker if it is indirect. */ |
|
|
|
if (namesz && (ROFF_dei == tok || ROFF_ami == tok)) { |
|
if (NULL == (name = roff_getstrn(r, iname, namesz))) { |
|
mandoc_vmsg(MANDOCERR_STR_UNDEF, |
|
r->parse, ln, (int)(iname - *bufp), |
|
"%.*s", (int)namesz, iname); |
|
namesz = 0; |
|
} else |
|
namesz = strlen(name); |
|
} else |
|
name = iname; |
|
|
if (namesz) |
if (namesz) |
r->last->end = mandoc_strndup(name, namesz); |
r->last->end = mandoc_strndup(name, namesz); |
|
|
Line 1020 roff_block_sub(ROFF_ARGS) |
|
Line 1046 roff_block_sub(ROFF_ARGS) |
|
|
|
t = roff_parse(r, *bufp, &pos, ln, ppos); |
t = roff_parse(r, *bufp, &pos, ln, ppos); |
|
|
/* |
|
* Macros other than block-end are only significant |
|
* in `de' blocks; elsewhere, simply throw them away. |
|
*/ |
|
if (ROFF_cblock != t) { |
if (ROFF_cblock != t) { |
if (ROFF_de == tok) |
if (ROFF_ig != tok) |
roff_setstr(r, r->last->name, *bufp + ppos, 2); |
roff_setstr(r, r->last->name, *bufp + ppos, 2); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
Line 1038 static enum rofferr |
|
Line 1060 static enum rofferr |
|
roff_block_text(ROFF_ARGS) |
roff_block_text(ROFF_ARGS) |
{ |
{ |
|
|
if (ROFF_de == tok) |
if (ROFF_ig != tok) |
roff_setstr(r, r->last->name, *bufp + pos, 2); |
roff_setstr(r, r->last->name, *bufp + pos, 2); |
|
|
return(ROFF_IGN); |
return(ROFF_IGN); |