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    ///