x2 seems not be initialized by -1. On 1/18/13, Bram Moolenaar <b...@moolenaar.net> wrote: > > Patch 7.3.769 > Problem: 'matchpairs' does not work with multi-byte characters. > Solution: Make it work. (Christian Brabandt) > Files: src/misc1.c, src/option.c, src/proto/option.pro, > src/search.c, > src/testdir/test69.in, src/testdir/test69.ok > > > *** ../vim-7.3.768/src/misc1.c 2012-08-15 14:04:50.000000000 +0200 > --- src/misc1.c 2013-01-17 15:55:09.000000000 +0100 > *************** > *** 2288,2301 **** > */ > if (p_sm && (State & INSERT) > && msg_silent == 0 > - #ifdef FEAT_MBYTE > - && charlen == 1 > - #endif > #ifdef FEAT_INS_EXPAND > && !ins_compl_active() > #endif > ) > ! showmatch(c); > > #ifdef FEAT_RIGHTLEFT > if (!p_ri || (State & REPLACE_FLAG)) > --- 2288,2305 ---- > */ > if (p_sm && (State & INSERT) > && msg_silent == 0 > #ifdef FEAT_INS_EXPAND > && !ins_compl_active() > #endif > ) > ! { > ! #ifdef FEAT_MBYTE > ! if (has_mbyte) > ! showmatch(mb_ptr2char(buf)); > ! else > ! #endif > ! showmatch(c); > ! } > > #ifdef FEAT_RIGHTLEFT > if (!p_ri || (State & REPLACE_FLAG)) > *** ../vim-7.3.768/src/option.c 2012-12-05 14:42:56.000000000 +0100 > --- src/option.c 2013-01-17 16:38:42.000000000 +0100 > *************** > *** 6149,6164 **** > /* 'matchpairs' */ > else if (gvarp == &p_mps) > { > ! /* Check for "x:y,x:y" */ > ! for (p = *varp; *p != NUL; p += 4) > { > ! if (p[1] != ':' || p[2] == NUL || (p[3] != NUL && p[3] != ',')) > { > ! errmsg = e_invarg; > ! break; > } > - if (p[3] == NUL) > - break; > } > } > > --- 6149,6194 ---- > /* 'matchpairs' */ > else if (gvarp == &p_mps) > { > ! #ifdef FEAT_MBYTE > ! if (has_mbyte) > { > ! for (p = *varp; *p != NUL; ++p) > { > ! int x2,x3 = -1; > ! > ! if (*p != NUL) > ! p += mb_ptr2len(p); > ! if (*p != NUL) > ! x2 = *p++; > ! if (*p != NUL) > ! { > ! x3 = mb_ptr2char(p); > ! p += mb_ptr2len(p); > ! } > ! if (x2 != ':' || x2 == -1 || x3 == -1 > ! || (*p != NUL && *p != ',')) > ! { > ! errmsg = e_invarg; > ! break; > ! } > ! if (*p == NUL) > ! break; > ! } > ! } > ! else > ! #endif > ! { > ! /* Check for "x:y,x:y" */ > ! for (p = *varp; *p != NUL; p += 4) > ! { > ! if (p[1] != ':' || p[2] == NUL || (p[3] != NUL && p[3] != ',')) > ! { > ! errmsg = e_invarg; > ! break; > ! } > ! if (p[3] == NUL) > ! break; > } > } > } > > *************** > *** 11453,11455 **** > --- 11483,11583 ---- > { > return curbuf->b_p_sts < 0 ? get_sw_value() : curbuf->b_p_sts; > } > + > + /* > + * Check matchpairs option for "*initc". > + * If there is a match set "*initc" to the matching character and "*findc" > to > + * the opposite character. Set "*backwards" to the direction. > + * When "switchit" is TRUE swap the direction. > + */ > + void > + find_mps_values(initc, findc, backwards, switchit) > + int *initc; > + int *findc; > + int *backwards; > + int switchit; > + { > + char_u *ptr; > + > + ptr = curbuf->b_p_mps; > + while (*ptr != NUL) > + { > + #ifdef FEAT_MBYTE > + if (has_mbyte) > + { > + char_u *prev; > + > + if (mb_ptr2char(ptr) == *initc) > + { > + if (switchit) > + { > + *findc = *initc; > + *initc = mb_ptr2char(ptr + mb_ptr2len(ptr) + 1); > + *backwards = TRUE; > + } > + else > + { > + *findc = mb_ptr2char(ptr + mb_ptr2len(ptr) + 1); > + *backwards = FALSE; > + } > + return; > + } > + prev = ptr; > + ptr += mb_ptr2len(ptr) + 1; > + if (mb_ptr2char(ptr) == *initc) > + { > + if (switchit) > + { > + *findc = *initc; > + *initc = mb_ptr2char(prev); > + *backwards = FALSE; > + } > + else > + { > + *findc = mb_ptr2char(prev); > + *backwards = TRUE; > + } > + return; > + } > + ptr += mb_ptr2len(ptr); > + } > + else > + #endif > + { > + if (*ptr == *initc) > + { > + if (switchit) > + { > + *backwards = TRUE; > + *findc = *initc; > + *initc = ptr[2]; > + } > + else > + { > + *backwards = FALSE; > + *findc = ptr[2]; > + } > + return; > + } > + ptr += 2; > + if (*ptr == *initc) > + { > + if (switchit) > + { > + *backwards = FALSE; > + *findc = *initc; > + *initc = ptr[-2]; > + } > + else > + { > + *backwards = TRUE; > + *findc = ptr[-2]; > + } > + return; > + } > + ++ptr; > + } > + if (*ptr == ',') > + ++ptr; > + } > + } > *** ../vim-7.3.768/src/proto/option.pro 2012-12-05 14:42:56.000000000 > +0100 > --- src/proto/option.pro 2013-01-17 16:39:30.000000000 +0100 > *************** > *** 59,62 **** > --- 59,63 ---- > int check_ff_value __ARGS((char_u *p)); > long get_sw_value __ARGS((void)); > long get_sts_value __ARGS((void)); > + void find_mps_values __ARGS((int *initc, int *findc, int *backwards, int > switchit)); > /* vim: set ft=c : */ > *** ../vim-7.3.768/src/search.c 2012-10-03 13:35:45.000000000 +0200 > --- src/search.c 2013-01-17 16:50:12.000000000 +0100 > *************** > *** 1786,1813 **** > } > else if (initc != '#' && initc != NUL) > { > ! /* 'matchpairs' is "x:y,x:y" */ > ! for (ptr = curbuf->b_p_mps; *ptr; ptr += 2) > ! { > ! if (*ptr == initc) > ! { > ! findc = initc; > ! initc = ptr[2]; > ! backwards = TRUE; > ! break; > ! } > ! ptr += 2; > ! if (*ptr == initc) > ! { > ! findc = initc; > ! initc = ptr[-2]; > ! backwards = FALSE; > ! break; > ! } > ! if (ptr[1] != ',') > ! break; > ! } > ! if (!findc) /* invalid initc! */ > return NULL; > } > /* > --- 1786,1793 ---- > } > else if (initc != '#' && initc != NUL) > { > ! find_mps_values(&initc, &findc, &backwards, TRUE); > ! if (findc == NUL) > return NULL; > } > /* > *************** > *** 1886,1921 **** > --pos.col; > for (;;) > { > ! initc = linep[pos.col]; > if (initc == NUL) > break; > > ! for (ptr = curbuf->b_p_mps; *ptr; ++ptr) > ! { > ! if (*ptr == initc) > ! { > ! findc = ptr[2]; > ! backwards = FALSE; > ! break; > ! } > ! ptr += 2; > ! if (*ptr == initc) > ! { > ! findc = ptr[-2]; > ! backwards = TRUE; > ! break; > ! } > ! if (!*++ptr) > ! break; > ! } > if (findc) > break; > ! #ifdef FEAT_MBYTE > ! if (has_mbyte) > ! pos.col += (*mb_ptr2len)(linep + pos.col); > ! else > ! #endif > ! ++pos.col; > } > if (!findc) > { > --- 1866,1879 ---- > --pos.col; > for (;;) > { > ! initc = PTR2CHAR(linep + pos.col); > if (initc == NUL) > break; > > ! find_mps_values(&initc, &findc, &backwards, FALSE); > if (findc) > break; > ! pos.col += MB_PTR2LEN(linep + pos.col); > } > if (!findc) > { > *************** > *** 2260,2266 **** > * inquote if the number of quotes in a line is even, unless this > * line or the previous one ends in a '\'. Complicated, isn't it? > */ > ! switch (c = linep[pos.col]) > { > case NUL: > /* at end of line without trailing backslash, reset inquote */ > --- 2218,2225 ---- > * inquote if the number of quotes in a line is even, unless this > * line or the previous one ends in a '\'. Complicated, isn't it? > */ > ! c = PTR2CHAR(linep + pos.col); > ! switch (c) > { > case NUL: > /* at end of line without trailing backslash, reset inquote */ > *************** > *** 2469,2488 **** > * Only show match for chars in the 'matchpairs' option. > */ > /* 'matchpairs' is "x:y,x:y" */ > ! for (p = curbuf->b_p_mps; *p != NUL; p += 2) > { > #ifdef FEAT_RIGHTLEFT > ! if (*p == c && (curwin->w_p_rl ^ p_ri)) > ! break; > #endif > ! p += 2; > ! if (*p == c > #ifdef FEAT_RIGHTLEFT > && !(curwin->w_p_rl ^ p_ri) > #endif > ) > break; > ! if (p[1] != ',') > return; > } > > --- 2428,2450 ---- > * Only show match for chars in the 'matchpairs' option. > */ > /* 'matchpairs' is "x:y,x:y" */ > ! for (p = curbuf->b_p_mps; *p != NUL; ++p) > { > + if (PTR2CHAR(p) == c > #ifdef FEAT_RIGHTLEFT > ! && (curwin->w_p_rl ^ p_ri) > #endif > ! ) > ! break; > ! p += MB_PTR2LEN(p) + 1; > ! if (PTR2CHAR(p) == c > #ifdef FEAT_RIGHTLEFT > && !(curwin->w_p_rl ^ p_ri) > #endif > ) > break; > ! p += MB_PTR2LEN(p); > ! if (*p == NUL) > return; > } > > *** ../vim-7.3.768/src/testdir/test69.in 2010-08-15 21:57:29.000000000 > +0200 > --- src/testdir/test69.in 2013-01-17 15:55:09.000000000 +0100 > *************** > *** 1,4 **** > --- 1,5 ---- > Test for multi-byte text formatting. > + Also test, that 'mps' with multibyte chars works. > > STARTTEST > :so mbyte.vim > *************** > *** 134,139 **** > --- 135,149 ---- > } > > STARTTEST > + /^{/+1 > + :set mps+= u2018: u2019 > + d% > + ENDTEST > + > + { > + ‘ two three ’ four > + } > + STARTTEST > :g/^STARTTEST/.,/^ENDTEST/d > :1;/^Results/,$wq! test.out > ENDTEST > *** ../vim-7.3.768/src/testdir/test69.ok 2010-08-15 21:57:29.000000000 > +0200 > --- src/testdir/test69.ok 2013-01-17 15:55:09.000000000 +0100 > *************** > *** 140,142 **** > --- 140,146 ---- > a > } > > + > + { > + four > + } > *** ../vim-7.3.768/src/version.c 2013-01-17 15:36:54.000000000 +0100 > --- src/version.c 2013-01-17 15:55:49.000000000 +0100 > *************** > *** 727,728 **** > --- 727,730 ---- > { /* Add new patch number below this line */ > + /**/ > + 769, > /**/ > > -- > Microsoft's definition of a boolean: TRUE, FALSE, MAYBE > "Embrace and extend"...? > > /// Bram Moolenaar -- b...@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 /// > > -- > You received this message from the "vim_dev" maillist. > Do not top-post! Type your reply below the text you are replying to. > For more information, visit http://www.vim.org/maillist.php >
-- - Yasuhiro Matsumoto -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php