Karsten Hopp 34ad50
To: vim_dev@googlegroups.com
Karsten Hopp 34ad50
Subject: Patch 7.3.1037
Karsten Hopp 34ad50
Fcc: outbox
Karsten Hopp 34ad50
From: Bram Moolenaar <Bram@moolenaar.net>
Karsten Hopp 34ad50
Mime-Version: 1.0
Karsten Hopp 34ad50
Content-Type: text/plain; charset=UTF-8
Karsten Hopp 34ad50
Content-Transfer-Encoding: 8bit
Karsten Hopp 34ad50
------------
Karsten Hopp 34ad50
Karsten Hopp 34ad50
Patch 7.3.1037
Karsten Hopp 34ad50
Problem:    Look-behind matching is very slow on long lines.
Karsten Hopp 34ad50
Solution:   Add a byte limit to how far back an attempt is made.
Karsten Hopp 34ad50
Files:	    src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
Karsten Hopp 34ad50
	    src/testdir/test64.ok
Karsten Hopp 34ad50
Karsten Hopp 34ad50
Karsten Hopp 34ad50
*** ../vim-7.3.1036/src/regexp.c	2013-05-21 21:37:01.000000000 +0200
Karsten Hopp 34ad50
--- src/regexp.c	2013-05-29 14:34:51.000000000 +0200
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 701,706 ****
Karsten Hopp 34ad50
--- 701,707 ----
Karsten Hopp 34ad50
  # define CASEMBC(x)
Karsten Hopp 34ad50
  #endif
Karsten Hopp 34ad50
  static void	reginsert __ARGS((int, char_u *));
Karsten Hopp 34ad50
+ static void	reginsert_nr __ARGS((int op, long val, char_u *opnd));
Karsten Hopp 34ad50
  static void	reginsert_limits __ARGS((int, long, long, char_u *));
Karsten Hopp 34ad50
  static char_u	*re_put_long __ARGS((char_u *pr, long_u val));
Karsten Hopp 34ad50
  static int	read_limits __ARGS((long *, long *));
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 1781,1787 ****
Karsten Hopp 34ad50
--- 1782,1790 ----
Karsten Hopp 34ad50
  	case Magic('@'):
Karsten Hopp 34ad50
  	    {
Karsten Hopp 34ad50
  		int	lop = END;
Karsten Hopp 34ad50
+ 		int	nr;
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
+ 		nr = getdecchrs();
Karsten Hopp 34ad50
  		switch (no_Magic(getchr()))
Karsten Hopp 34ad50
  		{
Karsten Hopp 34ad50
  		    case '=': lop = MATCH; break;		  /* \@= */
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 1803,1809 ****
Karsten Hopp 34ad50
  		    *flagp |= HASLOOKBH;
Karsten Hopp 34ad50
  		}
Karsten Hopp 34ad50
  		regtail(ret, regnode(END)); /* operand ends */
Karsten Hopp 34ad50
! 		reginsert(lop, ret);
Karsten Hopp 34ad50
  		break;
Karsten Hopp 34ad50
  	    }
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
--- 1806,1819 ----
Karsten Hopp 34ad50
  		    *flagp |= HASLOOKBH;
Karsten Hopp 34ad50
  		}
Karsten Hopp 34ad50
  		regtail(ret, regnode(END)); /* operand ends */
Karsten Hopp 34ad50
! 		if (lop == BEHIND || lop == NOBEHIND)
Karsten Hopp 34ad50
! 		{
Karsten Hopp 34ad50
! 		    if (nr < 0)
Karsten Hopp 34ad50
! 			nr = 0; /* no limit is same as zero limit */
Karsten Hopp 34ad50
! 		    reginsert_nr(lop, nr, ret);
Karsten Hopp 34ad50
! 		}
Karsten Hopp 34ad50
! 		else
Karsten Hopp 34ad50
! 		    reginsert(lop, ret);
Karsten Hopp 34ad50
  		break;
Karsten Hopp 34ad50
  	    }
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 2780,2785 ****
Karsten Hopp 34ad50
--- 2790,2827 ----
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
  /*
Karsten Hopp 34ad50
   * Insert an operator in front of already-emitted operand.
Karsten Hopp 34ad50
+  * Add a number to the operator.
Karsten Hopp 34ad50
+  */
Karsten Hopp 34ad50
+     static void
Karsten Hopp 34ad50
+ reginsert_nr(op, val, opnd)
Karsten Hopp 34ad50
+     int		op;
Karsten Hopp 34ad50
+     long	val;
Karsten Hopp 34ad50
+     char_u	*opnd;
Karsten Hopp 34ad50
+ {
Karsten Hopp 34ad50
+     char_u	*src;
Karsten Hopp 34ad50
+     char_u	*dst;
Karsten Hopp 34ad50
+     char_u	*place;
Karsten Hopp 34ad50
+ 
Karsten Hopp 34ad50
+     if (regcode == JUST_CALC_SIZE)
Karsten Hopp 34ad50
+     {
Karsten Hopp 34ad50
+ 	regsize += 7;
Karsten Hopp 34ad50
+ 	return;
Karsten Hopp 34ad50
+     }
Karsten Hopp 34ad50
+     src = regcode;
Karsten Hopp 34ad50
+     regcode += 7;
Karsten Hopp 34ad50
+     dst = regcode;
Karsten Hopp 34ad50
+     while (src > opnd)
Karsten Hopp 34ad50
+ 	*--dst = *--src;
Karsten Hopp 34ad50
+ 
Karsten Hopp 34ad50
+     place = opnd;		/* Op node, where operand used to be. */
Karsten Hopp 34ad50
+     *place++ = op;
Karsten Hopp 34ad50
+     *place++ = NUL;
Karsten Hopp 34ad50
+     *place++ = NUL;
Karsten Hopp 34ad50
+     place = re_put_long(place, (long_u)val);
Karsten Hopp 34ad50
+ }
Karsten Hopp 34ad50
+ 
Karsten Hopp 34ad50
+ /*
Karsten Hopp 34ad50
+  * Insert an operator in front of already-emitted operand.
Karsten Hopp 34ad50
   * The operator has the given limit values as operands.  Also set next pointer.
Karsten Hopp 34ad50
   *
Karsten Hopp 34ad50
   * Means relocating the operand.
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 3182,3188 ****
Karsten Hopp 34ad50
  }
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
  /*
Karsten Hopp 34ad50
!  * get and return the value of the decimal string immediately after the
Karsten Hopp 34ad50
   * current position. Return -1 for invalid.  Consumes all digits.
Karsten Hopp 34ad50
   */
Karsten Hopp 34ad50
      static int
Karsten Hopp 34ad50
--- 3224,3230 ----
Karsten Hopp 34ad50
  }
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
  /*
Karsten Hopp 34ad50
!  * Get and return the value of the decimal string immediately after the
Karsten Hopp 34ad50
   * current position. Return -1 for invalid.  Consumes all digits.
Karsten Hopp 34ad50
   */
Karsten Hopp 34ad50
      static int
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 3200,3205 ****
Karsten Hopp 34ad50
--- 3242,3248 ----
Karsten Hopp 34ad50
  	nr *= 10;
Karsten Hopp 34ad50
  	nr += c - '0';
Karsten Hopp 34ad50
  	++regparse;
Karsten Hopp 34ad50
+ 	curchr = -1; /* no longer valid */
Karsten Hopp 34ad50
      }
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
      if (i == 0)
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 5432,5438 ****
Karsten Hopp 34ad50
  		/* save the position after the found match for next */
Karsten Hopp 34ad50
  		reg_save(&(((regbehind_T *)rp) - 1)->save_after, &backpos);
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
! 		/* start looking for a match with operand at the current
Karsten Hopp 34ad50
  		 * position.  Go back one character until we find the
Karsten Hopp 34ad50
  		 * result, hitting the start of the line or the previous
Karsten Hopp 34ad50
  		 * line (for multi-line matching).
Karsten Hopp 34ad50
--- 5475,5481 ----
Karsten Hopp 34ad50
  		/* save the position after the found match for next */
Karsten Hopp 34ad50
  		reg_save(&(((regbehind_T *)rp) - 1)->save_after, &backpos);
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
! 		/* Start looking for a match with operand at the current
Karsten Hopp 34ad50
  		 * position.  Go back one character until we find the
Karsten Hopp 34ad50
  		 * result, hitting the start of the line or the previous
Karsten Hopp 34ad50
  		 * line (for multi-line matching).
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 5444,5450 ****
Karsten Hopp 34ad50
  		rp->rs_state = RS_BEHIND2;
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
  		reg_restore(&rp->rs_un.regsave, &backpos);
Karsten Hopp 34ad50
! 		scan = OPERAND(rp->rs_scan);
Karsten Hopp 34ad50
  	    }
Karsten Hopp 34ad50
  	    break;
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
--- 5487,5493 ----
Karsten Hopp 34ad50
  		rp->rs_state = RS_BEHIND2;
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
  		reg_restore(&rp->rs_un.regsave, &backpos);
Karsten Hopp 34ad50
! 		scan = OPERAND(rp->rs_scan) + 4;
Karsten Hopp 34ad50
  	    }
Karsten Hopp 34ad50
  	    break;
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 5472,5480 ****
Karsten Hopp 34ad50
--- 5515,5526 ----
Karsten Hopp 34ad50
  	    }
Karsten Hopp 34ad50
  	    else
Karsten Hopp 34ad50
  	    {
Karsten Hopp 34ad50
+ 		long limit;
Karsten Hopp 34ad50
+ 
Karsten Hopp 34ad50
  		/* No match or a match that doesn't end where we want it: Go
Karsten Hopp 34ad50
  		 * back one character.  May go to previous line once. */
Karsten Hopp 34ad50
  		no = OK;
Karsten Hopp 34ad50
+ 		limit = OPERAND_MIN(rp->rs_scan);
Karsten Hopp 34ad50
  		if (REG_MULTI)
Karsten Hopp 34ad50
  		{
Karsten Hopp 34ad50
  		    if (rp->rs_un.regsave.rs_u.pos.col == 0)
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 5493,5519 ****
Karsten Hopp 34ad50
  			}
Karsten Hopp 34ad50
  		    }
Karsten Hopp 34ad50
  		    else
Karsten Hopp 34ad50
  #ifdef FEAT_MBYTE
Karsten Hopp 34ad50
! 		    if (has_mbyte)
Karsten Hopp 34ad50
! 			rp->rs_un.regsave.rs_u.pos.col -=
Karsten Hopp 34ad50
! 			    (*mb_head_off)(regline, regline
Karsten Hopp 34ad50
  				    + rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
Karsten Hopp 34ad50
! 		    else
Karsten Hopp 34ad50
  #endif
Karsten Hopp 34ad50
! 			--rp->rs_un.regsave.rs_u.pos.col;
Karsten Hopp 34ad50
  		}
Karsten Hopp 34ad50
  		else
Karsten Hopp 34ad50
  		{
Karsten Hopp 34ad50
  		    if (rp->rs_un.regsave.rs_u.ptr == regline)
Karsten Hopp 34ad50
  			no = FAIL;
Karsten Hopp 34ad50
  		    else
Karsten Hopp 34ad50
! 			--rp->rs_un.regsave.rs_u.ptr;
Karsten Hopp 34ad50
  		}
Karsten Hopp 34ad50
  		if (no == OK)
Karsten Hopp 34ad50
  		{
Karsten Hopp 34ad50
  		    /* Advanced, prepare for finding match again. */
Karsten Hopp 34ad50
  		    reg_restore(&rp->rs_un.regsave, &backpos);
Karsten Hopp 34ad50
! 		    scan = OPERAND(rp->rs_scan);
Karsten Hopp 34ad50
  		    if (status == RA_MATCH)
Karsten Hopp 34ad50
  		    {
Karsten Hopp 34ad50
  			/* We did match, so subexpr may have been changed,
Karsten Hopp 34ad50
--- 5539,5579 ----
Karsten Hopp 34ad50
  			}
Karsten Hopp 34ad50
  		    }
Karsten Hopp 34ad50
  		    else
Karsten Hopp 34ad50
+ 		    {
Karsten Hopp 34ad50
  #ifdef FEAT_MBYTE
Karsten Hopp 34ad50
! 			if (has_mbyte)
Karsten Hopp 34ad50
! 			    rp->rs_un.regsave.rs_u.pos.col -=
Karsten Hopp 34ad50
! 				(*mb_head_off)(regline, regline
Karsten Hopp 34ad50
  				    + rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
Karsten Hopp 34ad50
! 			else
Karsten Hopp 34ad50
  #endif
Karsten Hopp 34ad50
! 			    --rp->rs_un.regsave.rs_u.pos.col;
Karsten Hopp 34ad50
! 			if (limit > 0
Karsten Hopp 34ad50
! 				&& ((rp->rs_un.regsave.rs_u.pos.lnum
Karsten Hopp 34ad50
! 						    < behind_pos.rs_u.pos.lnum
Karsten Hopp 34ad50
! 					? (colnr_T)STRLEN(regline)
Karsten Hopp 34ad50
! 					: behind_pos.rs_u.pos.col)
Karsten Hopp 34ad50
! 				    - rp->rs_un.regsave.rs_u.pos.col > limit))
Karsten Hopp 34ad50
! 			    no = FAIL;
Karsten Hopp 34ad50
! 		    }
Karsten Hopp 34ad50
  		}
Karsten Hopp 34ad50
  		else
Karsten Hopp 34ad50
  		{
Karsten Hopp 34ad50
  		    if (rp->rs_un.regsave.rs_u.ptr == regline)
Karsten Hopp 34ad50
  			no = FAIL;
Karsten Hopp 34ad50
  		    else
Karsten Hopp 34ad50
! 		    {
Karsten Hopp 34ad50
! 			mb_ptr_back(regline, rp->rs_un.regsave.rs_u.ptr);
Karsten Hopp 34ad50
! 			if (limit > 0 && (long)(behind_pos.rs_u.ptr
Karsten Hopp 34ad50
! 				     - rp->rs_un.regsave.rs_u.ptr) > limit)
Karsten Hopp 34ad50
! 			    no = FAIL;
Karsten Hopp 34ad50
! 		    }
Karsten Hopp 34ad50
  		}
Karsten Hopp 34ad50
  		if (no == OK)
Karsten Hopp 34ad50
  		{
Karsten Hopp 34ad50
  		    /* Advanced, prepare for finding match again. */
Karsten Hopp 34ad50
  		    reg_restore(&rp->rs_un.regsave, &backpos);
Karsten Hopp 34ad50
! 		    scan = OPERAND(rp->rs_scan) + 4;
Karsten Hopp 34ad50
  		    if (status == RA_MATCH)
Karsten Hopp 34ad50
  		    {
Karsten Hopp 34ad50
  			/* We did match, so subexpr may have been changed,
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 7773,7779 ****
Karsten Hopp 34ad50
  #ifdef DEBUG
Karsten Hopp 34ad50
  static char_u regname[][30] = {
Karsten Hopp 34ad50
  		    "AUTOMATIC Regexp Engine",
Karsten Hopp 34ad50
! 		    "BACKTACKING Regexp Engine",
Karsten Hopp 34ad50
  		    "NFA Regexp Engine"
Karsten Hopp 34ad50
  			    };
Karsten Hopp 34ad50
  #endif
Karsten Hopp 34ad50
--- 7833,7839 ----
Karsten Hopp 34ad50
  #ifdef DEBUG
Karsten Hopp 34ad50
  static char_u regname[][30] = {
Karsten Hopp 34ad50
  		    "AUTOMATIC Regexp Engine",
Karsten Hopp 34ad50
! 		    "BACKTRACKING Regexp Engine",
Karsten Hopp 34ad50
  		    "NFA Regexp Engine"
Karsten Hopp 34ad50
  			    };
Karsten Hopp 34ad50
  #endif
Karsten Hopp 34ad50
*** ../vim-7.3.1036/src/regexp_nfa.c	2013-05-28 22:52:11.000000000 +0200
Karsten Hopp 34ad50
--- src/regexp_nfa.c	2013-05-29 16:31:13.000000000 +0200
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 1331,1336 ****
Karsten Hopp 34ad50
--- 1331,1346 ----
Karsten Hopp 34ad50
  		case '=':
Karsten Hopp 34ad50
  		    EMIT(NFA_PREV_ATOM_NO_WIDTH);
Karsten Hopp 34ad50
  		    break;
Karsten Hopp 34ad50
+ 		case '0':
Karsten Hopp 34ad50
+ 		case '1':
Karsten Hopp 34ad50
+ 		case '2':
Karsten Hopp 34ad50
+ 		case '3':
Karsten Hopp 34ad50
+ 		case '4':
Karsten Hopp 34ad50
+ 		case '5':
Karsten Hopp 34ad50
+ 		case '6':
Karsten Hopp 34ad50
+ 		case '7':
Karsten Hopp 34ad50
+ 		case '8':
Karsten Hopp 34ad50
+ 		case '9':
Karsten Hopp 34ad50
  		case '!':
Karsten Hopp 34ad50
  		case '<':
Karsten Hopp 34ad50
  		case '>':
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 3817,3823 ****
Karsten Hopp 34ad50
  	 * because recursive calls should only start in the first position.
Karsten Hopp 34ad50
  	 * Also don't start a match past the first line. */
Karsten Hopp 34ad50
  	if (nfa_match == FALSE && start->c == NFA_MOPEN + 0
Karsten Hopp 34ad50
! 						 && reglnum == 0 && clen != 0)
Karsten Hopp 34ad50
  	{
Karsten Hopp 34ad50
  #ifdef ENABLE_LOG
Karsten Hopp 34ad50
  	    fprintf(log_fd, "(---) STARTSTATE\n");
Karsten Hopp 34ad50
--- 3827,3835 ----
Karsten Hopp 34ad50
  	 * because recursive calls should only start in the first position.
Karsten Hopp 34ad50
  	 * Also don't start a match past the first line. */
Karsten Hopp 34ad50
  	if (nfa_match == FALSE && start->c == NFA_MOPEN + 0
Karsten Hopp 34ad50
! 		&& reglnum == 0 && clen != 0
Karsten Hopp 34ad50
! 		&& (ireg_maxcol == 0
Karsten Hopp 34ad50
! 			      || (colnr_T)(reginput - regline) < ireg_maxcol))
Karsten Hopp 34ad50
  	{
Karsten Hopp 34ad50
  #ifdef ENABLE_LOG
Karsten Hopp 34ad50
  	    fprintf(log_fd, "(---) STARTSTATE\n");
Karsten Hopp 34ad50
*** ../vim-7.3.1036/src/testdir/test64.in	2013-05-28 22:03:13.000000000 +0200
Karsten Hopp 34ad50
--- src/testdir/test64.in	2013-05-29 14:56:44.000000000 +0200
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 336,341 ****
Karsten Hopp 34ad50
--- 336,349 ----
Karsten Hopp 34ad50
  :"call add(tl, [2, '\(\i\+\) \1', 'xgoo goox', 'goo goo', 'goo'])
Karsten Hopp 34ad50
  :call add(tl, [2, '\(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9', 'xabcddefghiabcddefghix', 'abcddefghiabcddefghi', 'a', 'b', 'c', 'dd', 'e', 'f', 'g', 'h', 'i'])
Karsten Hopp 34ad50
  :"
Karsten Hopp 34ad50
+ :"""" Look-behind with limit
Karsten Hopp 34ad50
+ :call add(tl, [0, '<\@<=span.', 'xxspanxx
Karsten Hopp 34ad50
+ :call add(tl, [0, '<\@1<=span.', 'xxspanxx
Karsten Hopp 34ad50
+ :call add(tl, [0, '<\@2<=span.', 'xxspanxx
Karsten Hopp 34ad50
+ :call add(tl, [0, '\(<<\)\@<=span.', 'xxspanxxxx
Karsten Hopp 34ad50
+ :call add(tl, [0, '\(<<\)\@1<=span.', 'xxspanxxxx
Karsten Hopp 34ad50
+ :call add(tl, [0, '\(<<\)\@2<=span.', 'xxspanxxxx
Karsten Hopp 34ad50
+ :"
Karsten Hopp 34ad50
  :"""" Run the tests
Karsten Hopp 34ad50
  :"
Karsten Hopp 34ad50
  :"
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 406,411 ****
Karsten Hopp 34ad50
--- 414,425 ----
Karsten Hopp 34ad50
  y$Go?p:"
Karsten Hopp 34ad50
  :"
Karsten Hopp 34ad50
  :"
Karsten Hopp 34ad50
+ :" Check a pattern with a look beind crossing a line boundary
Karsten Hopp 34ad50
+ /^Behind:
Karsten Hopp 34ad50
+ /\(<\_[xy]\+\)\@3<=start
Karsten Hopp 34ad50
+ :.yank
Karsten Hopp 34ad50
+ Go?p:"
Karsten Hopp 34ad50
+ :"
Karsten Hopp 34ad50
  :/\%#=1^Results/,$wq! test.out
Karsten Hopp 34ad50
  ENDTEST
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 423,426 ****
Karsten Hopp 34ad50
--- 437,448 ----
Karsten Hopp 34ad50
  xjk
Karsten Hopp 34ad50
  lmn
Karsten Hopp 34ad50
  
Karsten Hopp 34ad50
+ Behind:
Karsten Hopp 34ad50
+ asdfasd
Karsten Hopp 34ad50
+ xxstart1
Karsten Hopp 34ad50
+ asdfasd
Karsten Hopp 34ad50
+ xxxxstart2
Karsten Hopp 34ad50
+ asdfasd
Karsten Hopp 34ad50
+ xxxstart3
Karsten Hopp 34ad50
+ 
Karsten Hopp 34ad50
  Results of test64:
Karsten Hopp 34ad50
*** ../vim-7.3.1036/src/testdir/test64.ok	2013-05-28 22:03:13.000000000 +0200
Karsten Hopp 34ad50
--- src/testdir/test64.ok	2013-05-29 14:59:37.000000000 +0200
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 719,724 ****
Karsten Hopp 34ad50
--- 719,736 ----
Karsten Hopp 34ad50
  OK 0 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9
Karsten Hopp 34ad50
  OK 1 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9
Karsten Hopp 34ad50
  OK 2 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9
Karsten Hopp 34ad50
+ OK 0 - <\@<=span.
Karsten Hopp 34ad50
+ OK 1 - <\@<=span.
Karsten Hopp 34ad50
+ OK 0 - <\@1<=span.
Karsten Hopp 34ad50
+ OK 1 - <\@1<=span.
Karsten Hopp 34ad50
+ OK 0 - <\@2<=span.
Karsten Hopp 34ad50
+ OK 1 - <\@2<=span.
Karsten Hopp 34ad50
+ OK 0 - \(<<\)\@<=span.
Karsten Hopp 34ad50
+ OK 1 - \(<<\)\@<=span.
Karsten Hopp 34ad50
+ OK 0 - \(<<\)\@1<=span.
Karsten Hopp 34ad50
+ OK 1 - \(<<\)\@1<=span.
Karsten Hopp 34ad50
+ OK 0 - \(<<\)\@2<=span.
Karsten Hopp 34ad50
+ OK 1 - \(<<\)\@2<=span.
Karsten Hopp 34ad50
  192.168.0.1
Karsten Hopp 34ad50
  192.168.0.1
Karsten Hopp 34ad50
  192.168.0.1
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 726,728 ****
Karsten Hopp 34ad50
--- 738,742 ----
Karsten Hopp 34ad50
  <T="5">Ta 5</Title>
Karsten Hopp 34ad50
  <T="7">Ac 7</Title>
Karsten Hopp 34ad50
  ghi
Karsten Hopp 34ad50
+ 
Karsten Hopp 34ad50
+ xxxstart3
Karsten Hopp 34ad50
*** ../vim-7.3.1036/src/version.c	2013-05-28 22:52:11.000000000 +0200
Karsten Hopp 34ad50
--- src/version.c	2013-05-29 13:20:48.000000000 +0200
Karsten Hopp 34ad50
***************
Karsten Hopp 34ad50
*** 730,731 ****
Karsten Hopp 34ad50
--- 730,733 ----
Karsten Hopp 34ad50
  {   /* Add new patch number below this line */
Karsten Hopp 34ad50
+ /**/
Karsten Hopp 34ad50
+     1037,
Karsten Hopp 34ad50
  /**/
Karsten Hopp 34ad50
Karsten Hopp 34ad50
-- 
Karsten Hopp 34ad50
hundred-and-one symptoms of being an internet addict:
Karsten Hopp 34ad50
11. You find yourself typing "com" after every period when using a word
Karsten Hopp 34ad50
    processor.com
Karsten Hopp 34ad50
Karsten Hopp 34ad50
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
Karsten Hopp 34ad50
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
Karsten Hopp 34ad50
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
Karsten Hopp 34ad50
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///