version 1.320, 2017/07/08 15:28:09 |
version 1.324, 2017/07/14 17:16:16 |
Line 153 static void roffnode_cleanscope(struct roff *); |
|
Line 153 static void roffnode_cleanscope(struct roff *); |
|
static void roffnode_pop(struct roff *); |
static void roffnode_pop(struct roff *); |
static void roffnode_push(struct roff *, enum roff_tok, |
static void roffnode_push(struct roff *, enum roff_tok, |
const char *, int, int); |
const char *, int, int); |
|
static void roff_addtbl(struct roff_man *, struct tbl_node *); |
static enum rofferr roff_als(ROFF_ARGS); |
static enum rofferr roff_als(ROFF_ARGS); |
static enum rofferr roff_block(ROFF_ARGS); |
static enum rofferr roff_block(ROFF_ARGS); |
static enum rofferr roff_block_text(ROFF_ARGS); |
static enum rofferr roff_block_text(ROFF_ARGS); |
Line 979 roff_body_alloc(struct roff_man *man, int line, int po |
|
Line 980 roff_body_alloc(struct roff_man *man, int line, int po |
|
return n; |
return n; |
} |
} |
|
|
void |
static void |
roff_addtbl(struct roff_man *man, const struct tbl_span *tbl) |
roff_addtbl(struct roff_man *man, struct tbl_node *tbl) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
|
const struct tbl_span *span; |
|
|
if (man->macroset == MACROSET_MAN) |
if (man->macroset == MACROSET_MAN) |
man_breakscope(man, ROFF_TS); |
man_breakscope(man, ROFF_TS); |
n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE); |
while ((span = tbl_span(tbl)) != NULL) { |
n->span = tbl; |
n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE); |
roff_node_append(man, n); |
n->span = span; |
n->flags |= NODE_VALID | NODE_ENDED; |
roff_node_append(man, n); |
man->next = ROFF_NEXT_SIBLING; |
n->flags |= NODE_VALID | NODE_ENDED; |
|
man->next = ROFF_NEXT_SIBLING; |
|
} |
} |
} |
|
|
void |
void |
Line 1123 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1127 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
size_t maxl; /* expected length of the escape name */ |
size_t maxl; /* expected length of the escape name */ |
size_t naml; /* actual length of the escape name */ |
size_t naml; /* actual length of the escape name */ |
enum mandoc_esc esc; /* type of the escape sequence */ |
enum mandoc_esc esc; /* type of the escape sequence */ |
enum mandoc_os os_e; /* kind of RCS id seen */ |
|
int inaml; /* length returned from mandoc_escape() */ |
int inaml; /* length returned from mandoc_escape() */ |
int expand_count; /* to avoid infinite loops */ |
int expand_count; /* to avoid infinite loops */ |
int npos; /* position in numeric expression */ |
int npos; /* position in numeric expression */ |
int arg_complete; /* argument not interrupted by eol */ |
int arg_complete; /* argument not interrupted by eol */ |
int done; /* no more input available */ |
int done; /* no more input available */ |
int deftype; /* type of definition to paste */ |
int deftype; /* type of definition to paste */ |
|
int rcsid; /* kind of RCS id seen */ |
char term; /* character terminating the escape */ |
char term; /* character terminating the escape */ |
|
|
/* Search forward for comments. */ |
/* Search forward for comments. */ |
Line 1145 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1149 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
|
|
/* Comment found, look for RCS id. */ |
/* Comment found, look for RCS id. */ |
|
|
|
rcsid = 0; |
if ((cp = strstr(stesc, "$" "OpenBSD")) != NULL) { |
if ((cp = strstr(stesc, "$" "OpenBSD")) != NULL) { |
os_e = MANDOC_OS_OPENBSD; |
rcsid = 1 << MANDOC_OS_OPENBSD; |
cp += 8; |
cp += 8; |
} else if ((cp = strstr(stesc, "$" "NetBSD")) != NULL) { |
} else if ((cp = strstr(stesc, "$" "NetBSD")) != NULL) { |
os_e = MANDOC_OS_NETBSD; |
rcsid = 1 << MANDOC_OS_NETBSD; |
cp += 7; |
cp += 7; |
} |
} |
if (cp != NULL && |
if (cp != NULL && |
isalnum((unsigned char)*cp) == 0 && |
isalnum((unsigned char)*cp) == 0 && |
strchr(cp, '$') != NULL) { |
strchr(cp, '$') != NULL) { |
if (r->man->meta.rcsids & (1 << os_e)) |
if (r->man->meta.rcsids & rcsid) |
mandoc_msg(MANDOCERR_RCS_REP, r->parse, |
mandoc_msg(MANDOCERR_RCS_REP, r->parse, |
ln, stesc + 1 - buf->buf, stesc + 1); |
ln, stesc + 1 - buf->buf, stesc + 1); |
r->man->meta.rcsids |= 1 << os_e; |
r->man->meta.rcsids |= rcsid; |
} |
} |
|
|
/* Handle trailing whitespace. */ |
/* Handle trailing whitespace. */ |
Line 1501 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
Line 1506 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
eqn_read(r->eqn, buf->buf + ppos); |
eqn_read(r->eqn, buf->buf + ppos); |
return ROFF_IGN; |
return ROFF_IGN; |
} |
} |
if (r->tbl != NULL && ( ! ctl || buf->buf[pos] == '\0')) |
if (r->tbl != NULL && (ctl == 0 || buf->buf[pos] == '\0')) { |
return tbl_read(r->tbl, ln, buf->buf, ppos); |
tbl_read(r->tbl, ln, buf->buf, ppos); |
|
roff_addtbl(r->man, r->tbl); |
|
return ROFF_IGN; |
|
} |
if ( ! ctl) |
if ( ! ctl) |
return roff_parsetext(r, buf, pos, offs); |
return roff_parsetext(r, buf, pos, offs); |
|
|
Line 1543 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
Line 1551 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
pos++; |
pos++; |
while (buf->buf[pos] == ' ') |
while (buf->buf[pos] == ' ') |
pos++; |
pos++; |
return tbl_read(r->tbl, ln, buf->buf, pos); |
tbl_read(r->tbl, ln, buf->buf, pos); |
|
roff_addtbl(r->man, r->tbl); |
|
return ROFF_IGN; |
} |
} |
|
|
/* For now, let high level macros abort .ce mode. */ |
/* For now, let high level macros abort .ce mode. */ |
|
|
if (ctl && roffce_node != NULL && |
if (ctl && roffce_node != NULL && |
(t == TOKEN_NONE || t == ROFF_EQ || t == ROFF_TS)) { |
(t == TOKEN_NONE || t == ROFF_Dd || t == ROFF_EQ || |
|
t == ROFF_TH || t == ROFF_TS)) { |
r->man->last = roffce_node; |
r->man->last = roffce_node; |
r->man->next = ROFF_NEXT_SIBLING; |
r->man->next = ROFF_NEXT_SIBLING; |
roffce_lines = 0; |
roffce_lines = 0; |
Line 1572 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
Line 1583 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
void |
void |
roff_endparse(struct roff *r) |
roff_endparse(struct roff *r) |
{ |
{ |
|
if (r->last != NULL) |
if (r->last) |
|
mandoc_msg(MANDOCERR_BLK_NOEND, r->parse, |
mandoc_msg(MANDOCERR_BLK_NOEND, r->parse, |
r->last->line, r->last->col, |
r->last->line, r->last->col, |
roff_name[r->last->tok]); |
roff_name[r->last->tok]); |
|
|
if (r->eqn) { |
if (r->eqn != NULL) { |
mandoc_msg(MANDOCERR_BLK_NOEND, r->parse, |
mandoc_msg(MANDOCERR_BLK_NOEND, r->parse, |
r->eqn->node->line, r->eqn->node->pos, "EQ"); |
r->eqn->node->line, r->eqn->node->pos, "EQ"); |
eqn_parse(r->eqn); |
eqn_parse(r->eqn); |
r->eqn = NULL; |
r->eqn = NULL; |
} |
} |
|
|
if (r->tbl) { |
if (r->tbl != NULL) { |
mandoc_msg(MANDOCERR_BLK_NOEND, r->parse, |
mandoc_msg(MANDOCERR_BLK_NOEND, r->parse, |
r->tbl->line, r->tbl->pos, "TS"); |
r->tbl->line, r->tbl->pos, "TS"); |
tbl_end(&r->tbl); |
tbl_end(r->tbl); |
|
r->tbl = NULL; |
} |
} |
} |
} |
|
|
Line 2770 roff_Dd(ROFF_ARGS) |
|
Line 2781 roff_Dd(ROFF_ARGS) |
|
static enum rofferr |
static enum rofferr |
roff_TE(ROFF_ARGS) |
roff_TE(ROFF_ARGS) |
{ |
{ |
|
if (r->tbl == NULL) { |
if (NULL == r->tbl) |
|
mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse, |
mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse, |
ln, ppos, "TE"); |
ln, ppos, "TE"); |
else if ( ! tbl_end(&r->tbl)) { |
return ROFF_IGN; |
|
} |
|
if (tbl_end(r->tbl) == 0) { |
|
r->tbl = NULL; |
free(buf->buf); |
free(buf->buf); |
buf->buf = mandoc_strdup(".sp"); |
buf->buf = mandoc_strdup(".sp"); |
buf->sz = 4; |
buf->sz = 4; |
return ROFF_REPARSE; |
return ROFF_REPARSE; |
} |
} |
|
r->tbl = NULL; |
return ROFF_IGN; |
return ROFF_IGN; |
} |
} |
|
|
Line 2867 roff_EQ(ROFF_ARGS) |
|
Line 2881 roff_EQ(ROFF_ARGS) |
|
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
|
|
|
if (r->man->macroset == MACROSET_MAN) |
|
man_breakscope(r->man, ROFF_EQ); |
n = roff_node_alloc(r->man, ln, ppos, ROFFT_EQN, TOKEN_NONE); |
n = roff_node_alloc(r->man, ln, ppos, ROFFT_EQN, TOKEN_NONE); |
if (ln > r->man->last->line) |
if (ln > r->man->last->line) |
n->flags |= NODE_LINE; |
n->flags |= NODE_LINE; |
Line 2907 roff_EN(ROFF_ARGS) |
|
Line 2923 roff_EN(ROFF_ARGS) |
|
static enum rofferr |
static enum rofferr |
roff_TS(ROFF_ARGS) |
roff_TS(ROFF_ARGS) |
{ |
{ |
struct tbl_node *tbl; |
if (r->tbl != NULL) { |
|
|
if (r->tbl) { |
|
mandoc_msg(MANDOCERR_BLK_BROKEN, r->parse, |
mandoc_msg(MANDOCERR_BLK_BROKEN, r->parse, |
ln, ppos, "TS breaks TS"); |
ln, ppos, "TS breaks TS"); |
tbl_end(&r->tbl); |
tbl_end(r->tbl); |
} |
} |
|
r->tbl = tbl_alloc(ppos, ln, r->parse); |
tbl = tbl_alloc(ppos, ln, r->parse); |
|
|
|
if (r->last_tbl) |
if (r->last_tbl) |
r->last_tbl->next = tbl; |
r->last_tbl->next = r->tbl; |
else |
else |
r->first_tbl = r->last_tbl = tbl; |
r->first_tbl = r->tbl; |
|
r->last_tbl = r->tbl; |
r->tbl = r->last_tbl = tbl; |
|
return ROFF_IGN; |
return ROFF_IGN; |
} |
} |
|
|
Line 3600 roff_freestr(struct roffkv *r) |
|
Line 3611 roff_freestr(struct roffkv *r) |
|
} |
} |
|
|
/* --- accessors and utility functions ------------------------------------ */ |
/* --- accessors and utility functions ------------------------------------ */ |
|
|
const struct tbl_span * |
|
roff_span(const struct roff *r) |
|
{ |
|
|
|
return r->tbl ? tbl_span(r->tbl) : NULL; |
|
} |
|
|
|
/* |
/* |
* Duplicate an input string, making the appropriate character |
* Duplicate an input string, making the appropriate character |