version 1.359, 2018/08/01 13:46:15 |
version 1.363, 2018/12/03 21:00:11 |
Line 64 static size_t macro2len(enum roff_tok); |
|
Line 64 static size_t macro2len(enum roff_tok); |
|
static void rewrite_macro2len(struct roff_man *, char **); |
static void rewrite_macro2len(struct roff_man *, char **); |
static int similar(const char *, const char *); |
static int similar(const char *, const char *); |
|
|
|
static void post_abort(POST_ARGS); |
static void post_an(POST_ARGS); |
static void post_an(POST_ARGS); |
static void post_an_norm(POST_ARGS); |
static void post_an_norm(POST_ARGS); |
static void post_at(POST_ARGS); |
static void post_at(POST_ARGS); |
Line 116 static void post_useless(POST_ARGS); |
|
Line 117 static void post_useless(POST_ARGS); |
|
static void post_xr(POST_ARGS); |
static void post_xr(POST_ARGS); |
static void post_xx(POST_ARGS); |
static void post_xx(POST_ARGS); |
|
|
static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] = { |
static const v_post mdoc_valids[MDOC_MAX - MDOC_Dd] = { |
post_dd, /* Dd */ |
post_dd, /* Dd */ |
post_dt, /* Dt */ |
post_dt, /* Dt */ |
post_os, /* Os */ |
post_os, /* Os */ |
Line 151 static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] |
|
Line 152 static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] |
|
post_nd, /* Nd */ |
post_nd, /* Nd */ |
post_nm, /* Nm */ |
post_nm, /* Nm */ |
post_delim_nb, /* Op */ |
post_delim_nb, /* Op */ |
post_obsolete, /* Ot */ |
post_abort, /* Ot */ |
post_defaults, /* Pa */ |
post_defaults, /* Pa */ |
post_rv, /* Rv */ |
post_rv, /* Rv */ |
post_st, /* St */ |
post_st, /* St */ |
Line 224 static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] |
|
Line 225 static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] |
|
post_obsolete, /* Fr */ |
post_obsolete, /* Fr */ |
post_eoln, /* Ud */ |
post_eoln, /* Ud */ |
post_lb, /* Lb */ |
post_lb, /* Lb */ |
post_par, /* Lp */ |
post_abort, /* Lp */ |
post_delim_nb, /* Lk */ |
post_delim_nb, /* Lk */ |
post_defaults, /* Mt */ |
post_defaults, /* Mt */ |
post_delim_nb, /* Brq */ |
post_delim_nb, /* Brq */ |
Line 238 static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] |
|
Line 239 static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] |
|
NULL, /* %U */ |
NULL, /* %U */ |
NULL, /* Ta */ |
NULL, /* Ta */ |
}; |
}; |
static const v_post *const mdoc_valids = __mdoc_valids - MDOC_Dd; |
|
|
|
#define RSORD_MAX 14 /* Number of `Rs' blocks. */ |
#define RSORD_MAX 14 /* Number of `Rs' blocks. */ |
|
|
Line 286 static const char * const secnames[SEC__MAX] = { |
|
Line 286 static const char * const secnames[SEC__MAX] = { |
|
}; |
}; |
|
|
|
|
|
/* Validate the subtree rooted at mdoc->last. */ |
void |
void |
mdoc_node_validate(struct roff_man *mdoc) |
mdoc_node_validate(struct roff_man *mdoc) |
{ |
{ |
struct roff_node *n, *np; |
struct roff_node *n, *np; |
const v_post *p; |
const v_post *p; |
|
|
|
/* |
|
* Translate obsolete macros to modern macros first |
|
* such that later code does not need to look |
|
* for the obsolete versions. |
|
*/ |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
switch (n->tok) { |
|
case MDOC_Lp: |
|
n->tok = MDOC_Pp; |
|
break; |
|
case MDOC_Ot: |
|
post_obsolete(mdoc); |
|
n->tok = MDOC_Ft; |
|
break; |
|
default: |
|
break; |
|
} |
|
|
|
/* |
|
* Iterate over all children, recursing into each one |
|
* in turn, depth-first. |
|
*/ |
|
|
mdoc->last = mdoc->last->child; |
mdoc->last = mdoc->last->child; |
while (mdoc->last != NULL) { |
while (mdoc->last != NULL) { |
mdoc_node_validate(mdoc); |
mdoc_node_validate(mdoc); |
Line 302 mdoc_node_validate(struct roff_man *mdoc) |
|
Line 326 mdoc_node_validate(struct roff_man *mdoc) |
|
mdoc->last = mdoc->last->next; |
mdoc->last = mdoc->last->next; |
} |
} |
|
|
|
/* Finally validate the macro itself. */ |
|
|
mdoc->last = n; |
mdoc->last = n; |
mdoc->next = ROFF_NEXT_SIBLING; |
mdoc->next = ROFF_NEXT_SIBLING; |
switch (n->type) { |
switch (n->type) { |
Line 357 mdoc_node_validate(struct roff_man *mdoc) |
|
Line 383 mdoc_node_validate(struct roff_man *mdoc) |
|
} |
} |
|
|
assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX); |
assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX); |
p = mdoc_valids + n->tok; |
p = mdoc_valids + (n->tok - MDOC_Dd); |
if (*p) |
if (*p) |
(*p)(mdoc); |
(*p)(mdoc); |
if (mdoc->last == n) |
if (mdoc->last == n) |
Line 437 check_text_em(struct roff_man *mdoc, int ln, int pos, |
|
Line 463 check_text_em(struct roff_man *mdoc, int ln, int pos, |
|
isalpha((unsigned char)cp[-3]) : |
isalpha((unsigned char)cp[-3]) : |
np != NULL && |
np != NULL && |
np->type == ROFFT_TEXT && |
np->type == ROFFT_TEXT && |
np->string != '\0' && |
*np->string != '\0' && |
isalpha((unsigned char)np->string[ |
isalpha((unsigned char)np->string[ |
strlen(np->string) - 1])) || |
strlen(np->string) - 1])) || |
(cp[1] != '\0' && cp[2] != '\0' ? |
(cp[1] != '\0' && cp[2] != '\0' ? |
isalpha((unsigned char)cp[2]) : |
isalpha((unsigned char)cp[2]) : |
nn != NULL && |
nn != NULL && |
nn->type == ROFFT_TEXT && |
nn->type == ROFFT_TEXT && |
nn->string != '\0' && |
|
isalpha((unsigned char)*nn->string))) { |
isalpha((unsigned char)*nn->string))) { |
mandoc_msg(MANDOCERR_DASHDASH, mdoc->parse, |
mandoc_msg(MANDOCERR_DASHDASH, mdoc->parse, |
ln, pos + (int)(cp - p) - 1, NULL); |
ln, pos + (int)(cp - p) - 1, NULL); |
Line 489 check_toptext(struct roff_man *mdoc, int ln, int pos, |
|
Line 514 check_toptext(struct roff_man *mdoc, int ln, int pos, |
|
} |
} |
|
|
static void |
static void |
|
post_abort(POST_ARGS) |
|
{ |
|
abort(); |
|
} |
|
|
|
static void |
post_delim(POST_ARGS) |
post_delim(POST_ARGS) |
{ |
{ |
const struct roff_node *nch; |
const struct roff_node *nch; |
Line 1265 post_nm(POST_ARGS) |
|
Line 1296 post_nm(POST_ARGS) |
|
n->child->type == ROFFT_TEXT && mdoc->meta.msec != NULL) |
n->child->type == ROFFT_TEXT && mdoc->meta.msec != NULL) |
mandoc_xr_add(mdoc->meta.msec, n->child->string, -1, -1); |
mandoc_xr_add(mdoc->meta.msec, n->child->string, -1, -1); |
|
|
if (n->last != NULL && |
if (n->last != NULL && n->last->tok == MDOC_Pp) |
(n->last->tok == MDOC_Pp || |
|
n->last->tok == MDOC_Lp)) |
|
mdoc_node_relink(mdoc, n->last); |
mdoc_node_relink(mdoc, n->last); |
|
|
if (mdoc->meta.name == NULL) |
if (mdoc->meta.name == NULL) |
Line 1620 post_bl_block(POST_ARGS) |
|
Line 1649 post_bl_block(POST_ARGS) |
|
while (nc != NULL) { |
while (nc != NULL) { |
switch (nc->tok) { |
switch (nc->tok) { |
case MDOC_Pp: |
case MDOC_Pp: |
case MDOC_Lp: |
|
case ROFF_br: |
case ROFF_br: |
break; |
break; |
default: |
default: |
Line 1992 post_root(POST_ARGS) |
|
Line 2020 post_root(POST_ARGS) |
|
while (n != NULL && |
while (n != NULL && |
(n->type == ROFFT_COMMENT || |
(n->type == ROFFT_COMMENT || |
(n->tok >= MDOC_Dd && |
(n->tok >= MDOC_Dd && |
mdoc_macros[n->tok].flags & MDOC_PROLOGUE))) |
mdoc_macro(n->tok)->flags & MDOC_PROLOGUE))) |
n = n->next; |
n = n->next; |
|
|
if (n == NULL) |
if (n == NULL) |
Line 2494 post_ignpar(POST_ARGS) |
|
Line 2522 post_ignpar(POST_ARGS) |
|
} |
} |
|
|
if ((np = mdoc->last->child) != NULL) |
if ((np = mdoc->last->child) != NULL) |
if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) { |
if (np->tok == MDOC_Pp) { |
mandoc_vmsg(MANDOCERR_PAR_SKIP, |
mandoc_vmsg(MANDOCERR_PAR_SKIP, |
mdoc->parse, np->line, np->pos, |
mdoc->parse, np->line, np->pos, |
"%s after %s", roff_name[np->tok], |
"%s after %s", roff_name[np->tok], |
Line 2503 post_ignpar(POST_ARGS) |
|
Line 2531 post_ignpar(POST_ARGS) |
|
} |
} |
|
|
if ((np = mdoc->last->last) != NULL) |
if ((np = mdoc->last->last) != NULL) |
if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) { |
if (np->tok == MDOC_Pp) { |
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
np->line, np->pos, "%s at the end of %s", |
np->line, np->pos, "%s at the end of %s", |
roff_name[np->tok], |
roff_name[np->tok], |
Line 2524 post_prevpar(POST_ARGS) |
|
Line 2552 post_prevpar(POST_ARGS) |
|
return; |
return; |
|
|
/* |
/* |
* Don't allow prior `Lp' or `Pp' prior to a paragraph-type |
* Don't allow `Pp' prior to a paragraph-type |
* block: `Lp', `Pp', or non-compact `Bd' or `Bl'. |
* block: `Pp' or non-compact `Bd' or `Bl'. |
*/ |
*/ |
|
|
if (n->prev->tok != MDOC_Pp && |
if (n->prev->tok != MDOC_Pp && n->prev->tok != ROFF_br) |
n->prev->tok != MDOC_Lp && |
|
n->prev->tok != ROFF_br) |
|
return; |
return; |
if (n->tok == MDOC_Bl && n->norm->Bl.comp) |
if (n->tok == MDOC_Bl && n->norm->Bl.comp) |
return; |
return; |
Line 2568 post_par(POST_ARGS) |
|
Line 2594 post_par(POST_ARGS) |
|
np = mdoc->last->parent; |
np = mdoc->last->parent; |
if (np->tok != MDOC_Sh && np->tok != MDOC_Ss) |
if (np->tok != MDOC_Sh && np->tok != MDOC_Ss) |
return; |
return; |
} else if (np->tok != MDOC_Pp && np->tok != MDOC_Lp && |
} else if (np->tok != MDOC_Pp && |
(mdoc->last->tok != ROFF_br || |
(mdoc->last->tok != ROFF_br || |
(np->tok != ROFF_sp && np->tok != ROFF_br))) |
(np->tok != ROFF_sp && np->tok != ROFF_br))) |
return; |
return; |