astepano / rpms / vim

Forked from rpms/vim 6 years ago
Clone
0e5df63
To: vim-dev@vim.org
0e5df63
Subject: Patch 7.1.292
0e5df63
Fcc: outbox
0e5df63
From: Bram Moolenaar <Bram@moolenaar.net>
0e5df63
Mime-Version: 1.0
0e5df63
Content-Type: text/plain; charset=ISO-8859-1
0e5df63
Content-Transfer-Encoding: 8bit
0e5df63
------------
0e5df63
0e5df63
Patch 7.1.292
0e5df63
Problem:    When using a pattern with "\@<=" the submatches can be wrong.
0e5df63
	    (Brett Stahlman)
0e5df63
Solution:   Save the submatches when attempting a look-behind match.
0e5df63
Files:	    src/regexp.c
0e5df63
0e5df63
0e5df63
*** ../vim-7.1.291/src/regexp.c	Sat Jan 19 15:55:51 2008
0e5df63
--- src/regexp.c	Tue Apr  1 18:15:47 2008
0e5df63
***************
0e5df63
*** 3039,3044 ****
0e5df63
--- 3039,3053 ----
0e5df63
      } se_u;
0e5df63
  } save_se_T;
0e5df63
  
0e5df63
+ /* used for BEHIND and NOBEHIND matching */
0e5df63
+ typedef struct regbehind_S
0e5df63
+ {
0e5df63
+     regsave_T	save_after;
0e5df63
+     regsave_T	save_behind;
0e5df63
+     save_se_T   save_start[NSUBEXP];
0e5df63
+     save_se_T   save_end[NSUBEXP];
0e5df63
+ } regbehind_T;
0e5df63
+ 
0e5df63
  static char_u	*reg_getline __ARGS((linenr_T lnum));
0e5df63
  static long	vim_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm));
0e5df63
  static long	regtry __ARGS((regprog_T *prog, colnr_T col));
0e5df63
***************
0e5df63
*** 3046,3051 ****
0e5df63
--- 3055,3062 ----
0e5df63
  #ifdef FEAT_SYN_HL
0e5df63
  static void	cleanup_zsubexpr __ARGS((void));
0e5df63
  #endif
0e5df63
+ static void	save_subexpr __ARGS((regbehind_T *bp));
0e5df63
+ static void	restore_subexpr __ARGS((regbehind_T *bp));
0e5df63
  static void	reg_nextline __ARGS((void));
0e5df63
  static void	reg_save __ARGS((regsave_T *save, garray_T *gap));
0e5df63
  static void	reg_restore __ARGS((regsave_T *save, garray_T *gap));
0e5df63
***************
0e5df63
*** 3166,3184 ****
0e5df63
  	save_se_T  sesave;
0e5df63
  	regsave_T  regsave;
0e5df63
      } rs_un;			/* room for saving reginput */
0e5df63
!     short	rs_no;		/* submatch nr */
0e5df63
  } regitem_T;
0e5df63
  
0e5df63
  static regitem_T *regstack_push __ARGS((regstate_T state, char_u *scan));
0e5df63
  static void regstack_pop __ARGS((char_u **scan));
0e5df63
  
0e5df63
- /* used for BEHIND and NOBEHIND matching */
0e5df63
- typedef struct regbehind_S
0e5df63
- {
0e5df63
-     regsave_T	save_after;
0e5df63
-     regsave_T	save_behind;
0e5df63
- } regbehind_T;
0e5df63
- 
0e5df63
  /* used for STAR, PLUS and BRACE_SIMPLE matching */
0e5df63
  typedef struct regstar_S
0e5df63
  {
0e5df63
--- 3177,3188 ----
0e5df63
  	save_se_T  sesave;
0e5df63
  	regsave_T  regsave;
0e5df63
      } rs_un;			/* room for saving reginput */
0e5df63
!     short	rs_no;		/* submatch nr or BEHIND/NOBEHIND */
0e5df63
  } regitem_T;
0e5df63
  
0e5df63
  static regitem_T *regstack_push __ARGS((regstate_T state, char_u *scan));
0e5df63
  static void regstack_pop __ARGS((char_u **scan));
0e5df63
  
0e5df63
  /* used for STAR, PLUS and BRACE_SIMPLE matching */
0e5df63
  typedef struct regstar_S
0e5df63
  {
0e5df63
***************
0e5df63
*** 4888,4893 ****
0e5df63
--- 4892,4901 ----
0e5df63
  		    status = RA_FAIL;
0e5df63
  		else
0e5df63
  		{
0e5df63
+ 		    /* Need to save the subexpr to be able to restore them
0e5df63
+ 		     * when there is a match but we don't use it. */
0e5df63
+ 		    save_subexpr(((regbehind_T *)rp) - 1);
0e5df63
+ 
0e5df63
  		    rp->rs_no = op;
0e5df63
  		    reg_save(&rp->rs_un.regsave, &backpos);
0e5df63
  		    /* First try if what follows matches.  If it does then we
0e5df63
***************
0e5df63
*** 5118,5132 ****
0e5df63
  		    reg_restore(&(((regbehind_T *)rp) - 1)->save_after,
0e5df63
  								    &backpos);
0e5df63
  		else
0e5df63
! 		    /* But we didn't want a match. */
0e5df63
  		    status = RA_NOMATCH;
0e5df63
  		regstack_pop(&scan;;
0e5df63
  		regstack.ga_len -= sizeof(regbehind_T);
0e5df63
  	    }
0e5df63
  	    else
0e5df63
  	    {
0e5df63
! 		/* No match: Go back one character.  May go to previous
0e5df63
! 		 * line once. */
0e5df63
  		no = OK;
0e5df63
  		if (REG_MULTI)
0e5df63
  		{
0e5df63
--- 5126,5145 ----
0e5df63
  		    reg_restore(&(((regbehind_T *)rp) - 1)->save_after,
0e5df63
  								    &backpos);
0e5df63
  		else
0e5df63
! 		{
0e5df63
! 		    /* But we didn't want a match.  Need to restore the
0e5df63
! 		     * subexpr, because what follows matched, so they have
0e5df63
! 		     * been set. */
0e5df63
  		    status = RA_NOMATCH;
0e5df63
+ 		    restore_subexpr(((regbehind_T *)rp) - 1);
0e5df63
+ 		}
0e5df63
  		regstack_pop(&scan;;
0e5df63
  		regstack.ga_len -= sizeof(regbehind_T);
0e5df63
  	    }
0e5df63
  	    else
0e5df63
  	    {
0e5df63
! 		/* No match or a match that doesn't end where we want it: Go
0e5df63
! 		 * back one character.  May go to previous line once. */
0e5df63
  		no = OK;
0e5df63
  		if (REG_MULTI)
0e5df63
  		{
0e5df63
***************
0e5df63
*** 5160,5165 ****
0e5df63
--- 5173,5185 ----
0e5df63
  		    /* Advanced, prepare for finding match again. */
0e5df63
  		    reg_restore(&rp->rs_un.regsave, &backpos);
0e5df63
  		    scan = OPERAND(rp->rs_scan);
0e5df63
+ 		    if (status == RA_MATCH)
0e5df63
+ 		    {
0e5df63
+ 			/* We did match, so subexpr may have been changed,
0e5df63
+ 			 * need to restore them for the next try. */
0e5df63
+ 			status = RA_NOMATCH;
0e5df63
+ 			restore_subexpr(((regbehind_T *)rp) - 1);
0e5df63
+ 		    }
0e5df63
  		}
0e5df63
  		else
0e5df63
  		{
0e5df63
***************
0e5df63
*** 5172,5178 ****
0e5df63
  			status = RA_MATCH;
0e5df63
  		    }
0e5df63
  		    else
0e5df63
! 			status = RA_NOMATCH;
0e5df63
  		    regstack_pop(&scan;;
0e5df63
  		    regstack.ga_len -= sizeof(regbehind_T);
0e5df63
  		}
0e5df63
--- 5192,5207 ----
0e5df63
  			status = RA_MATCH;
0e5df63
  		    }
0e5df63
  		    else
0e5df63
! 		    {
0e5df63
! 			/* We do want a proper match.  Need to restore the
0e5df63
! 			 * subexpr if we had a match, because they may have
0e5df63
! 			 * been set. */
0e5df63
! 			if (status == RA_MATCH)
0e5df63
! 			{
0e5df63
! 			    status = RA_NOMATCH;
0e5df63
! 			    restore_subexpr(((regbehind_T *)rp) - 1);
0e5df63
! 			}
0e5df63
! 		    }
0e5df63
  		    regstack_pop(&scan;;
0e5df63
  		    regstack.ga_len -= sizeof(regbehind_T);
0e5df63
  		}
0e5df63
***************
0e5df63
*** 5820,5825 ****
0e5df63
--- 5849,5903 ----
0e5df63
  #endif
0e5df63
  
0e5df63
  /*
0e5df63
+  * Save the current subexpr to "bp", so that they can be restored
0e5df63
+  * later by restore_subexpr().
0e5df63
+  */
0e5df63
+     static void
0e5df63
+ save_subexpr(bp)
0e5df63
+     regbehind_T *bp;
0e5df63
+ {
0e5df63
+     int i;
0e5df63
+ 
0e5df63
+     for (i = 0; i < NSUBEXP; ++i)
0e5df63
+     {
0e5df63
+ 	if (REG_MULTI)
0e5df63
+ 	{
0e5df63
+ 	    bp->save_start[i].se_u.pos = reg_startpos[i];
0e5df63
+ 	    bp->save_end[i].se_u.pos = reg_endpos[i];
0e5df63
+ 	}
0e5df63
+ 	else
0e5df63
+ 	{
0e5df63
+ 	    bp->save_start[i].se_u.ptr = reg_startp[i];
0e5df63
+ 	    bp->save_end[i].se_u.ptr = reg_endp[i];
0e5df63
+ 	}
0e5df63
+     }
0e5df63
+ }
0e5df63
+ 
0e5df63
+ /*
0e5df63
+  * Restore the subexpr from "bp".
0e5df63
+  */
0e5df63
+     static void
0e5df63
+ restore_subexpr(bp)
0e5df63
+     regbehind_T *bp;
0e5df63
+ {
0e5df63
+     int i;
0e5df63
+ 
0e5df63
+     for (i = 0; i < NSUBEXP; ++i)
0e5df63
+     {
0e5df63
+ 	if (REG_MULTI)
0e5df63
+ 	{
0e5df63
+ 	    reg_startpos[i] = bp->save_start[i].se_u.pos;
0e5df63
+ 	    reg_endpos[i] = bp->save_end[i].se_u.pos;
0e5df63
+ 	}
0e5df63
+ 	else
0e5df63
+ 	{
0e5df63
+ 	    reg_startp[i] = bp->save_start[i].se_u.ptr;
0e5df63
+ 	    reg_endp[i] = bp->save_end[i].se_u.ptr;
0e5df63
+ 	}
0e5df63
+     }
0e5df63
+ }
0e5df63
+ 
0e5df63
+ /*
0e5df63
   * Advance reglnum, regline and reginput to the next line.
0e5df63
   */
0e5df63
      static void
0e5df63
*** ../vim-7.1.291/src/version.c	Tue Apr  1 20:58:23 2008
0e5df63
--- src/version.c	Wed Apr  9 12:12:33 2008
0e5df63
***************
0e5df63
*** 668,669 ****
0e5df63
--- 673,676 ----
0e5df63
  {   /* Add new patch number below this line */
0e5df63
+ /**/
0e5df63
+     292,
0e5df63
  /**/
0e5df63
0e5df63
-- 
0e5df63
hundred-and-one symptoms of being an internet addict:
0e5df63
259. When you enter your name in the AltaVista search engine, the top ten
0e5df63
     matches do indeed refer to you.
0e5df63
0e5df63
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
0e5df63
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
0e5df63
\\\        download, build and distribute -- http://www.A-A-P.org        ///
0e5df63
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///