patch 9.0.1047: matchparen is slow

Problem:    Matchparen is slow.
Solution:   Actually use the position where the match started, not the
            position where the search started. (closes #11644)
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index c298f85..19ee71b 100644
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -3943,6 +3943,7 @@
 	    char_u	*end;
 	} line[NSUBEXP];
     } list;
+    colnr_T	orig_start_col;  // list.multi[0].start_col without \zs
 } regsub_T;
 
 typedef struct
@@ -4099,9 +4100,12 @@
     {
 	// Copy the match start and end positions.
 	if (REG_MULTI)
+	{
 	    mch_memmove(&to->list.multi[0],
 			&from->list.multi[0],
 			sizeof(struct multipos) * from->in_use);
+	    to->orig_start_col = from->orig_start_col;
+	}
 	else
 	    mch_memmove(&to->list.line[0],
 			&from->list.line[0],
@@ -5621,9 +5625,9 @@
  * Returns zero for no match, 1 for a match.
  */
     static long
-find_match_text(colnr_T startcol, int regstart, char_u *match_text)
+find_match_text(colnr_T *startcol, int regstart, char_u *match_text)
 {
-    colnr_T col = startcol;
+    colnr_T col = *startcol;
     int	    c1, c2;
     int	    len1, len2;
     int	    match;
@@ -5662,6 +5666,7 @@
 		rex.reg_startp[0] = rex.line + col;
 		rex.reg_endp[0] = rex.line + col + len2;
 	    }
+	    *startcol = col;
 	    return 1L;
 	}
 
@@ -5670,6 +5675,8 @@
 	if (skip_to_start(regstart, &col) == FAIL)
 	    break;
     }
+
+    *startcol = col;
     return 0L;
 }
 
@@ -5777,6 +5784,7 @@
 	{
 	    m->norm.list.multi[0].start_lnum = rex.lnum;
 	    m->norm.list.multi[0].start_col = (colnr_T)(rex.input - rex.line);
+	    m->norm.orig_start_col = m->norm.list.multi[0].start_col;
 	}
 	else
 	    m->norm.list.line[0].start = rex.input;
@@ -7081,8 +7089,12 @@
 		if (add)
 		{
 		    if (REG_MULTI)
+		    {
 			m->norm.list.multi[0].start_col =
 					 (colnr_T)(rex.input - rex.line) + clen;
+			m->norm.orig_start_col =
+					       m->norm.list.multi[0].start_col;
+		    }
 		    else
 			m->norm.list.line[0].start = rex.input + clen;
 		    if (addstate(nextlist, start->out, m, NULL, clen) == NULL)
@@ -7218,6 +7230,8 @@
 	    rex.reg_endpos[i].lnum = subs.norm.list.multi[i].end_lnum;
 	    rex.reg_endpos[i].col = subs.norm.list.multi[i].end_col;
 	}
+	if (rex.reg_mmatch != NULL)
+	    rex.reg_mmatch->rmm_matchcol = subs.norm.orig_start_col;
 
 	if (rex.reg_startpos[0].lnum < 0)
 	{
@@ -7379,7 +7393,7 @@
 	// Nothing else to try. Doesn't handle combining chars well.
 	if (prog->match_text != NULL && !rex.reg_icombine)
 	{
-	    retval = find_match_text(col, prog->regstart, prog->match_text);
+	    retval = find_match_text(&col, prog->regstart, prog->match_text);
 	    if (REG_MULTI)
 		rex.reg_mmatch->rmm_matchcol = col;
 	    else
@@ -7421,10 +7435,6 @@
 	    if (end->lnum < start->lnum
 			|| (end->lnum == start->lnum && end->col < start->col))
 		rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0];
-
-	    // startpos[0] may be set by "\zs", also return the column where
-	    // the whole pattern matched.
-	    rex.reg_mmatch->rmm_matchcol = col;
 	}
 	else
 	{