version 1.333, 2017/06/10 01:48:53 |
version 1.336, 2017/06/11 17:16:51 |
Line 53 typedef void (*v_post)(POST_ARGS); |
|
Line 53 typedef void (*v_post)(POST_ARGS); |
|
|
|
static int build_list(struct roff_man *, int); |
static int build_list(struct roff_man *, int); |
static void check_text(struct roff_man *, int, int, char *); |
static void check_text(struct roff_man *, int, int, char *); |
static void check_bsd(struct roff_man *, int, int, char *); |
|
static void check_argv(struct roff_man *, |
static void check_argv(struct roff_man *, |
struct roff_node *, struct mdoc_argv *); |
struct roff_node *, struct mdoc_argv *); |
static void check_args(struct roff_man *, struct roff_node *); |
static void check_args(struct roff_man *, struct roff_node *); |
|
static void check_toptext(struct roff_man *, int, int, const char *); |
static int child_an(const struct roff_node *); |
static int child_an(const struct roff_node *); |
static size_t macro2len(enum roff_tok); |
static size_t macro2len(enum roff_tok); |
static void rewrite_macro2len(struct roff_man *, char **); |
static void rewrite_macro2len(struct roff_man *, char **); |
Line 184 static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] |
|
Line 184 static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] |
|
NULL, /* Eo */ |
NULL, /* Eo */ |
post_xx, /* Fx */ |
post_xx, /* Fx */ |
post_delim, /* Ms */ |
post_delim, /* Ms */ |
post_delim, /* No */ |
NULL, /* No */ |
post_ns, /* Ns */ |
post_ns, /* Ns */ |
post_xx, /* Nx */ |
post_xx, /* Nx */ |
post_xx, /* Ox */ |
post_xx, /* Ox */ |
Line 304 mdoc_node_validate(struct roff_man *mdoc) |
|
Line 304 mdoc_node_validate(struct roff_man *mdoc) |
|
if (n->sec != SEC_SYNOPSIS || |
if (n->sec != SEC_SYNOPSIS || |
(n->parent->tok != MDOC_Cd && n->parent->tok != MDOC_Fd)) |
(n->parent->tok != MDOC_Cd && n->parent->tok != MDOC_Fd)) |
check_text(mdoc, n->line, n->pos, n->string); |
check_text(mdoc, n->line, n->pos, n->string); |
if (n->parent->tok == MDOC_Sh || |
if (n->parent->tok == MDOC_It || |
n->parent->tok == MDOC_Ss || |
(n->parent->type == ROFFT_BODY && |
n->parent->tok == MDOC_It) |
(n->parent->tok == MDOC_Sh || |
check_bsd(mdoc, n->line, n->pos, n->string); |
n->parent->tok == MDOC_Ss))) |
|
check_toptext(mdoc, n->line, n->pos, n->string); |
break; |
break; |
case ROFFT_EQN: |
case ROFFT_EQN: |
case ROFFT_TBL: |
case ROFFT_TBL: |
Line 390 check_text(struct roff_man *mdoc, int ln, int pos, cha |
|
Line 391 check_text(struct roff_man *mdoc, int ln, int pos, cha |
|
} |
} |
|
|
static void |
static void |
check_bsd(struct roff_man *mdoc, int ln, int pos, char *p) |
check_toptext(struct roff_man *mdoc, int ln, int pos, const char *p) |
{ |
{ |
const char *cp; |
const char *cp, *cpr; |
|
|
|
if (*p == '\0') |
|
return; |
|
|
if ((cp = strstr(p, "OpenBSD")) != NULL) |
if ((cp = strstr(p, "OpenBSD")) != NULL) |
mandoc_msg(MANDOCERR_BX, mdoc->parse, |
mandoc_msg(MANDOCERR_BX, mdoc->parse, |
ln, pos + (cp - p), "Ox"); |
ln, pos + (cp - p), "Ox"); |
Line 406 check_bsd(struct roff_man *mdoc, int ln, int pos, char |
|
Line 410 check_bsd(struct roff_man *mdoc, int ln, int pos, char |
|
if ((cp = strstr(p, "DragonFly")) != NULL) |
if ((cp = strstr(p, "DragonFly")) != NULL) |
mandoc_msg(MANDOCERR_BX, mdoc->parse, |
mandoc_msg(MANDOCERR_BX, mdoc->parse, |
ln, pos + (cp - p), "Dx"); |
ln, pos + (cp - p), "Dx"); |
|
|
|
cp = p; |
|
while ((cp = strstr(cp + 1, "()")) != NULL) { |
|
for (cpr = cp - 1; cpr >= p; cpr--) |
|
if (*cpr != '_' && !isalnum((unsigned char)*cpr)) |
|
break; |
|
if ((cpr < p || *cpr == ' ') && cpr + 1 < cp) { |
|
cpr++; |
|
mandoc_vmsg(MANDOCERR_FUNC, mdoc->parse, |
|
ln, pos + (cpr - p), |
|
"%.*s()", (int)(cp - cpr), cpr); |
|
} |
|
} |
} |
} |
|
|
static void |
static void |
post_delim(POST_ARGS) |
post_delim(POST_ARGS) |
{ |
{ |
const struct roff_node *nch; |
const struct roff_node *nch; |
const char *lc; |
const char *lc, *cp; |
|
int nw; |
enum mdelim delim; |
enum mdelim delim; |
|
enum roff_tok tok; |
|
|
|
/* |
|
* Find candidates: at least two bytes, |
|
* the last one a closing or middle delimiter. |
|
*/ |
|
|
|
tok = mdoc->last->tok; |
nch = mdoc->last->last; |
nch = mdoc->last->last; |
if (nch == NULL || nch->type != ROFFT_TEXT) |
if (nch == NULL || nch->type != ROFFT_TEXT) |
return; |
return; |
Line 424 post_delim(POST_ARGS) |
|
Line 449 post_delim(POST_ARGS) |
|
delim = mdoc_isdelim(lc); |
delim = mdoc_isdelim(lc); |
if (delim == DELIM_NONE || delim == DELIM_OPEN) |
if (delim == DELIM_NONE || delim == DELIM_OPEN) |
return; |
return; |
|
|
|
/* |
|
* Reduce false positives by allowing various cases. |
|
*/ |
|
|
|
/* Escaped delimiters. */ |
|
if (lc > nch->string + 1 && lc[-2] == '\\' && |
|
(lc[-1] == '&' || lc[-1] == 'e')) |
|
return; |
|
|
|
/* Specific byte sequences. */ |
|
switch (*lc) { |
|
case ')': |
|
for (cp = lc; cp >= nch->string; cp--) |
|
if (*cp == '(') |
|
return; |
|
break; |
|
case '.': |
|
if (lc > nch->string + 1 && lc[-2] == '.' && lc[-1] == '.') |
|
return; |
|
if (lc[-1] == '.') |
|
return; |
|
break; |
|
case ';': |
|
if (tok == MDOC_Vt) |
|
return; |
|
break; |
|
case '?': |
|
if (lc[-1] == '?') |
|
return; |
|
break; |
|
case ']': |
|
for (cp = lc; cp >= nch->string; cp--) |
|
if (*cp == '[') |
|
return; |
|
break; |
|
case '|': |
|
if (lc == nch->string + 1 && lc[-1] == '|') |
|
return; |
|
default: |
|
break; |
|
} |
|
|
|
/* Exactly two non-alphanumeric bytes. */ |
|
if (lc == nch->string + 1 && !isalnum((unsigned char)lc[-1])) |
|
return; |
|
|
|
/* At least three alphabetic words with a sentence ending. */ |
|
if (strchr("!.:?", *lc) != NULL && (tok == MDOC_Em || |
|
tok == MDOC_Li || tok == MDOC_Po || tok == MDOC_Pq || |
|
tok == MDOC_Sy)) { |
|
nw = 0; |
|
for (cp = lc - 1; cp >= nch->string; cp--) { |
|
if (*cp == ' ') { |
|
nw++; |
|
if (cp > nch->string && cp[-1] == ',') |
|
cp--; |
|
} else if (isalpha((unsigned int)*cp)) { |
|
if (nw > 1) |
|
return; |
|
} else |
|
break; |
|
} |
|
} |
|
|
mandoc_vmsg(MANDOCERR_DELIM, mdoc->parse, |
mandoc_vmsg(MANDOCERR_DELIM, mdoc->parse, |
nch->line, nch->pos + (lc - nch->string), |
nch->line, nch->pos + (lc - nch->string), |
"%s%s %s", roff_name[mdoc->last->tok], |
"%s%s %s", roff_name[tok], |
nch == mdoc->last->child ? "" : " ...", nch->string); |
nch == mdoc->last->child ? "" : " ...", nch->string); |
} |
} |
|
|