changeset 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 592769af9d32
children 5a4995e468e1
files src/regexp_nfa.c src/testdir/test95.in src/testdir/test95.ok src/version.c
diffstat 4 files changed, 45 insertions(+), 16 deletions(-) [+]
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;
 	    }
--- a/src/testdir/test95.in
+++ b/src/testdir/test95.in
@@ -41,6 +41,15 @@ STARTTEST
 
 :"""" Test \Z
 :call add(tl, ['ú\Z', 'x'])
+:call add(tl, ['יהוה\Z', 'יהוה', 'יהוה'])
+:call add(tl, ['יְהוָה\Z', 'יהוה', 'יהוה'])
+:call add(tl, ['יהוה\Z', 'יְהוָה', 'יְהוָה'])
+:call add(tl, ['יְהוָה\Z', 'יְהוָה', 'יְהוָה'])
+:call add(tl, ['יְ\Z', 'וְיַ', 'יַ'])
+:call add(tl, ["ק\u200d\u05b9x\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"])
+:call add(tl, ["ק\u200d\u05b9x\\Z", "xק\u200dxy", "ק\u200dx"])
+:call add(tl, ["ק\u200dx\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"])
+:call add(tl, ["ק\u200dx\\Z", "xק\u200dxy", "ק\u200dx"])
 
 :"""" Combining different tests and features
 :call add(tl, ['[^[=a=]]\+', 'ddaãâbcd', 'dd'])
--- a/src/testdir/test95.ok
+++ b/src/testdir/test95.ok
@@ -12,4 +12,13 @@ OK - \%#=1\f\+
 OK - .ม
 OK - .ม่
 OK - ú\Z
+OK - יהוה\Z
+OK - יְהוָה\Z
+OK - יהוה\Z
+OK - יְהוָה\Z
+OK - יְ\Z
+OK - ק‍ֹx\Z
+OK - ק‍ֹx\Z
+OK - ק‍x\Z
+OK - ק‍x\Z
 OK - [^[=a=]]\+
--- 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 */
 /**/
+    1012,
+/**/
     1011,
 /**/
     1010,