To:
[email protected]
Subject: Patch 7.4a.036
Fcc: outbox
From: Bram Moolenaar <
[email protected]>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.4a.036
Problem: "\p" in a regexp does not match double-width characters.
(Yukihiro Nakadaira)
Solution: Don't count display cells, use vim_isprintc().
Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
src/testdir/test64.ok, src/testdir/test95.in,
src/testdir/test95.ok
*** ../vim-7.4a.035/src/regexp.c 2013-06-26 17:55:23.000000000 +0200
--- src/regexp.c 2013-07-21 16:59:00.000000000 +0200
***************
*** 4563,4576 ****
break;
case PRINT:
! if (ptr2cells(reginput) != 1)
status = RA_NOMATCH;
else
ADVANCE_REGINPUT();
break;
case SPRINT:
! if (VIM_ISDIGIT(*reginput) || ptr2cells(reginput) != 1)
status = RA_NOMATCH;
else
ADVANCE_REGINPUT();
--- 4563,4576 ----
break;
case PRINT:
! if (!vim_isprintc(PTR2CHAR(reginput)))
status = RA_NOMATCH;
else
ADVANCE_REGINPUT();
break;
case SPRINT:
! if (VIM_ISDIGIT(*reginput) || !vim_isprintc(PTR2CHAR(reginput)))
status = RA_NOMATCH;
else
ADVANCE_REGINPUT();
***************
*** 5944,5950 ****
if (got_int)
break;
}
! else if (ptr2cells(scan) == 1 && (testval || !VIM_ISDIGIT(*scan)))
{
mb_ptr_adv(scan);
}
--- 5944,5951 ----
if (got_int)
break;
}
! else if (vim_isprintc(PTR2CHAR(scan)) == 1
! && (testval || !VIM_ISDIGIT(*scan)))
{
mb_ptr_adv(scan);
}
*** ../vim-7.4a.035/src/regexp_nfa.c 2013-07-17 21:10:47.000000000 +0200
--- src/regexp_nfa.c 2013-07-21 16:54:40.000000000 +0200
***************
*** 5749,5760 ****
break;
case NFA_PRINT: /* \p */
! result = ptr2cells(reginput) == 1;
ADD_STATE_IF_MATCH(t->state);
break;
case NFA_SPRINT: /* \P */
! result = !VIM_ISDIGIT(curc) && ptr2cells(reginput) == 1;
ADD_STATE_IF_MATCH(t->state);
break;
--- 5749,5760 ----
break;
case NFA_PRINT: /* \p */
! result = vim_isprintc(PTR2CHAR(reginput));
ADD_STATE_IF_MATCH(t->state);
break;
case NFA_SPRINT: /* \P */
! result = !VIM_ISDIGIT(curc) && vim_isprintc(PTR2CHAR(reginput));
ADD_STATE_IF_MATCH(t->state);
break;
*** ../vim-7.4a.035/src/testdir/test64.in 2013-07-17 22:35:35.000000000 +0200
--- src/testdir/test64.in 2013-07-21 16:40:23.000000000 +0200
***************
*** 228,233 ****
--- 228,234 ----
:call add(tl, [2, '\v((ab)|c*)+', 'abcccaba', 'abcccab', '', 'ab'])
:call add(tl, [2, '\v(a(c*)+b)+', 'acbababaaa', 'acbabab', 'ab', ''])
:call add(tl, [2, '\v(a|b*)+', 'aaaa', 'aaaa', ''])
+ :call add(tl, [2, '\p*', 'aá ', 'aá '])
:"
:" Test greedy-ness and lazy-ness
:call add(tl, [2, 'a\{-2,7}','aaaaaaaaaaaaa', 'aa'])
*** ../vim-7.4a.035/src/testdir/test64.ok 2013-07-17 22:35:35.000000000 +0200
--- src/testdir/test64.ok 2013-07-21 17:00:44.000000000 +0200
***************
*** 506,511 ****
--- 506,514 ----
OK 0 - \v(a|b*)+
OK 1 - \v(a|b*)+
OK 2 - \v(a|b*)+
+ OK 0 - \p*
+ OK 1 - \p*
+ OK 2 - \p*
OK 0 - a\{-2,7}
OK 1 - a\{-2,7}
OK 2 - a\{-2,7}
*** ../vim-7.4a.035/src/testdir/test95.in 2013-05-30 18:13:59.000000000 +0200
--- src/testdir/test95.in 2013-07-21 16:53:52.000000000 +0200
***************
*** 29,34 ****
--- 29,35 ----
:" this is not a normal "i" but 0xec
:call add(tl, [2, '\p\+', 'ìa', 'ìa'])
+ :call add(tl, [2, '\p*', 'aあ', 'aあ'])
:"""" Test recognition of some character classes
:call add(tl, [2, '\i\+', '&*¨xx ', 'xx'])
***************
*** 118,123 ****
--- 119,134 ----
:endfor
:unlet t tl e l
+ :" check that 'ambiwidth' does not change the meaning of \p
+ :set regexpengine=1 ambiwidth=single
+ :$put ='eng 1 ambi single: ' . match(\"\u00EC\", '\p')
+ :set regexpengine=1 ambiwidth=double
+ :$put ='eng 1 ambi double: ' . match(\"\u00EC\", '\p')
+ :set regexpengine=2 ambiwidth=single
+ :$put ='eng 2 ambi single: ' . match(\"\u00EC\", '\p')
+ :set regexpengine=2 ambiwidth=double
+ :$put ='eng 2 ambi double: ' . match(\"\u00EC\", '\p')
+
:/\%#=1^Results/,$wq! test.out
ENDTEST
*** ../vim-7.4a.035/src/testdir/test95.ok 2013-05-26 15:12:17.000000000 +0200
--- src/testdir/test95.ok 2013-07-21 17:01:22.000000000 +0200
***************
*** 17,22 ****
--- 17,25 ----
OK 0 - \p\+
OK 1 - \p\+
OK 2 - \p\+
+ OK 0 - \p*
+ OK 1 - \p*
+ OK 2 - \p*
OK 0 - \i\+
OK 1 - \i\+
OK 2 - \i\+
***************
*** 113,115 ****
--- 116,122 ----
OK 0 - [^[=a=]]\+
OK 1 - [^[=a=]]\+
OK 2 - [^[=a=]]\+
+ eng 1 ambi single: 0
+ eng 1 ambi double: 0
+ eng 2 ambi single: 0
+ eng 2 ambi double: 0
*** ../vim-7.4a.035/src/version.c 2013-07-17 22:35:35.000000000 +0200
--- src/version.c 2013-07-21 16:55:42.000000000 +0200
***************
*** 729,730 ****
--- 729,732 ----
{ /* Add new patch number below this line */
+ /**/
+ 36,
/**/
--
hundred-and-one symptoms of being an internet addict:
3. Your bookmark takes 15 minutes to scroll from top to bottom.
/// Bram Moolenaar --
[email protected] --
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 ///