version 1.82, 2010/05/17 02:01:05 |
version 1.84, 2010/05/24 23:54:18 |
|
|
ROFF_de, |
ROFF_de, |
ROFF_dei, |
ROFF_dei, |
ROFF_de1, |
ROFF_de1, |
|
ROFF_ds, |
ROFF_el, |
ROFF_el, |
ROFF_ie, |
ROFF_ie, |
ROFF_if, |
ROFF_if, |
ROFF_ig, |
ROFF_ig, |
|
ROFF_rm, |
|
ROFF_tr, |
ROFF_cblock, |
ROFF_cblock, |
ROFF_ccond, |
ROFF_ccond, |
ROFF_MAX |
ROFF_MAX |
Line 98 static enum rofferr roff_ccond(ROFF_ARGS); |
|
Line 101 static enum rofferr roff_ccond(ROFF_ARGS); |
|
static enum rofferr roff_cond(ROFF_ARGS); |
static enum rofferr roff_cond(ROFF_ARGS); |
static enum rofferr roff_cond_text(ROFF_ARGS); |
static enum rofferr roff_cond_text(ROFF_ARGS); |
static enum rofferr roff_cond_sub(ROFF_ARGS); |
static enum rofferr roff_cond_sub(ROFF_ARGS); |
|
static enum rofferr roff_line(ROFF_ARGS); |
|
|
const struct roffmac roffs[ROFF_MAX] = { |
const struct roffmac roffs[ROFF_MAX] = { |
{ "am", roff_block, roff_block_text, roff_block_sub, 0 }, |
{ "am", roff_block, roff_block_text, roff_block_sub, 0 }, |
Line 106 const struct roffmac roffs[ROFF_MAX] = { |
|
Line 110 const struct roffmac roffs[ROFF_MAX] = { |
|
{ "de", roff_block, roff_block_text, roff_block_sub, 0 }, |
{ "de", roff_block, roff_block_text, roff_block_sub, 0 }, |
{ "dei", roff_block, roff_block_text, roff_block_sub, 0 }, |
{ "dei", roff_block, roff_block_text, roff_block_sub, 0 }, |
{ "de1", roff_block, roff_block_text, roff_block_sub, 0 }, |
{ "de1", roff_block, roff_block_text, roff_block_sub, 0 }, |
|
{ "ds", roff_line, NULL, NULL, 0 }, |
{ "el", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT }, |
{ "el", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT }, |
{ "ie", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT }, |
{ "ie", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT }, |
{ "if", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT }, |
{ "if", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT }, |
{ "ig", roff_block, roff_block_text, roff_block_sub, 0 }, |
{ "ig", roff_block, roff_block_text, roff_block_sub, 0 }, |
|
{ "rm", roff_line, NULL, NULL, 0 }, |
|
{ "tr", roff_line, NULL, NULL, 0 }, |
{ ".", roff_cblock, NULL, NULL, 0 }, |
{ ".", roff_cblock, NULL, NULL, 0 }, |
{ "\\}", roff_ccond, NULL, NULL, 0 }, |
{ "\\}", roff_ccond, NULL, NULL, 0 }, |
}; |
}; |
Line 568 roff_cond_sub(ROFF_ARGS) |
|
Line 575 roff_cond_sub(ROFF_ARGS) |
|
ppos = pos; |
ppos = pos; |
rr = r->last->rule; |
rr = r->last->rule; |
|
|
roffnode_cleanscope(r); |
roff_cond_text(r, tok, bufp, szp, ln, ppos, pos, offs); |
|
|
if (ROFF_MAX == (t = roff_parse(*bufp, &pos))) |
if (ROFF_MAX == (t = roff_parse(*bufp, &pos))) |
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
Line 609 roff_cond_text(ROFF_ARGS) |
|
Line 616 roff_cond_text(ROFF_ARGS) |
|
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
} |
} |
|
|
if (ep > st && '\\' != *(ep - 1)) |
if (ep > st && '\\' != *(ep - 1)) { |
|
ep = '\0'; |
roffnode_pop(r); |
roffnode_pop(r); |
|
} |
|
|
roffnode_cleanscope(r); |
roffnode_cleanscope(r); |
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
Line 621 roff_cond_text(ROFF_ARGS) |
|
Line 630 roff_cond_text(ROFF_ARGS) |
|
static enum rofferr |
static enum rofferr |
roff_cond(ROFF_ARGS) |
roff_cond(ROFF_ARGS) |
{ |
{ |
|
int cpos; /* position of the condition */ |
int sv; |
int sv; |
|
|
/* Stack overflow! */ |
/* Stack overflow! */ |
Line 630 roff_cond(ROFF_ARGS) |
|
Line 640 roff_cond(ROFF_ARGS) |
|
return(ROFF_ERR); |
return(ROFF_ERR); |
} |
} |
|
|
|
cpos = pos; |
|
|
if (ROFF_if == tok || ROFF_ie == tok) { |
if (ROFF_if == tok || ROFF_ie == tok) { |
/* |
/* |
* Read ahead past the conditional. FIXME: this does |
* Read ahead past the conditional. FIXME: this does |
Line 660 roff_cond(ROFF_ARGS) |
|
Line 672 roff_cond(ROFF_ARGS) |
|
if ( ! roffnode_push(r, tok, ln, ppos)) |
if ( ! roffnode_push(r, tok, ln, ppos)) |
return(ROFF_ERR); |
return(ROFF_ERR); |
|
|
/* TODO: here we would evaluate the conditional. */ |
/* XXX: Implement more conditionals. */ |
|
|
if (ROFF_el == tok) { |
if (ROFF_if == tok || ROFF_ie == tok) |
|
r->last->rule = 'n' == (*bufp)[cpos] ? |
|
ROFFRULE_ALLOW : ROFFRULE_DENY; |
|
else if (ROFF_el == tok) { |
/* |
/* |
* An `.el' will get the value of the current rstack |
* An `.el' will get the value of the current rstack |
* entry set in prior `ie' calls or defaults to DENY. |
* entry set in prior `ie' calls or defaults to DENY. |
Line 671 roff_cond(ROFF_ARGS) |
|
Line 686 roff_cond(ROFF_ARGS) |
|
r->last->rule = ROFFRULE_DENY; |
r->last->rule = ROFFRULE_DENY; |
else |
else |
r->last->rule = r->rstack[r->rstackpos]; |
r->last->rule = r->rstack[r->rstackpos]; |
} else if (ROFF_ie == tok) { |
} |
|
if (ROFF_ie == tok) { |
/* |
/* |
* An if-else will put the NEGATION of the current |
* An if-else will put the NEGATION of the current |
* evaluated conditional into the stack. |
* evaluated conditional into the stack. |
Line 682 roff_cond(ROFF_ARGS) |
|
Line 698 roff_cond(ROFF_ARGS) |
|
else |
else |
r->rstack[r->rstackpos] = ROFFRULE_DENY; |
r->rstack[r->rstackpos] = ROFFRULE_DENY; |
} |
} |
|
if (r->last->parent && ROFFRULE_DENY == r->last->parent->rule) |
|
r->last->rule = ROFFRULE_DENY; |
|
|
r->last->endspan = 1; |
r->last->endspan = 1; |
|
|
Line 702 roff_cond(ROFF_ARGS) |
|
Line 720 roff_cond(ROFF_ARGS) |
|
|
|
*offs = pos; |
*offs = pos; |
return(ROFF_RERUN); |
return(ROFF_RERUN); |
|
} |
|
|
|
|
|
/* ARGSUSED */ |
|
static enum rofferr |
|
roff_line(ROFF_ARGS) |
|
{ |
|
|
|
return(ROFF_IGN); |
} |
} |