changeset 4690:9d97a0c045ef v7.3.1092

updated for version 7.3.1092 Problem: Can't build with regexp debugging. NFA debug output shows wrong pattern. Solution: Fix debugging code for recent changes. Add the pattern to the program.
author Bram Moolenaar <bram@vim.org>
date Sun, 02 Jun 2013 15:55:55 +0200
parents 84bc02d9b970
children 36da87ebfdfe
files src/regexp.h src/regexp_nfa.c src/version.c
diffstat 3 files changed, 26 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/regexp.h
+++ b/src/regexp.h
@@ -86,13 +86,15 @@ typedef struct
     regengine_T		*engine;
     unsigned		regflags;
 
-    regprog_T		regprog;
-    nfa_state_T		*start;
+    nfa_state_T		*start;		/* points into state[] */
     int			has_zend;	/* pattern contains \ze */
     int			has_backref;	/* pattern contains \1 .. \9 */
 #ifdef FEAT_SYN_HL
     int			reghasz;
 #endif
+#ifdef DEBUG
+    char_u		*pattern;
+#endif
     int			nsubexp;	/* number of () */
     int			nstate;
     nfa_state_T		state[0];	/* actually longer.. */
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -3133,12 +3133,12 @@ skip_add:
 	    {
 		int col;
 
-		if (thread->sub.in_use <= 0)
+		if (thread->subs.norm.in_use <= 0)
 		    col = -1;
 		else if (REG_MULTI)
-		    col = thread->sub.list.multi[0].start.col;
+		    col = thread->subs.norm.list.multi[0].start.col;
 		else
-		    col = (int)(thread->sub.list.line[0].start - regline);
+		    col = (int)(thread->subs.norm.list.line[0].start - regline);
 		nfa_set_code(state->c);
 		fprintf(log_fd, "> Adding state %d to list %d. char %d: %s (start col %d)\n",
 		        abs(state->id), l->id, state->c, code, col);
@@ -3152,12 +3152,12 @@ skip_add:
     {
 	int col;
 
-	if (sub->in_use <= 0)
+	if (subs->norm.in_use <= 0)
 	    col = -1;
 	else if (REG_MULTI)
-	    col = sub->list.multi[0].start.col;
+	    col = subs->norm.list.multi[0].start.col;
 	else
-	    col = (int)(sub->list.line[0].start - regline);
+	    col = (int)(subs->norm.list.line[0].start - regline);
 	nfa_set_code(state->c);
 	fprintf(log_fd, "> Processing state %d for list %d. char %d: %s (start col %d)\n",
 		abs(state->id), l->id, state->c, code, col);
@@ -3836,12 +3836,12 @@ nfa_regmatch(start, submatch, m, endp)
 	    {
 		int col;
 
-		if (t->sub.in_use <= 0)
+		if (t->subs.norm.in_use <= 0)
 		    col = -1;
 		else if (REG_MULTI)
-		    col = t->sub.list.multi[0].start.col;
+		    col = t->subs.norm.list.multi[0].start.col;
 		else
-		    col = (int)(t->sub.list.line[0].start - regline);
+		    col = (int)(t->subs.norm.list.line[0].start - regline);
 		nfa_set_code(t->state->c);
 		fprintf(log_fd, "(%d) char %d %s (start col %d) ... \n",
 			abs(t->state->id), (int)t->state->c, code, col);
@@ -4818,6 +4818,9 @@ nfa_regexec_both(line, col)
     nfa_has_zend = prog->has_zend;
     nfa_has_backref = prog->has_backref;
     nfa_nsubexpr = prog->nsubexp;
+#ifdef DEBUG
+    nfa_regengine.expr = prog->pattern;
+#endif
 
     nstate = prog->nstate;
     for (i = 0; i < nstate; ++i)
@@ -4828,6 +4831,10 @@ nfa_regexec_both(line, col)
 
     retval = nfa_regtry(prog, col);
 
+#ifdef DEBUG
+    nfa_regengine.expr = NULL;
+#endif
+
 theend:
     return retval;
 }
@@ -4921,6 +4928,10 @@ nfa_regcomp(expr, re_flags)
     /* Remember whether this pattern has any \z specials in it. */
     prog->reghasz = re_has_z;
 #endif
+#ifdef DEBUG
+    prog->pattern = vim_strsave(expr); /* memory will leak */
+    nfa_regengine.expr = NULL;
+#endif
 
 out:
     vim_free(post_start);
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1092,
+/**/
     1091,
 /**/
     1090,