version 1.58, 2010/02/17 19:28:11 |
version 1.73, 2010/05/14 14:34:29 |
|
|
v_post *post; |
v_post *post; |
}; |
}; |
|
|
static int check_parent(PRE_ARGS, int, enum mdoc_type); |
static int check_parent(PRE_ARGS, enum mdoct, enum mdoc_type); |
static int check_msec(PRE_ARGS, ...); |
static int check_msec(PRE_ARGS, ...); |
static int check_sec(PRE_ARGS, ...); |
static int check_sec(PRE_ARGS, ...); |
static int check_stdarg(PRE_ARGS); |
static int check_stdarg(PRE_ARGS); |
Line 60 static int err_child_gt(struct mdoc *, const char *, |
|
Line 60 static int err_child_gt(struct mdoc *, const char *, |
|
static int warn_child_gt(struct mdoc *, const char *, int); |
static int warn_child_gt(struct mdoc *, const char *, int); |
static int err_child_eq(struct mdoc *, const char *, int); |
static int err_child_eq(struct mdoc *, const char *, int); |
static int warn_child_eq(struct mdoc *, const char *, int); |
static int warn_child_eq(struct mdoc *, const char *, int); |
static int warn_print(struct mdoc *, int, int); |
|
static int warn_count(struct mdoc *, const char *, |
static int warn_count(struct mdoc *, const char *, |
int, const char *, int); |
int, const char *, int); |
static int err_count(struct mdoc *, const char *, |
static int err_count(struct mdoc *, const char *, |
Line 77 static int ewarn_ge1(POST_ARGS); |
|
Line 76 static int ewarn_ge1(POST_ARGS); |
|
static int herr_eq0(POST_ARGS); |
static int herr_eq0(POST_ARGS); |
static int herr_ge1(POST_ARGS); |
static int herr_ge1(POST_ARGS); |
static int hwarn_eq1(POST_ARGS); |
static int hwarn_eq1(POST_ARGS); |
|
static int hwarn_eq0(POST_ARGS); |
static int hwarn_le1(POST_ARGS); |
static int hwarn_le1(POST_ARGS); |
|
|
static int post_an(POST_ARGS); |
static int post_an(POST_ARGS); |
Line 97 static int post_vt(POST_ARGS); |
|
Line 97 static int post_vt(POST_ARGS); |
|
static int pre_an(PRE_ARGS); |
static int pre_an(PRE_ARGS); |
static int pre_bd(PRE_ARGS); |
static int pre_bd(PRE_ARGS); |
static int pre_bl(PRE_ARGS); |
static int pre_bl(PRE_ARGS); |
static int pre_cd(PRE_ARGS); |
|
static int pre_dd(PRE_ARGS); |
static int pre_dd(PRE_ARGS); |
static int pre_display(PRE_ARGS); |
static int pre_display(PRE_ARGS); |
static int pre_dt(PRE_ARGS); |
static int pre_dt(PRE_ARGS); |
static int pre_er(PRE_ARGS); |
|
static int pre_ex(PRE_ARGS); |
static int pre_ex(PRE_ARGS); |
static int pre_fd(PRE_ARGS); |
static int pre_fd(PRE_ARGS); |
static int pre_it(PRE_ARGS); |
static int pre_it(PRE_ARGS); |
Line 113 static int pre_ss(PRE_ARGS); |
|
Line 111 static int pre_ss(PRE_ARGS); |
|
|
|
static v_post posts_an[] = { post_an, NULL }; |
static v_post posts_an[] = { post_an, NULL }; |
static v_post posts_at[] = { post_at, NULL }; |
static v_post posts_at[] = { post_at, NULL }; |
static v_post posts_bd[] = { herr_eq0, bwarn_ge1, NULL }; |
static v_post posts_bd[] = { hwarn_eq0, bwarn_ge1, NULL }; |
static v_post posts_bf[] = { hwarn_le1, post_bf, NULL }; |
static v_post posts_bf[] = { hwarn_le1, post_bf, NULL }; |
static v_post posts_bl[] = { bwarn_ge1, post_bl, NULL }; |
static v_post posts_bl[] = { bwarn_ge1, post_bl, NULL }; |
static v_post posts_bool[] = { eerr_eq1, ebool, NULL }; |
static v_post posts_bool[] = { eerr_eq1, ebool, NULL }; |
Line 133 static v_post posts_text1[] = { eerr_eq1, NULL }; |
|
Line 131 static v_post posts_text1[] = { eerr_eq1, NULL }; |
|
static v_post posts_vt[] = { post_vt, NULL }; |
static v_post posts_vt[] = { post_vt, NULL }; |
static v_post posts_wline[] = { bwarn_ge1, herr_eq0, NULL }; |
static v_post posts_wline[] = { bwarn_ge1, herr_eq0, NULL }; |
static v_post posts_wtext[] = { ewarn_ge1, NULL }; |
static v_post posts_wtext[] = { ewarn_ge1, NULL }; |
static v_post posts_xr[] = { eerr_ge1, NULL }; |
static v_post posts_xr[] = { ewarn_ge1, NULL }; |
static v_pre pres_an[] = { pre_an, NULL }; |
static v_pre pres_an[] = { pre_an, NULL }; |
static v_pre pres_bd[] = { pre_display, pre_bd, NULL }; |
static v_pre pres_bd[] = { pre_display, pre_bd, NULL }; |
static v_pre pres_bl[] = { pre_bl, NULL }; |
static v_pre pres_bl[] = { pre_bl, NULL }; |
static v_pre pres_cd[] = { pre_cd, NULL }; |
|
static v_pre pres_d1[] = { pre_display, NULL }; |
static v_pre pres_d1[] = { pre_display, NULL }; |
static v_pre pres_dd[] = { pre_dd, NULL }; |
static v_pre pres_dd[] = { pre_dd, NULL }; |
static v_pre pres_dt[] = { pre_dt, NULL }; |
static v_pre pres_dt[] = { pre_dt, NULL }; |
static v_pre pres_er[] = { pre_er, NULL }; |
static v_pre pres_er[] = { NULL, NULL }; |
static v_pre pres_ex[] = { pre_ex, NULL }; |
static v_pre pres_ex[] = { pre_ex, NULL }; |
static v_pre pres_fd[] = { pre_fd, NULL }; |
static v_pre pres_fd[] = { pre_fd, NULL }; |
static v_pre pres_it[] = { pre_it, NULL }; |
static v_pre pres_it[] = { pre_it, NULL }; |
Line 169 const struct valids mdoc_valids[MDOC_MAX] = { |
|
Line 166 const struct valids mdoc_valids[MDOC_MAX] = { |
|
{ NULL, posts_text }, /* Ad */ |
{ NULL, posts_text }, /* Ad */ |
{ pres_an, posts_an }, /* An */ |
{ pres_an, posts_an }, /* An */ |
{ NULL, NULL }, /* Ar */ |
{ NULL, NULL }, /* Ar */ |
{ pres_cd, posts_text }, /* Cd */ |
{ NULL, posts_text }, /* Cd */ |
{ NULL, NULL }, /* Cm */ |
{ NULL, NULL }, /* Cm */ |
{ NULL, NULL }, /* Dv */ |
{ NULL, NULL }, /* Dv */ |
{ pres_er, posts_text }, /* Er */ |
{ pres_er, posts_text }, /* Er */ |
Line 325 mdoc_valid_post(struct mdoc *mdoc) |
|
Line 322 mdoc_valid_post(struct mdoc *mdoc) |
|
} |
} |
|
|
|
|
static int |
|
warn_print(struct mdoc *m, int ln, int pos) |
|
{ |
|
|
|
if (MDOC_IGN_CHARS & m->pflags) |
|
return(mdoc_pwarn(m, ln, pos, EPRINT)); |
|
return(mdoc_perr(m, ln, pos, EPRINT)); |
|
} |
|
|
|
|
|
static inline int |
static inline int |
warn_count(struct mdoc *m, const char *k, |
warn_count(struct mdoc *m, const char *k, |
int want, const char *v, int has) |
int want, const char *v, int has) |
Line 414 CHECK_HEAD_DEFN(eq0, err, err_child_eq, 0) /* herr_eq0 |
|
Line 401 CHECK_HEAD_DEFN(eq0, err, err_child_eq, 0) /* herr_eq0 |
|
CHECK_HEAD_DEFN(le1, warn, warn_child_lt, 2) /* hwarn_le1() */ |
CHECK_HEAD_DEFN(le1, warn, warn_child_lt, 2) /* hwarn_le1() */ |
CHECK_HEAD_DEFN(ge1, err, err_child_gt, 0) /* herr_ge1() */ |
CHECK_HEAD_DEFN(ge1, err, err_child_gt, 0) /* herr_ge1() */ |
CHECK_HEAD_DEFN(eq1, warn, warn_child_eq, 1) /* hwarn_eq1() */ |
CHECK_HEAD_DEFN(eq1, warn, warn_child_eq, 1) /* hwarn_eq1() */ |
|
CHECK_HEAD_DEFN(eq0, warn, warn_child_eq, 0) /* hwarn_eq0() */ |
|
|
|
|
static int |
static int |
Line 519 check_text(struct mdoc *mdoc, int line, int pos, const |
|
Line 507 check_text(struct mdoc *mdoc, int line, int pos, const |
|
for ( ; *p; p++, pos++) { |
for ( ; *p; p++, pos++) { |
if ('\t' == *p) { |
if ('\t' == *p) { |
if ( ! (MDOC_LITERAL & mdoc->flags)) |
if ( ! (MDOC_LITERAL & mdoc->flags)) |
if ( ! warn_print(mdoc, line, pos)) |
if ( ! mdoc_pwarn(mdoc, line, pos, EPRINT)) |
return(0); |
return(0); |
} else if ( ! isprint((u_char)*p)) |
} else if ( ! isprint((u_char)*p)) |
if ( ! warn_print(mdoc, line, pos)) |
if ( ! mdoc_pwarn(mdoc, line, pos, EPRINT)) |
return(0); |
return(0); |
|
|
if ('\\' != *p) |
if ('\\' != *p) |
Line 547 check_text(struct mdoc *mdoc, int line, int pos, const |
|
Line 535 check_text(struct mdoc *mdoc, int line, int pos, const |
|
|
|
|
|
static int |
static int |
check_parent(PRE_ARGS, int tok, enum mdoc_type t) |
check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type t) |
{ |
{ |
|
|
assert(n->parent); |
assert(n->parent); |
Line 621 pre_bl(PRE_ARGS) |
|
Line 609 pre_bl(PRE_ARGS) |
|
case (MDOC_Inset): |
case (MDOC_Inset): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Column): |
case (MDOC_Column): |
if (type >= 0) |
/* |
return(mdoc_nerr(mdoc, n, EMULTILIST)); |
* Note that if a duplicate is detected, we |
|
* remove the duplicate instead of passing it |
|
* over. If we don't do this, mdoc_action will |
|
* become confused when it scans over multiple |
|
* types whilst setting its bitmasks. |
|
* |
|
* FIXME: this should occur in mdoc_action.c. |
|
*/ |
|
if (type >= 0) { |
|
if ( ! mdoc_nwarn(mdoc, n, EMULTILIST)) |
|
return(0); |
|
mdoc_argn_free(n->args, pos); |
|
break; |
|
} |
type = n->args->argv[pos].arg; |
type = n->args->argv[pos].arg; |
break; |
break; |
case (MDOC_Compact): |
case (MDOC_Compact): |
Line 735 pre_sh(PRE_ARGS) |
|
Line 736 pre_sh(PRE_ARGS) |
|
|
|
if (MDOC_BLOCK != n->type) |
if (MDOC_BLOCK != n->type) |
return(1); |
return(1); |
return(check_parent(mdoc, n, -1, MDOC_ROOT)); |
return(check_parent(mdoc, n, MDOC_MAX, MDOC_ROOT)); |
} |
} |
|
|
|
|
|
|
pre_rv(PRE_ARGS) |
pre_rv(PRE_ARGS) |
{ |
{ |
|
|
if ( ! check_msec(mdoc, n, 2, 3, 0)) |
|
return(0); |
|
return(check_stdarg(mdoc, n)); |
return(check_stdarg(mdoc, n)); |
} |
} |
|
|
Line 789 pre_ex(PRE_ARGS) |
|
Line 788 pre_ex(PRE_ARGS) |
|
|
|
|
|
static int |
static int |
pre_er(PRE_ARGS) |
|
{ |
|
|
|
return(check_msec(mdoc, n, 2, 3, 9, 0)); |
|
} |
|
|
|
|
|
static int |
|
pre_cd(PRE_ARGS) |
|
{ |
|
|
|
return(check_msec(mdoc, n, 4, 0)); |
|
} |
|
|
|
|
|
static int |
|
pre_dt(PRE_ARGS) |
pre_dt(PRE_ARGS) |
{ |
{ |
|
|
Line 1056 post_it(POST_ARGS) |
|
Line 1039 post_it(POST_ARGS) |
|
for (i = 0; c && MDOC_HEAD == c->type; c = c->next) |
for (i = 0; c && MDOC_HEAD == c->type; c = c->next) |
i++; |
i++; |
|
|
if (i < cols || i == (cols + 1)) { |
if (i < cols) { |
if ( ! mdoc_vwarn(mdoc, mdoc->last->line, |
if ( ! mdoc_vwarn(mdoc, mdoc->last->line, |
mdoc->last->pos, "column " |
mdoc->last->pos, "column " |
"mismatch: have %d, want %d", |
"mismatch: have %d, want %d", |
i, cols)) |
i, cols)) |
return(0); |
return(0); |
break; |
break; |
} else if (i == cols) |
} else if (i == cols || i == cols + 1) |
break; |
break; |
|
|
return(mdoc_verr(mdoc, mdoc->last->line, |
return(mdoc_verr(mdoc, mdoc->last->line, |
Line 1082 post_bl_head(POST_ARGS) |
|
Line 1065 post_bl_head(POST_ARGS) |
|
{ |
{ |
int i; |
int i; |
const struct mdoc_node *n; |
const struct mdoc_node *n; |
|
const struct mdoc_argv *a; |
|
|
n = mdoc->last->parent; |
n = mdoc->last->parent; |
assert(n->args); |
assert(n->args); |
|
|
for (i = 0; i < (int)n->args->argc; i++) |
for (i = 0; i < (int)n->args->argc; i++) { |
if (n->args->argv[i].arg == MDOC_Column) |
a = &n->args->argv[i]; |
break; |
if (a->arg == MDOC_Column) { |
|
if (a->sz && mdoc->last->nchild) |
|
return(mdoc_nerr(mdoc, n, ECOLMIS)); |
|
return(1); |
|
} |
|
} |
|
|
if (i == (int)n->args->argc) |
if (0 == (i = mdoc->last->nchild)) |
return(1); |
return(1); |
|
return(warn_count(mdoc, "==", 0, "line arguments", i)); |
if (n->args->argv[i].sz && mdoc->last->child) |
|
return(mdoc_nerr(mdoc, n, ECOLMIS)); |
|
|
|
return(1); |
|
} |
} |
|
|
|
|
Line 1301 post_sh_head(POST_ARGS) |
|
Line 1286 post_sh_head(POST_ARGS) |
|
return(mdoc_nerr(mdoc, n, ETOOLONG)); |
return(mdoc_nerr(mdoc, n, ETOOLONG)); |
} |
} |
|
|
sec = mdoc_atosec(buf); |
sec = mdoc_str2sec(buf); |
|
|
/* |
/* |
* Check: NAME should always be first, CUSTOM has no roles, |
* Check: NAME should always be first, CUSTOM has no roles, |
Line 1309 post_sh_head(POST_ARGS) |
|
Line 1294 post_sh_head(POST_ARGS) |
|
*/ |
*/ |
|
|
if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed) |
if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed) |
return(mdoc_nerr(mdoc, mdoc->last, ESECNAME)); |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ESECNAME)) |
|
return(0); |
|
|
if (SEC_CUSTOM == sec) |
if (SEC_CUSTOM == sec) |
return(1); |
return(1); |
|
|
if (sec == mdoc->lastnamed) |
if (sec == mdoc->lastnamed) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ESECREP)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ESECREP)) |
return(0); |
return(0); |
|
|
if (sec < mdoc->lastnamed) |
if (sec < mdoc->lastnamed) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ESECOOO)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ESECOOO)) |
return(0); |
return(0); |