version 1.138, 2011/05/14 16:06:08 |
version 1.140, 2011/05/24 15:22:14 |
Line 840 roff_cond_sub(ROFF_ARGS) |
|
Line 840 roff_cond_sub(ROFF_ARGS) |
|
{ |
{ |
enum rofft t; |
enum rofft t; |
enum roffrule rr; |
enum roffrule rr; |
|
char *ep; |
|
|
rr = r->last->rule; |
rr = r->last->rule; |
|
roffnode_cleanscope(r); |
|
|
/* |
/* |
* Clean out scope. If we've closed ourselves, then don't |
* If the macro is unknown, first check if it contains a closing |
* continue. |
* delimiter `\}'. If it does, close out our scope and return |
|
* the currently-scoped rule (ignore or continue). Else, drop |
|
* into the currently-scoped rule. |
*/ |
*/ |
|
|
roffnode_cleanscope(r); |
|
|
|
if (ROFF_MAX == (t = roff_parse(r, *bufp, &pos))) { |
if (ROFF_MAX == (t = roff_parse(r, *bufp, &pos))) { |
if ('\\' == (*bufp)[pos] && '}' == (*bufp)[pos + 1]) |
ep = &(*bufp)[pos]; |
return(roff_ccond |
for ( ; NULL != (ep = strchr(ep, '\\')); ep++) { |
(r, ROFF_ccond, bufp, szp, |
ep++; |
ln, pos, pos + 2, offs)); |
if ('}' != *ep) |
|
continue; |
|
*ep = '&'; |
|
roff_ccond(r, ROFF_ccond, bufp, szp, |
|
ln, pos, pos + 2, offs); |
|
break; |
|
} |
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
} |
} |
|
|
Line 863 roff_cond_sub(ROFF_ARGS) |
|
Line 871 roff_cond_sub(ROFF_ARGS) |
|
* if they're either structurally required (such as loops and |
* if they're either structurally required (such as loops and |
* conditionals) or a closing macro. |
* conditionals) or a closing macro. |
*/ |
*/ |
|
|
if (ROFFRULE_DENY == rr) |
if (ROFFRULE_DENY == rr) |
if ( ! (ROFFMAC_STRUCT & roffs[t].flags)) |
if ( ! (ROFFMAC_STRUCT & roffs[t].flags)) |
if (ROFF_ccond != t) |
if (ROFF_ccond != t) |
Line 873 roff_cond_sub(ROFF_ARGS) |
|
Line 882 roff_cond_sub(ROFF_ARGS) |
|
ln, ppos, pos, offs)); |
ln, ppos, pos, offs)); |
} |
} |
|
|
|
|
/* ARGSUSED */ |
/* ARGSUSED */ |
static enum rofferr |
static enum rofferr |
roff_cond_text(ROFF_ARGS) |
roff_cond_text(ROFF_ARGS) |
{ |
{ |
char *ep, *st; |
char *ep; |
enum roffrule rr; |
enum roffrule rr; |
|
|
rr = r->last->rule; |
rr = r->last->rule; |
|
roffnode_cleanscope(r); |
|
|
/* |
ep = &(*bufp)[pos]; |
* We display the value of the text if out current evaluation |
for ( ; NULL != (ep = strchr(ep, '\\')); ep++) { |
* scope permits us to do so. |
ep++; |
*/ |
if ('}' != *ep) |
|
continue; |
/* FIXME: use roff_ccond? */ |
*ep = '&'; |
|
roff_ccond(r, ROFF_ccond, bufp, szp, |
st = &(*bufp)[pos]; |
ln, pos, pos + 2, offs); |
if (NULL == (ep = strstr(st, "\\}"))) { |
|
roffnode_cleanscope(r); |
|
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
|
} |
} |
|
|
if (ep == st || (ep > st && '\\' != *(ep - 1))) |
|
roffnode_pop(r); |
|
|
|
roffnode_cleanscope(r); |
|
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
} |
} |
|
|
|
|
static enum roffrule |
static enum roffrule |
roff_evalcond(const char *v, int *pos) |
roff_evalcond(const char *v, int *pos) |