version 1.147, 2011/07/18 07:46:41 |
version 1.152, 2011/07/26 14:09:01 |
Line 404 roff_alloc(struct mparse *parse) |
|
Line 404 roff_alloc(struct mparse *parse) |
|
static int |
static int |
roff_res(struct roff *r, char **bufp, size_t *szp, int ln, int pos) |
roff_res(struct roff *r, char **bufp, size_t *szp, int ln, int pos) |
{ |
{ |
|
enum mandoc_esc esc; |
const char *stesc; /* start of an escape sequence ('\\') */ |
const char *stesc; /* start of an escape sequence ('\\') */ |
const char *stnam; /* start of the name, after "[(*" */ |
const char *stnam; /* start of the name, after "[(*" */ |
const char *cp; /* end of the name, e.g. before ']' */ |
const char *cp; /* end of the name, e.g. before ']' */ |
Line 426 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
Line 427 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
|
|
if ('\0' == *cp) |
if ('\0' == *cp) |
return(1); |
return(1); |
if ('*' != *cp++) |
|
|
if ('*' != *cp) { |
|
res = cp; |
|
esc = mandoc_escape(&cp, NULL, NULL); |
|
if (ESCAPE_ERROR != esc) |
|
continue; |
|
mandoc_msg(MANDOCERR_BADESCAPE, |
|
r->parse, ln, pos, NULL); |
|
cp = res; |
continue; |
continue; |
|
} |
|
|
|
cp++; |
|
|
/* |
/* |
* The third character decides the length |
* The third character decides the length |
* of the name of the string. |
* of the name of the string. |
Line 583 roff_endparse(struct roff *r) |
|
Line 595 roff_endparse(struct roff *r) |
|
|
|
if (r->eqn) { |
if (r->eqn) { |
mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, |
mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, |
r->eqn->eqn.line, r->eqn->eqn.pos, NULL); |
r->eqn->eqn.ln, r->eqn->eqn.pos, NULL); |
eqn_end(r->eqn); |
eqn_end(&r->eqn); |
r->eqn = NULL; |
|
} |
} |
|
|
if (r->tbl) { |
if (r->tbl) { |
mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, |
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; |
|
} |
} |
} |
} |
|
|
Line 1149 roff_nr(ROFF_ARGS) |
|
Line 1159 roff_nr(ROFF_ARGS) |
|
|
|
if (0 == strcmp(key, "nS")) { |
if (0 == strcmp(key, "nS")) { |
r->regs[(int)REG_nS].set = 1; |
r->regs[(int)REG_nS].set = 1; |
if ((iv = mandoc_strntou(val, strlen(val), 10)) >= 0) |
if ((iv = mandoc_strntoi(val, strlen(val), 10)) >= 0) |
r->regs[(int)REG_nS].u = (unsigned)iv; |
r->regs[(int)REG_nS].u = (unsigned)iv; |
else |
else |
r->regs[(int)REG_nS].u = 0u; |
r->regs[(int)REG_nS].u = 0u; |
Line 1182 roff_TE(ROFF_ARGS) |
|
Line 1192 roff_TE(ROFF_ARGS) |
|
if (NULL == r->tbl) |
if (NULL == r->tbl) |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); |
else |
else |
tbl_end(r->tbl); |
tbl_end(&r->tbl); |
|
|
r->tbl = NULL; |
|
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
Line 1201 roff_T_(ROFF_ARGS) |
|
Line 1210 roff_T_(ROFF_ARGS) |
|
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
/* ARGSUSED */ |
int |
static enum rofferr |
roff_closeeqn(struct roff *r) |
roff_EQ(ROFF_ARGS) |
|
{ |
{ |
struct eqn_node *e; |
|
|
|
|
return(r->eqn && ROFF_EQN == eqn_end(&r->eqn) ? 1 : 0); |
|
} |
|
|
|
void |
|
roff_openeqn(struct roff *r, const char *name, int line, |
|
int offs, const char *buf) |
|
{ |
|
struct eqn_node *e; |
|
int poff; |
|
|
assert(NULL == r->eqn); |
assert(NULL == r->eqn); |
e = eqn_alloc(ppos, ln, r->parse); |
e = eqn_alloc(name, offs, line, r->parse); |
|
|
if (r->last_eqn) |
if (r->last_eqn) |
r->last_eqn->next = e; |
r->last_eqn->next = e; |
Line 1216 roff_EQ(ROFF_ARGS) |
|
Line 1233 roff_EQ(ROFF_ARGS) |
|
r->first_eqn = r->last_eqn = e; |
r->first_eqn = r->last_eqn = e; |
|
|
r->eqn = r->last_eqn = e; |
r->eqn = r->last_eqn = e; |
|
|
|
if (buf) { |
|
poff = 0; |
|
eqn_read(&r->eqn, line, buf, offs, &poff); |
|
} |
|
} |
|
|
|
/* ARGSUSED */ |
|
static enum rofferr |
|
roff_EQ(ROFF_ARGS) |
|
{ |
|
|
|
roff_openeqn(r, *bufp + pos, ln, ppos, NULL); |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
Line 1236 roff_TS(ROFF_ARGS) |
|
Line 1266 roff_TS(ROFF_ARGS) |
|
|
|
if (r->tbl) { |
if (r->tbl) { |
mandoc_msg(MANDOCERR_SCOPEBROKEN, r->parse, 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->parse); |
t = tbl_alloc(ppos, ln, r->parse); |
Line 1471 roff_eqn(const struct roff *r) |
|
Line 1501 roff_eqn(const struct roff *r) |
|
{ |
{ |
|
|
return(r->last_eqn ? &r->last_eqn->eqn : NULL); |
return(r->last_eqn ? &r->last_eqn->eqn : NULL); |
|
} |
|
|
|
char |
|
roff_eqndelim(const struct roff *r) |
|
{ |
|
|
|
return('\0'); |
} |
} |