diff src/regexp_nfa.c @ 4529:432a6b8c7d93 v7.3.1012

updated for version 7.3.1012 Problem: \Z does not work properly with the new regexp engine. Solution: Make \Z work. Add tests.
author Bram Moolenaar <bram@vim.org>
date Fri, 24 May 2013 23:10:50 +0200
parents 55bcaa1d2749
children 1be43c095aff
line wrap: on
line diff
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1184,14 +1184,15 @@ collection:
 		    EMIT(NFA_CONCAT);
 		}
 		return OK;
-	    }		/* if exists closing ] */
-	    else if (reg_strict)
+	    } /* if exists closing ] */
+
+	    if (reg_strict)
 	    {
 		syntax_error = TRUE;
 		EMSG_RET_FAIL(_(e_missingbracket));
 	    }
-
-	/* FALLTHROUGH */
+	    /* FALLTHROUGH */
+
 	default:
 	    {
 #ifdef FEAT_MBYTE
@@ -1214,7 +1215,7 @@ nfa_do_multibyte:
 			EMIT(c);
 			if (i > 0)
 			    EMIT(NFA_CONCAT);
-			if (i += utf_char2len(c) >= plen)
+			if ((i += utf_char2len(c)) >= plen)
 			    break;
 			c = utf_ptr2char(old_regparse + i);
 		    }
@@ -2269,7 +2270,7 @@ post2nfa(postfix, end, nfa_calc_size)
 	    /* TODO */
 	    if (regflags & RF_ICOMBINE)
 	    {
-		goto normalchar;
+		/* use the base character only */
 	    }
 #endif
 	    /* FALLTHROUGH */
@@ -3145,23 +3146,31 @@ nfa_regmatch(start, submatch, m)
 		result = OK;
 		sta = t->state->out;
 		len = 0;
-		while (sta->c != NFA_END_COMPOSING && len < n)
+		if (ireg_icombine)
 		{
-		    if (len > 0)
-			mc = mb_ptr2char(reginput + len);
-		    if (mc != sta->c)
-			break;
-		    len += mb_char2len(mc);
-		    sta = sta->out;
+		    /* If \Z was present, then ignore composing characters. */
+		    /* TODO: How about negated? */
+		    if (sta->c != c)
+			result = FAIL;
+		    len = n;
+		    while (sta->c != NFA_END_COMPOSING)
+			sta = sta->out;
 		}
+		else
+		    while (sta->c != NFA_END_COMPOSING && len < n)
+		    {
+			if (len > 0)
+			    mc = mb_ptr2char(reginput + len);
+			if (mc != sta->c)
+			    break;
+			len += mb_char2len(mc);
+			sta = sta->out;
+		    }
 
 		/* if input char length doesn't match regexp char length */
 		if (len < n || sta->c != NFA_END_COMPOSING)
 		    result = FAIL;
 		end = t->state->out1;	    /* NFA_END_COMPOSING */
-		/* If \Z was present, then ignore composing characters */
-		if (ireg_icombine)
-		    result = 1 ^ sta->negated;
 		ADD_POS_NEG_STATE(end);
 		break;
 	    }