]> git.cameronkatri.com Git - mandoc.git/blobdiff - man_validate.c
The files mandoc.c and mandoc.h contained both specialised low-level
[mandoc.git] / man_validate.c
index 7a9deede11459a853e254fb9db4bfca5ed1f0778..647dbcca3ba075dba04180c17d0edfc31fd9ac71 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: man_validate.c,v 1.85 2012/11/17 00:26:33 schwarze Exp $ */
+/*     $Id: man_validate.c,v 1.89 2014/03/23 11:25:26 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -32,6 +32,7 @@
 
 #include "man.h"
 #include "mandoc.h"
+#include "mandoc_aux.h"
 #include "libman.h"
 #include "libmandoc.h"
 
@@ -49,6 +50,7 @@ static        int       check_eq2(CHKARGS);
 static int       check_le1(CHKARGS);
 static int       check_ge2(CHKARGS);
 static int       check_le5(CHKARGS);
+static int       check_head1(CHKARGS);
 static int       check_par(CHKARGS);
 static int       check_part(CHKARGS);
 static int       check_root(CHKARGS);
@@ -80,6 +82,7 @@ static        v_check   posts_sec[] = { post_sec, NULL };
 static v_check   posts_sp[] = { post_vs, check_le1, NULL };
 static v_check   posts_th[] = { check_ge2, check_le5, post_TH, NULL };
 static v_check   posts_uc[] = { post_UC, NULL };
+static v_check   posts_ur[] = { check_head1, check_part, NULL };
 static v_check   pres_sec[] = { pre_sec, NULL };
 
 static const struct man_valid man_valids[MAN_MAX] = {
@@ -119,6 +122,8 @@ static      const struct man_valid man_valids[MAN_MAX] = {
        { NULL, posts_eq2 }, /* OP */
        { NULL, posts_nf }, /* EX */
        { NULL, posts_fi }, /* EE */
+       { NULL, posts_ur }, /* UR */
+       { NULL, NULL }, /* UE */
 };
 
 
@@ -207,8 +212,8 @@ check_root(CHKARGS)
 
                man->meta.title = mandoc_strdup("unknown");
                man->meta.msec = mandoc_strdup("1");
-               man->meta.date = mandoc_normdate
-                       (man->parse, NULL, n->line, n->pos);
+               man->meta.date = man->quick ? mandoc_strdup("") :
+                   mandoc_normdate(man->parse, NULL, n->line, n->pos);
        }
 
        return(1);
@@ -245,6 +250,17 @@ INEQ_DEFINE(1, <=, le1)
 INEQ_DEFINE(2, >=, ge2)
 INEQ_DEFINE(5, <=, le5)
 
+static int
+check_head1(CHKARGS)
+{
+
+       if (MAN_HEAD == n->type && 1 != n->nchild)
+               mandoc_vmsg(MANDOCERR_ARGCOUNT, man->parse, n->line,
+                   n->pos, "line arguments eq 1 (have %d)", n->nchild);
+
+       return(1);
+}
+
 static int
 post_ft(CHKARGS)
 {
@@ -380,7 +396,6 @@ static int
 post_TH(CHKARGS)
 {
        const char      *p;
-       int              line, pos;
 
        free(man->meta.title);
        free(man->meta.vol);
@@ -388,8 +403,6 @@ post_TH(CHKARGS)
        free(man->meta.msec);
        free(man->meta.date);
 
-       line = n->line;
-       pos = n->pos;
        man->meta.title = man->meta.vol = man->meta.date =
                man->meta.msec = man->meta.source = NULL;
 
@@ -423,9 +436,10 @@ post_TH(CHKARGS)
        if (n)
                n = n->next;
        if (n && n->string && '\0' != n->string[0]) {
-               pos = n->pos;
-               man->meta.date = mandoc_normdate
-                   (man->parse, n->string, line, pos);
+               man->meta.date = man->quick ?
+                   mandoc_strdup(n->string) :
+                   mandoc_normdate(man->parse, n->string,
+                       n->line, n->pos);
        } else
                man->meta.date = mandoc_strdup("");