=================================================================== RCS file: /cvs/mandoc/Attic/validate.c,v retrieving revision 1.37 retrieving revision 1.39 diff -u -p -r1.37 -r1.39 --- mandoc/Attic/validate.c 2009/01/17 16:47:02 1.37 +++ mandoc/Attic/validate.c 2009/01/19 17:02:59 1.39 @@ -1,4 +1,4 @@ -/* $Id: validate.c,v 1.37 2009/01/17 16:47:02 kristaps Exp $ */ +/* $Id: validate.c,v 1.39 2009/01/19 17:02:59 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -29,6 +29,7 @@ typedef int (*v_post)(struct mdoc *); /* FIXME: math symbols. */ /* FIXME: make sure prologue is complete. */ /* FIXME: valid character-escape checks. */ +/* FIXME: make sure required sections are included (NAME, ...). */ struct valids { v_pre *pre; @@ -45,7 +46,9 @@ static int pre_check_stdarg(struct mdoc *, struct mdoc static int post_check_children_count(struct mdoc *); static int post_check_children_lt(struct mdoc *, int); static int post_check_children_gt(struct mdoc *, int); +static int post_check_children_wgt(struct mdoc *, int); static int post_check_children_eq(struct mdoc *, int); +static int post_check_children_weq(struct mdoc *, int); /* Specific pre-child-parse routines. */ @@ -76,6 +79,7 @@ static int eerr_le2(struct mdoc *); static int eerr_eq1(struct mdoc *); static int eerr_ge1(struct mdoc *); static int ewarn_eq0(struct mdoc *); +static int ewarn_eq1(struct mdoc *); static int bwarn_ge1(struct mdoc *); static int berr_eq0(struct mdoc *); static int ewarn_ge1(struct mdoc *); @@ -117,6 +121,7 @@ static v_post posts_wline[] = { hwarn_ge1, berr_eq0, N static v_post posts_sh[] = { herr_ge1, bwarn_ge1, post_sh, NULL }; static v_post posts_bl[] = { herr_eq0, bwarn_ge1, post_bl, NULL }; static v_post posts_it[] = { post_it, NULL }; +static v_post posts_in[] = { ewarn_eq1, NULL }; static v_post posts_ss[] = { herr_ge1, NULL }; static v_post posts_pp[] = { ewarn_eq0, NULL }; static v_post posts_d1[] = { herr_ge1, NULL }; @@ -155,12 +160,12 @@ const struct valids mdoc_valids[MDOC_MAX] = { { pres_ex, posts_ex }, /* Ex */ { NULL, posts_text }, /* Fa */ /* FIXME: only in SYNOPSIS section. */ - { NULL, NULL }, /* Fd */ + { NULL, posts_wtext }, /* Fd */ { NULL, NULL }, /* Fl */ { NULL, posts_text }, /* Fn */ - { NULL, NULL }, /* Ft */ + { NULL, posts_wtext }, /* Ft */ { NULL, posts_text }, /* Ic */ - { NULL, posts_wtext }, /* In */ + { NULL, posts_in }, /* In */ { NULL, posts_text }, /* Li */ { NULL, posts_wtext }, /* Nd */ { NULL, posts_nm }, /* Nm */ @@ -188,7 +193,7 @@ const struct valids mdoc_valids[MDOC_MAX] = { { NULL, posts_wline }, /* Aq */ { NULL, posts_at }, /* At */ { NULL, NULL }, /* Bc */ - { NULL, NULL }, /* Bf */ + { NULL, NULL }, /* Bf */ /* FIXME */ { NULL, NULL }, /* Bo */ { NULL, posts_wline }, /* Bq */ { NULL, NULL }, /* Bsx */ @@ -253,6 +258,18 @@ post_check_children_count(struct mdoc *mdoc) static int +post_check_children_wgt(struct mdoc *mdoc, int sz) +{ + int i; + + if ((i = post_check_children_count(mdoc)) > sz) + return(1); + return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests more " + "than %d parameters (has %d)", sz, i)); +} + + +static int post_check_children_gt(struct mdoc *mdoc, int sz) { int i; @@ -260,11 +277,23 @@ post_check_children_gt(struct mdoc *mdoc, int sz) if ((i = post_check_children_count(mdoc)) > sz) return(1); return(mdoc_err(mdoc, "macro requires more than %d " - "parameters (have %d)", sz, i)); + "parameters (has %d)", sz, i)); } static int +post_check_children_weq(struct mdoc *mdoc, int sz) +{ + int i; + + if ((i = post_check_children_count(mdoc)) == sz) + return(1); + return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests %d " + "parameters (has %d)", sz, i)); +} + + +static int post_check_children_eq(struct mdoc *mdoc, int sz) { int i; @@ -338,9 +367,7 @@ berr_eq0(struct mdoc *mdoc) if (MDOC_BODY != mdoc->last->type) return(1); - if (NULL == mdoc->last->child) - return(1); - return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests no body children")); + return(post_check_children_eq(mdoc, 0)); } @@ -350,21 +377,25 @@ bwarn_ge1(struct mdoc *mdoc) if (MDOC_BODY != mdoc->last->type) return(1); - if (mdoc->last->child) - return(1); - return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests one or more body children")); + return(post_check_children_wgt(mdoc, 0)); } static int +ewarn_eq1(struct mdoc *mdoc) +{ + + assert(MDOC_ELEM == mdoc->last->type); + return(post_check_children_weq(mdoc, 1)); +} + + +static int ewarn_eq0(struct mdoc *mdoc) { assert(MDOC_ELEM == mdoc->last->type); - if (NULL == mdoc->last->child) - return(1); - return(mdoc_pwarn(mdoc, mdoc->last->child->line, - mdoc->last->child->pos, WARN_SYNTAX, "macro suggests no parameters")); + return(post_check_children_weq(mdoc, 0)); } @@ -373,9 +404,7 @@ ewarn_ge1(struct mdoc *mdoc) { assert(MDOC_ELEM == mdoc->last->type); - if (mdoc->last->child) - return(1); - return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests one or more parameters")); + return(post_check_children_wgt(mdoc, 0)); } @@ -440,9 +469,7 @@ hwarn_ge1(struct mdoc *mdoc) if (MDOC_HEAD != mdoc->last->type) return(1); - if (mdoc->last->child) - return(1); - return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests one or more parameters")); + return(post_check_children_wgt(mdoc, 0)); } @@ -465,6 +492,7 @@ pre_display(struct mdoc *mdoc, struct mdoc_node *node) return(1); assert(mdoc->last); + /* LINTED */ for (n = mdoc->last->parent; n; n = n->parent) if (MDOC_BLOCK == n->type) if (MDOC_Bd == n->tok) @@ -489,6 +517,7 @@ pre_bl(struct mdoc *mdoc, struct mdoc_node *node) argv = NULL; argc = node->data.block.argc; + /* LINTED */ for (i = type = err = 0; i < argc; i++) { argv = &node->data.block.argv[(int)i]; assert(argv); @@ -546,6 +575,7 @@ pre_bd(struct mdoc *mdoc, struct mdoc_node *node) argv = NULL; argc = node->data.block.argc; + /* LINTED */ for (err = i = type = 0; 0 == err && i < argc; i++) { argv = &node->data.block.argv[(int)i]; assert(argv); @@ -858,9 +888,11 @@ post_it(struct mdoc *mdoc) argc = n->data.block.argc; type = TYPE_NONE; + sv = -1; /* Some types require block-head, some not. */ + /* LINTED */ for (i = 0; TYPE_NONE == type && i < argc; i++) switch (n->data.block.argv[(int)i].arg) { case (MDOC_Tag): @@ -926,20 +958,21 @@ post_it(struct mdoc *mdoc) if ( ! mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests body children")) return(0); + assert(-1 != sv); if (MDOC_Column != sv) return(1); /* Make sure the number of columns is sane. */ - sv = mdoc->last->parent->parent->data.block.argv->sz; + argc = mdoc->last->parent->parent->data.block.argv->sz; n = mdoc->last->data.block.head->child; for (i = 0; n; n = n->next) i++; - if (i == (size_t)sv) + if (i == argc) return(1); - return(mdoc_err(mdoc, "expected %d list columns, have %d", sv, (int)i)); + return(mdoc_err(mdoc, "expected %zu list columns, have %zu", argc, i)); #undef TYPE_NONE #undef TYPE_BODY #undef TYPE_HEAD @@ -955,6 +988,7 @@ post_bl(struct mdoc *mdoc) return(1); assert(MDOC_Bl == mdoc->last->tok); + /* LINTED */ for (n = mdoc->last->child; n; n = n->next) { if (MDOC_BLOCK == n->type) if (MDOC_It == n->tok) @@ -973,6 +1007,7 @@ ebool(struct mdoc *mdoc) struct mdoc_node *n; assert(MDOC_ELEM == mdoc->last->type); + /* LINTED */ for (n = mdoc->last->child; n; n = n->next) { if (MDOC_TEXT != n->type) break; @@ -995,11 +1030,11 @@ post_root(struct mdoc *mdoc) if (NULL == mdoc->last->child) return(mdoc_err(mdoc, "document has no data")); if (NULL == mdoc->meta.title) - return(mdoc_err(mdoc, "document has no incomplete prologue")); + return(mdoc_err(mdoc, "document has incomplete prologue")); if (NULL == mdoc->meta.os) - return(mdoc_err(mdoc, "document has no incomplete prologue")); + return(mdoc_err(mdoc, "document has incomplete prologue")); if (0 == mdoc->meta.date) - return(mdoc_err(mdoc, "document has no incomplete prologue")); + return(mdoc_err(mdoc, "document has incomplete prologue")); return(1); } @@ -1050,6 +1085,10 @@ int mdoc_valid_post(struct mdoc *mdoc) { v_post *p; + + if (MDOC_VALID & mdoc->last->flags) + return(1); + mdoc->last->flags |= MDOC_VALID; if (MDOC_TEXT == mdoc->last->type) return(1);