]> 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 56a587ffdcd6b81beb01d8163b4b469b2a69710b..daf00177dedcaeae74df4b130da2859b952a3081 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.83 2010/05/26 09:35: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);
@@ -92,6 +93,7 @@ static        int      post_sh(POST_ARGS);
 static int      post_sh_body(POST_ARGS);
 static int      post_sh_head(POST_ARGS);
 static int      post_st(POST_ARGS);
+static int      post_eoln(POST_ARGS);
 static int      post_vt(POST_ARGS);
 static int      pre_an(PRE_ARGS);
 static int      pre_bd(PRE_ARGS);
@@ -111,6 +113,8 @@ static      v_post   posts_bd[] = { hwarn_eq0, bwarn_ge1, NULL };
 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 };
@@ -127,7 +131,6 @@ static      v_post   posts_text1[] = { eerr_eq1, NULL };
 static v_post   posts_vt[] = { post_vt, NULL };
 static v_post   posts_wline[] = { bwarn_ge1, herr_eq0, NULL };
 static v_post   posts_wtext[] = { ewarn_ge1, NULL };
-static v_post   posts_xr[] = { ewarn_ge1, NULL };
 static v_pre    pres_an[] = { pre_an, NULL };
 static v_pre    pres_bd[] = { pre_display, pre_bd, NULL };
 static v_pre    pres_bl[] = { pre_bl, NULL };
@@ -146,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 */ 
@@ -184,7 +187,7 @@ const       struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, posts_st },                     /* St */ 
        { NULL, NULL },                         /* Va */
        { NULL, posts_vt },                     /* Vt */ 
-       { NULL, posts_xr },                     /* Xr */ 
+       { NULL, posts_wtext },                  /* Xr */ 
        { NULL, posts_text },                   /* %A */
        { NULL, posts_text },                   /* %B */ /* FIXME: can be used outside Rs/Re. */
        { NULL, posts_text },                   /* %D */ /* FIXME: check date with mandoc_a2time(). */
@@ -246,10 +249,10 @@ const     struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, NULL },                         /* Oc */
        { NULL, posts_wline },                  /* Bk */
        { NULL, NULL },                         /* Ek */
-       { NULL, posts_notext },                 /* Bt */
+       { NULL, posts_eoln },                   /* Bt */
        { NULL, NULL },                         /* Hf */
        { NULL, NULL },                         /* Fr */
-       { NULL, posts_notext },                 /* Ud */
+       { NULL, posts_eoln },                   /* Ud */
        { NULL, posts_lb },                     /* Lb */
        { NULL, posts_notext },                 /* Lp */ 
        { NULL, posts_text },                   /* Lk */ 
@@ -265,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 */
 };
 
 
@@ -391,7 +395,7 @@ CHECK_CHILD_DEFN(err, lt, <)                        /* err_child_lt() */
 CHECK_CHILD_DEFN(warn, lt, <)                  /* warn_child_lt() */
 CHECK_BODY_DEFN(ge1, warn, warn_child_gt, 0)   /* bwarn_ge1() */
 CHECK_BODY_DEFN(ge1, err, err_child_gt, 0)     /* berr_ge1() */
-CHECK_ELEM_DEFN(ge1, warn, warn_child_gt, 0)   /* ewarn_gt1() */
+CHECK_ELEM_DEFN(ge1, warn, warn_child_gt, 0)   /* ewarn_ge1() */
 CHECK_ELEM_DEFN(eq1, err, err_child_eq, 1)     /* eerr_eq1() */
 CHECK_ELEM_DEFN(le1, err, err_child_lt, 2)     /* eerr_le1() */
 CHECK_ELEM_DEFN(eq0, err, err_child_eq, 0)     /* eerr_eq0() */
@@ -737,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))
@@ -828,6 +849,16 @@ post_lb(POST_ARGS)
 }
 
 
+static int
+post_eoln(POST_ARGS)
+{
+
+       if (NULL == mdoc->last->child)
+               return(1);
+       return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_ARGSLOST));
+}
+
+
 static int
 post_vt(POST_ARGS)
 {
@@ -898,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;
 
@@ -987,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,