]> git.cameronkatri.com Git - mandoc.git/commitdiff
Make args_checkpunct() use mdoc_isdelim() instead of mdoc_iscdelim(),
authorKristaps Dzonsons <kristaps@bsd.lv>
Thu, 17 Mar 2011 01:23:28 +0000 (01:23 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Thu, 17 Mar 2011 01:23:28 +0000 (01:23 +0000)
which is wrong.  Then remove mdoc_iscdelim() alltogether.

libmdoc.h
mdoc_argv.c
mdoc_strings.c

index 5a46d1cfb98b52bb07ca2bd3814ead3b981cd657..f1089c821c875c8a36a1cf8fc2b9a72165b9b31f 100644 (file)
--- a/libmdoc.h
+++ b/libmdoc.h
@@ -1,4 +1,4 @@
-/*     $Id: libmdoc.h,v 1.63 2010/11/30 13:04:14 kristaps Exp $ */
+/*     $Id: libmdoc.h,v 1.64 2011/03/17 01:23:28 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -114,7 +114,7 @@ int           mdoc_endbody_alloc(struct mdoc *m, int line, int pos,
 void             mdoc_node_delete(struct mdoc *, struct mdoc_node *);
 void             mdoc_hash_init(void);
 enum mdoct       mdoc_hash_find(const char *);
-enum mdelim      mdoc_iscdelim(char);
+#define        DELIMSZ   6 /* maximum size of a delimiter string */
 enum mdelim      mdoc_isdelim(const char *);
 size_t           mdoc_isescape(const char *);
 enum   mdoc_sec  mdoc_str2sec(const char *);
index c404dae31e0a6d9cdf4fcb8d0168009050332794..dc28916ca34ce46d3f2021ac391a57a1e37f8422 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_argv.c,v 1.64 2011/03/17 00:58:14 kristaps Exp $ */
+/*     $Id: mdoc_argv.c,v 1.65 2011/03/17 01:23:28 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -412,13 +412,6 @@ args(struct mdoc *m, int line, int *pos,
                return(ARGS_EOLN);
        }
 
-       /* 
-        * If the first character is a closing delimiter and we're to
-        * look for delimited strings, then pass down the buffer seeing
-        * if it follows the pattern of [[::delim::][ ]+]+.  Note that
-        * we ONLY care about closing delimiters.
-        */
-
        *v = &buf[*pos];
 
        if (ARGS_DELIM & fl && args_checkpunct(&buf[*pos])) {
@@ -572,28 +565,50 @@ args(struct mdoc *m, int line, int *pos,
 
 /* 
  * Check if the string consists only of space-separated closing
- * delimiters.
+ * delimiters.  This is a bit of a dance: the first must be a close
+ * delimiter, but it may be followed by middle delimiters.  Arbitrary
+ * whitespace may separate these tokens.
  */
 static int
 args_checkpunct(const char *p)
 {
-       int              i;
+       int              i, j;
+       char             buf[DELIMSZ];
        enum mdelim      d;
 
        i = 0;
 
-       if (DELIM_CLOSE != mdoc_iscdelim(p[i]))
+       /* First token must be a close-delimiter. */
+
+       for (j = 0; p[i] && ' ' != p[i] && j < DELIMSZ; j++, i++)
+               buf[j] = p[i];
+
+       if (DELIMSZ == j)
                return(0);
 
-       while ('\0' != p[i]) {
-               d = mdoc_iscdelim(p[i]);
-               if (DELIM_NONE == d || DELIM_OPEN == d)
-                       break;
-               i++;
-               if ('\0' == p[i] || ' ' != p[i])
-                       break;
+       buf[j] = '\0';
+       if (DELIM_CLOSE != mdoc_isdelim(buf))
+               return(0);
+
+       while (' ' == p[i])
                i++;
-               while (p[i] && ' ' == p[i])
+
+       /* Remaining must NOT be open/none. */
+       
+       while (p[i]) {
+               j = 0;
+               while (p[i] && ' ' != p[i] && j < DELIMSZ)
+                       buf[j++] = p[i++];
+
+               if (DELIMSZ == j)
+                       return(0);
+
+               buf[j] = '\0';
+               d = mdoc_isdelim(buf);
+               if (DELIM_NONE == d || DELIM_OPEN == d)
+                       return(0);
+
+               while (' ' == p[i])
                        i++;
        }
 
index e7ced1fe1b37e496ab3627e46e85e77cffb0cb6d..83e58a9845a934ce0d1bb9e9f473998d7d64d7f3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_strings.c,v 1.24 2010/07/31 23:52:58 schwarze Exp $ */
+/*     $Id: mdoc_strings.c,v 1.25 2011/03/17 01:23:29 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -54,53 +54,40 @@ static      const char * const secnames[SEC__MAX] = {
        NULL
 };
 
-/* 
- * FIXME: this is repeated in print_text() (html.c) and term_word()
- * (term.c).
- */
-enum mdelim
-mdoc_iscdelim(char p)
-{
-
-       switch (p) {
-       case('('):
-               /* FALLTHROUGH */
-       case('['):
-               return(DELIM_OPEN);
-       case('|'):
-               return(DELIM_MIDDLE);
-       case('.'):
-               /* FALLTHROUGH */
-       case(','):
-               /* FALLTHROUGH */
-       case(';'):
-               /* FALLTHROUGH */
-       case(':'):
-               /* FALLTHROUGH */
-       case('?'):
-               /* FALLTHROUGH */
-       case('!'):
-               /* FALLTHROUGH */
-       case(')'):
-               /* FALLTHROUGH */
-       case(']'):
-               return(DELIM_CLOSE);
-       default:
-               break;
-       }
-
-       return(DELIM_NONE);
-}
-
-
 enum mdelim
 mdoc_isdelim(const char *p)
 {
 
        if ('\0' == p[0])
                return(DELIM_NONE);
+
        if ('\0' == p[1])
-               return(mdoc_iscdelim(p[0]));
+               switch (p[0]) {
+               case('('):
+                       /* FALLTHROUGH */
+               case('['):
+                       return(DELIM_OPEN);
+               case('|'):
+                       return(DELIM_MIDDLE);
+               case('.'):
+                       /* FALLTHROUGH */
+               case(','):
+                       /* FALLTHROUGH */
+               case(';'):
+                       /* FALLTHROUGH */
+               case(':'):
+                       /* FALLTHROUGH */
+               case('?'):
+                       /* FALLTHROUGH */
+               case('!'):
+                       /* FALLTHROUGH */
+               case(')'):
+                       /* FALLTHROUGH */
+               case(']'):
+                       return(DELIM_CLOSE);
+               default:
+                       return(DELIM_NONE);
+               }
 
        /*
         * XXX; account for groff bubu where the \*(Ba reserved string