=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_validate.c,v retrieving revision 1.82 retrieving revision 1.83 diff -c -r1.82 -r1.83 *** src/usr.bin/mandoc/mdoc_validate.c 2010/12/29 00:47:31 1.82 --- src/usr.bin/mandoc/mdoc_validate.c 2011/01/03 23:39:27 1.83 *************** *** 1,4 **** ! /* $Id: mdoc_validate.c,v 1.82 2010/12/29 00:47:31 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * --- 1,4 ---- ! /* $Id: mdoc_validate.c,v 1.83 2011/01/03 23:39:27 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * *************** *** 53,59 **** enum check_lvl { CHECK_WARN, CHECK_ERROR, - CHECK_FATAL }; typedef int (*v_pre)(PRE_ARGS); --- 53,58 ---- *************** *** 78,93 **** static int ebool(POST_ARGS); static int berr_ge1(POST_ARGS); static int bwarn_ge1(POST_ARGS); - static int eerr_eq0(POST_ARGS); - static int eerr_eq1(POST_ARGS); static int eerr_ge1(POST_ARGS); - static int eerr_le1(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_eq0(POST_ARGS); static int hwarn_eq1(POST_ARGS); static int hwarn_le1(POST_ARGS); static int post_an(POST_ARGS); --- 77,90 ---- static int ebool(POST_ARGS); static int berr_ge1(POST_ARGS); static int bwarn_ge1(POST_ARGS); static int eerr_ge1(POST_ARGS); static int ewarn_eq0(POST_ARGS); + static int ewarn_eq1(POST_ARGS); static int ewarn_ge1(POST_ARGS); ! static int ewarn_le1(POST_ARGS); static int hwarn_eq0(POST_ARGS); static int hwarn_eq1(POST_ARGS); + static int hwarn_ge1(POST_ARGS); static int hwarn_le1(POST_ARGS); static int post_an(POST_ARGS); *************** *** 138,166 **** static v_post posts_bf[] = { hwarn_le1, post_bf, NULL }; static v_post posts_bk[] = { hwarn_eq0, bwarn_ge1, NULL }; static v_post posts_bl[] = { bwarn_ge1, post_bl, NULL }; ! static v_post posts_bool[] = { eerr_eq1, ebool, NULL }; static v_post posts_eoln[] = { post_eoln, NULL }; static v_post posts_defaults[] = { post_defaults, NULL }; static v_post posts_dd[] = { ewarn_ge1, post_dd, post_prol, NULL }; ! static v_post posts_dl[] = { post_literal, bwarn_ge1, herr_eq0, NULL }; static v_post posts_dt[] = { post_dt, post_prol, NULL }; static v_post posts_fo[] = { hwarn_eq1, bwarn_ge1, 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[] = { 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[] = { post_ignpar, herr_ge1, bwarn_ge1, post_sh, NULL }; ! static v_post posts_sp[] = { eerr_le1, 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 }; ! static v_post posts_text1[] = { eerr_eq1, NULL }; static v_post posts_vt[] = { post_vt, NULL }; ! static v_post posts_wline[] = { bwarn_ge1, herr_eq0, NULL }; static v_post posts_wtext[] = { ewarn_ge1, NULL }; static v_pre pres_an[] = { pre_an, NULL }; static v_pre pres_bd[] = { pre_display, pre_bd, pre_literal, pre_par, NULL }; --- 135,163 ---- static v_post posts_bf[] = { hwarn_le1, post_bf, NULL }; static v_post posts_bk[] = { hwarn_eq0, bwarn_ge1, NULL }; static v_post posts_bl[] = { bwarn_ge1, post_bl, NULL }; ! static v_post posts_bool[] = { ebool, NULL }; static v_post posts_eoln[] = { post_eoln, NULL }; static v_post posts_defaults[] = { post_defaults, NULL }; static v_post posts_dd[] = { ewarn_ge1, post_dd, post_prol, NULL }; ! static v_post posts_dl[] = { post_literal, bwarn_ge1, NULL }; static v_post posts_dt[] = { post_dt, post_prol, NULL }; static v_post posts_fo[] = { hwarn_eq1, bwarn_ge1, NULL }; static v_post posts_it[] = { post_it, NULL }; ! static v_post posts_lb[] = { post_lb, NULL }; static v_post posts_nd[] = { berr_ge1, NULL }; 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[] = { post_rs, NULL }; ! static v_post posts_sh[] = { post_ignpar, hwarn_ge1, bwarn_ge1, post_sh, NULL }; ! static v_post posts_sp[] = { ewarn_le1, NULL }; ! static v_post posts_ss[] = { post_ignpar, hwarn_ge1, bwarn_ge1, NULL }; ! static v_post posts_st[] = { post_st, NULL }; static v_post posts_std[] = { post_std, NULL }; static v_post posts_text[] = { eerr_ge1, NULL }; ! static v_post posts_text1[] = { ewarn_eq1, NULL }; static v_post posts_vt[] = { post_vt, NULL }; ! static v_post posts_wline[] = { bwarn_ge1, NULL }; static v_post posts_wtext[] = { ewarn_ge1, NULL }; static v_pre pres_an[] = { pre_an, NULL }; static v_pre pres_bd[] = { pre_display, pre_bd, pre_literal, pre_par, NULL }; *************** *** 380,385 **** --- 377,383 ---- enum check_lvl lvl, enum check_ineq ineq, int val) { const char *p; + enum mandocerr t; if (m->last->type != type) return(1); *************** *** 391,397 **** return(1); break; case (CHECK_GT): ! p = "greater than "; if (m->last->nchild > val) return(1); break; --- 389,395 ---- return(1); break; case (CHECK_GT): ! p = "more than "; if (m->last->nchild > val) return(1); break; *************** *** 405,422 **** /* NOTREACHED */ } ! if (CHECK_WARN == lvl) { ! return(mdoc_vmsg(m, MANDOCERR_ARGCOUNT, ! m->last->line, m->last->pos, ! "want %s%d children (have %d)", ! p, val, m->last->nchild)); ! } ! /* FIXME: THIS IS THE SAME AS THE ABOVE. */ ! ! return(mdoc_vmsg(m, MANDOCERR_ARGCOUNT, ! m->last->line, m->last->pos, ! "require %s%d children (have %d)", p, val, m->last->nchild)); } --- 403,412 ---- /* NOTREACHED */ } ! t = lvl == CHECK_WARN ? MANDOCERR_ARGCWARN : MANDOCERR_ARGCOUNT; ! return(mdoc_vmsg(m, t, m->last->line, m->last->pos, ! "want %s%d children (have %d)", p, val, m->last->nchild)); } *************** *** 424,430 **** berr_ge1(POST_ARGS) { ! return(check_count(mdoc, MDOC_BODY, CHECK_FATAL, CHECK_GT, 0)); } static int --- 414,420 ---- berr_ge1(POST_ARGS) { ! return(check_count(mdoc, MDOC_BODY, CHECK_ERROR, CHECK_GT, 0)); } static int *************** *** 434,466 **** } static int - eerr_eq0(POST_ARGS) - { - return(check_count(mdoc, MDOC_ELEM, CHECK_FATAL, CHECK_EQ, 0)); - } - - static int - eerr_eq1(POST_ARGS) - { - return(check_count(mdoc, MDOC_ELEM, CHECK_FATAL, CHECK_EQ, 1)); - } - - static int eerr_ge1(POST_ARGS) { ! return(check_count(mdoc, MDOC_ELEM, CHECK_FATAL, CHECK_GT, 0)); } static int ! eerr_le1(POST_ARGS) { ! return(check_count(mdoc, MDOC_ELEM, CHECK_FATAL, CHECK_LT, 2)); } static int ! ewarn_eq0(POST_ARGS) { ! return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 0)); } static int --- 424,444 ---- } static int eerr_ge1(POST_ARGS) { ! return(check_count(mdoc, MDOC_ELEM, CHECK_ERROR, CHECK_GT, 0)); } static int ! ewarn_eq0(POST_ARGS) { ! return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 0)); } static int ! ewarn_eq1(POST_ARGS) { ! return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1)); } static int *************** *** 470,487 **** } static int ! herr_eq0(POST_ARGS) { ! return(check_count(mdoc, MDOC_HEAD, CHECK_FATAL, CHECK_EQ, 0)); } static int - herr_ge1(POST_ARGS) - { - return(check_count(mdoc, MDOC_HEAD, CHECK_FATAL, CHECK_GT, 0)); - } - - static int hwarn_eq0(POST_ARGS) { return(check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_EQ, 0)); --- 448,459 ---- } static int ! ewarn_le1(POST_ARGS) { ! return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_LT, 2)); } static int hwarn_eq0(POST_ARGS) { return(check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_EQ, 0)); *************** *** 494,499 **** --- 466,477 ---- } static int + hwarn_ge1(POST_ARGS) + { + return(check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_GT, 0)); + } + + static int hwarn_le1(POST_ARGS) { return(check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_LT, 2)); *************** *** 1046,1051 **** --- 1024,1031 ---- char *buf; size_t sz; + check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1); + assert(mdoc->last->child); assert(MDOC_TEXT == mdoc->last->child->type); *************** *** 1238,1245 **** struct mdoc_node *np; np = mdoc->last; ! if (AUTH__NONE != np->norm->An.auth && np->child) ! return(eerr_eq0(mdoc)); /* * FIXME: make this ewarn and make sure that the front-ends --- 1218,1227 ---- struct mdoc_node *np; np = mdoc->last; ! if (AUTH__NONE != np->norm->An.auth && np->child) { ! check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 0); ! return(1); ! } /* * FIXME: make this ewarn and make sure that the front-ends *************** *** 1581,1588 **** ebool(struct mdoc *mdoc) { ! if (NULL == mdoc->last->child) return(1); assert(MDOC_TEXT == mdoc->last->child->type); --- 1563,1574 ---- ebool(struct mdoc *mdoc) { ! if (NULL == mdoc->last->child) { ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_MACROEMPTY); ! mdoc_node_delete(mdoc, mdoc->last); return(1); + } + check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1); assert(MDOC_TEXT == mdoc->last->child->type); *************** *** 1631,1648 **** static int post_st(POST_ARGS) { ! const char *p; ! assert(MDOC_TEXT == mdoc->last->child->type); ! p = mdoc_a2st(mdoc->last->child->string); ! if (p == NULL) { mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADSTANDARD); mdoc_node_delete(mdoc, mdoc->last); } else { ! free(mdoc->last->child->string); ! mdoc->last->child->string = mandoc_strdup(p); } return(1); --- 1617,1639 ---- static int post_st(POST_ARGS) { ! struct mdoc_node *ch; ! const char *p; ! if (NULL == (ch = mdoc->last->child)) { ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_MACROEMPTY); ! mdoc_node_delete(mdoc, mdoc->last); ! return(1); ! } ! assert(MDOC_TEXT == ch->type); ! if (NULL == (p = mdoc_a2st(ch->string))) { mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADSTANDARD); mdoc_node_delete(mdoc, mdoc->last); } else { ! free(ch->string); ! ch->string = mandoc_strdup(p); } return(1); *************** *** 1654,1661 **** struct mdoc_node *nn, *next, *prev; int i, j; ! if (MDOC_BODY != mdoc->last->type) return(1); /* * Make sure only certain types of nodes are allowed within the --- 1645,1662 ---- struct mdoc_node *nn, *next, *prev; int i, j; ! switch (mdoc->last->type) { ! case (MDOC_HEAD): ! check_count(mdoc, MDOC_HEAD, CHECK_WARN, CHECK_EQ, 0); return(1); + case (MDOC_BODY): + if (mdoc->last->child) + break; + check_count(mdoc, MDOC_BODY, CHECK_WARN, CHECK_GT, 0); + return(1); + default: + return(1); + } /* * Make sure only certain types of nodes are allowed within the