]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_validate.c
In .Bl -column, if some of the column width declarations are given
[mandoc.git] / mdoc_validate.c
index 85b57d48f78da8a496496d0e4cb98ff99aa2a141..67e21df7f0382fb12a0cbd57d1c2d312c12d3140 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.232 2014/07/30 00:19:16 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.237 2014/07/31 00:41:10 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -66,7 +66,6 @@ struct        valids {
 
 static int      check_count(struct mdoc *, enum mdoc_type,
                        enum check_lvl, enum check_ineq, int);
-static int      check_parent(PRE_ARGS, enum mdoct, enum mdoc_type);
 static void     check_text(struct mdoc *, int, int, char *);
 static void     check_argv(struct mdoc *,
                        struct mdoc_node *, struct mdoc_argv *);
@@ -124,13 +123,10 @@ static    int      pre_bl(PRE_ARGS);
 static int      pre_dd(PRE_ARGS);
 static int      pre_display(PRE_ARGS);
 static int      pre_dt(PRE_ARGS);
-static int      pre_it(PRE_ARGS);
 static int      pre_literal(PRE_ARGS);
 static int      pre_obsolete(PRE_ARGS);
 static int      pre_os(PRE_ARGS);
 static int      pre_par(PRE_ARGS);
-static int      pre_sh(PRE_ARGS);
-static int      pre_ss(PRE_ARGS);
 static int      pre_std(PRE_ARGS);
 
 static v_post   posts_an[] = { post_an, NULL };
@@ -176,12 +172,10 @@ static    v_pre    pres_d1[] = { pre_display, NULL };
 static v_pre    pres_dl[] = { pre_literal, pre_display, NULL };
 static v_pre    pres_dd[] = { pre_dd, NULL };
 static v_pre    pres_dt[] = { pre_dt, NULL };
-static v_pre    pres_it[] = { pre_it, pre_par, NULL };
+static v_pre    pres_it[] = { pre_par, NULL };
 static v_pre    pres_obsolete[] = { pre_obsolete, 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 };
-static v_pre    pres_ss[] = { pre_ss, NULL };
 static v_pre    pres_std[] = { pre_std, NULL };
 
 static const struct valids mdoc_valids[MDOC_MAX] = {
@@ -189,8 +183,8 @@ static      const struct valids mdoc_valids[MDOC_MAX] = {
        { pres_dd, posts_dd },                  /* Dd */
        { pres_dt, posts_dt },                  /* Dt */
        { pres_os, posts_os },                  /* Os */
-       { pres_sh, posts_sh },                  /* Sh */
-       { pres_ss, posts_ss },                  /* Ss */
+       { NULL, posts_sh },                     /* Sh */
+       { NULL, posts_ss },                     /* Ss */
        { pres_pp, posts_pp },                  /* Pp */
        { pres_d1, posts_d1 },                  /* D1 */
        { pres_dl, posts_dl },                  /* Dl */
@@ -549,22 +543,6 @@ check_text(struct mdoc *mdoc, int ln, int pos, char *p)
                    ln, pos + (int)(p - cp), NULL);
 }
 
-static int
-check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type t)
-{
-
-       assert(n->parent);
-       if ((MDOC_ROOT == t || tok == n->parent->tok) &&
-                       (t == n->parent->type))
-               return(1);
-
-       mandoc_vmsg(MANDOCERR_SYNTCHILD, mdoc->parse,
-           n->line, n->pos, "want parent %s",
-           MDOC_ROOT == t ? "<root>" : mdoc_macronames[tok]);
-       return(0);
-}
-
-
 static int
 pre_display(PRE_ARGS)
 {
@@ -857,34 +835,6 @@ pre_bd(PRE_ARGS)
        return(1);
 }
 
-static int
-pre_ss(PRE_ARGS)
-{
-
-       if (MDOC_BLOCK != n->type)
-               return(1);
-       return(check_parent(mdoc, n, MDOC_Sh, MDOC_BODY));
-}
-
-static int
-pre_sh(PRE_ARGS)
-{
-
-       if (MDOC_BLOCK != n->type)
-               return(1);
-       return(check_parent(mdoc, n, MDOC_MAX, MDOC_ROOT));
-}
-
-static int
-pre_it(PRE_ARGS)
-{
-
-       if (MDOC_BLOCK != n->type)
-               return(1);
-
-       return(check_parent(mdoc, n, MDOC_Bl, MDOC_BODY));
-}
-
 static int
 pre_an(PRE_ARGS)
 {
@@ -1260,7 +1210,6 @@ post_it(POST_ARGS)
        int               i, cols;
        enum mdoc_list    lt;
        struct mdoc_node *nbl, *nit, *nch;
-       enum mandocerr    er;
 
        nit = mdoc->last;
        if (MDOC_BLOCK != nit->type)
@@ -1311,16 +1260,11 @@ post_it(POST_ARGS)
                        if (MDOC_BODY == nch->type)
                                i++;
 
-               if (i < cols)
-                       er = MANDOCERR_ARGCOUNT;
-               else if (i == cols || i == cols + 1)
-                       break;
-               else
-                       er = MANDOCERR_SYNTARGCOUNT;
-
-               mandoc_vmsg(er, mdoc->parse, nit->line, nit->pos,
-                   "columns == %d (have %d)", cols, i);
-               return(MANDOCERR_ARGCOUNT == er);
+               if (i < cols || i > cols + 1)
+                       mandoc_vmsg(MANDOCERR_ARGCOUNT,
+                           mdoc->parse, nit->line, nit->pos,
+                           "columns == %d (have %d)", cols, i);
+               break;
        default:
                abort();
        }
@@ -1507,6 +1451,7 @@ static int
 post_bl_head(POST_ARGS)
 {
        struct mdoc_node *np, *nn, *nnp;
+       struct mdoc_argv *argv;
        int               i, j;
 
        if (LIST_column != mdoc->last->norm->Bl.type)
@@ -1514,22 +1459,12 @@ post_bl_head(POST_ARGS)
                return(hwarn_eq0(mdoc));
 
        /*
-        * Convert old-style lists, where the column width specifiers
+        * Append old-style lists, where the column width specifiers
         * trail as macro parameters, to the new-style ("normal-form")
         * lists where they're argument values following -column.
         */
 
-       /* First, disallow both types and allow normal-form. */
-
-       /*
-        * TODO: technically, we can accept both and just merge the two
-        * lists, but I'll leave that for another day.
-        */
-
-       if (mdoc->last->norm->Bl.ncols && mdoc->last->nchild) {
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_COLUMNS);
-               return(0);
-       } else if (NULL == mdoc->last->child)
+       if (mdoc->last->child == NULL)
                return(1);
 
        np = mdoc->last->parent;
@@ -1540,7 +1475,6 @@ post_bl_head(POST_ARGS)
                        break;
 
        assert(j < (int)np->args->argc);
-       assert(0 == np->args->argv[j].sz);
 
        /*
         * Accommodate for new-style groff column syntax.  Shuffle the
@@ -1548,15 +1482,17 @@ post_bl_head(POST_ARGS)
         * column field.  Then, delete the head children.
         */
 
-       np->args->argv[j].sz = (size_t)mdoc->last->nchild;
-       np->args->argv[j].value = mandoc_reallocarray(NULL,
-           (size_t)mdoc->last->nchild, sizeof(char *));
+       argv = np->args->argv + j;
+       i = argv->sz;
+       argv->sz += mdoc->last->nchild;
+       argv->value = mandoc_reallocarray(argv->value,
+           argv->sz, 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 = argv->sz;
+       mdoc->last->norm->Bl.cols = (void *)argv->value;
 
-       for (i = 0, nn = mdoc->last->child; nn; i++) {
-               np->args->argv[j].value[i] = nn->string;
+       for (nn = mdoc->last->child; nn; i++) {
+               argv->value[i] = nn->string;
                nn->string = NULL;
                nnp = nn;
                nn = nn->next;
@@ -1683,16 +1619,24 @@ ebool(struct mdoc *mdoc)
 static int
 post_root(POST_ARGS)
 {
-       int               ret;
        struct mdoc_node *n;
 
-       ret = 1;
-
-       /* Check that we have a finished prologue. */
+       /* Add missing prologue data. */
 
        if ( ! (MDOC_PBODY & mdoc->flags)) {
-               ret = 0;
-               mdoc_nmsg(mdoc, mdoc->first, MANDOCERR_NODOCPROLOG);
+               mandoc_msg(MANDOCERR_PROLOG_BAD, mdoc->parse, 0, 0, "EOF");
+               if (mdoc->meta.date == NULL)
+                       mdoc->meta.date = mdoc->quick ?
+                           mandoc_strdup("") :
+                           mandoc_normdate(mdoc->parse, NULL, 0, 0);
+               if (mdoc->meta.title == NULL)
+                       mdoc->meta.title = mandoc_strdup("UNKNOWN");
+               if (mdoc->meta.vol == NULL)
+                       mdoc->meta.vol = mandoc_strdup("LOCAL");
+               if (mdoc->meta.arch == NULL)
+                       mdoc->meta.msec = mandoc_strdup("1");
+               if (mdoc->meta.os == NULL)
+                       mdoc->meta.os = mandoc_strdup("UNKNOWN");
        }
 
        n = mdoc->first;
@@ -1707,7 +1651,7 @@ post_root(POST_ARGS)
                    n->child->line, n->child->pos,
                    mdoc_macronames[n->child->tok]);
 
-       return(ret);
+       return(1);
 }
 
 static int
@@ -2376,7 +2320,8 @@ post_os(POST_ARGS)
 #else /*!OSNAME */
        if (NULL == defbuf) {
                if (-1 == uname(&utsname)) {
-                       mdoc_nmsg(mdoc, n, MANDOCERR_UNAME);
+                       mandoc_msg(MANDOCERR_OS_UNAME, mdoc->parse,
+                           n->line, n->pos, "Os");
                        defbuf = mandoc_strdup("UNKNOWN");
                } else
                        mandoc_asprintf(&defbuf, "%s %s",