diff options
-rw-r--r-- | mdoc.7 | 4 | ||||
-rw-r--r-- | mdoc_term.c | 23 | ||||
-rw-r--r-- | mdoc_validate.c | 230 |
3 files changed, 128 insertions, 129 deletions
@@ -668,8 +668,4 @@ blocks. The \-split and \-nosplit arguments to .Sq \&.An are inane. -.\" LIST-ITEM -.It -The end-of-line whitespace warnings are superfluous holdovers from -historic groff. .El diff --git a/mdoc_term.c b/mdoc_term.c index df2258c1..7db43e79 100644 --- a/mdoc_term.c +++ b/mdoc_term.c @@ -571,16 +571,15 @@ arg_listtype(const struct mdoc_node *n) /* FALLTHROUGH */ case (MDOC_Column): /* FALLTHROUGH */ + case (MDOC_Hang): + /* FALLTHROUGH */ case (MDOC_Ohang): return(n->args->argv[i].arg); default: break; } - /* FIXME: mandated by parser. */ - - errx(1, "list type not supported"); - /* NOTREACHED */ + return(-1); } @@ -726,6 +725,7 @@ termp_it_pre(DECL_ARGS) (void)arg_getattrs(keys, vals, 3, bl); type = arg_listtype(bl); + assert(-1 != type); /* Calculate real width and offset. */ @@ -752,7 +752,7 @@ termp_it_pre(DECL_ARGS) /* * List-type can override the width in the case of fixed-head * values (bullet, dash/hyphen, enum). Tags need a non-zero - * offset. + * offset. FIXME: double-check that correct. */ switch (type) { @@ -768,6 +768,8 @@ termp_it_pre(DECL_ARGS) if (width < 5) width = 5; break; + case (MDOC_Hang): + /* FALLTHROUGH */ case (MDOC_Tag): if (0 == width) width = 10; @@ -785,6 +787,8 @@ termp_it_pre(DECL_ARGS) case (MDOC_Diag): term_word(p, "\\ "); /* FALLTHROUGH */ + case (MDOC_Hang): + /* FALLTHROUGH */ case (MDOC_Inset): if (MDOC_BODY == node->type) p->flags &= ~TERMP_NOSPACE; @@ -826,11 +830,17 @@ termp_it_pre(DECL_ARGS) /* FALLTHROUGH */ case (MDOC_Hyphen): /* FALLTHROUGH */ + case (MDOC_Hang): + /* FALLTHROUGH */ case (MDOC_Tag): if (MDOC_HEAD == node->type) p->flags |= TERMP_NOBREAK; else p->flags |= TERMP_NOLPAD; + + if (MDOC_HEAD == node->type && MDOC_Hang == type) + p->flags |= TERMP_NONOBREAK; + if (MDOC_HEAD == node->type && MDOC_Tag == type) if (NULL == node->next || NULL == node->next->child) @@ -872,6 +882,8 @@ termp_it_pre(DECL_ARGS) /* FALLTHROUGH */ case (MDOC_Hyphen): /* FALLTHROUGH */ + case (MDOC_Hang): + /* FALLTHROUGH */ case (MDOC_Tag): if (MDOC_HEAD == node->type) p->rmargin = p->offset + width; @@ -954,6 +966,7 @@ termp_it_post(DECL_ARGS) return; type = arg_listtype(node->parent->parent->parent); + assert(-1 != type); switch (type) { case (MDOC_Diag): diff --git a/mdoc_validate.c b/mdoc_validate.c index 9202df65..0c7826a0 100644 --- a/mdoc_validate.c +++ b/mdoc_validate.c @@ -28,9 +28,8 @@ /* FIXME: .Bl -diag can't have non-text children in HEAD. */ /* TODO: ignoring Pp (it's superfluous in some invocations). */ -#define PRE_ARGS struct mdoc *mdoc, const struct mdoc_node *n -#define POST_ARGS struct mdoc *mdoc - +#define PRE_ARGS struct mdoc *mdoc, const struct mdoc_node *n +#define POST_ARGS struct mdoc *mdoc typedef int (*v_pre)(PRE_ARGS); typedef int (*v_post)(POST_ARGS); @@ -40,112 +39,117 @@ struct valids { v_post *post; }; -static int check_parent(PRE_ARGS, int, enum mdoc_type); -static int check_msec(PRE_ARGS, ...); -static int check_sec(PRE_ARGS, ...); -static int check_stdarg(PRE_ARGS); -static int check_text(struct mdoc *, int, int, const char *); -static int check_argv(struct mdoc *, +static int check_parent(PRE_ARGS, int, enum mdoc_type); +static int check_msec(PRE_ARGS, ...); +static int check_sec(PRE_ARGS, ...); +static int check_stdarg(PRE_ARGS); +static int check_text(struct mdoc *, int, int, const char *); +static int check_argv(struct mdoc *, const struct mdoc_node *, const struct mdoc_argv *); -static int check_args(struct mdoc *, +static int check_args(struct mdoc *, const struct mdoc_node *); -static int err_child_lt(struct mdoc *, const char *, int); -static int warn_child_lt(struct mdoc *, const char *, int); -static int err_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 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 err_child_lt(struct mdoc *, const char *, int); +static int warn_child_lt(struct mdoc *, const char *, int); +static int err_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 warn_child_eq(struct mdoc *, const char *, int); +static int warn_print(struct mdoc *, int, int); +static int warn_count(struct mdoc *, const char *, int, const char *, int); -static int err_count(struct mdoc *, const char *, +static int err_count(struct mdoc *, const char *, int, const char *, int); -static int pre_an(PRE_ARGS); -static int pre_bd(PRE_ARGS); -static int pre_bl(PRE_ARGS); -static int pre_cd(PRE_ARGS); -static int pre_dd(PRE_ARGS); -static int pre_display(PRE_ARGS); -static int pre_dt(PRE_ARGS); -static int pre_er(PRE_ARGS); -static int pre_ex(PRE_ARGS); -static int pre_fd(PRE_ARGS); -static int pre_it(PRE_ARGS); -static int pre_lb(PRE_ARGS); -static int pre_os(PRE_ARGS); -static int pre_rv(PRE_ARGS); -static int pre_sh(PRE_ARGS); -static int pre_ss(PRE_ARGS); -static int herr_ge1(POST_ARGS); -static int hwarn_le1(POST_ARGS); -static int herr_eq0(POST_ARGS); -static int eerr_eq0(POST_ARGS); -static int eerr_le2(POST_ARGS); -static int eerr_eq1(POST_ARGS); -static int eerr_ge1(POST_ARGS); -static int ewarn_eq0(POST_ARGS); -static int bwarn_ge1(POST_ARGS); -static int berr_ge1(POST_ARGS); -static int hwarn_eq1(POST_ARGS); -static int ewarn_ge1(POST_ARGS); -static int ebool(POST_ARGS); - -static int post_an(POST_ARGS); -static int post_args(POST_ARGS); -static int post_at(POST_ARGS); -static int post_bf(POST_ARGS); -static int post_bl(POST_ARGS); -static int post_bl_head(POST_ARGS); -static int post_it(POST_ARGS); -static int post_lb(POST_ARGS); -static int post_nm(POST_ARGS); -static int post_root(POST_ARGS); -static int post_sh(POST_ARGS); -static int post_sh_body(POST_ARGS); -static int post_sh_head(POST_ARGS); -static int post_st(POST_ARGS); - -static v_pre pres_an[] = { pre_an, NULL }; -static v_pre pres_bd[] = { pre_display, pre_bd, NULL }; -static v_pre pres_bl[] = { pre_bl, NULL }; -static v_pre pres_cd[] = { pre_cd, NULL }; -static v_pre pres_dd[] = { pre_dd, NULL }; -static v_pre pres_d1[] = { pre_display, NULL }; -static v_pre pres_dt[] = { pre_dt, NULL }; -static v_pre pres_er[] = { pre_er, NULL }; -static v_pre pres_ex[] = { pre_ex, NULL }; -static v_pre pres_fd[] = { pre_fd, NULL }; -static v_pre pres_it[] = { pre_it, NULL }; -static v_pre pres_lb[] = { pre_lb, NULL }; -static v_pre pres_os[] = { pre_os, NULL }; -static v_pre pres_rv[] = { pre_rv, NULL }; -static v_pre pres_sh[] = { pre_sh, NULL }; -static v_pre pres_ss[] = { pre_ss, NULL }; -static v_post posts_bool[] = { eerr_eq1, ebool, NULL }; -static v_post posts_bd[] = { herr_eq0, bwarn_ge1, NULL }; -static v_post posts_text[] = { eerr_ge1, NULL }; -static v_post posts_wtext[] = { ewarn_ge1, NULL }; -static v_post posts_notext[] = { eerr_eq0, NULL }; -static v_post posts_wline[] = { bwarn_ge1, herr_eq0, NULL }; -static v_post posts_sh[] = { herr_ge1, bwarn_ge1, post_sh, NULL }; -static v_post posts_bl[] = { bwarn_ge1, post_bl, NULL }; -static v_post posts_it[] = { post_it, NULL }; -static v_post posts_in[] = { eerr_eq1, NULL }; -static v_post posts_ss[] = { herr_ge1, NULL }; -static v_post posts_nd[] = { berr_ge1, NULL }; -static v_post posts_pf[] = { eerr_eq1, NULL }; -static v_post posts_lb[] = { eerr_eq1, post_lb, NULL }; -static v_post posts_st[] = { eerr_eq1, post_st, NULL }; -static v_post posts_pp[] = { ewarn_eq0, NULL }; -static v_post posts_ex[] = { eerr_eq0, post_args, NULL }; -static v_post posts_rv[] = { eerr_eq0, post_args, NULL }; -static v_post posts_an[] = { post_an, NULL }; -static v_post posts_at[] = { post_at, NULL }; -static v_post posts_xr[] = { eerr_ge1, eerr_le2, NULL }; -static v_post posts_nm[] = { post_nm, NULL }; -static v_post posts_bf[] = { hwarn_le1, post_bf, NULL }; -static v_post posts_fo[] = { hwarn_eq1, bwarn_ge1, NULL }; + +#ifdef __linux__ +extern size_t strlcat(char *, const char *, size_t); +#endif + +static int berr_ge1(POST_ARGS); +static int bwarn_ge1(POST_ARGS); +static int ebool(POST_ARGS); +static int eerr_eq0(POST_ARGS); +static int eerr_eq1(POST_ARGS); +static int eerr_ge1(POST_ARGS); +static int eerr_le2(POST_ARGS); +static int ewarn_eq0(POST_ARGS); +static int ewarn_ge1(POST_ARGS); +static int herr_eq0(POST_ARGS); +static int herr_ge1(POST_ARGS); +static int hwarn_eq1(POST_ARGS); +static int hwarn_le1(POST_ARGS); + +static int post_an(POST_ARGS); +static int post_args(POST_ARGS); +static int post_at(POST_ARGS); +static int post_bf(POST_ARGS); +static int post_bl(POST_ARGS); +static int post_bl_head(POST_ARGS); +static int post_it(POST_ARGS); +static int post_lb(POST_ARGS); +static int post_nm(POST_ARGS); +static int post_root(POST_ARGS); +static int post_sh(POST_ARGS); +static int post_sh_body(POST_ARGS); +static int post_sh_head(POST_ARGS); +static int post_st(POST_ARGS); +static int pre_an(PRE_ARGS); +static int pre_bd(PRE_ARGS); +static int pre_bl(PRE_ARGS); +static int pre_cd(PRE_ARGS); +static int pre_dd(PRE_ARGS); +static int pre_display(PRE_ARGS); +static int pre_dt(PRE_ARGS); +static int pre_er(PRE_ARGS); +static int pre_ex(PRE_ARGS); +static int pre_fd(PRE_ARGS); +static int pre_it(PRE_ARGS); +static int pre_lb(PRE_ARGS); +static int pre_os(PRE_ARGS); +static int pre_rv(PRE_ARGS); +static int pre_sh(PRE_ARGS); +static int pre_ss(PRE_ARGS); + +static v_post posts_an[] = { post_an, NULL }; +static v_post posts_at[] = { post_at, NULL }; +static v_post posts_bd[] = { herr_eq0, bwarn_ge1, 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_bool[] = { eerr_eq1, ebool, NULL }; +static v_post posts_ex[] = { eerr_eq0, post_args, NULL }; +static v_post posts_fo[] = { hwarn_eq1, bwarn_ge1, NULL }; +static v_post posts_in[] = { eerr_eq1, NULL }; +static v_post posts_it[] = { post_it, NULL }; +static v_post posts_lb[] = { eerr_eq1, post_lb, NULL }; +static v_post posts_nd[] = { berr_ge1, NULL }; +static v_post posts_nm[] = { post_nm, NULL }; +static v_post posts_notext[] = { eerr_eq0, NULL }; +static v_post posts_pf[] = { eerr_eq1, NULL }; +static v_post posts_pp[] = { ewarn_eq0, NULL }; +static v_post posts_rv[] = { eerr_eq0, post_args, NULL }; +static v_post posts_sh[] = { herr_ge1, bwarn_ge1, post_sh, NULL }; +static v_post posts_ss[] = { herr_ge1, NULL }; +static v_post posts_st[] = { eerr_eq1, post_st, NULL }; +static v_post posts_text[] = { eerr_ge1, NULL }; +static v_post posts_wline[] = { bwarn_ge1, herr_eq0, NULL }; +static v_post posts_wtext[] = { ewarn_ge1, NULL }; +static v_post posts_xr[] = { eerr_ge1, eerr_le2, NULL }; +static v_pre pres_an[] = { pre_an, NULL }; +static v_pre pres_bd[] = { pre_display, pre_bd, 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_dd[] = { pre_dd, NULL }; +static v_pre pres_dt[] = { pre_dt, NULL }; +static v_pre pres_er[] = { pre_er, NULL }; +static v_pre pres_ex[] = { pre_ex, NULL }; +static v_pre pres_fd[] = { pre_fd, NULL }; +static v_pre pres_it[] = { pre_it, NULL }; +static v_pre pres_lb[] = { pre_lb, NULL }; +static v_pre pres_os[] = { pre_os, NULL }; +static v_pre pres_rv[] = { pre_rv, NULL }; +static v_pre pres_sh[] = { pre_sh, NULL }; +static v_pre pres_ss[] = { pre_ss, NULL }; const struct valids mdoc_valids[MDOC_MAX] = { { NULL, NULL }, /* Ap */ @@ -269,14 +273,8 @@ const struct valids mdoc_valids[MDOC_MAX] = { }; -#ifdef __linux__ -extern size_t strlcat(char *, const char *, size_t); -#endif - - int -mdoc_valid_pre(struct mdoc *mdoc, - const struct mdoc_node *n) +mdoc_valid_pre(struct mdoc *mdoc, const struct mdoc_node *n) { v_pre *p; int line, pos; @@ -305,14 +303,6 @@ mdoc_valid_post(struct mdoc *mdoc) { v_post *p; - /* - * This check occurs after the macro's children have been filled - * in: postfix validation. Since this happens when we're - * rewinding the scope tree, it's possible to have multiple - * invocations (as by design, for now), we set bit MDOC_VALID to - * indicate that we've validated. - */ - if (MDOC_VALID & mdoc->last->flags) return(1); mdoc->last->flags |= MDOC_VALID; @@ -544,7 +534,7 @@ check_text(struct mdoc *mdoc, int line, int pos, const char *p) } if ( ! (MDOC_IGN_ESCAPE & mdoc->pflags)) return(mdoc_perr(mdoc, line, pos, EESCAPE)); - if ( ! mdoc_perr(mdoc, line, pos, EESCAPE)) + if ( ! mdoc_pwarn(mdoc, line, pos, EESCAPE)) return(0); } |