diff src/regexp.c @ 170:8c60f65311fa v7.0052

updated for version 7.0052
author vimboss
date Sat, 26 Feb 2005 23:04:13 +0000
parents c93c9cad9618
children 84c21eb4fc40
line wrap: on
line diff
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -3265,12 +3265,38 @@ vim_regexec_both(line, col)
 #endif
 	    c = *prog->regmust;
 	s = line + col;
-	while ((s = cstrchr(s, c)) != NULL)
-	{
-	    if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
-		break;		/* Found it. */
-	    mb_ptr_adv(s);
-	}
+
+	/*
+	 * This is used very often, esp. for ":global".  Use three versions of
+	 * the loop to avoid overhead of conditions.
+	 */
+	if (!ireg_ic
+#ifdef FEAT_MBYTE
+		&& !has_mbyte
+#endif
+		)
+	    while ((s = vim_strbyte(s, c)) != NULL)
+	    {
+		if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
+		    break;		/* Found it. */
+		++s;
+	    }
+#ifdef FEAT_MBYTE
+	else if (!ireg_ic || (!enc_utf8 && mb_char2len(c) > 1))
+	    while ((s = vim_strchr(s, c)) != NULL)
+	    {
+		if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
+		    break;		/* Found it. */
+		mb_ptr_adv(s);
+	    }
+#endif
+	else
+	    while ((s = cstrchr(s, c)) != NULL)
+	    {
+		if (cstrncmp(s, prog->regmust, &prog->regmlen) == 0)
+		    break;		/* Found it. */
+		mb_ptr_adv(s);
+	    }
 	if (s == NULL)		/* Not present. */
 	    goto theend;
     }
@@ -3339,8 +3365,16 @@ vim_regexec_both(line, col)
 	{
 	    if (prog->regstart != NUL)
 	    {
-		/* Skip until the char we know it must start with. */
-		s = cstrchr(regline + col, prog->regstart);
+		/* Skip until the char we know it must start with.
+		 * Used often, do some work to avoid call overhead. */
+		if (!ireg_ic
+#ifdef FEAT_MBYTE
+			    && !has_mbyte
+#endif
+			    )
+		    s = vim_strbyte(regline + col, prog->regstart);
+		else
+		    s = cstrchr(regline + col, prog->regstart);
 		if (s == NULL)
 		{
 		    retval = 0;
@@ -3375,7 +3409,8 @@ vim_regexec_both(line, col)
 
 #ifdef HAVE_SETJMP_H
 inner_end:
-    ;
+    if (did_mch_startjmp)
+	mch_endjmp();
 #endif
 #ifdef HAVE_TRY_EXCEPT
     }
@@ -3391,10 +3426,6 @@ inner_end:
 	retval = 0L;
     }
 #endif
-#ifdef HAVE_SETJMP_H
-    if (did_mch_startjmp)
-	mch_endjmp();
-#endif
 
 theend:
     /* Didn't find a match. */