Karsten Hopp d27979
To: vim_dev@googlegroups.com
Karsten Hopp d27979
Subject: Patch 7.3.1138
Karsten Hopp d27979
Fcc: outbox
Karsten Hopp d27979
From: Bram Moolenaar <Bram@moolenaar.net>
Karsten Hopp d27979
Mime-Version: 1.0
Karsten Hopp d27979
Content-Type: text/plain; charset=UTF-8
Karsten Hopp d27979
Content-Transfer-Encoding: 8bit
Karsten Hopp d27979
------------
Karsten Hopp d27979
Karsten Hopp d27979
Patch 7.3.1138
Karsten Hopp d27979
Problem:    New regexp engine: neglist no longer used.
Karsten Hopp d27979
Solution:   Remove the now unused neglist.
Karsten Hopp d27979
Files:	    src/regexp_nfa.c
Karsten Hopp d27979
Karsten Hopp d27979
Karsten Hopp d27979
*** ../vim-7.3.1137/src/regexp_nfa.c	2013-06-07 14:08:24.000000000 +0200
Karsten Hopp d27979
--- src/regexp_nfa.c	2013-06-07 14:43:12.000000000 +0200
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4276,4288 ****
Karsten Hopp d27979
      int		flag = 0;
Karsten Hopp d27979
      int		go_to_nextline = FALSE;
Karsten Hopp d27979
      nfa_thread_T *t;
Karsten Hopp d27979
!     nfa_list_T	list[3];
Karsten Hopp d27979
!     nfa_list_T	*listtbl[2][2];
Karsten Hopp d27979
!     nfa_list_T	*ll;
Karsten Hopp d27979
      int		listidx;
Karsten Hopp d27979
      nfa_list_T	*thislist;
Karsten Hopp d27979
      nfa_list_T	*nextlist;
Karsten Hopp d27979
-     nfa_list_T	*neglist;
Karsten Hopp d27979
      int		*listids = NULL;
Karsten Hopp d27979
      nfa_state_T *add_state;
Karsten Hopp d27979
      int		 add_count;
Karsten Hopp d27979
--- 4276,4285 ----
Karsten Hopp d27979
      int		flag = 0;
Karsten Hopp d27979
      int		go_to_nextline = FALSE;
Karsten Hopp d27979
      nfa_thread_T *t;
Karsten Hopp d27979
!     nfa_list_T	list[2];
Karsten Hopp d27979
      int		listidx;
Karsten Hopp d27979
      nfa_list_T	*thislist;
Karsten Hopp d27979
      nfa_list_T	*nextlist;
Karsten Hopp d27979
      int		*listids = NULL;
Karsten Hopp d27979
      nfa_state_T *add_state;
Karsten Hopp d27979
      int		 add_count;
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4306,4314 ****
Karsten Hopp d27979
      list[0].len = nstate + 1;
Karsten Hopp d27979
      list[1].t = (nfa_thread_T *)lalloc(size, TRUE);
Karsten Hopp d27979
      list[1].len = nstate + 1;
Karsten Hopp d27979
!     list[2].t = (nfa_thread_T *)lalloc(size, TRUE);
Karsten Hopp d27979
!     list[2].len = nstate + 1;
Karsten Hopp d27979
!     if (list[0].t == NULL || list[1].t == NULL || list[2].t == NULL)
Karsten Hopp d27979
  	goto theend;
Karsten Hopp d27979
  
Karsten Hopp d27979
  #ifdef ENABLE_LOG
Karsten Hopp d27979
--- 4303,4309 ----
Karsten Hopp d27979
      list[0].len = nstate + 1;
Karsten Hopp d27979
      list[1].t = (nfa_thread_T *)lalloc(size, TRUE);
Karsten Hopp d27979
      list[1].len = nstate + 1;
Karsten Hopp d27979
!     if (list[0].t == NULL || list[1].t == NULL)
Karsten Hopp d27979
  	goto theend;
Karsten Hopp d27979
  
Karsten Hopp d27979
  #ifdef ENABLE_LOG
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4332,4356 ****
Karsten Hopp d27979
      thislist->n = 0;
Karsten Hopp d27979
      nextlist = &list[1];
Karsten Hopp d27979
      nextlist->n = 0;
Karsten Hopp d27979
-     neglist = &list[2];
Karsten Hopp d27979
-     neglist->n = 0;
Karsten Hopp d27979
  #ifdef ENABLE_LOG
Karsten Hopp d27979
      fprintf(log_fd, "(---) STARTSTATE\n");
Karsten Hopp d27979
  #endif
Karsten Hopp d27979
      thislist->id = nfa_listid + 1;
Karsten Hopp d27979
      addstate(thislist, start, m, 0);
Karsten Hopp d27979
  
Karsten Hopp d27979
!     /* There are two cases when the NFA advances: 1. input char matches the
Karsten Hopp d27979
!      * NFA node and 2. input char does not match the NFA node and the state
Karsten Hopp d27979
!      * has the negated flag. The following macro calls addstate() according to
Karsten Hopp d27979
!      * these rules. It is used A LOT, so use the "listtbl" table for speed */
Karsten Hopp d27979
!     listtbl[0][0] = NULL;
Karsten Hopp d27979
!     listtbl[0][1] = neglist;
Karsten Hopp d27979
!     listtbl[1][0] = nextlist;
Karsten Hopp d27979
!     listtbl[1][1] = NULL;
Karsten Hopp d27979
! #define	ADD_POS_NEG_STATE(state)			\
Karsten Hopp d27979
!     ll = listtbl[result ? 1 : 0][state->negated];	\
Karsten Hopp d27979
!     if (ll != NULL) {					\
Karsten Hopp d27979
  	add_state = state->out;				\
Karsten Hopp d27979
  	add_off = clen;					\
Karsten Hopp d27979
      }
Karsten Hopp d27979
--- 4327,4340 ----
Karsten Hopp d27979
      thislist->n = 0;
Karsten Hopp d27979
      nextlist = &list[1];
Karsten Hopp d27979
      nextlist->n = 0;
Karsten Hopp d27979
  #ifdef ENABLE_LOG
Karsten Hopp d27979
      fprintf(log_fd, "(---) STARTSTATE\n");
Karsten Hopp d27979
  #endif
Karsten Hopp d27979
      thislist->id = nfa_listid + 1;
Karsten Hopp d27979
      addstate(thislist, start, m, 0);
Karsten Hopp d27979
  
Karsten Hopp d27979
! #define	ADD_STATE_IF_MATCH(state)			\
Karsten Hopp d27979
!     if (result) {					\
Karsten Hopp d27979
  	add_state = state->out;				\
Karsten Hopp d27979
  	add_off = clen;					\
Karsten Hopp d27979
      }
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4385,4395 ****
Karsten Hopp d27979
  	thislist = &list[flag];
Karsten Hopp d27979
  	nextlist = &list[flag ^= 1];
Karsten Hopp d27979
  	nextlist->n = 0;	    /* clear nextlist */
Karsten Hopp d27979
- 	listtbl[1][0] = nextlist;
Karsten Hopp d27979
  	++nfa_listid;
Karsten Hopp d27979
  	thislist->id = nfa_listid;
Karsten Hopp d27979
  	nextlist->id = nfa_listid + 1;
Karsten Hopp d27979
- 	neglist->id = nfa_listid + 1;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	pimlist.ga_len = 0;
Karsten Hopp d27979
  
Karsten Hopp d27979
--- 4369,4377 ----
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4413,4436 ****
Karsten Hopp d27979
  	/*
Karsten Hopp d27979
  	 * If the state lists are empty we can stop.
Karsten Hopp d27979
  	 */
Karsten Hopp d27979
! 	if (thislist->n == 0 && neglist->n == 0)
Karsten Hopp d27979
  	    break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	/* compute nextlist */
Karsten Hopp d27979
! 	for (listidx = 0; listidx < thislist->n || neglist->n > 0; ++listidx)
Karsten Hopp d27979
  	{
Karsten Hopp d27979
! 	    if (neglist->n > 0)
Karsten Hopp d27979
! 	    {
Karsten Hopp d27979
! 		t = &neglist->t[0];
Karsten Hopp d27979
! 		neglist->n--;
Karsten Hopp d27979
! 		listidx--;
Karsten Hopp d27979
! #ifdef ENABLE_LOG
Karsten Hopp d27979
! 		fprintf(log_fd, "     using neglist entry, %d remaining\n",
Karsten Hopp d27979
! 			neglist->n);
Karsten Hopp d27979
! #endif
Karsten Hopp d27979
! 	    }
Karsten Hopp d27979
! 	    else
Karsten Hopp d27979
! 		t = &thislist->t[listidx];
Karsten Hopp d27979
  
Karsten Hopp d27979
  #ifdef NFA_REGEXP_DEBUG_LOG
Karsten Hopp d27979
  	    nfa_set_code(t->state->c);
Karsten Hopp d27979
--- 4395,4407 ----
Karsten Hopp d27979
  	/*
Karsten Hopp d27979
  	 * If the state lists are empty we can stop.
Karsten Hopp d27979
  	 */
Karsten Hopp d27979
! 	if (thislist->n == 0)
Karsten Hopp d27979
  	    break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	/* compute nextlist */
Karsten Hopp d27979
! 	for (listidx = 0; listidx < thislist->n; ++listidx)
Karsten Hopp d27979
  	{
Karsten Hopp d27979
! 	    t = &thislist->t[listidx];
Karsten Hopp d27979
  
Karsten Hopp d27979
  #ifdef NFA_REGEXP_DEBUG_LOG
Karsten Hopp d27979
  	    nfa_set_code(t->state->c);
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4475,4481 ****
Karsten Hopp d27979
  		 * states at this position.  When the list of states is going
Karsten Hopp d27979
  		 * to be empty quit without advancing, so that "reginput" is
Karsten Hopp d27979
  		 * correct. */
Karsten Hopp d27979
! 		if (nextlist->n == 0 && neglist->n == 0)
Karsten Hopp d27979
  		    clen = 0;
Karsten Hopp d27979
  		goto nextchar;
Karsten Hopp d27979
  	      }
Karsten Hopp d27979
--- 4446,4452 ----
Karsten Hopp d27979
  		 * states at this position.  When the list of states is going
Karsten Hopp d27979
  		 * to be empty quit without advancing, so that "reginput" is
Karsten Hopp d27979
  		 * correct. */
Karsten Hopp d27979
! 		if (nextlist->n == 0)
Karsten Hopp d27979
  		    clen = 0;
Karsten Hopp d27979
  		goto nextchar;
Karsten Hopp d27979
  	      }
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4648,4654 ****
Karsten Hopp d27979
  		    {
Karsten Hopp d27979
  			/* match current character, output of corresponding
Karsten Hopp d27979
  			 * NFA_END_PATTERN to be used at next position. */
Karsten Hopp d27979
- 			ll = nextlist;
Karsten Hopp d27979
  			add_state = t->state->out1->out->out;
Karsten Hopp d27979
  			add_off = clen;
Karsten Hopp d27979
  		    }
Karsten Hopp d27979
--- 4619,4624 ----
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4656,4662 ****
Karsten Hopp d27979
  		    {
Karsten Hopp d27979
  			/* skip over the matched characters, set character
Karsten Hopp d27979
  			 * count in NFA_SKIP */
Karsten Hopp d27979
- 			ll = nextlist;
Karsten Hopp d27979
  			add_state = t->state->out1->out;
Karsten Hopp d27979
  			add_off = bytelen;
Karsten Hopp d27979
  			add_count = bytelen - clen;
Karsten Hopp d27979
--- 4626,4631 ----
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4821,4827 ****
Karsten Hopp d27979
  		    result = FAIL;
Karsten Hopp d27979
  
Karsten Hopp d27979
  		end = t->state->out1;	    /* NFA_END_COMPOSING */
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(end);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  	    }
Karsten Hopp d27979
  #endif
Karsten Hopp d27979
--- 4790,4796 ----
Karsten Hopp d27979
  		    result = FAIL;
Karsten Hopp d27979
  
Karsten Hopp d27979
  		end = t->state->out1;	    /* NFA_END_COMPOSING */
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(end);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  	    }
Karsten Hopp d27979
  #endif
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4833,4846 ****
Karsten Hopp d27979
  		    go_to_nextline = TRUE;
Karsten Hopp d27979
  		    /* Pass -1 for the offset, which means taking the position
Karsten Hopp d27979
  		     * at the start of the next line. */
Karsten Hopp d27979
- 		    ll = nextlist;
Karsten Hopp d27979
  		    add_state = t->state->out;
Karsten Hopp d27979
  		    add_off = -1;
Karsten Hopp d27979
  		}
Karsten Hopp d27979
  		else if (curc == '\n' && reg_line_lbr)
Karsten Hopp d27979
  		{
Karsten Hopp d27979
  		    /* match \n as if it is an ordinary character */
Karsten Hopp d27979
- 		    ll = nextlist;
Karsten Hopp d27979
  		    add_state = t->state->out;
Karsten Hopp d27979
  		    add_off = 1;
Karsten Hopp d27979
  		}
Karsten Hopp d27979
--- 4802,4813 ----
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4863,4869 ****
Karsten Hopp d27979
  	    case NFA_CLASS_BACKSPACE:
Karsten Hopp d27979
  	    case NFA_CLASS_ESCAPE:
Karsten Hopp d27979
  		result = check_char_class(t->state->c, curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_START_COLL:
Karsten Hopp d27979
--- 4830,4836 ----
Karsten Hopp d27979
  	    case NFA_CLASS_BACKSPACE:
Karsten Hopp d27979
  	    case NFA_CLASS_ESCAPE:
Karsten Hopp d27979
  		result = check_char_class(t->state->c, curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_START_COLL:
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4933,4939 ****
Karsten Hopp d27979
  		{
Karsten Hopp d27979
  		    /* next state is in out of the NFA_END_COLL, out1 of
Karsten Hopp d27979
  		     * START points to the END state */
Karsten Hopp d27979
- 		    ll = nextlist;
Karsten Hopp d27979
  		    add_state = t->state->out1->out;
Karsten Hopp d27979
  		    add_off = clen;
Karsten Hopp d27979
  		}
Karsten Hopp d27979
--- 4900,4905 ----
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4944,4950 ****
Karsten Hopp d27979
  		/* Any char except '\0', (end of input) does not match. */
Karsten Hopp d27979
  		if (curc > 0)
Karsten Hopp d27979
  		{
Karsten Hopp d27979
- 		    ll = nextlist;
Karsten Hopp d27979
  		    add_state = t->state->out;
Karsten Hopp d27979
  		    add_off = clen;
Karsten Hopp d27979
  		}
Karsten Hopp d27979
--- 4910,4915 ----
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 4955,5087 ****
Karsten Hopp d27979
  	     */
Karsten Hopp d27979
  	    case NFA_IDENT:	/*  \i	*/
Karsten Hopp d27979
  		result = vim_isIDc(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_SIDENT:	/*  \I	*/
Karsten Hopp d27979
  		result = !VIM_ISDIGIT(curc) && vim_isIDc(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_KWORD:	/*  \k	*/
Karsten Hopp d27979
  		result = vim_iswordp_buf(reginput, reg_buf);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_SKWORD:	/*  \K	*/
Karsten Hopp d27979
  		result = !VIM_ISDIGIT(curc)
Karsten Hopp d27979
  					&& vim_iswordp_buf(reginput, reg_buf);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_FNAME:	/*  \f	*/
Karsten Hopp d27979
  		result = vim_isfilec(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_SFNAME:	/*  \F	*/
Karsten Hopp d27979
  		result = !VIM_ISDIGIT(curc) && vim_isfilec(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_PRINT:	/*  \p	*/
Karsten Hopp d27979
  		result = ptr2cells(reginput) == 1;
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_SPRINT:	/*  \P	*/
Karsten Hopp d27979
  		result = !VIM_ISDIGIT(curc) && ptr2cells(reginput) == 1;
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_WHITE:	/*  \s	*/
Karsten Hopp d27979
  		result = vim_iswhite(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NWHITE:	/*  \S	*/
Karsten Hopp d27979
  		result = curc != NUL && !vim_iswhite(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_DIGIT:	/*  \d	*/
Karsten Hopp d27979
  		result = ri_digit(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NDIGIT:	/*  \D	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_digit(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_HEX:	/*  \x	*/
Karsten Hopp d27979
  		result = ri_hex(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NHEX:	/*  \X	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_hex(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_OCTAL:	/*  \o	*/
Karsten Hopp d27979
  		result = ri_octal(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NOCTAL:	/*  \O	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_octal(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_WORD:	/*  \w	*/
Karsten Hopp d27979
  		result = ri_word(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NWORD:	/*  \W	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_word(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_HEAD:	/*  \h	*/
Karsten Hopp d27979
  		result = ri_head(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NHEAD:	/*  \H	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_head(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_ALPHA:	/*  \a	*/
Karsten Hopp d27979
  		result = ri_alpha(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NALPHA:	/*  \A	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_alpha(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_LOWER:	/*  \l	*/
Karsten Hopp d27979
  		result = ri_lower(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NLOWER:	/*  \L	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_lower(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_UPPER:	/*  \u	*/
Karsten Hopp d27979
  		result = ri_upper(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NUPPER:	/* \U	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_upper(curc);
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_BACKREF1:
Karsten Hopp d27979
--- 4920,5052 ----
Karsten Hopp d27979
  	     */
Karsten Hopp d27979
  	    case NFA_IDENT:	/*  \i	*/
Karsten Hopp d27979
  		result = vim_isIDc(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_SIDENT:	/*  \I	*/
Karsten Hopp d27979
  		result = !VIM_ISDIGIT(curc) && vim_isIDc(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_KWORD:	/*  \k	*/
Karsten Hopp d27979
  		result = vim_iswordp_buf(reginput, reg_buf);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_SKWORD:	/*  \K	*/
Karsten Hopp d27979
  		result = !VIM_ISDIGIT(curc)
Karsten Hopp d27979
  					&& vim_iswordp_buf(reginput, reg_buf);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_FNAME:	/*  \f	*/
Karsten Hopp d27979
  		result = vim_isfilec(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_SFNAME:	/*  \F	*/
Karsten Hopp d27979
  		result = !VIM_ISDIGIT(curc) && vim_isfilec(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_PRINT:	/*  \p	*/
Karsten Hopp d27979
  		result = ptr2cells(reginput) == 1;
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_SPRINT:	/*  \P	*/
Karsten Hopp d27979
  		result = !VIM_ISDIGIT(curc) && ptr2cells(reginput) == 1;
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_WHITE:	/*  \s	*/
Karsten Hopp d27979
  		result = vim_iswhite(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NWHITE:	/*  \S	*/
Karsten Hopp d27979
  		result = curc != NUL && !vim_iswhite(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_DIGIT:	/*  \d	*/
Karsten Hopp d27979
  		result = ri_digit(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NDIGIT:	/*  \D	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_digit(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_HEX:	/*  \x	*/
Karsten Hopp d27979
  		result = ri_hex(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NHEX:	/*  \X	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_hex(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_OCTAL:	/*  \o	*/
Karsten Hopp d27979
  		result = ri_octal(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NOCTAL:	/*  \O	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_octal(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_WORD:	/*  \w	*/
Karsten Hopp d27979
  		result = ri_word(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NWORD:	/*  \W	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_word(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_HEAD:	/*  \h	*/
Karsten Hopp d27979
  		result = ri_head(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NHEAD:	/*  \H	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_head(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_ALPHA:	/*  \a	*/
Karsten Hopp d27979
  		result = ri_alpha(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NALPHA:	/*  \A	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_alpha(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_LOWER:	/*  \l	*/
Karsten Hopp d27979
  		result = ri_lower(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NLOWER:	/*  \L	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_lower(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_UPPER:	/*  \u	*/
Karsten Hopp d27979
  		result = ri_upper(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_NUPPER:	/* \U	*/
Karsten Hopp d27979
  		result = curc != NUL && !ri_upper(curc);
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  
Karsten Hopp d27979
  	    case NFA_BACKREF1:
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 5135,5141 ****
Karsten Hopp d27979
  		    {
Karsten Hopp d27979
  			/* match current character, jump ahead to out of
Karsten Hopp d27979
  			 * NFA_SKIP */
Karsten Hopp d27979
- 			ll = nextlist;
Karsten Hopp d27979
  			add_state = t->state->out->out;
Karsten Hopp d27979
  			add_off = clen;
Karsten Hopp d27979
  		    }
Karsten Hopp d27979
--- 5100,5105 ----
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 5143,5149 ****
Karsten Hopp d27979
  		    {
Karsten Hopp d27979
  			/* skip over the matched characters, set character
Karsten Hopp d27979
  			 * count in NFA_SKIP */
Karsten Hopp d27979
- 			ll = nextlist;
Karsten Hopp d27979
  			add_state = t->state->out;
Karsten Hopp d27979
  			add_off = bytelen;
Karsten Hopp d27979
  			add_count = bytelen - clen;
Karsten Hopp d27979
--- 5107,5112 ----
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 5156,5169 ****
Karsten Hopp d27979
  	      if (t->count - clen <= 0)
Karsten Hopp d27979
  	      {
Karsten Hopp d27979
  		  /* end of match, go to what follows */
Karsten Hopp d27979
- 		  ll = nextlist;
Karsten Hopp d27979
  		  add_state = t->state->out;
Karsten Hopp d27979
  		  add_off = clen;
Karsten Hopp d27979
  	      }
Karsten Hopp d27979
  	      else
Karsten Hopp d27979
  	      {
Karsten Hopp d27979
  		  /* add state again with decremented count */
Karsten Hopp d27979
- 		  ll = nextlist;
Karsten Hopp d27979
  		  add_state = t->state;
Karsten Hopp d27979
  		  add_off = 0;
Karsten Hopp d27979
  		  add_count = t->count - clen;
Karsten Hopp d27979
--- 5119,5130 ----
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 5267,5273 ****
Karsten Hopp d27979
  						&& clen != utf_char2len(curc))
Karsten Hopp d27979
  		    result = FALSE;
Karsten Hopp d27979
  #endif
Karsten Hopp d27979
! 		ADD_POS_NEG_STATE(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  	      }
Karsten Hopp d27979
  
Karsten Hopp d27979
--- 5228,5234 ----
Karsten Hopp d27979
  						&& clen != utf_char2len(curc))
Karsten Hopp d27979
  		    result = FALSE;
Karsten Hopp d27979
  #endif
Karsten Hopp d27979
! 		ADD_STATE_IF_MATCH(t->state);
Karsten Hopp d27979
  		break;
Karsten Hopp d27979
  	      }
Karsten Hopp d27979
  
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 5328,5336 ****
Karsten Hopp d27979
  			continue;
Karsten Hopp d27979
  		}
Karsten Hopp d27979
  
Karsten Hopp d27979
! 		addstate(ll, add_state, &t->subs, add_off);
Karsten Hopp d27979
  		if (add_count > 0)
Karsten Hopp d27979
! 		    nextlist->t[ll->n - 1].count = add_count;
Karsten Hopp d27979
  	    }
Karsten Hopp d27979
  
Karsten Hopp d27979
  	} /* for (thislist = thislist; thislist->state; thislist++) */
Karsten Hopp d27979
--- 5289,5297 ----
Karsten Hopp d27979
  			continue;
Karsten Hopp d27979
  		}
Karsten Hopp d27979
  
Karsten Hopp d27979
! 		addstate(nextlist, add_state, &t->subs, add_off);
Karsten Hopp d27979
  		if (add_count > 0)
Karsten Hopp d27979
! 		    nextlist->t[nextlist->n - 1].count = add_count;
Karsten Hopp d27979
  	    }
Karsten Hopp d27979
  
Karsten Hopp d27979
  	} /* for (thislist = thislist; thislist->state; thislist++) */
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 5396,5405 ****
Karsten Hopp d27979
      /* Free memory */
Karsten Hopp d27979
      vim_free(list[0].t);
Karsten Hopp d27979
      vim_free(list[1].t);
Karsten Hopp d27979
-     vim_free(list[2].t);
Karsten Hopp d27979
      vim_free(listids);
Karsten Hopp d27979
      ga_clear(&pimlist);
Karsten Hopp d27979
! #undef ADD_POS_NEG_STATE
Karsten Hopp d27979
  #ifdef NFA_REGEXP_DEBUG_LOG
Karsten Hopp d27979
      fclose(debug);
Karsten Hopp d27979
  #endif
Karsten Hopp d27979
--- 5357,5365 ----
Karsten Hopp d27979
      /* Free memory */
Karsten Hopp d27979
      vim_free(list[0].t);
Karsten Hopp d27979
      vim_free(list[1].t);
Karsten Hopp d27979
      vim_free(listids);
Karsten Hopp d27979
      ga_clear(&pimlist);
Karsten Hopp d27979
! #undef ADD_STATE_IF_MATCH
Karsten Hopp d27979
  #ifdef NFA_REGEXP_DEBUG_LOG
Karsten Hopp d27979
      fclose(debug);
Karsten Hopp d27979
  #endif
Karsten Hopp d27979
*** ../vim-7.3.1137/src/version.c	2013-06-07 14:08:24.000000000 +0200
Karsten Hopp d27979
--- src/version.c	2013-06-07 14:57:46.000000000 +0200
Karsten Hopp d27979
***************
Karsten Hopp d27979
*** 730,731 ****
Karsten Hopp d27979
--- 730,733 ----
Karsten Hopp d27979
  {   /* Add new patch number below this line */
Karsten Hopp d27979
+ /**/
Karsten Hopp d27979
+     1138,
Karsten Hopp d27979
  /**/
Karsten Hopp d27979
Karsten Hopp d27979
-- 
Karsten Hopp d27979
From "know your smileys":
Karsten Hopp d27979
 <|-) Chinese
Karsten Hopp d27979
 <|-( Chinese and doesn't like these kind of jokes
Karsten Hopp d27979
Karsten Hopp d27979
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
Karsten Hopp d27979
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
Karsten Hopp d27979
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
Karsten Hopp d27979
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///