]> git.cameronkatri.com Git - mandoc.git/commitdiff
Move checking of escapes into roff.c, where we're already stepping
authorKristaps Dzonsons <kristaps@bsd.lv>
Tue, 26 Jul 2011 14:09:01 +0000 (14:09 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Tue, 26 Jul 2011 14:09:01 +0000 (14:09 +0000)
through looking for user-defined escapes.  This clears up a nice bit of
validation code.

man_validate.c
mdoc_validate.c
roff.c

index 1aeb703dce8f597493a2f5fa32f6d3d7555e170e..7f0581c585b3cad6ea4087f133206192af1112f2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_validate.c,v 1.71 2011/07/24 18:15:14 kristaps Exp $ */
+/*     $Id: man_validate.c,v 1.72 2011/07/26 14:09:01 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -207,45 +207,15 @@ check_root(CHKARGS)
 }
 
 static void
-check_text(CHKARGS) 
+check_text(CHKARGS)
 {
-       char            *p, *pp, *cpp;
-       int              pos;
-       size_t           sz;
+       char            *cp, *p;
 
-       p = n->string;
-       pos = n->pos + 1;
-
-       while ('\0' != *p) {
-               sz = strcspn(p, "\t\\");
-
-               p += (int)sz;
-               pos += (int)sz;
-
-               if ('\t' == *p) {
-                       if ( ! (MAN_LITERAL & m->flags))
-                               man_pmsg(m, n->line, pos, MANDOCERR_BADTAB);
-                       p++;
-                       pos++;
+       cp = p = n->string;
+       for (cp = p; NULL != (p = strchr(p, '\t')); p++) {
+               if (MAN_LITERAL & m->flags)
                        continue;
-               } else if ('\0' == *p)
-                       break;
-
-               pos++;
-               pp = ++p;
-
-               if (ESCAPE_ERROR == mandoc_escape
-                               ((const char **)&pp, NULL, NULL)) {
-                       man_pmsg(m, n->line, pos, MANDOCERR_BADESCAPE);
-                       break;
-               }
-
-               cpp = p;
-               while (NULL != (cpp = memchr(cpp, ASCII_HYPH, pp - cpp)))
-                       *cpp = '-';
-
-               pos += pp - p;
-               p = pp;
+               man_pmsg(m, n->line, (int)(p - cp), MANDOCERR_BADTAB);
        }
 }
 
index b8f277fa912774772bc5b3587a40acacf593c3cd..c292032128f43b29707e67ee4c7522564cbe3a8a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.171 2011/07/24 18:15:14 kristaps Exp $ */
+/*     $Id: mdoc_validate.c,v 1.172 2011/07/26 14:09:01 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -545,39 +545,13 @@ check_argv(struct mdoc *m, struct mdoc_node *n, struct mdoc_argv *v)
 static void
 check_text(struct mdoc *m, int ln, int pos, char *p)
 {
-       char            *cpp, *pp;
-       size_t           sz;
-
-       while ('\0' != *p) {
-               sz = strcspn(p, "\t\\");
-
-               p += (int)sz;
-               pos += (int)sz;
+       char            *cp;
 
-               if ('\t' == *p) {
-                       if ( ! (MDOC_LITERAL & m->flags))
-                               mdoc_pmsg(m, ln, pos, MANDOCERR_BADTAB);
-                       p++;
-                       pos++;
+       cp = p;
+       for (cp = p; NULL != (p = strchr(p, '\t')); p++) {
+               if (MDOC_LITERAL & m->flags)
                        continue;
-               } else if ('\0' == *p)
-                       break;
-
-               pos++;
-               pp = ++p;
-
-               if (ESCAPE_ERROR == mandoc_escape
-                               ((const char **)&pp, NULL, NULL)) {
-                       mdoc_pmsg(m, ln, pos, MANDOCERR_BADESCAPE);
-                       break;
-               }
-
-               cpp = p;
-               while (NULL != (cpp = memchr(cpp, ASCII_HYPH, pp - cpp)))
-                       *cpp = '-';
-
-               pos += pp - p;
-               p = pp;
+               mdoc_pmsg(m, ln, (int)(p - cp), MANDOCERR_BADTAB);
        }
 }
 
diff --git a/roff.c b/roff.c
index b43211fbbe3ff8c9300225ff671065e7d745168c..439516feb12ac58ebd0266fa6e58f1cbd0423839 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.151 2011/07/25 15:37:00 kristaps Exp $ */
+/*     $Id: roff.c,v 1.152 2011/07/26 14:09:01 kristaps Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -404,6 +404,7 @@ roff_alloc(struct mparse *parse)
 static int
 roff_res(struct roff *r, char **bufp, size_t *szp, int ln, int pos)
 {
+       enum mandoc_esc  esc;
        const char      *stesc; /* start of an escape sequence ('\\') */
        const char      *stnam; /* start of the name, after "[(*" */
        const char      *cp;    /* end of the name, e.g. before ']' */
@@ -426,8 +427,19 @@ roff_res(struct roff *r, char **bufp, size_t *szp, int ln, int pos)
 
                if ('\0' == *cp)
                        return(1);
-               if ('*' != *cp++)
+
+               if ('*' != *cp) {
+                       res = cp;
+                       esc = mandoc_escape(&cp, NULL, NULL);
+                       if (ESCAPE_ERROR != esc)
+                               continue;
+                       mandoc_msg(MANDOCERR_BADESCAPE, 
+                                       r->parse, ln, pos, NULL);
+                       cp = res;
                        continue;
+               }
+
+               cp++;
 
                /*
                 * The third character decides the length