]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_validate.c
Mostly complete implementation of the 'c' (character available)
[mandoc.git] / mdoc_validate.c
index a6e3d5e79524665d3b524a9f19cae879521822fa..57182df3f9faf3951ed005a4c7ebc9d7587a25e7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.355 2018/03/16 15:05:44 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.362 2018/08/17 20:33:38 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -116,7 +116,7 @@ static      void     post_useless(POST_ARGS);
 static void     post_xr(POST_ARGS);
 static void     post_xx(POST_ARGS);
 
-static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] = {
+static const v_post mdoc_valids[MDOC_MAX - MDOC_Dd] = {
        post_dd,        /* Dd */
        post_dt,        /* Dt */
        post_os,        /* Os */
@@ -238,7 +238,6 @@ static      const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] = {
        NULL,           /* %U */
        NULL,           /* Ta */
 };
-static const v_post *const mdoc_valids = __mdoc_valids - MDOC_Dd;
 
 #define        RSORD_MAX 14 /* Number of `Rs' blocks. */
 
@@ -320,6 +319,7 @@ mdoc_node_validate(struct roff_man *mdoc)
                    (np->tok == MDOC_Sh || np->tok == MDOC_Ss)))
                        check_toptext(mdoc, n->line, n->pos, n->string);
                break;
+       case ROFFT_COMMENT:
        case ROFFT_EQN:
        case ROFFT_TBL:
                break;
@@ -356,7 +356,7 @@ mdoc_node_validate(struct roff_man *mdoc)
                }
 
                assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);
-               p = mdoc_valids + n->tok;
+               p = mdoc_valids + (n->tok - MDOC_Dd);
                if (*p)
                        (*p)(mdoc);
                if (mdoc->last == n)
@@ -412,8 +412,9 @@ check_text_em(struct roff_man *mdoc, int ln, int pos, char *p)
        /* Look for em-dashes wrongly encoded as "--". */
 
        for (cp = p; *cp != '\0'; cp++) {
-               if (*cp != '-' || *++cp != '-')
+               if (cp[0] != '-' || cp[1] != '-')
                        continue;
+               cp++;
 
                /* Skip input sequences of more than two '-'. */
 
@@ -435,14 +436,13 @@ check_text_em(struct roff_man *mdoc, int ln, int pos, char *p)
                     isalpha((unsigned char)cp[-3]) :
                     np != NULL &&
                     np->type == ROFFT_TEXT &&
-                    np->string != '\0' &&
+                    *np->string != '\0' &&
                     isalpha((unsigned char)np->string[
                       strlen(np->string) - 1])) ||
-                   (cp[2] != '\0' ?
+                   (cp[1] != '\0' && cp[2] != '\0' ?
                     isalpha((unsigned char)cp[2]) :
                     nn != NULL &&
                     nn->type == ROFFT_TEXT &&
-                    nn->string != '\0' &&
                     isalpha((unsigned char)*nn->string))) {
                        mandoc_msg(MANDOCERR_DASHDASH, mdoc->parse,
                            ln, pos + (int)(cp - p) - 1, NULL);
@@ -1003,10 +1003,10 @@ post_lb(POST_ARGS)
 
        roff_word_alloc(mdoc, n->line, n->pos, "library");
        mdoc->last->flags = NODE_NOSRC;
-       roff_word_alloc(mdoc, n->line, n->pos, "\\(Lq");
+       roff_word_alloc(mdoc, n->line, n->pos, "\\(lq");
        mdoc->last->flags = NODE_DELIMO | NODE_NOSRC;
        mdoc->last = mdoc->last->next;
-       roff_word_alloc(mdoc, n->line, n->pos, "\\(Rq");
+       roff_word_alloc(mdoc, n->line, n->pos, "\\(rq");
        mdoc->last->flags = NODE_DELIMC | NODE_NOSRC;
        mdoc->last = n;
 }
@@ -1987,8 +1987,10 @@ post_root(POST_ARGS)
        /* Check that we begin with a proper `Sh'. */
 
        n = mdoc->first->child;
-       while (n != NULL && n->tok >= MDOC_Dd &&
-           mdoc_macros[n->tok].flags & MDOC_PROLOGUE)
+       while (n != NULL &&
+           (n->type == ROFFT_COMMENT ||
+            (n->tok >= MDOC_Dd &&
+             mdoc_macro(n->tok)->flags & MDOC_PROLOGUE)))
                n = n->next;
 
        if (n == NULL)