Blob Blame History Raw
To: vim_dev@googlegroups.com
Subject: Patch 7.3.1118
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

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