]> git.cameronkatri.com Git - mandoc.git/commitdiff
clean up post_dt() validation function;
authorIngo Schwarze <schwarze@openbsd.org>
Mon, 16 Feb 2015 19:02:48 +0000 (19:02 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Mon, 16 Feb 2015 19:02:48 +0000 (19:02 +0000)
improved diagnostics, minus six lines of code

mandoc.1
mdoc_validate.c

index 79f55b143e1b7c126c12c79e0067c3e0f0a5af51..c8678cd123a1b7e703d113e74119167cf317c901 100644 (file)
--- a/mandoc.1
+++ b/mandoc.1
@@ -1,4 +1,4 @@
-.\"    $Id: mandoc.1,v 1.153 2015/02/16 16:23:54 schwarze Exp $
+.\"    $Id: mandoc.1,v 1.154 2015/02/16 19:02:48 schwarze Exp $
 .\"
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 .\" Copyright (c) 2012, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1687,6 +1687,9 @@ or a request of the
 .Ic \&de
 family with more than two arguments
 .It
+.Ic \&Dt
+with more than three arguments
+.It
 .Ic \&TH
 with more than five arguments
 .It
index f37e4c3734fd63218497ed6cc738936f35c0989f..981a41166ef5ed11768bddf1d7d9f82d2d293c94 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.279 2015/02/14 13:23:57 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.280 2015/02/16 19:02:48 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -2156,70 +2156,68 @@ post_dt(POST_ARGS)
        mdoc->meta.vol = NULL;
        mdoc->meta.arch = NULL;
 
-       /* First check that all characters are uppercase. */
+       /* Mandatory first argument: title. */
 
-       if (NULL != (nn = n->child))
-               for (p = nn->string; *p; p++) {
-                       if (toupper((unsigned char)*p) == *p)
-                               continue;
-                       mandoc_vmsg(MANDOCERR_TITLE_CASE,
-                           mdoc->parse, nn->line,
-                           nn->pos + (p - nn->string),
-                           "Dt %s", nn->string);
-                       break;
-               }
-
-       /* No argument: msec and arch remain NULL. */
-
-       if (NULL == (nn = n->child)) {
+       nn = n->child;
+       if (nn == NULL || *nn->string == '\0') {
                mandoc_msg(MANDOCERR_DT_NOTITLE,
                    mdoc->parse, n->line, n->pos, "Dt");
                mdoc->meta.title = mandoc_strdup("UNTITLED");
-               mdoc->meta.vol = mandoc_strdup("LOCAL");
-               goto out;
+       } else {
+               mdoc->meta.title = mandoc_strdup(nn->string);
+
+               /* Check that all characters are uppercase. */
+
+               for (p = nn->string; *p != '\0'; p++)
+                       if (islower((unsigned char)*p)) {
+                               mandoc_vmsg(MANDOCERR_TITLE_CASE,
+                                   mdoc->parse, nn->line,
+                                   nn->pos + (p - nn->string),
+                                   "Dt %s", nn->string);
+                               break;
+                       }
        }
 
-       /* One argument: msec and arch remain NULL. */
+       /* Mandatory second argument: section. */
 
-       mdoc->meta.title = mandoc_strdup(
-           '\0' == nn->string[0] ? "UNTITLED" : nn->string);
+       if (nn != NULL)
+               nn = nn->next;
 
-       if (NULL == (nn = nn->next)) {
+       if (nn == NULL) {
                mandoc_vmsg(MANDOCERR_MSEC_MISSING,
                    mdoc->parse, n->line, n->pos,
                    "Dt %s", mdoc->meta.title);
                mdoc->meta.vol = mandoc_strdup("LOCAL");
-               goto out;
+               goto out;  /* msec and arch remain NULL. */
        }
 
-       /* Handles: `.Dt TITLE SEC'
-        * title = TITLE,
-        * volume = SEC is msec ? format(msec) : SEC,
-        * msec = SEC is msec ? atoi(msec) : 0,
-        * arch = NULL
-        */
+       mdoc->meta.msec = mandoc_strdup(nn->string);
+
+       /* Infer volume title from section number. */
 
        cp = mandoc_a2msec(nn->string);
-       if (cp) {
-               mdoc->meta.vol = mandoc_strdup(cp);
-               mdoc->meta.msec = mandoc_strdup(nn->string);
-       } else {
+       if (cp == NULL) {
                mandoc_vmsg(MANDOCERR_MSEC_BAD, mdoc->parse,
                    nn->line, nn->pos, "Dt ... %s", nn->string);
                mdoc->meta.vol = mandoc_strdup(nn->string);
-               mdoc->meta.msec = mandoc_strdup(nn->string);
-       }
+       } else
+               mdoc->meta.vol = mandoc_strdup(cp);
 
-       /* Handle an optional architecture */
+       /* Optional third argument: architecture. */
 
-       if ((nn = nn->next) != NULL) {
-               for (p = nn->string; *p; p++)
-                       *p = tolower((unsigned char)*p);
-               mdoc->meta.arch = mandoc_strdup(nn->string);
-       }
+       if ((nn = nn->next) == NULL)
+               goto out;
+
+       for (p = nn->string; *p != '\0'; p++)
+               *p = tolower((unsigned char)*p);
+       mdoc->meta.arch = mandoc_strdup(nn->string);
+
+       /* Ignore fourth and later arguments. */
+
+       if ((nn = nn->next) != NULL)
+               mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse,
+                   nn->line, nn->pos, "Dt ... %s", nn->string);
 
-       /* Ignore any subsequent parameters... */
-       /* FIXME: warn about subsequent parameters. */
 out:
        mdoc_node_delete(mdoc, n);
 }