version 1.318, 2017/07/04 22:52:00 |
version 1.319, 2017/07/08 14:51:04 |
|
|
struct tbl_node *first_tbl; /* first table parsed */ |
struct tbl_node *first_tbl; /* first table parsed */ |
struct tbl_node *last_tbl; /* last table parsed */ |
struct tbl_node *last_tbl; /* last table parsed */ |
struct tbl_node *tbl; /* current table being parsed */ |
struct tbl_node *tbl; /* current table being parsed */ |
struct eqn_node *last_eqn; /* last equation parsed */ |
struct eqn_node *last_eqn; /* equation parser */ |
struct eqn_node *first_eqn; /* first equation parsed */ |
struct eqn_node *eqn; /* active equation parser */ |
struct eqn_node *eqn; /* current equation being parsed */ |
|
int eqn_inline; /* current equation is inline */ |
int eqn_inline; /* current equation is inline */ |
int options; /* parse options */ |
int options; /* parse options */ |
int rstacksz; /* current size limit of rstack */ |
int rstacksz; /* current size limit of rstack */ |
|
|
roff_free1(struct roff *r) |
roff_free1(struct roff *r) |
{ |
{ |
struct tbl_node *tbl; |
struct tbl_node *tbl; |
struct eqn_node *e; |
|
int i; |
int i; |
|
|
while (NULL != (tbl = r->first_tbl)) { |
while (NULL != (tbl = r->first_tbl)) { |
Line 704 roff_free1(struct roff *r) |
|
Line 702 roff_free1(struct roff *r) |
|
} |
} |
r->first_tbl = r->last_tbl = r->tbl = NULL; |
r->first_tbl = r->last_tbl = r->tbl = NULL; |
|
|
while (NULL != (e = r->first_eqn)) { |
if (r->last_eqn != NULL) |
r->first_eqn = e->next; |
eqn_free(r->last_eqn); |
eqn_free(e); |
r->last_eqn = r->eqn = NULL; |
} |
|
r->first_eqn = r->last_eqn = r->eqn = NULL; |
|
|
|
while (r->last) |
while (r->last) |
roffnode_pop(r); |
roffnode_pop(r); |
Line 984 roff_body_alloc(struct roff_man *man, int line, int po |
|
Line 980 roff_body_alloc(struct roff_man *man, int line, int po |
|
} |
} |
|
|
void |
void |
roff_addeqn(struct roff_man *man, const struct eqn *eqn) |
|
{ |
|
struct roff_node *n; |
|
|
|
n = roff_node_alloc(man, eqn->ln, eqn->pos, ROFFT_EQN, TOKEN_NONE); |
|
n->eqn = eqn; |
|
if (eqn->ln > man->last->line) |
|
n->flags |= NODE_LINE; |
|
roff_node_append(man, n); |
|
man->next = ROFF_NEXT_SIBLING; |
|
} |
|
|
|
void |
|
roff_addtbl(struct roff_man *man, const struct tbl_span *tbl) |
roff_addtbl(struct roff_man *man, const struct tbl_span *tbl) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
Line 1055 roff_node_free(struct roff_node *n) |
|
Line 1038 roff_node_free(struct roff_node *n) |
|
mdoc_argv_free(n->args); |
mdoc_argv_free(n->args); |
if (n->type == ROFFT_BLOCK || n->type == ROFFT_ELEM) |
if (n->type == ROFFT_BLOCK || n->type == ROFFT_ELEM) |
free(n->norm); |
free(n->norm); |
|
if (n->eqn != NULL) |
|
eqn_box_free(n->eqn); |
free(n->string); |
free(n->string); |
free(n); |
free(n); |
} |
} |
Line 1512 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
Line 1497 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
return e; |
return e; |
assert(e == ROFF_CONT); |
assert(e == ROFF_CONT); |
} |
} |
if (r->eqn != NULL) |
if (r->eqn != NULL && strncmp(buf->buf + ppos, ".EN", 3)) { |
return eqn_read(&r->eqn, ln, buf->buf, ppos, offs); |
eqn_read(r->eqn, buf->buf + ppos); |
|
return ROFF_IGN; |
|
} |
if (r->tbl != NULL && ( ! ctl || buf->buf[pos] == '\0')) |
if (r->tbl != NULL && ( ! ctl || buf->buf[pos] == '\0')) |
return tbl_read(r->tbl, ln, buf->buf, ppos); |
return tbl_read(r->tbl, ln, buf->buf, ppos); |
if ( ! ctl) |
if ( ! ctl) |
Line 1593 roff_endparse(struct roff *r) |
|
Line 1580 roff_endparse(struct roff *r) |
|
|
|
if (r->eqn) { |
if (r->eqn) { |
mandoc_msg(MANDOCERR_BLK_NOEND, r->parse, |
mandoc_msg(MANDOCERR_BLK_NOEND, r->parse, |
r->eqn->eqn.ln, r->eqn->eqn.pos, "EQ"); |
r->eqn->node->line, r->eqn->node->pos, "EQ"); |
eqn_end(&r->eqn); |
eqn_parse(r->eqn); |
|
r->eqn = NULL; |
} |
} |
|
|
if (r->tbl) { |
if (r->tbl) { |
Line 2877 roff_eqndelim(struct roff *r, struct buf *buf, int pos |
|
Line 2865 roff_eqndelim(struct roff *r, struct buf *buf, int pos |
|
static enum rofferr |
static enum rofferr |
roff_EQ(ROFF_ARGS) |
roff_EQ(ROFF_ARGS) |
{ |
{ |
struct eqn_node *e; |
struct roff_node *n; |
|
|
|
n = roff_node_alloc(r->man, ln, ppos, ROFFT_EQN, TOKEN_NONE); |
|
if (ln > r->man->last->line) |
|
n->flags |= NODE_LINE; |
|
n->eqn = mandoc_calloc(1, sizeof(*n->eqn)); |
|
n->eqn->expectargs = UINT_MAX; |
|
roff_node_append(r->man, n); |
|
r->man->next = ROFF_NEXT_SIBLING; |
|
|
assert(r->eqn == NULL); |
assert(r->eqn == NULL); |
e = eqn_alloc(ppos, ln, r->parse); |
if (r->last_eqn == NULL) |
|
r->last_eqn = eqn_alloc(r->parse); |
|
else |
|
eqn_reset(r->last_eqn); |
|
r->eqn = r->last_eqn; |
|
r->eqn->node = n; |
|
|
if (r->last_eqn) { |
|
r->last_eqn->next = e; |
|
e->delim = r->last_eqn->delim; |
|
e->odelim = r->last_eqn->odelim; |
|
e->cdelim = r->last_eqn->cdelim; |
|
} else |
|
r->first_eqn = r->last_eqn = e; |
|
|
|
r->eqn = r->last_eqn = e; |
|
|
|
if (buf->buf[pos] != '\0') |
if (buf->buf[pos] != '\0') |
mandoc_vmsg(MANDOCERR_ARG_SKIP, r->parse, ln, pos, |
mandoc_vmsg(MANDOCERR_ARG_SKIP, r->parse, ln, pos, |
".EQ %s", buf->buf + pos); |
".EQ %s", buf->buf + pos); |
Line 2902 roff_EQ(ROFF_ARGS) |
|
Line 2893 roff_EQ(ROFF_ARGS) |
|
static enum rofferr |
static enum rofferr |
roff_EN(ROFF_ARGS) |
roff_EN(ROFF_ARGS) |
{ |
{ |
|
if (r->eqn != NULL) { |
mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse, ln, ppos, "EN"); |
eqn_parse(r->eqn); |
|
r->eqn = NULL; |
|
} else |
|
mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse, ln, ppos, "EN"); |
|
if (buf->buf[pos] != '\0') |
|
mandoc_vmsg(MANDOCERR_ARG_SKIP, r->parse, ln, pos, |
|
"EN %s", buf->buf + pos); |
return ROFF_IGN; |
return ROFF_IGN; |
} |
} |
|
|
Line 3608 roff_span(const struct roff *r) |
|
Line 3605 roff_span(const struct roff *r) |
|
{ |
{ |
|
|
return r->tbl ? tbl_span(r->tbl) : NULL; |
return r->tbl ? tbl_span(r->tbl) : NULL; |
} |
|
|
|
const struct eqn * |
|
roff_eqn(const struct roff *r) |
|
{ |
|
|
|
return r->last_eqn ? &r->last_eqn->eqn : NULL; |
|
} |
} |
|
|
/* |
/* |