]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_validate.c
Clean up the warnings related to document structure.
[mandoc.git] / mdoc_validate.c
index 85ae65df37036c3c59a891fcaa5d0843560c5c7e..32f141de8c943a8b05aaf74cb030853d34a4b0fb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.210 2014/04/20 16:46:05 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.217 2014/07/01 22:37:15 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -45,8 +45,6 @@
 #define        PRE_ARGS  struct mdoc *mdoc, struct mdoc_node *n
 #define        POST_ARGS struct mdoc *mdoc
 
 #define        PRE_ARGS  struct mdoc *mdoc, struct mdoc_node *n
 #define        POST_ARGS struct mdoc *mdoc
 
-#define        NUMSIZ    32
-
 enum   check_ineq {
        CHECK_LT,
        CHECK_GT,
 enum   check_ineq {
        CHECK_LT,
        CHECK_GT,
@@ -937,10 +935,12 @@ pre_dt(PRE_ARGS)
 {
 
        if (NULL == mdoc->meta.date || mdoc->meta.os)
 {
 
        if (NULL == mdoc->meta.date || mdoc->meta.os)
-               mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO);
+               mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse,
+                   n->line, n->pos, "Dt");
 
        if (mdoc->meta.title)
 
        if (mdoc->meta.title)
-               mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGREP);
+               mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse,
+                   n->line, n->pos, "Dt");
 
        return(1);
 }
 
        return(1);
 }
@@ -950,10 +950,12 @@ pre_os(PRE_ARGS)
 {
 
        if (NULL == mdoc->meta.title || NULL == mdoc->meta.date)
 {
 
        if (NULL == mdoc->meta.title || NULL == mdoc->meta.date)
-               mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO);
+               mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse,
+                   n->line, n->pos, "Os");
 
        if (mdoc->meta.os)
 
        if (mdoc->meta.os)
-               mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGREP);
+               mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse,
+                   n->line, n->pos, "Os");
 
        return(1);
 }
 
        return(1);
 }
@@ -963,10 +965,12 @@ pre_dd(PRE_ARGS)
 {
 
        if (mdoc->meta.title || mdoc->meta.os)
 {
 
        if (mdoc->meta.title || mdoc->meta.os)
-               mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO);
+               mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse,
+                   n->line, n->pos, "Dd");
 
        if (mdoc->meta.date)
 
        if (mdoc->meta.date)
-               mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGREP);
+               mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse,
+                   n->line, n->pos, "Dd");
 
        return(1);
 }
 
        return(1);
 }
@@ -1046,34 +1050,25 @@ post_bf(POST_ARGS)
 static int
 post_lb(POST_ARGS)
 {
 static int
 post_lb(POST_ARGS)
 {
-       const char      *p;
-       char            *buf;
-       size_t           sz;
+       struct mdoc_node        *n;
+       const char              *stdlibname;
+       char                    *libname;
 
        check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1);
 
 
        check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1);
 
-       assert(mdoc->last->child);
-       assert(MDOC_TEXT == mdoc->last->child->type);
-
-       p = mdoc_a2lib(mdoc->last->child->string);
-
-       /* If lookup ok, replace with table value. */
+       n = mdoc->last->child;
 
 
-       if (p) {
-               free(mdoc->last->child->string);
-               mdoc->last->child->string = mandoc_strdup(p);
-               return(1);
-       }
+       assert(n);
+       assert(MDOC_TEXT == n->type);
 
 
-       /* If not, use "library ``xxxx''. */
+       if (NULL == (stdlibname = mdoc_a2lib(n->string)))
+               mandoc_asprintf(&libname,
+                   "library \\(lq%s\\(rq", n->string);
+       else
+               libname = mandoc_strdup(stdlibname);
 
 
-       sz = strlen(mdoc->last->child->string) + 2 +
-            strlen("\\(lqlibrary\\(rq");
-       buf = mandoc_malloc(sz);
-       snprintf(buf, sz, "library \\(lq%s\\(rq",
-           mdoc->last->child->string);
-       free(mdoc->last->child->string);
-       mdoc->last->child->string = buf;
+       free(n->string);
+       n->string = libname;
        return(1);
 }
 
        return(1);
 }
 
@@ -1194,9 +1189,9 @@ post_defaults(POST_ARGS)
 static int
 post_at(POST_ARGS)
 {
 static int
 post_at(POST_ARGS)
 {
-       const char       *p, *q;
-       char             *buf;
-       size_t            sz;
+       struct mdoc_node        *n;
+       const char              *std_att;
+       char                    *att;
 
        /*
         * If we have a child, look it up in the standard keys.  If a
 
        /*
         * If we have a child, look it up in the standard keys.  If a
@@ -1204,27 +1199,18 @@ post_at(POST_ARGS)
         * prefix "AT&T UNIX " to the existing data.
         */
 
         * prefix "AT&T UNIX " to the existing data.
         */
 
-       if (NULL == mdoc->last->child)
+       if (NULL == (n = mdoc->last->child))
                return(1);
 
                return(1);
 
-       assert(MDOC_TEXT == mdoc->last->child->type);
-       p = mdoc_a2att(mdoc->last->child->string);
-
-       if (p) {
-               free(mdoc->last->child->string);
-               mdoc->last->child->string = mandoc_strdup(p);
-       } else {
+       assert(MDOC_TEXT == n->type);
+       if (NULL == (std_att = mdoc_a2att(n->string))) {
                mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADATT);
                mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADATT);
-               p = "AT&T UNIX ";
-               q = mdoc->last->child->string;
-               sz = strlen(p) + strlen(q) + 1;
-               buf = mandoc_malloc(sz);
-               strlcpy(buf, p, sz);
-               strlcat(buf, q, sz);
-               free(mdoc->last->child->string);
-               mdoc->last->child->string = buf;
-       }
+               mandoc_asprintf(&att, "AT&T UNIX %s", n->string);
+       } else
+               att = mandoc_strdup(std_att);
 
 
+       free(n->string);
+       n->string = att;
        return(1);
 }
 
        return(1);
 }
 
@@ -1388,7 +1374,7 @@ post_bl_block_width(POST_ARGS)
        int               i;
        enum mdoct        tok;
        struct mdoc_node *n;
        int               i;
        enum mdoct        tok;
        struct mdoc_node *n;
-       char              buf[NUMSIZ];
+       char              buf[24];
 
        n = mdoc->last;
 
 
        n = mdoc->last;
 
@@ -1420,7 +1406,7 @@ post_bl_block_width(POST_ARGS)
 
        assert(i < (int)n->args->argc);
 
 
        assert(i < (int)n->args->argc);
 
-       snprintf(buf, NUMSIZ, "%un", (unsigned int)width);
+       (void)snprintf(buf, sizeof(buf), "%un", (unsigned int)width);
        free(n->args->argv[i].value[0]);
        n->args->argv[i].value[0] = mandoc_strdup(buf);
 
        free(n->args->argv[i].value[0]);
        n->args->argv[i].value[0] = mandoc_strdup(buf);
 
@@ -1435,7 +1421,7 @@ post_bl_block_tag(POST_ARGS)
        struct mdoc_node *n, *nn;
        size_t            sz, ssz;
        int               i;
        struct mdoc_node *n, *nn;
        size_t            sz, ssz;
        int               i;
-       char              buf[NUMSIZ];
+       char              buf[24];
 
        /*
         * Calculate the -width for a `Bl -tag' list if it hasn't been
 
        /*
         * Calculate the -width for a `Bl -tag' list if it hasn't been
@@ -1470,7 +1456,7 @@ post_bl_block_tag(POST_ARGS)
 
        /* Defaults to ten ens. */
 
 
        /* Defaults to ten ens. */
 
-       snprintf(buf, NUMSIZ, "%un", (unsigned int)sz);
+       (void)snprintf(buf, sizeof(buf), "%un", (unsigned int)sz);
 
        /*
         * We have to dynamically add this to the macro's argument list.
 
        /*
         * We have to dynamically add this to the macro's argument list.
@@ -1480,8 +1466,8 @@ post_bl_block_tag(POST_ARGS)
        assert(n->args);
        i = (int)(n->args->argc)++;
 
        assert(n->args);
        i = (int)(n->args->argc)++;
 
-       n->args->argv = mandoc_realloc(n->args->argv,
-           n->args->argc * sizeof(struct mdoc_argv));
+       n->args->argv = mandoc_reallocarray(n->args->argv,
+           n->args->argc, sizeof(struct mdoc_argv));
 
        n->args->argv[i].arg = MDOC_Width;
        n->args->argv[i].line = n->line;
 
        n->args->argv[i].arg = MDOC_Width;
        n->args->argv[i].line = n->line;
@@ -1541,8 +1527,8 @@ post_bl_head(POST_ARGS)
         */
 
        np->args->argv[j].sz = (size_t)mdoc->last->nchild;
         */
 
        np->args->argv[j].sz = (size_t)mdoc->last->nchild;
-       np->args->argv[j].value = mandoc_malloc(
-           (size_t)mdoc->last->nchild * sizeof(char *));
+       np->args->argv[j].value = mandoc_reallocarray(NULL,
+           (size_t)mdoc->last->nchild, sizeof(char *));
 
        mdoc->last->norm->Bl.ncols = np->args->argv[j].sz;
        mdoc->last->norm->Bl.cols = (void *)np->args->argv[j].value;
 
        mdoc->last->norm->Bl.ncols = np->args->argv[j].sz;
        mdoc->last->norm->Bl.cols = (void *)np->args->argv[j].value;
@@ -1665,15 +1651,15 @@ ebool(struct mdoc *mdoc)
 static int
 post_root(POST_ARGS)
 {
 static int
 post_root(POST_ARGS)
 {
-       int               erc;
+       int               ret;
        struct mdoc_node *n;
 
        struct mdoc_node *n;
 
-       erc = 0;
+       ret = 1;
 
        /* Check that we have a finished prologue. */
 
        if ( ! (MDOC_PBODY & mdoc->flags)) {
 
        /* Check that we have a finished prologue. */
 
        if ( ! (MDOC_PBODY & mdoc->flags)) {
-               erc++;
+               ret = 0;
                mdoc_nmsg(mdoc, mdoc->first, MANDOCERR_NODOCPROLOG);
        }
 
                mdoc_nmsg(mdoc, mdoc->first, MANDOCERR_NODOCPROLOG);
        }
 
@@ -1682,17 +1668,14 @@ post_root(POST_ARGS)
 
        /* Check that we begin with a proper `Sh'. */
 
 
        /* Check that we begin with a proper `Sh'. */
 
-       if (NULL == n->child) {
-               erc++;
-               mdoc_nmsg(mdoc, n, MANDOCERR_NODOCBODY);
-       } else if (MDOC_BLOCK != n->child->type ||
-           MDOC_Sh != n->child->tok) {
-               erc++;
-               /* Can this be lifted?  See rxdebug.1 for example. */
-               mdoc_nmsg(mdoc, n, MANDOCERR_NODOCBODY);
-       }
+       if (NULL == n->child)
+               mdoc_nmsg(mdoc, n, MANDOCERR_DOC_EMPTY);
+       else if (MDOC_Sh != n->child->tok)
+               mandoc_msg(MANDOCERR_SEC_BEFORE, mdoc->parse,
+                   n->child->line, n->child->pos,
+                   mdoc_macronames[n->child->tok]);
 
 
-       return(erc ? 0 : 1);
+       return(ret);
 }
 
 static int
 }
 
 static int
@@ -1913,7 +1896,8 @@ post_sh_body(POST_ARGS)
         */
 
        if (NULL == (n = mdoc->last->child)) {
         */
 
        if (NULL == (n = mdoc->last->child)) {
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADNAMESEC);
+               mandoc_msg(MANDOCERR_NAMESEC_BAD, mdoc->parse,
+                   mdoc->last->line, mdoc->last->pos, "empty");
                return(1);
        }
 
                return(1);
        }
 
@@ -1922,14 +1906,16 @@ post_sh_body(POST_ARGS)
                        continue;
                if (MDOC_TEXT == n->type)
                        continue;
                        continue;
                if (MDOC_TEXT == n->type)
                        continue;
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADNAMESEC);
+               mandoc_msg(MANDOCERR_NAMESEC_BAD, mdoc->parse,
+                   n->line, n->pos, mdoc_macronames[n->tok]);
        }
 
        assert(n);
        if (MDOC_BLOCK == n->type && MDOC_Nd == n->tok)
                return(1);
 
        }
 
        assert(n);
        if (MDOC_BLOCK == n->type && MDOC_Nd == n->tok)
                return(1);
 
-       mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADNAMESEC);
+       mandoc_msg(MANDOCERR_NAMESEC_BAD, mdoc->parse,
+           n->line, n->pos, mdoc_macronames[n->tok]);
        return(1);
 }
 
        return(1);
 }
 
@@ -1937,6 +1923,7 @@ static int
 post_sh_head(POST_ARGS)
 {
        struct mdoc_node *n;
 post_sh_head(POST_ARGS)
 {
        struct mdoc_node *n;
+       const char      *goodsec;
        char            *secname;
        enum mdoc_sec    sec;
 
        char            *secname;
        enum mdoc_sec    sec;
 
@@ -1955,7 +1942,8 @@ post_sh_head(POST_ARGS)
        /* The NAME should be first. */
 
        if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed)
        /* The NAME should be first. */
 
        if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed)
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NAMESECFIRST);
+               mandoc_msg(MANDOCERR_NAMESEC_FIRST, mdoc->parse,
+                   mdoc->last->line, mdoc->last->pos, secname);
 
        /* The SYNOPSIS gets special attention in other areas. */
 
 
        /* The SYNOPSIS gets special attention in other areas. */
 
@@ -1998,10 +1986,12 @@ post_sh_head(POST_ARGS)
         */
 
        if (sec == mdoc->lastnamed)
         */
 
        if (sec == mdoc->lastnamed)
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECREP);
+               mandoc_msg(MANDOCERR_SEC_REP, mdoc->parse,
+                   mdoc->last->line, mdoc->last->pos, secname);
 
        if (sec < mdoc->lastnamed)
 
        if (sec < mdoc->lastnamed)
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECOOO);
+               mandoc_msg(MANDOCERR_SEC_ORDER, mdoc->parse,
+                   mdoc->last->line, mdoc->last->pos, secname);
 
        /* Mark the last named section. */
 
 
        /* Mark the last named section. */
 
@@ -2011,10 +2001,12 @@ post_sh_head(POST_ARGS)
 
        assert(mdoc->meta.msec);
 
 
        assert(mdoc->meta.msec);
 
+       goodsec = NULL;
        switch (sec) {
        case SEC_ERRORS:
                if (*mdoc->meta.msec == '4')
                        break;
        switch (sec) {
        case SEC_ERRORS:
                if (*mdoc->meta.msec == '4')
                        break;
+               goodsec = "2, 3, 4, 9";
                /* FALLTHROUGH */
        case SEC_RETURN_VALUES:
                /* FALLTHROUGH */
                /* FALLTHROUGH */
        case SEC_RETURN_VALUES:
                /* FALLTHROUGH */
@@ -2023,12 +2015,17 @@ post_sh_head(POST_ARGS)
                        break;
                if (*mdoc->meta.msec == '3')
                        break;
                        break;
                if (*mdoc->meta.msec == '3')
                        break;
+               if (NULL == goodsec)
+                       goodsec = "2, 3, 9";
                /* FALLTHROUGH */
        case SEC_CONTEXT:
                if (*mdoc->meta.msec == '9')
                        break;
                /* FALLTHROUGH */
        case SEC_CONTEXT:
                if (*mdoc->meta.msec == '9')
                        break;
-               mandoc_msg(MANDOCERR_SECMSEC, mdoc->parse,
-                   mdoc->last->line, mdoc->last->pos, secname);
+               if (NULL == goodsec)
+                       goodsec = "9";
+               mandoc_vmsg(MANDOCERR_SEC_MSEC, mdoc->parse,
+                   mdoc->last->line, mdoc->last->pos,
+                   "%s for %s only", secname, goodsec);
                break;
        default:
                break;
                break;
        default:
                break;
@@ -2193,18 +2190,16 @@ post_dt(POST_ARGS)
 
        mdoc->meta.title = mdoc->meta.vol = mdoc->meta.arch = NULL;
 
 
        mdoc->meta.title = mdoc->meta.vol = mdoc->meta.arch = NULL;
 
-       /* First make all characters uppercase. */
+       /* First check that all characters are uppercase. */
 
        if (NULL != (nn = n->child))
                for (p = nn->string; *p; p++) {
                        if (toupper((unsigned char)*p) == *p)
                                continue;
 
        if (NULL != (nn = n->child))
                for (p = nn->string; *p; p++) {
                        if (toupper((unsigned char)*p) == *p)
                                continue;
-
-                       /*
-                        * FIXME: don't be lazy: have this make all
-                        * characters be uppercase and just warn once.
-                        */
-                       mdoc_nmsg(mdoc, nn, MANDOCERR_UPPERCASE);
+                       mandoc_msg(MANDOCERR_TITLE_CASE,
+                           mdoc->parse, nn->line,
+                           nn->pos + (p - nn->string),
+                           nn->string);
                        break;
                }
 
                        break;
                }
 
@@ -2248,7 +2243,8 @@ post_dt(POST_ARGS)
                mdoc->meta.vol = mandoc_strdup(cp);
                mdoc->meta.msec = mandoc_strdup(nn->string);
        } else {
                mdoc->meta.vol = mandoc_strdup(cp);
                mdoc->meta.msec = mandoc_strdup(nn->string);
        } else {
-               mdoc_nmsg(mdoc, n, MANDOCERR_BADMSEC);
+               mandoc_msg(MANDOCERR_MSEC_BAD, mdoc->parse,
+                   nn->line, nn->pos, nn->string);
                mdoc->meta.vol = mandoc_strdup(nn->string);
                mdoc->meta.msec = mandoc_strdup(nn->string);
        }
                mdoc->meta.vol = mandoc_strdup(nn->string);
                mdoc->meta.msec = mandoc_strdup(nn->string);
        }
@@ -2270,7 +2266,8 @@ post_dt(POST_ARGS)
        } else {
                cp = mdoc_a2arch(nn->string);
                if (NULL == cp) {
        } else {
                cp = mdoc_a2arch(nn->string);
                if (NULL == cp) {
-                       mdoc_nmsg(mdoc, nn, MANDOCERR_BADVOLARCH);
+                       mandoc_msg(MANDOCERR_ARCH_BAD, mdoc->parse,
+                           nn->line, nn->pos, nn->string);
                        free(mdoc->meta.vol);
                        mdoc->meta.vol = mandoc_strdup(nn->string);
                } else
                        free(mdoc->meta.vol);
                        mdoc->meta.vol = mandoc_strdup(nn->string);
                } else