]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_validate.c
Ugly fix for `Bl' or `Bd' causing badness when nested in `Bl -hang' lists.
[mandoc.git] / mdoc_validate.c
index 9d103ebb171ced27d036e55104cb07297061b0b4..797642aaf7aec3194435aa39c171baf7c04b3ce7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.34 2009/07/17 12:08:08 kristaps Exp $ */
+/*     $Id: mdoc_validate.c,v 1.39 2009/07/23 08:36:32 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -18,6 +18,8 @@
 
 #include <assert.h>
 #include <ctype.h>
+#include <errno.h>
+#include <limits.h>
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
@@ -72,7 +74,6 @@ static        int      eerr_eq0(POST_ARGS);
 static int      eerr_eq1(POST_ARGS);
 static int      eerr_ge1(POST_ARGS);
 static int      eerr_le2(POST_ARGS);
-static int      ewarn_eq0(POST_ARGS);
 static int      ewarn_ge1(POST_ARGS);
 static int      herr_eq0(POST_ARGS);
 static int      herr_ge1(POST_ARGS);
@@ -92,6 +93,7 @@ static        int      post_root(POST_ARGS);
 static int      post_sh(POST_ARGS);
 static int      post_sh_body(POST_ARGS);
 static int      post_sh_head(POST_ARGS);
+static int      post_sp(POST_ARGS);
 static int      post_st(POST_ARGS);
 static int      pre_an(PRE_ARGS);
 static int      pre_bd(PRE_ARGS);
@@ -127,6 +129,7 @@ static      v_post   posts_notext[] = { eerr_eq0, NULL };
 static v_post   posts_pf[] = { eerr_eq1, NULL };
 static v_post   posts_rv[] = { eerr_eq0, post_args, NULL };
 static v_post   posts_sh[] = { herr_ge1, bwarn_ge1, post_sh, NULL };
+static v_post   posts_sp[] = { post_sp, NULL };
 static v_post   posts_ss[] = { herr_ge1, NULL };
 static v_post   posts_st[] = { eerr_eq1, post_st, NULL };
 static v_post   posts_text[] = { eerr_ge1, NULL };
@@ -270,7 +273,7 @@ const       struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, NULL },                         /* Dx */
        { NULL, posts_text },                   /* %Q */
        { NULL, posts_notext },                 /* br */
-       { NULL, NULL },                         /* sp */
+       { NULL, posts_sp },                     /* sp */
 };
 
 
@@ -403,7 +406,6 @@ 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(eq0, warn, warn_child_eq, 0)   /* ewarn_eq0() */
 CHECK_ELEM_DEFN(ge1, warn, warn_child_gt, 0)   /* ewarn_gt1() */
 CHECK_ELEM_DEFN(eq1, err, err_child_eq, 1)     /* eerr_eq1() */
 CHECK_ELEM_DEFN(le2, err, err_child_lt, 3)     /* eerr_le2() */
@@ -860,7 +862,7 @@ post_bf(POST_ARGS)
                return(1);
        else if (0 == strcmp(p, "Li"))
                return(1);
-       else if (0 == strcmp(p, "Sm"))
+       else if (0 == strcmp(p, "Sy"))
                return(1);
 
        return(mdoc_nerr(mdoc, head, EFONT));
@@ -1026,11 +1028,20 @@ post_it(POST_ARGS)
                c = mdoc->last->child;
                for (i = 0; c && MDOC_HEAD == c->type; c = c->next)
                        i++;
-               if (i == cols)
+
+               if (i < cols || i == (cols + 1)) {
+                       if ( ! mdoc_vwarn(mdoc, mdoc->last->line, 
+                                       mdoc->last->pos, "column "
+                                       "mismatch: have %d, want %d", 
+                                       i, cols))
+                               return(0);
+                       break;
+               } else if (i == cols)
                        break;
-               return(mdoc_verr(mdoc, mdoc->last->line, mdoc->last->pos,
-                               "column mismatch (have %d, want %d)", 
-                               i, cols));
+
+               return(mdoc_verr(mdoc, mdoc->last->line, 
+                               mdoc->last->pos, "column mismatch: "
+                               "have %d, want %d", i, cols));
        default:
                break;
        }
@@ -1128,6 +1139,37 @@ post_root(POST_ARGS)
 }
 
 
+static int
+post_sp(POST_ARGS)
+{
+       long             lval;
+       char            *ep, *buf;
+
+       if (NULL == mdoc->last->child)
+               return(1);
+       else if ( ! eerr_eq1(mdoc))
+               return(0);
+
+       assert(MDOC_TEXT == mdoc->last->child->type);
+       buf = mdoc->last->child->string;
+       assert(buf);
+       
+       /* From OpenBSD's strtol(3). */
+       errno = 0;
+       lval = strtol(buf, &ep, 10);
+       if (buf[0] == '\0' || *ep != '\0')
+               return(mdoc_nerr(mdoc, mdoc->last->child, ENUMFMT));
+
+       if ((errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) ||
+                       (lval > INT_MAX || lval < 0))
+               return(mdoc_nerr(mdoc, mdoc->last->child, ENUMFMT));
+
+       return(1);
+}
+
+
+
+
 static int
 post_st(POST_ARGS)
 {