Patch 7.3.1118
Problem:    Match failure rate is not very specific.
Solution:   Tune the failure rate for match items.
Files:      src/regexp_nfa.c


*** ../vim-7.3.1117/src/regexp_nfa.c    2013-06-05 11:05:12.000000000 +0200
--- src/regexp_nfa.c    2013-06-05 11:41:09.000000000 +0200
***************
*** 3956,3980 ****
      if (depth > 4)
        return 1;
  
!     if (c == NFA_SPLIT)
      {
!       if (state->out->c == NFA_SPLIT || state->out1->c == NFA_SPLIT)
            return 1;
!       l = failure_chance(state->out, depth + 1);
!       r = failure_chance(state->out1, depth + 1);
!       return l < r ? l : r;
!     }
!     if (c == NFA_ANY)
!       return 1;
!     if (c > 0)
!       return 99;
!     if ((c >= NFA_MOPEN && c <= NFA_MOPEN9)
  #ifdef FEAT_SYN_HL
!           || (c >= NFA_ZOPEN && c <= NFA_ZOPEN9)
  #endif
!           || c == NFA_NOPEN)
!       return failure_chance(state->out, depth + 1);
!     /* something else */
      return 50;
  }
  
--- 3956,4093 ----
      if (depth > 4)
        return 1;
  
!     switch (c)
      {
!       case NFA_SPLIT:
!           if (state->out->c == NFA_SPLIT || state->out1->c == NFA_SPLIT)
!               /* avoid recursive stuff */
!               return 1;
!           /* two alternatives, use the lowest failure chance */
!           l = failure_chance(state->out, depth + 1);
!           r = failure_chance(state->out1, depth + 1);
!           return l < r ? l : r;
! 
!       case NFA_ANY:
!           /* matches anything, unlikely to fail */
            return 1;
!       case NFA_MATCH:
!           /* empty match works always */
!           return 0;
! 
!       case NFA_BOL:
!       case NFA_EOL:
!       case NFA_BOF:
!       case NFA_EOF:
!       case NFA_NEWL:
!           return 99;
! 
!       case NFA_BOW:
!       case NFA_EOW:
!           return 90;
! 
!       case NFA_MOPEN:
!       case NFA_MOPEN1:
!       case NFA_MOPEN2:
!       case NFA_MOPEN3:
!       case NFA_MOPEN4:
!       case NFA_MOPEN5:
!       case NFA_MOPEN6:
!       case NFA_MOPEN7:
!       case NFA_MOPEN8:
!       case NFA_MOPEN9:
! #ifdef FEAT_SYN_HL
!       case NFA_ZOPEN:
!       case NFA_ZOPEN1:
!       case NFA_ZOPEN2:
!       case NFA_ZOPEN3:
!       case NFA_ZOPEN4:
!       case NFA_ZOPEN5:
!       case NFA_ZOPEN6:
!       case NFA_ZOPEN7:
!       case NFA_ZOPEN8:
!       case NFA_ZOPEN9:
!       case NFA_ZCLOSE:
!       case NFA_ZCLOSE1:
!       case NFA_ZCLOSE2:
!       case NFA_ZCLOSE3:
!       case NFA_ZCLOSE4:
!       case NFA_ZCLOSE5:
!       case NFA_ZCLOSE6:
!       case NFA_ZCLOSE7:
!       case NFA_ZCLOSE8:
!       case NFA_ZCLOSE9:
! #endif
!       case NFA_NOPEN:
!       case NFA_MCLOSE:
!       case NFA_MCLOSE1:
!       case NFA_MCLOSE2:
!       case NFA_MCLOSE3:
!       case NFA_MCLOSE4:
!       case NFA_MCLOSE5:
!       case NFA_MCLOSE6:
!       case NFA_MCLOSE7:
!       case NFA_MCLOSE8:
!       case NFA_MCLOSE9:
!       case NFA_NCLOSE:
!           return failure_chance(state->out, depth + 1);
! 
!       case NFA_BACKREF1:
!       case NFA_BACKREF2:
!       case NFA_BACKREF3:
!       case NFA_BACKREF4:
!       case NFA_BACKREF5:
!       case NFA_BACKREF6:
!       case NFA_BACKREF7:
!       case NFA_BACKREF8:
!       case NFA_BACKREF9:
  #ifdef FEAT_SYN_HL
!       case NFA_ZREF1:
!       case NFA_ZREF2:
!       case NFA_ZREF3:
!       case NFA_ZREF4:
!       case NFA_ZREF5:
!       case NFA_ZREF6:
!       case NFA_ZREF7:
!       case NFA_ZREF8:
!       case NFA_ZREF9:
  #endif
!           /* backreferences don't match in many places */
!           return 94;
! 
!       case NFA_LNUM_GT:
!       case NFA_LNUM_LT:
!       case NFA_COL_GT:
!       case NFA_COL_LT:
!       case NFA_VCOL_GT:
!       case NFA_VCOL_LT:
!       case NFA_MARK_GT:
!       case NFA_MARK_LT:
! #ifdef FEAT_VISUAL
!       case NFA_VISUAL:
! #endif
!           /* before/after positions don't match very often */
!           return 85;
! 
!       case NFA_LNUM:
!           return 90;
! 
!       case NFA_CURSOR:
!       case NFA_COL:
!       case NFA_VCOL:
!       case NFA_MARK:
!           /* specific positions rarely match */
!           return 98;
! 
!       case NFA_COMPOSING:
!           return 95;
! 
!       default:
!           if (c > 0)
!               /* character match fails often */
!               return 95;
!     }
! 
!     /* something else, includes character classes */
      return 50;
  }
  
*** ../vim-7.3.1117/src/version.c       2013-06-05 11:05:12.000000000 +0200
--- src/version.c       2013-06-05 11:41:58.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
  {   /* Add new patch number below this line */
+ /**/
+     1118,
  /**/

-- 
>From "know your smileys":
 :~)    A man with a tape recorder up his nose

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

-- 
-- 
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Raspunde prin e-mail lui