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 found = FALSE; | ||||
|   nfa_thread_T        *thread; | ||||
|   lpos_T save_lpos; | ||||
|   struct multipos     save_multipos; | ||||
|   int save_in_use; | ||||
|   char_u              *save_ptr; | ||||
|   int i; | ||||
| @@ -4127,15 +4127,13 @@ skip_add: | ||||
|  | ||||
|     /* avoid compiler warnings */ | ||||
|     save_ptr = NULL; | ||||
|     save_lpos.lnum = 0; | ||||
|     save_lpos.col = 0; | ||||
|     memset(&save_multipos, 0, sizeof(save_multipos)); | ||||
|  | ||||
|     /* Set the position (with "off" added) in the subexpression.  Save | ||||
|      * and restore it when it was in use.  Otherwise fill any gap. */ | ||||
|     if (REG_MULTI) { | ||||
|       if (subidx < sub->in_use) { | ||||
|         save_lpos.lnum = sub->list.multi[subidx].start_lnum; | ||||
|         save_lpos.col = sub->list.multi[subidx].start_col; | ||||
|         save_multipos = sub->list.multi[subidx]; | ||||
|         save_in_use = -1; | ||||
|       } else { | ||||
|         save_in_use = sub->in_use; | ||||
| @@ -4178,9 +4176,8 @@ skip_add: | ||||
|       sub = &subs->norm; | ||||
|  | ||||
|     if (save_in_use == -1) { | ||||
|       if (REG_MULTI){ | ||||
|         sub->list.multi[subidx].start_lnum = save_lpos.lnum; | ||||
|         sub->list.multi[subidx].start_col = save_lpos.col; | ||||
|       if (REG_MULTI) { | ||||
|         sub->list.multi[subidx] = save_multipos; | ||||
|       } | ||||
|       else | ||||
|         sub->list.line[subidx].start = save_ptr; | ||||
| @@ -4234,8 +4231,7 @@ skip_add: | ||||
|     if (sub->in_use <= subidx) | ||||
|       sub->in_use = subidx + 1; | ||||
|     if (REG_MULTI) { | ||||
|       save_lpos.lnum = sub->list.multi[subidx].end_lnum; | ||||
|       save_lpos.col = sub->list.multi[subidx].end_col; | ||||
|       save_multipos = sub->list.multi[subidx]; | ||||
|       if (off == -1) { | ||||
|         sub->list.multi[subidx].end_lnum = reglnum + 1; | ||||
|         sub->list.multi[subidx].end_col = 0; | ||||
| @@ -4249,9 +4245,8 @@ skip_add: | ||||
|     } else { | ||||
|       save_ptr = sub->list.line[subidx].end; | ||||
|       sub->list.line[subidx].end = reginput + off; | ||||
|       /* avoid compiler warnings */ | ||||
|       save_lpos.lnum = 0; | ||||
|       save_lpos.col = 0; | ||||
|       // avoid compiler warnings | ||||
|       memset(&save_multipos, 0, sizeof(save_multipos)); | ||||
|     } | ||||
|  | ||||
|     subs = addstate(l, state->out, subs, pim, off_arg); | ||||
| @@ -4261,9 +4256,8 @@ skip_add: | ||||
|     else | ||||
|       sub = &subs->norm; | ||||
|  | ||||
|     if (REG_MULTI){ | ||||
|       sub->list.multi[subidx].end_lnum = save_lpos.lnum; | ||||
|       sub->list.multi[subidx].end_col = save_lpos.col; | ||||
|     if (REG_MULTI) { | ||||
|       sub->list.multi[subidx] = save_multipos; | ||||
|     } | ||||
|     else | ||||
|       sub->list.line[subidx].end = save_ptr; | ||||
|   | ||||
| @@ -98,6 +98,21 @@ func Test_recursive_substitute() | ||||
|   bwipe! | ||||
| 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() | ||||
|   let expected = ['abc def', 'abc', 'def', '', '', '', '', '', '', ''] | ||||
|   for re in range(0, 2) | ||||
|   | ||||
| @@ -90,7 +90,7 @@ static const int included_patches[] = { | ||||
|   2357, | ||||
|   2356, | ||||
|   2355, | ||||
|   // 2354, | ||||
|   2354, | ||||
|   2353, | ||||
|   // 2352 NA | ||||
|   // 2351 NA | ||||
|   | ||||
		Reference in New Issue
	
	Block a user