version 1.112, 2010/12/29 14:53:31 |
version 1.117, 2011/01/01 16:18:39 |
|
|
struct regset *regs; /* read/writable registers */ |
struct regset *regs; /* read/writable registers */ |
struct roffstr *first_string; /* user-defined strings & macros */ |
struct roffstr *first_string; /* user-defined strings & macros */ |
const char *current_string; /* value of last called user macro */ |
const char *current_string; /* value of last called user macro */ |
struct tbl *tbl; |
struct tbl *first_tbl; /* first table parsed */ |
|
struct tbl *last_tbl; /* last table parsed */ |
|
struct tbl *tbl; /* current table being parsed */ |
}; |
}; |
|
|
struct roffnode { |
struct roffnode { |
Line 299 roffnode_push(struct roff *r, enum rofft tok, const ch |
|
Line 301 roffnode_push(struct roff *r, enum rofft tok, const ch |
|
static void |
static void |
roff_free1(struct roff *r) |
roff_free1(struct roff *r) |
{ |
{ |
|
struct tbl *t; |
|
|
if (r->tbl) { |
while (r->first_tbl) { |
tbl_free(r->tbl); |
t = r->first_tbl; |
r->tbl = NULL; |
r->first_tbl = t->next; |
|
tbl_free(t); |
} |
} |
|
|
|
r->first_tbl = r->last_tbl = r->tbl = NULL; |
|
|
while (r->last) |
while (r->last) |
roffnode_pop(r); |
roffnode_pop(r); |
|
|
Line 509 roff_parseln(struct roff *r, int ln, char **bufp, |
|
Line 515 roff_parseln(struct roff *r, int ln, char **bufp, |
|
} |
} |
|
|
|
|
int |
void |
roff_endparse(struct roff *r) |
roff_endparse(struct roff *r) |
{ |
{ |
|
|
/* FIXME: if r->tbl */ |
|
if (r->last) |
if (r->last) |
(*r->msg)(MANDOCERR_SCOPEEXIT, r->data, |
(*r->msg)(MANDOCERR_SCOPEEXIT, r->data, |
r->last->line, r->last->col, NULL); |
r->last->line, r->last->col, NULL); |
return(1); |
|
|
if (r->tbl) { |
|
(*r->msg)(MANDOCERR_SCOPEEXIT, r->data, |
|
r->tbl->line, r->tbl->pos, NULL); |
|
tbl_end(r->tbl); |
|
r->tbl = NULL; |
|
} |
} |
} |
|
|
|
|
Line 1118 roff_TE(ROFF_ARGS) |
|
Line 1129 roff_TE(ROFF_ARGS) |
|
if (NULL == r->tbl) |
if (NULL == r->tbl) |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
else |
else |
tbl_free(r->tbl); |
tbl_end(r->tbl); |
|
|
r->tbl = NULL; |
r->tbl = NULL; |
return(ROFF_IGN); |
return(ROFF_IGN); |
Line 1132 roff_T_(ROFF_ARGS) |
|
Line 1143 roff_T_(ROFF_ARGS) |
|
if (NULL == r->tbl) |
if (NULL == r->tbl) |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); |
else |
else |
tbl_restart(r->tbl); |
tbl_restart(ppos, ln, r->tbl); |
|
|
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
Line 1141 roff_T_(ROFF_ARGS) |
|
Line 1152 roff_T_(ROFF_ARGS) |
|
static enum rofferr |
static enum rofferr |
roff_TS(ROFF_ARGS) |
roff_TS(ROFF_ARGS) |
{ |
{ |
|
struct tbl *t; |
|
|
if (r->tbl) { |
if (r->tbl) { |
(*r->msg)(MANDOCERR_SCOPEBROKEN, r->data, ln, ppos, NULL); |
(*r->msg)(MANDOCERR_SCOPEBROKEN, r->data, ln, ppos, NULL); |
tbl_reset(r->tbl); |
tbl_end(r->tbl); |
} else |
} |
r->tbl = tbl_alloc(r->data, r->msg); |
|
|
|
|
t = tbl_alloc(ppos, ln, r->data, r->msg); |
|
|
|
if (r->last_tbl) |
|
r->last_tbl->next = t; |
|
else |
|
r->first_tbl = r->last_tbl = t; |
|
|
|
r->tbl = r->last_tbl = t; |
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
Line 1364 roff_freestr(struct roff *r) |
|
Line 1383 roff_freestr(struct roff *r) |
|
} |
} |
|
|
r->first_string = NULL; |
r->first_string = NULL; |
|
} |
|
|
|
const struct tbl_span * |
|
roff_span(const struct roff *r) |
|
{ |
|
|
|
return(r->tbl ? tbl_span(r->tbl) : NULL); |
} |
} |