mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	vim-patch:7.4.2354
Problem:    The example that explains nested backreferences does not work
            properly with the new regexp engine. (Harm te Hennepe)
Solution:   Also save the end position when adding a state. (closes vim/vim#990)
d563883a1f
			
			
This commit is contained in:
		 Shougo Matsushita
					Shougo Matsushita
				
			
				
					committed by
					
						 James McCoy
						James McCoy
					
				
			
			
				
	
			
			
			 James McCoy
						James McCoy
					
				
			
						parent
						
							5f8f46ba8e
						
					
				
				
					commit
					b4ccf5c20a
				
			| @@ -3913,7 +3913,7 @@ addstate ( | |||||||
|   int k; |   int k; | ||||||
|   int found = FALSE; |   int found = FALSE; | ||||||
|   nfa_thread_T        *thread; |   nfa_thread_T        *thread; | ||||||
|   lpos_T save_lpos; |   struct multipos     save_multipos; | ||||||
|   int save_in_use; |   int save_in_use; | ||||||
|   char_u              *save_ptr; |   char_u              *save_ptr; | ||||||
|   int i; |   int i; | ||||||
| @@ -4127,15 +4127,13 @@ skip_add: | |||||||
|  |  | ||||||
|     /* avoid compiler warnings */ |     /* avoid compiler warnings */ | ||||||
|     save_ptr = NULL; |     save_ptr = NULL; | ||||||
|     save_lpos.lnum = 0; |     memset(&save_multipos, 0, sizeof(save_multipos)); | ||||||
|     save_lpos.col = 0; |  | ||||||
|  |  | ||||||
|     /* Set the position (with "off" added) in the subexpression.  Save |     /* Set the position (with "off" added) in the subexpression.  Save | ||||||
|      * and restore it when it was in use.  Otherwise fill any gap. */ |      * and restore it when it was in use.  Otherwise fill any gap. */ | ||||||
|     if (REG_MULTI) { |     if (REG_MULTI) { | ||||||
|       if (subidx < sub->in_use) { |       if (subidx < sub->in_use) { | ||||||
|         save_lpos.lnum = sub->list.multi[subidx].start_lnum; |         save_multipos = sub->list.multi[subidx]; | ||||||
|         save_lpos.col = sub->list.multi[subidx].start_col; |  | ||||||
|         save_in_use = -1; |         save_in_use = -1; | ||||||
|       } else { |       } else { | ||||||
|         save_in_use = sub->in_use; |         save_in_use = sub->in_use; | ||||||
| @@ -4179,8 +4177,7 @@ skip_add: | |||||||
|  |  | ||||||
|     if (save_in_use == -1) { |     if (save_in_use == -1) { | ||||||
|       if (REG_MULTI) { |       if (REG_MULTI) { | ||||||
|         sub->list.multi[subidx].start_lnum = save_lpos.lnum; |         sub->list.multi[subidx] = save_multipos; | ||||||
|         sub->list.multi[subidx].start_col = save_lpos.col; |  | ||||||
|       } |       } | ||||||
|       else |       else | ||||||
|         sub->list.line[subidx].start = save_ptr; |         sub->list.line[subidx].start = save_ptr; | ||||||
| @@ -4234,8 +4231,7 @@ skip_add: | |||||||
|     if (sub->in_use <= subidx) |     if (sub->in_use <= subidx) | ||||||
|       sub->in_use = subidx + 1; |       sub->in_use = subidx + 1; | ||||||
|     if (REG_MULTI) { |     if (REG_MULTI) { | ||||||
|       save_lpos.lnum = sub->list.multi[subidx].end_lnum; |       save_multipos = sub->list.multi[subidx]; | ||||||
|       save_lpos.col = sub->list.multi[subidx].end_col; |  | ||||||
|       if (off == -1) { |       if (off == -1) { | ||||||
|         sub->list.multi[subidx].end_lnum = reglnum + 1; |         sub->list.multi[subidx].end_lnum = reglnum + 1; | ||||||
|         sub->list.multi[subidx].end_col = 0; |         sub->list.multi[subidx].end_col = 0; | ||||||
| @@ -4249,9 +4245,8 @@ skip_add: | |||||||
|     } else { |     } else { | ||||||
|       save_ptr = sub->list.line[subidx].end; |       save_ptr = sub->list.line[subidx].end; | ||||||
|       sub->list.line[subidx].end = reginput + off; |       sub->list.line[subidx].end = reginput + off; | ||||||
|       /* avoid compiler warnings */ |       // avoid compiler warnings | ||||||
|       save_lpos.lnum = 0; |       memset(&save_multipos, 0, sizeof(save_multipos)); | ||||||
|       save_lpos.col = 0; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     subs = addstate(l, state->out, subs, pim, off_arg); |     subs = addstate(l, state->out, subs, pim, off_arg); | ||||||
| @@ -4262,8 +4257,7 @@ skip_add: | |||||||
|       sub = &subs->norm; |       sub = &subs->norm; | ||||||
|  |  | ||||||
|     if (REG_MULTI) { |     if (REG_MULTI) { | ||||||
|       sub->list.multi[subidx].end_lnum = save_lpos.lnum; |       sub->list.multi[subidx] = save_multipos; | ||||||
|       sub->list.multi[subidx].end_col = save_lpos.col; |  | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|       sub->list.line[subidx].end = save_ptr; |       sub->list.line[subidx].end = save_ptr; | ||||||
|   | |||||||
| @@ -98,6 +98,21 @@ func Test_recursive_substitute() | |||||||
|   bwipe! |   bwipe! | ||||||
| endfunc | endfunc | ||||||
|  |  | ||||||
|  | func Test_nested_backrefs() | ||||||
|  |   " Check example in change.txt. | ||||||
|  |   new | ||||||
|  |   for re in range(0, 2) | ||||||
|  |     exe 'set re=' . re | ||||||
|  |     call setline(1, 'aa ab x') | ||||||
|  |     1s/\(\(a[a-d] \)*\)\(x\)/-\1- -\2- -\3-/ | ||||||
|  |     call assert_equal('-aa ab - -ab - -x-', getline(1)) | ||||||
|  |  | ||||||
|  |     call assert_equal('-aa ab - -ab - -x-', substitute('aa ab x', '\(\(a[a-d] \)*\)\(x\)', '-\1- -\2- -\3-', '')) | ||||||
|  |   endfor | ||||||
|  |   bwipe! | ||||||
|  |   set re=0 | ||||||
|  | endfunc | ||||||
|  |  | ||||||
| func Test_eow_with_optional() | func Test_eow_with_optional() | ||||||
|   let expected = ['abc def', 'abc', 'def', '', '', '', '', '', '', ''] |   let expected = ['abc def', 'abc', 'def', '', '', '', '', '', '', ''] | ||||||
|   for re in range(0, 2) |   for re in range(0, 2) | ||||||
|   | |||||||
| @@ -90,7 +90,7 @@ static const int included_patches[] = { | |||||||
|   2357, |   2357, | ||||||
|   2356, |   2356, | ||||||
|   2355, |   2355, | ||||||
|   // 2354, |   2354, | ||||||
|   2353, |   2353, | ||||||
|   // 2352 NA |   // 2352 NA | ||||||
|   // 2351 NA |   // 2351 NA | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user