| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.636 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.636 (after 7.3.625) |
| Problem: Not all zero-width matches handled correctly for "gn". |
| Solution: Move zero-width detection to a separate function. (Christian |
| Brabandt) |
| Files: src/search.c |
| |
| |
| |
| |
| |
| *** 4526,4531 **** |
| --- 4526,4533 ---- |
| #endif /* FEAT_TEXTOBJ */ |
| |
| #if defined(FEAT_VISUAL) || defined(PROTO) |
| + static int is_zerowidth __ARGS((char_u *pattern)); |
| + |
| /* |
| * Find next search match under cursor, cursor at end. |
| * Used while an operator is pending, and in Visual mode. |
| |
| *** 4546,4556 **** |
| int visual_active = FALSE; |
| int flags = 0; |
| pos_T save_VIsual; |
| - regmmatch_T regmatch; |
| - int nmatched = 0; |
| int zerowidth = FALSE; |
| |
| - |
| /* wrapping should not occur */ |
| p_ws = FALSE; |
| |
| --- 4548,4555 ---- |
| |
| *** 4583,4606 **** |
| else |
| orig_pos = pos = start_pos = curwin->w_cursor; |
| |
| ! /* |
| ! * Check for zero-width pattern. |
| ! */ |
| ! if (search_regcomp(spats[last_idx].pat, RE_SEARCH, RE_SEARCH, |
| ! ((SEARCH_HIS + SEARCH_KEEP)), ®match) == FAIL) |
| return FAIL; |
| |
| - /* Zero-width pattern should match somewhere, then we can check if start |
| - * and end are in the same position. */ |
| - nmatched = vim_regexec_multi(®match, curwin, curbuf, |
| - curwin->w_cursor.lnum, (colnr_T)0, NULL); |
| - if (called_emsg) |
| - return FAIL; |
| - if (nmatched && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum |
| - && regmatch.endpos[0].col == regmatch.startpos[0].col) |
| - zerowidth = TRUE; |
| - vim_free(regmatch.regprog); |
| - |
| /* |
| * The trick is to first search backwards and then search forward again, |
| * so that a match at the current cursor position will be correctly |
| --- 4582,4592 ---- |
| else |
| orig_pos = pos = start_pos = curwin->w_cursor; |
| |
| ! /* Is the pattern is zero-width? */ |
| ! zerowidth = is_zerowidth(spats[last_idx].pat); |
| ! if (zerowidth == -1) |
| return FAIL; |
| |
| /* |
| * The trick is to first search backwards and then search forward again, |
| * so that a match at the current cursor position will be correctly |
| |
| *** 4693,4698 **** |
| --- 4679,4721 ---- |
| |
| return OK; |
| } |
| + |
| + /* |
| + * Check if the pattern is zero-width. |
| + * Returns TRUE, FALSE or -1 for failure. |
| + */ |
| + static int |
| + is_zerowidth(pattern) |
| + char_u *pattern; |
| + { |
| + regmmatch_T regmatch; |
| + int nmatched = 0; |
| + int result = -1; |
| + pos_T pos; |
| + |
| + if (search_regcomp(pattern, RE_SEARCH, RE_SEARCH, |
| + SEARCH_KEEP, ®match) == FAIL) |
| + return -1; |
| + |
| + /* move to match */ |
| + clearpos(&pos); |
| + if (searchit(curwin, curbuf, &pos, FORWARD, spats[last_idx].pat, 1, |
| + SEARCH_KEEP, RE_SEARCH, 0, NULL) != FAIL) |
| + { |
| + /* Zero-width pattern should match somewhere, then we can check if |
| + * start and end are in the same position. */ |
| + nmatched = vim_regexec_multi(®match, curwin, curbuf, |
| + pos.lnum, (colnr_T)0, NULL); |
| + |
| + if (!called_emsg) |
| + result = (nmatched != 0 |
| + && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum |
| + && regmatch.startpos[0].col == regmatch.endpos[0].col); |
| + } |
| + |
| + vim_free(regmatch.regprog); |
| + return result; |
| + } |
| #endif /* FEAT_VISUAL */ |
| |
| #if defined(FEAT_LISP) || defined(FEAT_CINDENT) || defined(FEAT_TEXTOBJ) \ |
| |
| |
| |
| *** 721,722 **** |
| --- 721,724 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 636, |
| /**/ |
| |
| -- |
| Edison's greatest achievement came in 1879, when he invented the |
| electric company. Edison's design was a brilliant adaptation of the |
| simple electrical circuit: the electric company sends electricity |
| through a wire to a customer, then immediately gets the electricity |
| back through another wire |
| |
| /// 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 /// |