To: vim_dev@googlegroups.com Subject: Patch 7.3.180 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.180 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) Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok *** ../vim-7.3.179/src/misc1.c 2011-05-10 11:56:26.000000000 +0200 --- src/misc1.c 2011-05-10 13:24:38.000000000 +0200 *************** *** 1561,1566 **** --- 1561,1569 ---- 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,1575 **** /* * Repeat to match several nested comment strings. */ ! while (line[i]) { /* * scan through the 'comments' option for a match --- 1572,1578 ---- /* * Repeat to match several nested comment strings. */ ! while (line[i] != NUL) { /* * scan through the 'comments' option for a match *************** *** 1577,1658 **** 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; (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 (got_com && vim_strchr(part_buf, COM_NEST) == NULL) continue; ! /* When 'O' flag used don't use for "O" command */ if (backward && vim_strchr(part_buf, COM_NOBACK) != NULL) continue; ! /* ! * 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). ! */ if (vim_iswhite(string[0])) { if (i == 0 || !vim_iswhite(line[i - 1])) ! continue; while (vim_iswhite(string[0])) ++string; } for (j = 0; string[j] != NUL && string[j] == line[i + j]; ++j) ; if (string[j] != NUL) ! continue; ! /* ! * 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; found_one = TRUE; break; } ! /* ! * No match found, stop scanning. ! */ if (!found_one) break; ! /* ! * Include any trailing white space. ! */ while (vim_iswhite(line[i])) ++i; ! /* ! * If this comment doesn't nest, stop here. ! */ if (vim_strchr(part_buf, COM_NEST) == NULL) break; } return (got_com ? i : 0); } #endif --- 1580,1683 ---- 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) ! *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 */ ! /* 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 present and using "O" command skip this one. */ if (backward && vim_strchr(part_buf, COM_NOBACK) != NULL) continue; ! /* 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). */ if (vim_iswhite(string[0])) { if (i == 0 || !vim_iswhite(line[i - 1])) ! 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; /* string doesn't match */ ! /* 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 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; } ! 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. */ while (vim_iswhite(line[i])) ++i; ! /* 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 *** ../vim-7.3.179/src/testdir/test3.in 2011-05-10 11:56:26.000000000 +0200 --- src/testdir/test3.in 2011-05-10 12:05:50.000000000 +0200 *************** *** 1373,1378 **** --- 1373,1390 ---- } STARTTEST + :set com=s1:/*,m:*,ex:*/ + ]]3jofoo(); + ENDTEST + + void func(void) + { + /* + * This is a comment. + */ + } + + STARTTEST :g/^STARTTEST/.,/^ENDTEST/d :1;/start of AUTO/,$wq! test.out ENDTEST *** ../vim-7.3.179/src/testdir/test3.ok 2011-05-10 11:56:26.000000000 +0200 --- src/testdir/test3.ok 2011-05-10 12:05:50.000000000 +0200 *************** *** 1225,1227 **** --- 1225,1236 ---- << "c"; } + + void func(void) + { + /* + * This is a comment. + */ + foo(); + } + *** ../vim-7.3.179/src/version.c 2011-05-10 11:56:26.000000000 +0200 --- src/version.c 2011-05-10 13:37:28.000000000 +0200 *************** *** 716,717 **** --- 716,719 ---- { /* Add new patch number below this line */ + /**/ + 180, /**/ -- "Thou shalt not follow the Null Pointer, for at its end Chaos and Madness lie." /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///