=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_validate.c,v retrieving revision 1.30 retrieving revision 1.31 diff -c -r1.30 -r1.31 *** src/usr.bin/mandoc/mdoc_validate.c 2009/07/19 12:26:57 1.30 --- src/usr.bin/mandoc/mdoc_validate.c 2009/07/26 01:59:46 1.31 *************** *** 1,4 **** ! /* $Id: mdoc_validate.c,v 1.30 2009/07/19 12:26:57 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * --- 1,4 ---- ! /* $Id: mdoc_validate.c,v 1.31 2009/07/26 01:59:46 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * *************** *** 18,23 **** --- 18,25 ---- #include #include + #include + #include #include #include #include *************** *** 68,74 **** 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); --- 70,75 ---- *************** *** 88,93 **** --- 89,95 ---- static int post_sh(POST_ARGS); static int post_sh_body(POST_ARGS); static int post_sh_head(POST_ARGS); + static int post_sp(POST_ARGS); static int post_st(POST_ARGS); static int pre_an(PRE_ARGS); static int pre_bd(PRE_ARGS); *************** *** 121,129 **** 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 }; --- 123,131 ---- 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_rv[] = { eerr_eq0, post_args, NULL }; static v_post posts_sh[] = { herr_ge1, bwarn_ge1, post_sh, NULL }; + static v_post posts_sp[] = { post_sp, 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 }; *************** *** 154,160 **** { pres_os, NULL }, /* Os */ { pres_sh, posts_sh }, /* Sh */ { pres_ss, posts_ss }, /* Ss */ ! { NULL, posts_pp }, /* Pp */ { pres_d1, posts_wline }, /* D1 */ { pres_d1, posts_wline }, /* Dl */ { pres_bd, posts_bd }, /* Bd */ --- 156,162 ---- { pres_os, NULL }, /* Os */ { pres_sh, posts_sh }, /* Sh */ { pres_ss, posts_ss }, /* Ss */ ! { NULL, posts_notext }, /* Pp */ { pres_d1, posts_wline }, /* D1 */ { pres_d1, posts_wline }, /* Dl */ { pres_bd, posts_bd }, /* Bd */ *************** *** 255,261 **** { NULL, NULL }, /* Fr */ { NULL, posts_notext }, /* Ud */ { pres_lb, posts_lb }, /* Lb */ ! { NULL, posts_pp }, /* Lp */ { NULL, NULL }, /* Lk */ { NULL, posts_text }, /* Mt */ { NULL, posts_wline }, /* Brq */ --- 257,263 ---- { NULL, NULL }, /* Fr */ { NULL, posts_notext }, /* Ud */ { pres_lb, posts_lb }, /* Lb */ ! { NULL, posts_notext }, /* Lp */ { NULL, NULL }, /* Lk */ { NULL, posts_text }, /* Mt */ { NULL, posts_wline }, /* Brq */ *************** *** 266,271 **** --- 268,275 ---- { NULL, NULL }, /* En */ { NULL, NULL }, /* Dx */ { NULL, posts_text }, /* %Q */ + { NULL, posts_notext }, /* br */ + { NULL, posts_sp }, /* sp */ }; *************** *** 398,404 **** CHECK_CHILD_DEFN(warn, lt, <) /* warn_child_lt() */ CHECK_BODY_DEFN(ge1, warn, warn_child_gt, 0) /* bwarn_ge1() */ CHECK_BODY_DEFN(ge1, err, err_child_gt, 0) /* berr_ge1() */ - CHECK_ELEM_DEFN(eq0, warn, warn_child_eq, 0) /* ewarn_eq0() */ CHECK_ELEM_DEFN(ge1, warn, warn_child_gt, 0) /* ewarn_gt1() */ CHECK_ELEM_DEFN(eq1, err, err_child_eq, 1) /* eerr_eq1() */ CHECK_ELEM_DEFN(le2, err, err_child_lt, 3) /* eerr_le2() */ --- 402,407 ---- *************** *** 1121,1126 **** --- 1124,1160 ---- return(1); } + + + static int + post_sp(POST_ARGS) + { + long lval; + char *ep, *buf; + + if (NULL == mdoc->last->child) + return(1); + else if ( ! eerr_eq1(mdoc)) + return(0); + + assert(MDOC_TEXT == mdoc->last->child->type); + buf = mdoc->last->child->string; + assert(buf); + + /* From OpenBSD's strtol(3). */ + errno = 0; + lval = strtol(buf, &ep, 10); + if (buf[0] == '\0' || *ep != '\0') + return(mdoc_nerr(mdoc, mdoc->last->child, ENUMFMT)); + + if ((errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) || + (lval > INT_MAX || lval < 0)) + return(mdoc_nerr(mdoc, mdoc->last->child, ENUMFMT)); + + return(1); + } + + static int