]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.180 v7.3.180
authorBram Moolenaar <Bram@vim.org>
Tue, 10 May 2011 11:38:27 +0000 (13:38 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 10 May 2011 11:38:27 +0000 (13:38 +0200)
Problem:    When both a middle part of 'comments' matches and an end part, the
            middle part was used errornously.
Solution:   After finding the middle part match continue looking for a better
            end part match. (partly by Lech Lorens)

src/misc1.c
src/testdir/test3.in
src/testdir/test3.ok
src/version.c

index a5c4607e331dd9c0c10e36071a2b2d739d517e78..8700390112e708e9f339804433900d0e9d6fa247 100644 (file)
@@ -1561,6 +1561,9 @@ get_leader_len(line, flags, backward)
     char_u     part_buf[COM_MAX_LEN];  /* buffer for one option part */
     char_u     *string;                /* pointer to comment string */
     char_u     *list;
+    int                middle_match_len = 0;
+    char_u     *prev_list;
+    char_u     *saved_flags;
 
     i = 0;
     while (vim_iswhite(line[i]))    /* leading white space is ignored */
@@ -1569,7 +1572,7 @@ get_leader_len(line, flags, backward)
     /*
      * Repeat to match several nested comment strings.
      */
-    while (line[i])
+    while (line[i] != NUL)
     {
        /*
         * scan through the 'comments' option for a match
@@ -1577,82 +1580,104 @@ get_leader_len(line, flags, backward)
        found_one = FALSE;
        for (list = curbuf->b_p_com; *list; )
        {
-           /*
-            * Get one option part into part_buf[].  Advance list to next one.
-            * put string at start of string.
-            */
-           if (!got_com && flags != NULL)  /* remember where flags started */
-               *flags = list;
+           /* Get one option part into part_buf[].  Advance "list" to next
+            * one.  Put "string" at start of string.  */
+           if (!got_com && flags != NULL)
+               *flags = list;      /* remember where flags started */
+           prev_list = list;
            (void)copy_option_part(&list, part_buf, COM_MAX_LEN, ",");
            string = vim_strchr(part_buf, ':');
            if (string == NULL)     /* missing ':', ignore this part */
                continue;
            *string++ = NUL;        /* isolate flags from string */
 
-           /*
-            * When already found a nested comment, only accept further
-            * nested comments.
-            */
+           /* If we found a middle match previously, use that match when this
+            * is not a middle or end. */
+           if (middle_match_len != 0
+                   && vim_strchr(part_buf, COM_MIDDLE) == NULL
+                   && vim_strchr(part_buf, COM_END) == NULL)
+               break;
+
+           /* When we already found a nested comment, only accept further
+            * nested comments. */
            if (got_com && vim_strchr(part_buf, COM_NEST) == NULL)
                continue;
 
-           /* When 'O' flag used don't use for "O" command */
+           /* When 'O' flag present and using "O" command skip this one. */
            if (backward && vim_strchr(part_buf, COM_NOBACK) != NULL)
                continue;
 
-           /*
-            * Line contents and string must match.
+           /* Line contents and string must match.
             * When string starts with white space, must have some white space
             * (but the amount does not need to match, there might be a mix of
-            * TABs and spaces).
-            */
+            * TABs and spaces). */
            if (vim_iswhite(string[0]))
            {
                if (i == 0 || !vim_iswhite(line[i - 1]))
-                   continue;
+                   continue;  /* missing shite space */
                while (vim_iswhite(string[0]))
                    ++string;
            }
            for (j = 0; string[j] != NUL && string[j] == line[i + j]; ++j)
                ;
            if (string[j] != NUL)
-               continue;
+               continue;  /* string doesn't match */
 
-           /*
-            * When 'b' flag used, there must be white space or an
-            * end-of-line after the string in the line.
-            */
+           /* When 'b' flag used, there must be white space or an
+            * end-of-line after the string in the line. */
            if (vim_strchr(part_buf, COM_BLANK) != NULL
                           && !vim_iswhite(line[i + j]) && line[i + j] != NUL)
                continue;
 
-           /*
-            * We have found a match, stop searching.
-            */
-           i += j;
-           got_com = TRUE;
+           /* We have found a match, stop searching unless this is a middle
+            * comment. The middle comment can be a substring of the end
+            * comment in which case it's better to return the length of the
+            * end comment and its flags.  Thus we keep searching with middle
+            * and end matches and use an end match if it matches better. */
+           if (vim_strchr(part_buf, COM_MIDDLE) != NULL)
+           {
+               if (middle_match_len == 0)
+               {
+                   middle_match_len = j;
+                   saved_flags = prev_list;
+               }
+               continue;
+           }
+           if (middle_match_len != 0 && j > middle_match_len)
+               /* Use this match instead of the middle match, since it's a
+                * longer thus better match. */
+               middle_match_len = 0;
+
+           if (middle_match_len == 0)
+               i += j;
            found_one = TRUE;
            break;
        }
 
-       /*
-        * No match found, stop scanning.
-        */
+       if (middle_match_len != 0)
+       {
+           /* Use the previously found middle match after failing to find a
+            * match with an end. */
+           if (!got_com && flags != NULL)
+               *flags = saved_flags;
+           i += middle_match_len;
+           found_one = TRUE;
+       }
+
+       /* No match found, stop scanning. */
        if (!found_one)
            break;
 
-       /*
-        * Include any trailing white space.
-        */
+       /* Include any trailing white space. */
        while (vim_iswhite(line[i]))
            ++i;
 
-       /*
-        * If this comment doesn't nest, stop here.
-        */
+       /* If this comment doesn't nest, stop here. */
+       got_com = TRUE;
        if (vim_strchr(part_buf, COM_NEST) == NULL)
            break;
     }
+
     return (got_com ? i : 0);
 }
 #endif
index e4c699394fb9280834fff5c7d9d8bbb32285bac4..56a1dc89478ab762403b295d08d1963c378442bf 100644 (file)
@@ -1372,6 +1372,18 @@ void func(void)
        << "c";
 }
 
+STARTTEST
+:set com=s1:/*,m:*,ex:*/
+]]3jofoo();\e
+ENDTEST
+
+void func(void)
+{
+       /*
+        * This is a comment.
+        */
+}
+
 STARTTEST
 :g/^STARTTEST/.,/^ENDTEST/d
 :1;/start of AUTO/,$wq! test.out
index 39b485950e57c800ef83556d6889da6ba8bfa631..656b16ecb5549ab9d68e53d957f49f42b25b5aed 100644 (file)
@@ -1225,3 +1225,12 @@ void func(void)
                << "c";
 }
 
+
+void func(void)
+{
+       /*
+        * This is a comment.
+        */
+       foo();
+}
+
index 2713ffc43cbb8dba79b796bcc77bfe61d2d854fe..6a21278b1a12d730b03810486173fb17ea9252f7 100644 (file)
@@ -714,6 +714,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    180,
 /**/
     179,
 /**/