Patch 7.4.290
Problem:    A non-greedy match followed by a branch is too greedy. (Ingo
            Karkat)
Solution:   Add NFA_MATCH when it is already in the state list if the position
            differs.
Files:      src/testdir/test64.in, src/testdir/test64.ok, src/regexp_nfa.c


*** ../vim-7.4.289/src/testdir/test64.in        2014-05-13 15:56:45.017670668 
+0200
--- src/testdir/test64.in       2014-05-13 16:15:57.213680754 +0200
***************
*** 238,244 ****
  :call add(tl, [2, 
'\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz'])
  :call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 
'ayxayzxayzxa',''])
  :call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa'])
! :call add(tl, [2, '\v(a{-1,3})+','aa','aa','a'])
  :"
  :" Test Character classes
  :call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23'])
--- 238,248 ----
  :call add(tl, [2, 
'\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz'])
  :call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 
'ayxayzxayzxa',''])
  :call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa'])
! :call add(tl, [2, '\v(a{-1,3})+', 'aa', 'aa', 'a'])
! :call add(tl, [2, '^\s\{-}\zs\( x\|x$\)', ' x', ' x', ' x'])
! :call add(tl, [2, '^\s\{-}\zs\(x\| x$\)', ' x', ' x', ' x'])
! :call add(tl, [2, '^\s\{-}\ze\(x\| x$\)', ' x', '', ' x'])
! :call add(tl, [2, '^\(\s\{-}\)\(x\| x$\)', ' x', ' x', '', ' x'])
  :"
  :" Test Character classes
  :call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23'])
***************
*** 462,476 ****
  :    try
  :      let l = matchlist(text, pat)
  :    catch
! :      $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", caused an 
exception: \"' . v:exception . '\"'
  :    endtry
  :" check the match itself
  :    if len(l) == 0 && len(t) > matchidx
! :      $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", did not 
match, expected: \"' . t[matchidx] . '\"'
  :    elseif len(l) > 0 && len(t) == matchidx
! :      $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' 
. l[0] . '\", expected no match'
  :    elseif len(t) > matchidx && l[0] != t[matchidx]
! :      $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' 
. l[0] . '\", expected: \"' . t[matchidx] . '\"'
  :    else
  :      $put ='OK ' . engine . ' - ' . pat
  :    endif
--- 466,480 ----
  :    try
  :      let l = matchlist(text, pat)
  :    catch
! :      $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . 
'\", caused an exception: \"' . v:exception . '\"'
  :    endtry
  :" check the match itself
  :    if len(l) == 0 && len(t) > matchidx
! :      $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . 
'\", did not match, expected: \"' . t[matchidx] . '\"'
  :    elseif len(l) > 0 && len(t) == matchidx
! :      $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . 
'\", match: \"' . l[0] . '\", expected no match'
  :    elseif len(t) > matchidx && l[0] != t[matchidx]
! :      $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . 
'\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"'
  :    else
  :      $put ='OK ' . engine . ' - ' . pat
  :    endif
***************
*** 483,489 ****
  :          let e = t[matchidx + i]
  :        endif
  :        if l[i] != e
! :          $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", 
submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"'
  :        endif
  :      endfor
  :      unlet i
--- 487,493 ----
  :          let e = t[matchidx + i]
  :        endif
  :        if l[i] != e
! :          $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . 
text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"'
  :        endif
  :      endfor
  :      unlet i
*** ../vim-7.4.289/src/testdir/test64.ok        2014-05-13 15:56:45.017670668 
+0200
--- src/testdir/test64.ok       2014-05-13 16:39:35.077693166 +0200
***************
*** 533,538 ****
--- 533,550 ----
  OK 0 - \v(a{-1,3})+
  OK 1 - \v(a{-1,3})+
  OK 2 - \v(a{-1,3})+
+ OK 0 - ^\s\{-}\zs\( x\|x$\)
+ OK 1 - ^\s\{-}\zs\( x\|x$\)
+ OK 2 - ^\s\{-}\zs\( x\|x$\)
+ OK 0 - ^\s\{-}\zs\(x\| x$\)
+ OK 1 - ^\s\{-}\zs\(x\| x$\)
+ OK 2 - ^\s\{-}\zs\(x\| x$\)
+ OK 0 - ^\s\{-}\ze\(x\| x$\)
+ OK 1 - ^\s\{-}\ze\(x\| x$\)
+ OK 2 - ^\s\{-}\ze\(x\| x$\)
+ OK 0 - ^\(\s\{-}\)\(x\| x$\)
+ OK 1 - ^\(\s\{-}\)\(x\| x$\)
+ OK 2 - ^\(\s\{-}\)\(x\| x$\)
  OK 0 - \d\+e\d\d
  OK 1 - \d\+e\d\d
  OK 2 - \d\+e\d\d
*** ../vim-7.4.289/src/regexp_nfa.c     2014-05-13 15:56:45.021670668 +0200
--- src/regexp_nfa.c    2014-05-13 16:37:58.481692320 +0200
***************
*** 4324,4331 ****
            {
                /* This state is already in the list, don't add it again,
                 * unless it is an MOPEN that is used for a backreference or
!                * when there is a PIM. */
!               if (!nfa_has_backref && pim == NULL && !l->has_pim)
                {
  skip_add:
  #ifdef ENABLE_LOG
--- 4324,4333 ----
            {
                /* This state is already in the list, don't add it again,
                 * unless it is an MOPEN that is used for a backreference or
!                * when there is a PIM. For NFA_MATCH check the position,
!                * lower position is preferred. */
!               if (!nfa_has_backref && pim == NULL && !l->has_pim
!                                                    && state->c != NFA_MATCH)
                {
  skip_add:
  #ifdef ENABLE_LOG
*** ../vim-7.4.289/src/version.c        2014-05-13 15:56:45.025670668 +0200
--- src/version.c       2014-05-13 16:13:33.953679500 +0200
***************
*** 736,737 ****
--- 736,739 ----
  {   /* Add new patch number below this line */
+ /**/
+     290,
  /**/

-- 
Although the scythe isn't pre-eminent among the weapons of war, anyone who
has been on the wrong end of, say, a peasants' revolt will know that in
skilled hands it is fearsome.
                                        -- (Terry Pratchett, Mort)

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

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui