patch 8.1.0971: failure for selecting quoted text object moves cursor

Problem:    Failure for selecting quoted text object moves cursor.
Solution:   Restore the Visual selection on failure. (Christian Brabandt,
            closes #4024)
diff --git a/src/search.c b/src/search.c
index 20f6299..d2554e2 100644
--- a/src/search.c
+++ b/src/search.c
@@ -4359,11 +4359,12 @@
     int		col_end;
     int		col_start = curwin->w_cursor.col;
     int		inclusive = FALSE;
-    int		vis_empty = TRUE;	/* Visual selection <= 1 char */
-    int		vis_bef_curs = FALSE;	/* Visual starts before cursor */
-    int		inside_quotes = FALSE;	/* Looks like "i'" done before */
-    int		selected_quote = FALSE;	/* Has quote inside selection */
+    int		vis_empty = TRUE;	// Visual selection <= 1 char
+    int		vis_bef_curs = FALSE;	// Visual starts before cursor
+    int		inside_quotes = FALSE;	// Looks like "i'" done before
+    int		selected_quote = FALSE;	// Has quote inside selection
     int		i;
+    int		restore_vis_bef = FALSE; // restore VIsual on abort
 
     /* Correct cursor when 'selection' is "exclusive". */
     if (VIsual_active)
@@ -4377,12 +4378,13 @@
 	{
 	    if (!vis_bef_curs)
 	    {
-		/* VIsual needs to be start of Visual selection. */
+		// VIsual needs to be the start of Visual selection.
 		pos_T t = curwin->w_cursor;
 
 		curwin->w_cursor = VIsual;
 		VIsual = t;
 		vis_bef_curs = TRUE;
+		restore_vis_bef = TRUE;
 	    }
 	    dec_cursor();
 	}
@@ -4431,7 +4433,7 @@
 	     * opening quote. */
 	    col_start = find_next_quote(line, col_start + 1, quotechar, NULL);
 	    if (col_start < 0)
-		return FALSE;
+		goto abort_search;
 	    col_end = find_next_quote(line, col_start + 1, quotechar,
 							      curbuf->b_p_qe);
 	    if (col_end < 0)
@@ -4445,7 +4447,7 @@
 	{
 	    col_end = find_prev_quote(line, col_start, quotechar, NULL);
 	    if (line[col_end] != quotechar)
-		return FALSE;
+		goto abort_search;
 	    col_start = find_prev_quote(line, col_end, quotechar,
 							      curbuf->b_p_qe);
 	    if (line[col_start] != quotechar)
@@ -4480,12 +4482,12 @@
 	    /* Find open quote character. */
 	    col_start = find_next_quote(line, col_start, quotechar, NULL);
 	    if (col_start < 0 || col_start > first_col)
-		return FALSE;
+		goto abort_search;
 	    /* Find close quote character. */
 	    col_end = find_next_quote(line, col_start + 1, quotechar,
 							      curbuf->b_p_qe);
 	    if (col_end < 0)
-		return FALSE;
+		goto abort_search;
 	    /* If is cursor between start and end quote character, it is
 	     * target text object. */
 	    if (col_start <= first_col && first_col <= col_end)
@@ -4502,14 +4504,14 @@
 	    /* No quote before the cursor, look after the cursor. */
 	    col_start = find_next_quote(line, col_start, quotechar, NULL);
 	    if (col_start < 0)
-		return FALSE;
+		goto abort_search;
 	}
 
 	/* Find close quote character. */
 	col_end = find_next_quote(line, col_start + 1, quotechar,
 							      curbuf->b_p_qe);
 	if (col_end < 0)
-	    return FALSE;
+	    goto abort_search;
     }
 
     /* When "include" is TRUE, include spaces after closing quote or before
@@ -4596,6 +4598,20 @@
     }
 
     return OK;
+
+abort_search:
+    if (VIsual_active && *p_sel == 'e')
+    {
+	inc_cursor();
+	if (restore_vis_bef)
+	{
+	    pos_T t = curwin->w_cursor;
+
+	    curwin->w_cursor = VIsual;
+	    VIsual = t;
+	}
+    }
+    return FALSE;
 }
 
 #endif /* FEAT_TEXTOBJ */