]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_validate.c
Fixed my breaking of Ingo's eoln-whitespace detection code, where a
[mandoc.git] / mdoc_validate.c
index 9d2baad7d6eb0504bc6da3fbd3be1adc2b96c069..daf00177dedcaeae74df4b130da2859b952a3081 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.84 2010/05/26 10:39:35 kristaps Exp $ */
+/*     $Id: mdoc_validate.c,v 1.88 2010/05/31 10:28:04 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -83,6 +83,7 @@ static        int      post_at(POST_ARGS);
 static int      post_bf(POST_ARGS);
 static int      post_bl(POST_ARGS);
 static int      post_bl_head(POST_ARGS);
+static int      post_dt(POST_ARGS);
 static int      post_it(POST_ARGS);
 static int      post_lb(POST_ARGS);
 static int      post_nm(POST_ARGS);
@@ -113,6 +114,7 @@ static      v_post   posts_bf[] = { hwarn_le1, post_bf, NULL };
 static v_post   posts_bl[] = { bwarn_ge1, post_bl, NULL };
 static v_post   posts_bool[] = { eerr_eq1, ebool, NULL };
 static v_post   posts_eoln[] = { post_eoln, NULL };
+static v_post   posts_dt[] = { post_dt, NULL };
 static v_post   posts_fo[] = { hwarn_eq1, bwarn_ge1, NULL };
 static v_post   posts_it[] = { post_it, NULL };
 static v_post   posts_lb[] = { eerr_eq1, post_lb, NULL };
@@ -147,7 +149,7 @@ static      v_pre    pres_ss[] = { pre_ss, NULL };
 const  struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, NULL },                         /* Ap */
        { pres_dd, posts_text },                /* Dd */
-       { pres_dt, NULL },                      /* Dt */
+       { pres_dt, posts_dt },                  /* Dt */
        { pres_os, NULL },                      /* Os */
        { pres_sh, posts_sh },                  /* Sh */ 
        { pres_ss, posts_ss },                  /* Ss */ 
@@ -266,6 +268,7 @@ const       struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, posts_notext },                 /* br */
        { NULL, posts_sp },                     /* sp */
        { NULL, posts_text1 },                  /* %U */
+       { NULL, NULL },                         /* Ta */
 };
 
 
@@ -738,10 +741,27 @@ pre_rv(PRE_ARGS)
 
 
 static int
-pre_dt(PRE_ARGS)
+post_dt(POST_ARGS)
 {
+       const struct mdoc_node *nn;
+       const char      *p;
+
+       if (NULL != (nn = mdoc->last->child))
+               for (p = nn->string; *p; p++) {
+                       if (toupper((u_char)*p) == *p)
+                               continue;
+                       if ( ! mdoc_nmsg(mdoc, nn, MANDOCERR_UPPERCASE))
+                               return(0);
+                       break;
+               }
+
+       return(1);
+}
 
-       /* FIXME: make sure is capitalised. */
+
+static int
+pre_dt(PRE_ARGS)
+{
 
        if (0 == mdoc->meta.date || mdoc->meta.os)
                if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO))
@@ -909,6 +929,7 @@ post_an(POST_ARGS)
 static int
 post_it(POST_ARGS)
 {
+       /* FIXME: use mdoc_list! */
        int               type, i, cols;
        struct mdoc_node *n, *c;
 
@@ -998,15 +1019,16 @@ post_it(POST_ARGS)
                                return(0);
                break;
        case (MDOC_Column):
-               if (NULL == mdoc->last->head->child)
-                       if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS))
-                               return(0);
-               if (mdoc->last->body->child)
-                       if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BODYLOST))
+               assert(NULL == mdoc->last->head->child);
+               if (NULL == mdoc->last->body->child)
+                       if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY))
                                return(0);
+
+               /* Count up the number of columns.  */
                c = mdoc->last->child;
-               for (i = 0; c && MDOC_HEAD == c->type; c = c->next)
-                       i++;
+               for (i = 0; c; c = c->next)
+                       if (MDOC_BODY == c->type)
+                               i++;
 
                if (i < cols) {
                        if ( ! mdoc_vmsg(mdoc, MANDOCERR_ARGCOUNT,