changeset 4543:08ac46980953 v7.3.1019

updated for version 7.3.1019 Problem: These do not work with the new regexp engine: \%o123, \%x123, \%d123, \%u123 and \%U123. Solution: Implement these items.
author Bram Moolenaar <bram@vim.org>
date Sat, 25 May 2013 22:04:23 +0200
parents c02661ad95f8
children 9bfe2b0a4eea
files src/regexp_nfa.c src/version.c
diffstat 2 files changed, 30 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -604,7 +604,6 @@ nfa_regatom()
     char_u	*endp;
 #ifdef FEAT_MBYTE
     char_u	*old_regparse = regparse;
-    int		clen;
     int		i;
 #endif
     int		extra = 0;
@@ -623,15 +622,12 @@ nfa_regatom()
     cpo_bsl = vim_strchr(p_cpo, CPO_BACKSL) != NULL;
 
     c = getchr();
-
-#ifdef FEAT_MBYTE
-    /* clen has the length of the current char, without composing chars */
-    clen = (*mb_char2len)(c);
-    if (has_mbyte && clen > 1)
-	goto nfa_do_multibyte;
-#endif
     switch (c)
     {
+	case NUL:
+	    syntax_error = TRUE;
+	    EMSG_RET_FAIL(_("E865: (NFA) Regexp end encountered prematurely"));
+
 	case Magic('^'):
 	    EMIT(NFA_BOL);
 	    break;
@@ -747,10 +743,6 @@ nfa_regatom()
 		return FAIL;	    /* cascaded error */
 	    break;
 
-	case NUL:
-	    syntax_error = TRUE;
-	    EMSG_RET_FAIL(_("E865: (NFA) Regexp end encountered prematurely"));
-
 	case Magic('|'):
 	case Magic('&'):
 	case Magic(')'):
@@ -834,11 +826,26 @@ nfa_regatom()
 		case 'x':   /* %xab hex 2 */
 		case 'u':   /* %uabcd hex 4 */
 		case 'U':   /* %U1234abcd hex 8 */
-		    /* Not yet supported */
-		    return FAIL;
-
-		    c = coll_get_char();
-		    EMIT(c);
+		    {
+			int i;
+
+			switch (c)
+			{
+			    case 'd': i = getdecchrs(); break;
+			    case 'o': i = getoctchrs(); break;
+			    case 'x': i = gethexchrs(2); break;
+			    case 'u': i = gethexchrs(4); break;
+			    case 'U': i = gethexchrs(8); break;
+			    default:  i = -1; break;
+			}
+
+			if (i < 0)
+			    EMSG2_RET_FAIL(
+			       _("E678: Invalid character after %s%%[dxouU]"),
+				    reg_magic == MAGIC_ALL);
+			/* TODO: what if a composing character follows? */
+			EMIT(i);
+		    }
 		    break;
 
 		/* Catch \%^ and \%$ regardless of where they appear in the
@@ -1217,9 +1224,10 @@ collection:
 		int	plen;
 
 nfa_do_multibyte:
-		/* Length of current char with composing chars. */
-		if (enc_utf8 && (clen != (plen = (*mb_ptr2len)(old_regparse))
-			    || utf_iscomposing(c)))
+		/* plen is length of current char with composing chars */
+		if (enc_utf8 && ((*mb_char2len)(c)
+			    != (plen = (*mb_ptr2len)(old_regparse))
+						       || utf_iscomposing(c)))
 		{
 		    /* A base character plus composing characters, or just one
 		     * or more composing characters.
--- 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 */
 /**/
+    1019,
+/**/
     1018,
 /**/
     1017,