mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06: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:
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
|
||||
|
Loading…
Reference in New Issue
Block a user