]> git.cameronkatri.com Git - mandoc.git/blobdiff - man_validate.c
Introduce the concept of nodes that are semantically transparent:
[mandoc.git] / man_validate.c
index b62625997b101f959e885eb59b9a53d1f41a2cc3..374793e499a5da6d7bc8a264aa1bf0d61dce9c79 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: man_validate.c,v 1.143 2018/12/31 04:55:46 schwarze Exp $ */
+/*     $Id: man_validate.c,v 1.150 2020/01/19 16:44:50 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012-2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012-2020 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
 
 typedef        void    (*v_check)(CHKARGS);
 
-static void      check_abort(CHKARGS);
+static void      check_abort(CHKARGS) __attribute__((__noreturn__));
 static void      check_par(CHKARGS);
 static void      check_part(CHKARGS);
 static void      check_root(CHKARGS);
 static void      check_text(CHKARGS);
 
 static void      post_AT(CHKARGS);
+static void      post_EE(CHKARGS);
+static void      post_EX(CHKARGS);
 static void      post_IP(CHKARGS);
 static void      post_OP(CHKARGS);
 static void      post_SH(CHKARGS);
@@ -78,8 +80,6 @@ static        const v_check man_valids[MAN_MAX - MAN_TH] = {
        NULL,       /* I */
        NULL,       /* IR */
        NULL,       /* RI */
-       NULL,       /* nf */
-       NULL,       /* fi */
        NULL,       /* RE */
        check_part, /* RS */
        NULL,       /* DT */
@@ -90,8 +90,8 @@ static        const v_check man_valids[MAN_MAX - MAN_TH] = {
        NULL,       /* SY */
        NULL,       /* YS */
        post_OP,    /* OP */
-       NULL,       /* EX */
-       NULL,       /* EE */
+       post_EX,    /* EX */
+       post_EE,    /* EE */
        post_UR,    /* UR */
        NULL,       /* UE */
        post_UR,    /* MT */
@@ -160,7 +160,7 @@ man_validate(struct roff_man *man)
                if (*cp)
                        (*cp)(man, n);
                if (man->last == n)
-                       man_state(man, n);
+                       n->flags |= NODE_VALID;
                break;
        }
 }
@@ -185,8 +185,7 @@ check_root(CHKARGS)
 
                man->meta.title = mandoc_strdup("");
                man->meta.msec = mandoc_strdup("");
-               man->meta.date = man->quick ? mandoc_strdup("") :
-                   mandoc_normdate(man, NULL, n->line, n->pos);
+               man->meta.date = mandoc_normdate(NULL, NULL);
        }
 
        if (man->meta.os_e &&
@@ -207,7 +206,7 @@ check_text(CHKARGS)
 {
        char            *cp, *p;
 
-       if (MAN_LITERAL & man->flags)
+       if (n->flags & NODE_NOFILL)
                return;
 
        cp = n->string;
@@ -216,6 +215,20 @@ check_text(CHKARGS)
                    n->line, n->pos + (int)(p - cp), NULL);
 }
 
+static void
+post_EE(CHKARGS)
+{
+       if ((n->flags & NODE_NOFILL) == 0)
+               mandoc_msg(MANDOCERR_FI_SKIP, n->line, n->pos, "EE");
+}
+
+static void
+post_EX(CHKARGS)
+{
+       if (n->flags & NODE_NOFILL)
+               mandoc_msg(MANDOCERR_NF_SKIP, n->line, n->pos, "EX");
+}
+
 static void
 post_OP(CHKARGS)
 {
@@ -355,8 +368,8 @@ post_TH(CHKARGS)
        /* ->TITLE<- MSEC DATE OS VOL */
 
        n = n->child;
-       if (n && n->string) {
-               for (p = n->string; '\0' != *p; p++) {
+       if (n != NULL && n->string != NULL) {
+               for (p = n->string; *p != '\0'; p++) {
                        /* Only warn about this once... */
                        if (isalpha((unsigned char)*p) &&
                            ! isupper((unsigned char)*p)) {
@@ -374,9 +387,9 @@ post_TH(CHKARGS)
 
        /* TITLE ->MSEC<- DATE OS VOL */
 
-       if (n)
+       if (n != NULL)
                n = n->next;
-       if (n && n->string)
+       if (n != NULL && n->string != NULL)
                man->meta.msec = mandoc_strdup(n->string);
        else {
                man->meta.msec = mandoc_strdup("");
@@ -386,18 +399,12 @@ post_TH(CHKARGS)
 
        /* TITLE MSEC ->DATE<- OS VOL */
 
-       if (n)
+       if (n != NULL)
                n = n->next;
-       if (n && n->string && '\0' != n->string[0]) {
-               man->meta.date = man->quick ?
-                   mandoc_strdup(n->string) :
-                   mandoc_normdate(man, n->string, n->line, n->pos);
-       } else {
+       if (man->quick && n != NULL)
                man->meta.date = mandoc_strdup("");
-               mandoc_msg(MANDOCERR_DATE_MISSING,
-                   n ? n->line : nb->line,
-                   n ? n->pos : nb->pos, "TH");
-       }
+       else
+               man->meta.date = mandoc_normdate(n, nb);
 
        /* TITLE MSEC DATE ->OS<- VOL */