version 1.127, 2011/03/15 16:23:51 |
version 1.128, 2011/03/20 16:02:05 |
|
|
}; |
}; |
|
|
struct roff { |
struct roff { |
|
struct mparse *parse; /* parse point */ |
struct roffnode *last; /* leaf of stack */ |
struct roffnode *last; /* leaf of stack */ |
mandocmsg msg; /* err/warn/fatal messages */ |
|
void *data; /* privdata for messages */ |
|
enum roffrule rstack[RSTACK_MAX]; /* stack of !`ie' rules */ |
enum roffrule rstack[RSTACK_MAX]; /* stack of !`ie' rules */ |
int rstackpos; /* position in rstack */ |
int rstackpos; /* position in rstack */ |
struct regset *regs; /* read/writable registers */ |
struct regset *regs; /* read/writable registers */ |
Line 361 roff_free(struct roff *r) |
|
Line 360 roff_free(struct roff *r) |
|
|
|
|
|
struct roff * |
struct roff * |
roff_alloc(struct regset *regs, void *data, const mandocmsg msg) |
roff_alloc(struct regset *regs, struct mparse *parse) |
{ |
{ |
struct roff *r; |
struct roff *r; |
|
|
r = mandoc_calloc(1, sizeof(struct roff)); |
r = mandoc_calloc(1, sizeof(struct roff)); |
r->regs = regs; |
r->regs = regs; |
r->msg = msg; |
r->parse = parse; |
r->data = data; |
|
r->rstackpos = -1; |
r->rstackpos = -1; |
|
|
roff_hash_init(); |
roff_hash_init(); |
Line 555 roff_endparse(struct roff *r) |
|
Line 553 roff_endparse(struct roff *r) |
|
{ |
{ |
|
|
if (r->last) |
if (r->last) |
(*r->msg)(MANDOCERR_SCOPEEXIT, r->data, |
mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, |
r->last->line, r->last->col, NULL); |
r->last->line, r->last->col, NULL); |
|
|
if (r->eqn) { |
if (r->eqn) { |
(*r->msg)(MANDOCERR_SCOPEEXIT, r->data, |
mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, |
r->eqn->eqn.line, r->eqn->eqn.pos, NULL); |
r->eqn->eqn.line, r->eqn->eqn.pos, NULL); |
eqn_end(r->eqn); |
eqn_end(r->eqn); |
r->eqn = NULL; |
r->eqn = NULL; |
} |
} |
|
|
if (r->tbl) { |
if (r->tbl) { |
(*r->msg)(MANDOCERR_SCOPEEXIT, r->data, |
mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, |
r->tbl->line, r->tbl->pos, NULL); |
r->tbl->line, r->tbl->pos, NULL); |
tbl_end(r->tbl); |
tbl_end(r->tbl); |
r->tbl = NULL; |
r->tbl = NULL; |
Line 639 roff_cblock(ROFF_ARGS) |
|
Line 637 roff_cblock(ROFF_ARGS) |
|
*/ |
*/ |
|
|
if (NULL == r->last) { |
if (NULL == r->last) { |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
Line 658 roff_cblock(ROFF_ARGS) |
|
Line 656 roff_cblock(ROFF_ARGS) |
|
case (ROFF_ig): |
case (ROFF_ig): |
break; |
break; |
default: |
default: |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
if ((*bufp)[pos]) |
if ((*bufp)[pos]) |
(*r->msg)(MANDOCERR_ARGSLOST, r->data, ln, pos, NULL); |
mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL); |
|
|
roffnode_pop(r); |
roffnode_pop(r); |
roffnode_cleanscope(r); |
roffnode_cleanscope(r); |
Line 690 roff_ccond(ROFF_ARGS) |
|
Line 688 roff_ccond(ROFF_ARGS) |
|
{ |
{ |
|
|
if (NULL == r->last) { |
if (NULL == r->last) { |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
Line 702 roff_ccond(ROFF_ARGS) |
|
Line 700 roff_ccond(ROFF_ARGS) |
|
case (ROFF_if): |
case (ROFF_if): |
break; |
break; |
default: |
default: |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
if (r->last->endspan > -1) { |
if (r->last->endspan > -1) { |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
if ((*bufp)[pos]) |
if ((*bufp)[pos]) |
(*r->msg)(MANDOCERR_ARGSLOST, r->data, ln, pos, NULL); |
mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL); |
|
|
roffnode_pop(r); |
roffnode_pop(r); |
roffnode_cleanscope(r); |
roffnode_cleanscope(r); |
Line 732 roff_block(ROFF_ARGS) |
|
Line 730 roff_block(ROFF_ARGS) |
|
|
|
if (ROFF_ig != tok) { |
if (ROFF_ig != tok) { |
if ('\0' == (*bufp)[pos]) { |
if ('\0' == (*bufp)[pos]) { |
(*r->msg)(MANDOCERR_NOARGS, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
Line 746 roff_block(ROFF_ARGS) |
|
Line 744 roff_block(ROFF_ARGS) |
|
if (ROFF_de == tok) |
if (ROFF_de == tok) |
name = *bufp + pos; |
name = *bufp + pos; |
else |
else |
(*r->msg)(MANDOCERR_REQUEST, r->data, ln, ppos, |
mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos, |
roffs[tok].name); |
roffs[tok].name); |
|
|
while ((*bufp)[pos] && ' ' != (*bufp)[pos]) |
while ((*bufp)[pos] && ' ' != (*bufp)[pos]) |
Line 796 roff_block(ROFF_ARGS) |
|
Line 794 roff_block(ROFF_ARGS) |
|
r->last->end[(int)sz] = '\0'; |
r->last->end[(int)sz] = '\0'; |
|
|
if ((*bufp)[pos]) |
if ((*bufp)[pos]) |
(*r->msg)(MANDOCERR_ARGSLOST, r->data, ln, pos, NULL); |
mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL); |
|
|
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
Line 977 roff_line_ignore(ROFF_ARGS) |
|
Line 975 roff_line_ignore(ROFF_ARGS) |
|
{ |
{ |
|
|
if (ROFF_it == tok) |
if (ROFF_it == tok) |
(*r->msg)(MANDOCERR_REQUEST, r->data, ln, ppos, "it"); |
mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos, "it"); |
|
|
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
Line 992 roff_cond(ROFF_ARGS) |
|
Line 990 roff_cond(ROFF_ARGS) |
|
/* Stack overflow! */ |
/* Stack overflow! */ |
|
|
if (ROFF_ie == tok && r->rstackpos == RSTACK_MAX - 1) { |
if (ROFF_ie == tok && r->rstackpos == RSTACK_MAX - 1) { |
(*r->msg)(MANDOCERR_MEM, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_MEM, r->parse, ln, ppos, NULL); |
return(ROFF_ERR); |
return(ROFF_ERR); |
} |
} |
|
|
Line 1023 roff_cond(ROFF_ARGS) |
|
Line 1021 roff_cond(ROFF_ARGS) |
|
*/ |
*/ |
|
|
if ('\0' == (*bufp)[pos] && sv != pos) { |
if ('\0' == (*bufp)[pos] && sv != pos) { |
(*r->msg)(MANDOCERR_NOARGS, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
Line 1150 roff_TE(ROFF_ARGS) |
|
Line 1148 roff_TE(ROFF_ARGS) |
|
{ |
{ |
|
|
if (NULL == r->tbl) |
if (NULL == r->tbl) |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
else |
else |
tbl_end(r->tbl); |
tbl_end(r->tbl); |
|
|
Line 1164 roff_T_(ROFF_ARGS) |
|
Line 1162 roff_T_(ROFF_ARGS) |
|
{ |
{ |
|
|
if (NULL == r->tbl) |
if (NULL == r->tbl) |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
else |
else |
tbl_restart(ppos, ln, r->tbl); |
tbl_restart(ppos, ln, r->tbl); |
|
|
Line 1194 static enum rofferr |
|
Line 1192 static enum rofferr |
|
roff_EN(ROFF_ARGS) |
roff_EN(ROFF_ARGS) |
{ |
{ |
|
|
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
Line 1205 roff_TS(ROFF_ARGS) |
|
Line 1203 roff_TS(ROFF_ARGS) |
|
struct tbl_node *t; |
struct tbl_node *t; |
|
|
if (r->tbl) { |
if (r->tbl) { |
(*r->msg)(MANDOCERR_SCOPEBROKEN, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_SCOPEBROKEN, r->parse, ln, ppos, NULL); |
tbl_end(r->tbl); |
tbl_end(r->tbl); |
} |
} |
|
|
t = tbl_alloc(ppos, ln, r->data, r->msg); |
t = tbl_alloc(ppos, ln, r->parse); |
|
|
if (r->last_tbl) |
if (r->last_tbl) |
r->last_tbl->next = t; |
r->last_tbl->next = t; |
Line 1226 roff_so(ROFF_ARGS) |
|
Line 1224 roff_so(ROFF_ARGS) |
|
{ |
{ |
char *name; |
char *name; |
|
|
(*r->msg)(MANDOCERR_SO, r->data, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_SO, r->parse, ln, ppos, NULL); |
|
|
/* |
/* |
* Handle `so'. Be EXTREMELY careful, as we shouldn't be |
* Handle `so'. Be EXTREMELY careful, as we shouldn't be |
Line 1237 roff_so(ROFF_ARGS) |
|
Line 1235 roff_so(ROFF_ARGS) |
|
|
|
name = *bufp + pos; |
name = *bufp + pos; |
if ('/' == *name || strstr(name, "../") || strstr(name, "/..")) { |
if ('/' == *name || strstr(name, "../") || strstr(name, "/..")) { |
(*r->msg)(MANDOCERR_SOPATH, r->data, ln, pos, NULL); |
mandoc_msg(MANDOCERR_SOPATH, r->parse, ln, pos, NULL); |
return(ROFF_ERR); |
return(ROFF_ERR); |
} |
} |
|
|
Line 1260 roff_userdef(ROFF_ARGS) |
|
Line 1258 roff_userdef(ROFF_ARGS) |
|
cp = *bufp + pos; |
cp = *bufp + pos; |
for (i = 0; i < 9; i++) |
for (i = 0; i < 9; i++) |
arg[i] = '\0' == *cp ? "" : |
arg[i] = '\0' == *cp ? "" : |
mandoc_getarg(&cp, r->msg, r->data, ln, &pos); |
mandoc_getarg(r->parse, &cp, ln, &pos); |
|
|
/* |
/* |
* Expand macro arguments. |
* Expand macro arguments. |
Line 1316 roff_getname(struct roff *r, char **cpp, int ln, int p |
|
Line 1314 roff_getname(struct roff *r, char **cpp, int ln, int p |
|
cp++; |
cp++; |
if ('\\' == *cp) |
if ('\\' == *cp) |
continue; |
continue; |
(*r->msg)(MANDOCERR_NAMESC, r->data, ln, pos, NULL); |
mandoc_msg(MANDOCERR_NAMESC, r->parse, ln, pos, NULL); |
*cp = '\0'; |
*cp = '\0'; |
name = cp; |
name = cp; |
} |
} |