changeset 28911:e25196adb7c1 v8.2.4978

patch 8.2.4978: no error if engine selection atom is not at the start Commit: https://github.com/vim/vim/commit/360da40b47a84ee8586c3b5d062f8c64a2ac9cc6 Author: Christian Brabandt <cb@256bit.org> Date: Wed May 18 15:04:02 2022 +0100 patch 8.2.4978: no error if engine selection atom is not at the start Problem: No error if engine selection atom is not at the start. Solution: Give an error. (Christian Brabandt, closes https://github.com/vim/vim/issues/10439)
author Bram Moolenaar <Bram@vim.org>
date Wed, 18 May 2022 16:15:03 +0200
parents 983006b5755d
children 2ca7719992c9
files runtime/doc/pattern.txt src/errors.h src/regexp_bt.c src/regexp_nfa.c src/testdir/test_regexp_latin.vim src/version.c
diffstat 6 files changed, 39 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/pattern.txt
+++ b/runtime/doc/pattern.txt
@@ -379,7 +379,7 @@ Vim includes two regexp engines:
 1. An old, backtracking engine that supports everything.
 2. A new, NFA engine that works much faster on some patterns, possibly slower
    on some patterns.
-
+								 *E1281*
 Vim will automatically select the right engine for you.  However, if you run
 into a problem or want to specifically select one engine or the other, you can
 prepend one of the following to the pattern:
--- a/src/errors.h
+++ b/src/errors.h
@@ -3277,3 +3277,5 @@ EXTERN char e_missing_close_curly_str[]
 EXTERN char e_illegal_character_in_word[]
 	INIT(= N_("E1280: Illegal character in word"));
 #endif
+EXTERN char e_atom_engine_must_be_at_start_of_pattern[]
+	INIT(= N_("E1281: Atom '\\%%#=%c' must be at the start of the pattern"));
--- a/src/regexp_bt.c
+++ b/src/regexp_bt.c
@@ -1503,6 +1503,14 @@ regatom(int *flagp)
 		    break;
 
 		case '#':
+		    if (regparse[0] == '=' && regparse[1] >= 48
+							  && regparse[1] <= 50)
+		    {
+			// misplaced \%#=1
+			semsg(_(e_atom_engine_must_be_at_start_of_pattern),
+								  regparse[1]);
+			return FAIL;
+		    }
 		    ret = regnode(CURSOR);
 		    break;
 
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1592,6 +1592,14 @@ nfa_regatom(void)
 		    break;
 
 		case '#':
+		    if (regparse[0] == '=' && regparse[1] >= 48
+							  && regparse[1] <= 50)
+		    {
+			// misplaced \%#=1
+			semsg(_(e_atom_engine_must_be_at_start_of_pattern),
+								  regparse[1]);
+			return FAIL;
+		    }
 		    EMIT(NFA_CURSOR);
 		    break;
 
--- a/src/testdir/test_regexp_latin.vim
+++ b/src/testdir/test_regexp_latin.vim
@@ -1096,4 +1096,22 @@ func Test_using_invalid_visual_position(
   bwipe!
 endfunc
 
+func Test_using_two_engines_pattern()
+  new
+  call setline(1, ['foobar=0', 'foobar=1', 'foobar=2'])
+  " \%#= at the end of the pattern
+  for i in range(0, 2)
+    call cursor( (i+1), 7) 
+    call assert_fails("%s/foobar\\%#=" .. i, 'E1281:')
+  endfor
+
+  " \%#= at the start of the pattern
+  for i in range(0, 2)
+    call cursor( (i+1), 7) 
+    exe ":%s/\\%#=" .. i .. "foobar=" .. i .. "/xx"
+  endfor
+  call assert_equal(['xx', 'xx', 'xx'], getline(1, '$'))
+  bwipe!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4978,
+/**/
     4977,
 /**/
     4976,