=================================================================== RCS file: /cvs/mandoc/mdoc_validate.c,v retrieving revision 1.137 retrieving revision 1.141 diff -u -p -r1.137 -r1.141 --- mandoc/mdoc_validate.c 2010/12/05 15:55:01 1.137 +++ mandoc/mdoc_validate.c 2010/12/16 00:25:35 1.141 @@ -1,4 +1,4 @@ -/* $Id: mdoc_validate.c,v 1.137 2010/12/05 15:55:01 kristaps Exp $ */ +/* $Id: mdoc_validate.c,v 1.141 2010/12/16 00:25:35 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * @@ -107,6 +107,7 @@ static int post_it(POST_ARGS); static int post_lb(POST_ARGS); static int post_nm(POST_ARGS); static int post_os(POST_ARGS); +static int post_ignpar(POST_ARGS); static int post_prol(POST_ARGS); static int post_root(POST_ARGS); static int post_rs(POST_ARGS); @@ -150,9 +151,9 @@ static v_post posts_nm[] = { post_nm, NULL }; static v_post posts_notext[] = { ewarn_eq0, NULL }; static v_post posts_os[] = { post_os, post_prol, NULL }; static v_post posts_rs[] = { berr_ge1, herr_eq0, post_rs, NULL }; -static v_post posts_sh[] = { herr_ge1, bwarn_ge1, post_sh, NULL }; +static v_post posts_sh[] = { post_ignpar, herr_ge1, bwarn_ge1, post_sh, NULL }; static v_post posts_sp[] = { eerr_le1, NULL }; -static v_post posts_ss[] = { herr_ge1, NULL }; +static v_post posts_ss[] = { post_ignpar, herr_ge1, bwarn_ge1, NULL }; static v_post posts_st[] = { eerr_eq1, post_st, NULL }; static v_post posts_std[] = { post_std, NULL }; static v_post posts_text[] = { eerr_ge1, NULL }; @@ -169,7 +170,7 @@ static v_pre pres_dd[] = { pre_dd, NULL }; static v_pre pres_dt[] = { pre_dt, NULL }; static v_pre pres_er[] = { NULL, NULL }; static v_pre pres_fd[] = { NULL, NULL }; -static v_pre pres_it[] = { pre_it, NULL }; +static v_pre pres_it[] = { pre_it, pre_par, NULL }; static v_pre pres_os[] = { pre_os, NULL }; static v_pre pres_pp[] = { pre_par, NULL }; static v_pre pres_sh[] = { pre_sh, NULL }; @@ -210,7 +211,7 @@ const struct valids mdoc_valids[MDOC_MAX] = { { NULL, posts_defaults }, /* Li */ { NULL, posts_nd }, /* Nd */ { NULL, posts_nm }, /* Nm */ - { NULL, posts_wline }, /* Op */ + { NULL, NULL }, /* Op */ { NULL, NULL }, /* Ot */ { NULL, posts_defaults }, /* Pa */ { pres_std, posts_std }, /* Rv */ @@ -231,18 +232,18 @@ const struct valids mdoc_valids[MDOC_MAX] = { { NULL, posts_text }, /* %V */ { NULL, NULL }, /* Ac */ { NULL, NULL }, /* Ao */ - { NULL, posts_wline }, /* Aq */ + { NULL, NULL }, /* Aq */ { NULL, posts_at }, /* At */ { NULL, NULL }, /* Bc */ { NULL, posts_bf }, /* Bf */ { NULL, NULL }, /* Bo */ - { NULL, posts_wline }, /* Bq */ + { NULL, NULL }, /* Bq */ { NULL, NULL }, /* Bsx */ { NULL, NULL }, /* Bx */ { NULL, posts_bool }, /* Db */ { NULL, NULL }, /* Dc */ { NULL, NULL }, /* Do */ - { NULL, posts_wline }, /* Dq */ + { NULL, NULL }, /* Dq */ { NULL, NULL }, /* Ec */ { NULL, NULL }, /* Ef */ { NULL, NULL }, /* Em */ @@ -256,16 +257,16 @@ const struct valids mdoc_valids[MDOC_MAX] = { { NULL, NULL }, /* Pc */ { NULL, posts_text1 }, /* Pf */ { NULL, NULL }, /* Po */ - { NULL, posts_wline }, /* Pq */ + { NULL, NULL }, /* Pq */ { NULL, NULL }, /* Qc */ - { NULL, posts_wline }, /* Ql */ + { NULL, NULL }, /* Ql */ { NULL, NULL }, /* Qo */ - { NULL, posts_wline }, /* Qq */ + { NULL, NULL }, /* Qq */ { NULL, NULL }, /* Re */ { NULL, posts_rs }, /* Rs */ { NULL, NULL }, /* Sc */ { NULL, NULL }, /* So */ - { NULL, posts_wline }, /* Sq */ + { NULL, NULL }, /* Sq */ { NULL, posts_bool }, /* Sm */ { NULL, posts_text }, /* Sx */ { NULL, posts_text }, /* Sy */ @@ -287,7 +288,7 @@ const struct valids mdoc_valids[MDOC_MAX] = { { NULL, posts_notext }, /* Lp */ { NULL, posts_text }, /* Lk */ { NULL, posts_defaults }, /* Mt */ - { NULL, posts_wline }, /* Brq */ + { NULL, NULL }, /* Brq */ { NULL, NULL }, /* Bro */ { NULL, NULL }, /* Brc */ { NULL, posts_text }, /* %C */ @@ -894,10 +895,6 @@ pre_it(PRE_ARGS) if (MDOC_BLOCK != n->type) return(1); - /* - * FIXME: this can probably be lifted if we make the It into - * something else on-the-fly? - */ return(check_parent(mdoc, n, MDOC_Bl, MDOC_BODY)); } @@ -1448,11 +1445,8 @@ post_bl_block_tag(POST_ARGS) assert(MDOC_BLOCK == nn->type); nn = nn->head->child; - if (nn == NULL) { - /* No -width for .Bl and first .It is emtpy */ - mdoc_nmsg(mdoc, n, MANDOCERR_NOWIDTHARG); + if (nn == NULL) break; - } if (MDOC_TEXT == nn->type) { sz = strlen(nn->string) + 1; @@ -1461,8 +1455,6 @@ post_bl_block_tag(POST_ARGS) if (0 != (ssz = mdoc_macro2len(nn->tok))) sz = ssz; - else - mdoc_nmsg(mdoc, n, MANDOCERR_NOWIDTHARG); break; } @@ -1572,21 +1564,20 @@ post_bl(POST_ARGS) return(post_bl_block(mdoc)); if (MDOC_BODY != mdoc->last->type) return(1); - if (NULL == mdoc->last->child) - return(1); - /* - * We only allow certain children of `Bl'. This is usually on - * `It', but apparently `Sm' occurs here and there, so we let - * that one through, too. - */ - - /* LINTED */ for (n = mdoc->last->child; n; n = n->next) { - if (MDOC_BLOCK == n->type && MDOC_It == n->tok) + switch (n->tok) { + case (MDOC_It): continue; - if (MDOC_Sm == n->tok) + case (MDOC_Sm): + /* FALLTHROUGH */ + case (MDOC_Pp): + mdoc_nmsg(mdoc, n, MANDOCERR_CHILD); continue; + default: + break; + } + mdoc_nmsg(mdoc, n, MANDOCERR_SYNTCHILD); return(0); } @@ -1888,11 +1879,36 @@ post_sh_head(POST_ARGS) } static int +post_ignpar(POST_ARGS) +{ + struct mdoc_node *np; + + if (MDOC_BODY != mdoc->last->type) + return(1); + + if (NULL != (np = mdoc->last->child)) + if (MDOC_Pp == np->tok || MDOC_Lp == np->tok) { + mdoc_nmsg(mdoc, np, MANDOCERR_IGNPAR); + mdoc_node_delete(mdoc, np); + } + + if (NULL != (np = mdoc->last->last)) + if (MDOC_Pp == np->tok || MDOC_Lp == np->tok) { + mdoc_nmsg(mdoc, np, MANDOCERR_IGNPAR); + mdoc_node_delete(mdoc, np); + } + + return(1); +} + +static int pre_par(PRE_ARGS) { if (NULL == mdoc->last) return(1); + if (MDOC_ELEM != n->type && MDOC_BLOCK != n->type) + return(1); /* * Don't allow prior `Lp' or `Pp' prior to a paragraph-type @@ -1901,10 +1917,11 @@ pre_par(PRE_ARGS) if (MDOC_Pp != mdoc->last->tok && MDOC_Lp != mdoc->last->tok) return(1); - if (MDOC_Bl == n->tok && n->data.Bl->comp) return(1); if (MDOC_Bd == n->tok && n->data.Bd->comp) + return(1); + if (MDOC_It == n->tok && n->parent->data.Bl->comp) return(1); mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_IGNPAR);