To: vim_dev@googlegroups.com Subject: Patch 7.4.771 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.771 Problem: Search does not handle multi-byte character at the start position correctly. Solution: Take byte size of character into account. (Yukihiro Nakadaira) Files: src/search.c, src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak, src/testdir/Make_ming.mak, src/testdir/Make_os2.mak, src/testdir/Make_vms.mms, src/testdir/Makefile, src/testdir/test_search_mbyte.in, src/testdir/test_search_mbyte.ok *** ../vim-7.4.770/src/search.c 2015-03-13 15:02:46.254059251 +0100 --- src/search.c 2015-07-10 14:37:49.055931842 +0200 *************** *** 548,553 **** --- 548,554 ---- pos_T start_pos; int at_first_line; int extra_col; + int start_char_len; int match_ok; long nmatched; int submatch = 0; *************** *** 574,596 **** /* When not accepting a match at the start position set "extra_col" to * a non-zero value. Don't do that when starting at MAXCOL, since * MAXCOL + 1 is zero. */ ! if ((options & SEARCH_START) || pos->col == MAXCOL) ! extra_col = 0; #ifdef FEAT_MBYTE /* Watch out for the "col" being MAXCOL - 2, used in a closed fold. */ ! else if (dir != BACKWARD && has_mbyte ! && pos->lnum >= 1 && pos->lnum <= buf->b_ml.ml_line_count ! && pos->col < MAXCOL - 2) { ptr = ml_get_buf(buf, pos->lnum, FALSE) + pos->col; if (*ptr == NUL) ! extra_col = 1; else ! extra_col = (*mb_ptr2len)(ptr); } #endif else ! extra_col = 1; start_pos = *pos; /* remember start pos for detecting no match */ found = 0; /* default: not found */ --- 575,611 ---- /* When not accepting a match at the start position set "extra_col" to * a non-zero value. Don't do that when starting at MAXCOL, since * MAXCOL + 1 is zero. */ ! if (pos->col == MAXCOL) ! start_char_len = 0; #ifdef FEAT_MBYTE /* Watch out for the "col" being MAXCOL - 2, used in a closed fold. */ ! else if (has_mbyte ! && pos->lnum >= 1 && pos->lnum <= buf->b_ml.ml_line_count ! && pos->col < MAXCOL - 2) { ptr = ml_get_buf(buf, pos->lnum, FALSE) + pos->col; if (*ptr == NUL) ! start_char_len = 1; else ! start_char_len = (*mb_ptr2len)(ptr); } #endif else ! start_char_len = 1; ! if (dir == FORWARD) ! { ! if (options & SEARCH_START) ! extra_col = 0; ! else ! extra_col = start_char_len; ! } ! else ! { ! if (options & SEARCH_START) ! extra_col = start_char_len; ! else ! extra_col = 0; ! } start_pos = *pos; /* remember start pos for detecting no match */ found = 0; /* default: not found */ *************** *** 779,793 **** || (lnum + regmatch.endpos[0].lnum == start_pos.lnum && (int)regmatch.endpos[0].col - 1 ! + extra_col ! <= (int)start_pos.col)) : (lnum + regmatch.startpos[0].lnum < start_pos.lnum || (lnum + regmatch.startpos[0].lnum == start_pos.lnum && (int)regmatch.startpos[0].col ! + extra_col ! <= (int)start_pos.col)))) { match_ok = TRUE; matchpos = regmatch.startpos[0]; --- 794,808 ---- || (lnum + regmatch.endpos[0].lnum == start_pos.lnum && (int)regmatch.endpos[0].col - 1 ! < (int)start_pos.col ! + extra_col)) : (lnum + regmatch.startpos[0].lnum < start_pos.lnum || (lnum + regmatch.startpos[0].lnum == start_pos.lnum && (int)regmatch.startpos[0].col ! < (int)start_pos.col ! + extra_col)))) { match_ok = TRUE; matchpos = regmatch.startpos[0]; *** ../vim-7.4.770/src/testdir/Make_amiga.mak 2015-06-25 13:57:20.033431073 +0200 --- src/testdir/Make_amiga.mak 2015-07-10 14:36:33.776641084 +0200 *************** *** 57,62 **** --- 57,63 ---- test_perl.out \ test_qf_title.out \ test_ruby.out \ + test_search_mbyte.out \ test_set.out \ test_signs.out \ test_textobjects.out \ *************** *** 205,210 **** --- 206,212 ---- test_perl.out: test_perl.in test_qf_title.out: test_qf_title.in test_ruby.out: test_ruby.in + test_search_mbyte.out: test_search_mbyte.in test_set.out: test_set.in test_signs.out: test_signs.in test_textobjects.out: test_textobjects.in *** ../vim-7.4.770/src/testdir/Make_dos.mak 2015-06-25 13:57:20.033431073 +0200 --- src/testdir/Make_dos.mak 2015-07-10 14:36:43.384550582 +0200 *************** *** 56,61 **** --- 56,62 ---- test_perl.out \ test_qf_title.out \ test_ruby.out \ + test_search_mbyte.out \ test_set.out \ test_signs.out \ test_textobjects.out \ *** ../vim-7.4.770/src/testdir/Make_ming.mak 2015-06-25 13:57:20.033431073 +0200 --- src/testdir/Make_ming.mak 2015-07-10 14:36:50.716481518 +0200 *************** *** 78,83 **** --- 78,84 ---- test_perl.out \ test_qf_title.out \ test_ruby.out \ + test_search_mbyte.out \ test_set.out \ test_signs.out \ test_textobjects.out \ *** ../vim-7.4.770/src/testdir/Make_os2.mak 2015-06-25 13:57:20.033431073 +0200 --- src/testdir/Make_os2.mak 2015-07-10 14:36:52.820461700 +0200 *************** *** 58,63 **** --- 58,64 ---- test_perl.out \ test_qf_title.out \ test_ruby.out \ + test_search_mbyte.out \ test_set.out \ test_signs.out \ test_textobjects.out \ *** ../vim-7.4.770/src/testdir/Make_vms.mms 2015-06-25 13:57:20.033431073 +0200 --- src/testdir/Make_vms.mms 2015-07-10 14:36:58.240410647 +0200 *************** *** 4,10 **** # Authors: Zoltan Arpadffy, # Sandor Kopanyi, # ! # Last change: 2015 Jun 19 # # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. # Edit the lines in the Configuration section below to select. --- 4,10 ---- # Authors: Zoltan Arpadffy, # Sandor Kopanyi, # ! # Last change: 2015 Jul 10 # # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. # Edit the lines in the Configuration section below to select. *************** *** 117,122 **** --- 117,123 ---- test_perl.out \ test_qf_title.out \ test_ruby.out \ + test_search_mbyte.out \ test_set.out \ test_signs.out \ test_textobjects.out \ *** ../vim-7.4.770/src/testdir/Makefile 2015-06-25 13:57:20.033431073 +0200 --- src/testdir/Makefile 2015-07-10 14:37:09.404305492 +0200 *************** *** 54,59 **** --- 54,60 ---- test_perl.out \ test_qf_title.out \ test_ruby.out \ + test_search_mbyte.out \ test_set.out \ test_signs.out \ test_textobjects.out \ *** ../vim-7.4.770/src/testdir/test_search_mbyte.in 2015-07-10 14:42:43.513156459 +0200 --- src/testdir/test_search_mbyte.in 2015-07-10 14:33:38.430293025 +0200 *************** *** 0 **** --- 1,15 ---- + Test for search('multi-byte char', 'bce') + + STARTTEST + :source small.vim + :source mbyte.vim + :set encoding=utf-8 + :/^Test bce:/+1 + :$put =search('A', 'bce', line('.')) + :1;/^Results:/,$wq! test.out + ENDTEST + + Results: + + Test bce: + A *** ../vim-7.4.770/src/testdir/test_search_mbyte.ok 2015-07-10 14:42:43.517156422 +0200 --- src/testdir/test_search_mbyte.ok 2015-07-10 14:34:23.409869226 +0200 *************** *** 0 **** --- 1,5 ---- + Results: + + Test bce: + A + 15 *** ../vim-7.4.770/src/version.c 2015-07-10 14:05:03.930436893 +0200 --- src/version.c 2015-07-10 14:37:46.207958692 +0200 *************** *** 743,744 **** --- 743,746 ---- { /* Add new patch number below this line */ + /**/ + 771, /**/ -- hundred-and-one symptoms of being an internet addict: 197. Your desk collapses under the weight of your computer peripherals. /// 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 ///