version 1.218, 2017/04/17 12:53:29 |
version 1.222, 2017/05/05 13:17:55 |
Line 46 static void phrase_ta(MACRO_PROT_ARGS); |
|
Line 46 static void phrase_ta(MACRO_PROT_ARGS); |
|
static void append_delims(struct roff_man *, int, int *, char *); |
static void append_delims(struct roff_man *, int, int *, char *); |
static void dword(struct roff_man *, int, int, const char *, |
static void dword(struct roff_man *, int, int, const char *, |
enum mdelim, int); |
enum mdelim, int); |
static int find_pending(struct roff_man *, int, int, int, |
static int find_pending(struct roff_man *, enum roff_tok, |
struct roff_node *); |
int, int, struct roff_node *); |
static int lookup(struct roff_man *, int, int, int, const char *); |
static int lookup(struct roff_man *, int, int, int, const char *); |
static int macro_or_word(MACRO_PROT_ARGS, int); |
static int macro_or_word(MACRO_PROT_ARGS, int); |
static void break_intermediate(struct roff_node *, |
static void break_intermediate(struct roff_node *, |
struct roff_node *); |
struct roff_node *); |
static int parse_rest(struct roff_man *, int, int, int *, char *); |
static int parse_rest(struct roff_man *, enum roff_tok, |
static int rew_alt(int); |
int, int *, char *); |
static void rew_elem(struct roff_man *, int); |
static enum roff_tok rew_alt(enum roff_tok); |
|
static void rew_elem(struct roff_man *, enum roff_tok); |
static void rew_last(struct roff_man *, const struct roff_node *); |
static void rew_last(struct roff_man *, const struct roff_node *); |
static void rew_pending(struct roff_man *, |
static void rew_pending(struct roff_man *, |
const struct roff_node *); |
const struct roff_node *); |
|
|
const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { |
const struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_Dd] = { |
{ in_line_argn, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ap */ |
|
{ in_line_eoln, MDOC_PROLOGUE }, /* Dd */ |
{ in_line_eoln, MDOC_PROLOGUE }, /* Dd */ |
{ in_line_eoln, MDOC_PROLOGUE }, /* Dt */ |
{ in_line_eoln, MDOC_PROLOGUE }, /* Dt */ |
{ in_line_eoln, MDOC_PROLOGUE }, /* Os */ |
{ in_line_eoln, MDOC_PROLOGUE }, /* Os */ |
Line 76 const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { |
|
Line 76 const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { |
|
{ blk_full, MDOC_PARSED | MDOC_JOIN }, /* It */ |
{ blk_full, MDOC_PARSED | MDOC_JOIN }, /* It */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ad */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ad */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* An */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* An */ |
|
{ in_line_argn, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ap */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ar */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ar */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Cd */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Cd */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Cm */ |
{ in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Cm */ |
Line 196 const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { |
|
Line 197 const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { |
|
{ blk_part_imp, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* En */ |
{ blk_part_imp, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* En */ |
{ in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Dx */ |
{ in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Dx */ |
{ in_line_eoln, MDOC_JOIN }, /* %Q */ |
{ in_line_eoln, MDOC_JOIN }, /* %Q */ |
{ in_line_eoln, 0 }, /* br */ |
|
{ in_line_eoln, 0 }, /* sp */ |
{ in_line_eoln, 0 }, /* sp */ |
{ in_line_eoln, 0 }, /* %U */ |
{ in_line_eoln, 0 }, /* %U */ |
{ phrase_ta, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ta */ |
{ phrase_ta, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ta */ |
{ in_line_eoln, MDOC_PROLOGUE }, /* ll */ |
|
}; |
}; |
|
const struct mdoc_macro *const mdoc_macros = __mdoc_macros - MDOC_Dd; |
|
|
const struct mdoc_macro * const mdoc_macros = __mdoc_macros; |
|
|
|
|
|
/* |
/* |
* This is called at the end of parsing. It must traverse up the tree, |
* This is called at the end of parsing. It must traverse up the tree, |
* closing out open [implicit] scopes. Obviously, open explicit scopes |
* closing out open [implicit] scopes. Obviously, open explicit scopes |
Line 225 mdoc_endparse(struct roff_man *mdoc) |
|
Line 223 mdoc_endparse(struct roff_man *mdoc) |
|
if (n->type == ROFFT_BLOCK && |
if (n->type == ROFFT_BLOCK && |
mdoc_macros[n->tok].flags & MDOC_EXPLICIT) |
mdoc_macros[n->tok].flags & MDOC_EXPLICIT) |
mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse, |
mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse, |
n->line, n->pos, mdoc_macronames[n->tok]); |
n->line, n->pos, roff_name[n->tok]); |
|
|
/* Rewind to the first. */ |
/* Rewind to the first. */ |
|
|
Line 240 mdoc_endparse(struct roff_man *mdoc) |
|
Line 238 mdoc_endparse(struct roff_man *mdoc) |
|
static int |
static int |
lookup(struct roff_man *mdoc, int from, int line, int ppos, const char *p) |
lookup(struct roff_man *mdoc, int from, int line, int ppos, const char *p) |
{ |
{ |
int res; |
enum roff_tok res; |
|
|
if (mdoc->flags & MDOC_PHRASEQF) { |
if (mdoc->flags & MDOC_PHRASEQF) { |
mdoc->flags &= ~MDOC_PHRASEQF; |
mdoc->flags &= ~MDOC_PHRASEQF; |
return TOKEN_NONE; |
return TOKEN_NONE; |
} |
} |
if (from == TOKEN_NONE || mdoc_macros[from].flags & MDOC_PARSED) { |
if (from == TOKEN_NONE || mdoc_macros[from].flags & MDOC_PARSED) { |
res = mdoc_hash_find(p); |
res = roffhash_find(mdoc->mdocmac, p, 0); |
if (res != TOKEN_NONE) { |
if (res != TOKEN_NONE) { |
if (mdoc_macros[res].flags & MDOC_CALLABLE) |
if (mdoc_macros[res].flags & MDOC_CALLABLE) |
return res; |
return res; |
if (res != MDOC_br && res != MDOC_sp && res != MDOC_ll) |
if (res != MDOC_sp) |
mandoc_msg(MANDOCERR_MACRO_CALL, |
mandoc_msg(MANDOCERR_MACRO_CALL, |
mdoc->parse, line, ppos, p); |
mdoc->parse, line, ppos, p); |
} |
} |
Line 324 rew_pending(struct roff_man *mdoc, const struct roff_n |
|
Line 322 rew_pending(struct roff_man *mdoc, const struct roff_n |
|
* For a block closing macro, return the corresponding opening one. |
* For a block closing macro, return the corresponding opening one. |
* Otherwise, return the macro itself. |
* Otherwise, return the macro itself. |
*/ |
*/ |
static int |
static enum roff_tok |
rew_alt(int tok) |
rew_alt(enum roff_tok tok) |
{ |
{ |
switch (tok) { |
switch (tok) { |
case MDOC_Ac: |
case MDOC_Ac: |
Line 366 rew_alt(int tok) |
|
Line 364 rew_alt(int tok) |
|
} |
} |
|
|
static void |
static void |
rew_elem(struct roff_man *mdoc, int tok) |
rew_elem(struct roff_man *mdoc, enum roff_tok tok) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
|
|
Line 398 break_intermediate(struct roff_node *n, struct roff_no |
|
Line 396 break_intermediate(struct roff_node *n, struct roff_no |
|
* the rew_pending() call closing out the sub-block. |
* the rew_pending() call closing out the sub-block. |
*/ |
*/ |
static int |
static int |
find_pending(struct roff_man *mdoc, int tok, int line, int ppos, |
find_pending(struct roff_man *mdoc, enum roff_tok tok, int line, int ppos, |
struct roff_node *target) |
struct roff_node *target) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
Line 420 find_pending(struct roff_man *mdoc, int tok, int line, |
|
Line 418 find_pending(struct roff_man *mdoc, int tok, int line, |
|
else if ( ! (target->flags & NODE_ENDED)) { |
else if ( ! (target->flags & NODE_ENDED)) { |
mandoc_vmsg(MANDOCERR_BLK_NEST, |
mandoc_vmsg(MANDOCERR_BLK_NEST, |
mdoc->parse, line, ppos, |
mdoc->parse, line, ppos, |
"%s breaks %s", mdoc_macronames[tok], |
"%s breaks %s", roff_name[tok], |
mdoc_macronames[n->tok]); |
roff_name[n->tok]); |
mdoc_endbody_alloc(mdoc, line, ppos, |
mdoc_endbody_alloc(mdoc, line, ppos, |
tok, target); |
tok, target); |
} |
} |
Line 524 macro_or_word(MACRO_PROT_ARGS, int parsed) |
|
Line 522 macro_or_word(MACRO_PROT_ARGS, int parsed) |
|
mdoc_macros[tok].flags & MDOC_JOIN); |
mdoc_macros[tok].flags & MDOC_JOIN); |
return 0; |
return 0; |
} else { |
} else { |
if (mdoc_macros[tok].fp == in_line_eoln) |
if (tok != TOKEN_NONE && |
|
mdoc_macros[tok].fp == in_line_eoln) |
rew_elem(mdoc, tok); |
rew_elem(mdoc, tok); |
mdoc_macro(mdoc, ntok, line, ppos, pos, buf); |
mdoc_macro(mdoc, ntok, line, ppos, pos, buf); |
if (tok == TOKEN_NONE) |
if (tok == TOKEN_NONE) |
Line 548 blk_exp_close(MACRO_PROT_ARGS) |
|
Line 547 blk_exp_close(MACRO_PROT_ARGS) |
|
|
|
int j, lastarg, maxargs, nl, pending; |
int j, lastarg, maxargs, nl, pending; |
enum margserr ac; |
enum margserr ac; |
int atok, ntok; |
enum roff_tok atok, ntok; |
char *p; |
char *p; |
|
|
nl = MDOC_NEWLINE & mdoc->flags; |
nl = MDOC_NEWLINE & mdoc->flags; |
Line 633 blk_exp_close(MACRO_PROT_ARGS) |
|
Line 632 blk_exp_close(MACRO_PROT_ARGS) |
|
|
|
mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, |
mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, |
line, ppos, "%s breaks %s", |
line, ppos, "%s breaks %s", |
mdoc_macronames[atok], |
roff_name[atok], roff_name[later->tok]); |
mdoc_macronames[later->tok]); |
|
|
|
endbody = mdoc_endbody_alloc(mdoc, line, ppos, |
endbody = mdoc_endbody_alloc(mdoc, line, ppos, |
atok, body); |
atok, body); |
Line 676 blk_exp_close(MACRO_PROT_ARGS) |
|
Line 674 blk_exp_close(MACRO_PROT_ARGS) |
|
|
|
if (body == NULL) { |
if (body == NULL) { |
mandoc_msg(MANDOCERR_BLK_NOTOPEN, mdoc->parse, |
mandoc_msg(MANDOCERR_BLK_NOTOPEN, mdoc->parse, |
line, ppos, mdoc_macronames[tok]); |
line, ppos, roff_name[tok]); |
if (maxargs && endbody == NULL) { |
if (maxargs && endbody == NULL) { |
/* |
/* |
* Stray .Ec without previous .Eo: |
* Stray .Ec without previous .Eo: |
* Break the output line, keep the arguments. |
* Break the output line, keep the arguments. |
*/ |
*/ |
roff_elem_alloc(mdoc, line, ppos, MDOC_br); |
roff_elem_alloc(mdoc, line, ppos, ROFF_br); |
rew_elem(mdoc, MDOC_br); |
rew_elem(mdoc, ROFF_br); |
} |
} |
} else if (endbody == NULL) { |
} else if (endbody == NULL) { |
rew_last(mdoc, body); |
rew_last(mdoc, body); |
Line 695 blk_exp_close(MACRO_PROT_ARGS) |
|
Line 693 blk_exp_close(MACRO_PROT_ARGS) |
|
if (buf[*pos] != '\0') |
if (buf[*pos] != '\0') |
mandoc_vmsg(MANDOCERR_ARG_SKIP, |
mandoc_vmsg(MANDOCERR_ARG_SKIP, |
mdoc->parse, line, ppos, |
mdoc->parse, line, ppos, |
"%s %s", mdoc_macronames[tok], |
"%s %s", roff_name[tok], |
buf + *pos); |
buf + *pos); |
if (endbody == NULL && n != NULL) |
if (endbody == NULL && n != NULL) |
rew_pending(mdoc, n); |
rew_pending(mdoc, n); |
|
|
in_line(MACRO_PROT_ARGS) |
in_line(MACRO_PROT_ARGS) |
{ |
{ |
int la, scope, cnt, firstarg, mayopen, nc, nl; |
int la, scope, cnt, firstarg, mayopen, nc, nl; |
int ntok; |
enum roff_tok ntok; |
enum margserr ac; |
enum margserr ac; |
enum mdelim d; |
enum mdelim d; |
struct mdoc_arg *arg; |
struct mdoc_arg *arg; |
Line 833 in_line(MACRO_PROT_ARGS) |
|
Line 831 in_line(MACRO_PROT_ARGS) |
|
mdoc_argv_free(arg); |
mdoc_argv_free(arg); |
mandoc_msg(MANDOCERR_MACRO_EMPTY, |
mandoc_msg(MANDOCERR_MACRO_EMPTY, |
mdoc->parse, line, ppos, |
mdoc->parse, line, ppos, |
mdoc_macronames[tok]); |
roff_name[tok]); |
} |
} |
mdoc_macro(mdoc, ntok, line, la, pos, buf); |
mdoc_macro(mdoc, ntok, line, la, pos, buf); |
if (nl) |
if (nl) |
Line 881 in_line(MACRO_PROT_ARGS) |
|
Line 879 in_line(MACRO_PROT_ARGS) |
|
} |
} |
|
|
dword(mdoc, line, la, p, d, |
dword(mdoc, line, la, p, d, |
MDOC_JOIN & mdoc_macros[tok].flags); |
mdoc_macros[tok].flags & MDOC_JOIN); |
|
|
/* |
/* |
* If the first argument is a closing delimiter, |
* If the first argument is a closing delimiter, |
Line 921 in_line(MACRO_PROT_ARGS) |
|
Line 919 in_line(MACRO_PROT_ARGS) |
|
} else { |
} else { |
mdoc_argv_free(arg); |
mdoc_argv_free(arg); |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
line, ppos, mdoc_macronames[tok]); |
line, ppos, roff_name[tok]); |
} |
} |
} |
} |
if (nl) |
if (nl) |
Line 946 blk_full(MACRO_PROT_ARGS) |
|
Line 944 blk_full(MACRO_PROT_ARGS) |
|
|
|
if (buf[*pos] == '\0' && (tok == MDOC_Sh || tok == MDOC_Ss)) { |
if (buf[*pos] == '\0' && (tok == MDOC_Sh || tok == MDOC_Ss)) { |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
line, ppos, mdoc_macronames[tok]); |
line, ppos, roff_name[tok]); |
return; |
return; |
} |
} |
|
|
Line 969 blk_full(MACRO_PROT_ARGS) |
|
Line 967 blk_full(MACRO_PROT_ARGS) |
|
mandoc_vmsg(MANDOCERR_BLK_BROKEN, |
mandoc_vmsg(MANDOCERR_BLK_BROKEN, |
mdoc->parse, line, ppos, |
mdoc->parse, line, ppos, |
"It breaks %s", |
"It breaks %s", |
mdoc_macronames[blk->tok]); |
roff_name[blk->tok]); |
rew_pending(mdoc, blk); |
rew_pending(mdoc, blk); |
} |
} |
break; |
break; |
Line 981 blk_full(MACRO_PROT_ARGS) |
|
Line 979 blk_full(MACRO_PROT_ARGS) |
|
case MDOC_Ss: |
case MDOC_Ss: |
mandoc_vmsg(MANDOCERR_BLK_BROKEN, |
mandoc_vmsg(MANDOCERR_BLK_BROKEN, |
mdoc->parse, line, ppos, |
mdoc->parse, line, ppos, |
"%s breaks %s", |
"%s breaks %s", roff_name[tok], |
mdoc_macronames[tok], |
roff_name[n->tok]); |
mdoc_macronames[n->tok]); |
|
rew_pending(mdoc, n); |
rew_pending(mdoc, n); |
n = mdoc->last; |
n = mdoc->last; |
continue; |
continue; |
Line 1009 blk_full(MACRO_PROT_ARGS) |
|
Line 1006 blk_full(MACRO_PROT_ARGS) |
|
if (blk != NULL) { |
if (blk != NULL) { |
mandoc_vmsg(MANDOCERR_BLK_BROKEN, |
mandoc_vmsg(MANDOCERR_BLK_BROKEN, |
mdoc->parse, line, ppos, |
mdoc->parse, line, ppos, |
"It breaks %s", |
"It breaks %s", roff_name[blk->tok]); |
mdoc_macronames[blk->tok]); |
|
rew_pending(mdoc, blk); |
rew_pending(mdoc, blk); |
blk = NULL; |
blk = NULL; |
} |
} |
Line 1025 blk_full(MACRO_PROT_ARGS) |
|
Line 1021 blk_full(MACRO_PROT_ARGS) |
|
if (tok == MDOC_It && (n == NULL || n->tok != MDOC_Bl)) { |
if (tok == MDOC_It && (n == NULL || n->tok != MDOC_Bl)) { |
mandoc_vmsg(MANDOCERR_IT_STRAY, mdoc->parse, |
mandoc_vmsg(MANDOCERR_IT_STRAY, mdoc->parse, |
line, ppos, "It %s", buf + *pos); |
line, ppos, "It %s", buf + *pos); |
roff_elem_alloc(mdoc, line, ppos, MDOC_br); |
roff_elem_alloc(mdoc, line, ppos, ROFF_br); |
rew_elem(mdoc, MDOC_br); |
rew_elem(mdoc, ROFF_br); |
return; |
return; |
} |
} |
} |
} |
Line 1103 blk_full(MACRO_PROT_ARGS) |
|
Line 1099 blk_full(MACRO_PROT_ARGS) |
|
if (tok == MDOC_Bd || tok == MDOC_Bk) { |
if (tok == MDOC_Bd || tok == MDOC_Bk) { |
mandoc_vmsg(MANDOCERR_ARG_EXCESS, |
mandoc_vmsg(MANDOCERR_ARG_EXCESS, |
mdoc->parse, line, la, "%s ... %s", |
mdoc->parse, line, la, "%s ... %s", |
mdoc_macronames[tok], buf + la); |
roff_name[tok], buf + la); |
break; |
break; |
} |
} |
if (tok == MDOC_Rs) { |
if (tok == MDOC_Rs) { |
Line 1311 in_line_argn(MACRO_PROT_ARGS) |
|
Line 1307 in_line_argn(MACRO_PROT_ARGS) |
|
struct mdoc_arg *arg; |
struct mdoc_arg *arg; |
char *p; |
char *p; |
enum margserr ac; |
enum margserr ac; |
int ntok; |
enum roff_tok ntok; |
int state; /* arg#; -1: not yet open; -2: closed */ |
int state; /* arg#; -1: not yet open; -2: closed */ |
int la, maxargs, nl; |
int la, maxargs, nl; |
|
|
Line 1401 in_line_argn(MACRO_PROT_ARGS) |
|
Line 1397 in_line_argn(MACRO_PROT_ARGS) |
|
} |
} |
|
|
dword(mdoc, line, la, p, DELIM_MAX, |
dword(mdoc, line, la, p, DELIM_MAX, |
MDOC_JOIN & mdoc_macros[tok].flags); |
mdoc_macros[tok].flags & MDOC_JOIN); |
} |
} |
|
|
if (state == -1) { |
if (state == -1) { |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
line, ppos, mdoc_macronames[tok]); |
line, ppos, roff_name[tok]); |
return; |
return; |
} |
} |
|
|
Line 1434 in_line_eoln(MACRO_PROT_ARGS) |
|
Line 1430 in_line_eoln(MACRO_PROT_ARGS) |
|
} |
} |
|
|
if (buf[*pos] == '\0' && |
if (buf[*pos] == '\0' && |
(tok == MDOC_Fd || mdoc_macronames[tok][0] == '%')) { |
(tok == MDOC_Fd || *roff_name[tok] == '%')) { |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
line, ppos, mdoc_macronames[tok]); |
line, ppos, roff_name[tok]); |
return; |
return; |
} |
} |
|
|
Line 1453 in_line_eoln(MACRO_PROT_ARGS) |
|
Line 1449 in_line_eoln(MACRO_PROT_ARGS) |
|
* or until the next macro, call that macro, and return 1. |
* or until the next macro, call that macro, and return 1. |
*/ |
*/ |
static int |
static int |
parse_rest(struct roff_man *mdoc, int tok, int line, int *pos, char *buf) |
parse_rest(struct roff_man *mdoc, enum roff_tok tok, |
|
int line, int *pos, char *buf) |
{ |
{ |
int la; |
int la; |
|
|