changeset 678:bd677f8ba924

(re_search_2): Optimize regexp that starts with ^.
author Richard Stallman <rms@gnu.org>
date Sat, 31 Aug 1996 23:40:19 +0000
parents 89bc1e0c8354
children b088267ea1c8
files regex.c
diffstat 1 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/regex.c
+++ b/regex.c
@@ -3284,6 +3284,7 @@
   register RE_TRANSLATE_TYPE translate = bufp->translate;
   int total_size = size1 + size2;
   int endpos = startpos + range;
+  int anchored_start = 0;
 
   /* Check for out-of-range STARTPOS.  */
   if (startpos < 0 || startpos > total_size)
@@ -3323,9 +3324,26 @@
     if (re_compile_fastmap (bufp) == -2)
       return -2;
 
+  /* See whether the pattern is anchored.  */
+  if (bufp->buffer[0] == begline)
+    anchored_start = 1;
+
   /* Loop through the string, looking for a place to start matching.  */
   for (;;)
     {
+      /* If the pattern is anchored,
+	 skip quickly past places we cannot match.
+	 We don't bother to treat startpos == 0 specially
+	 because that case doesn't repeat.  */
+      if (anchored_start && startpos > 0)
+	{
+	  if (! (bufp->newline_anchor
+		 && ((startpos <= size1 ? string1[startpos - 1]
+		      : string2[startpos - size1 - 1])
+		     == '\n')))
+	    goto advance;
+	}
+
       /* If a fastmap is supplied, skip quickly over characters that
          cannot be the start of a match.  If the pattern can match the
          null string, however, we don't need to skip characters; we want
@@ -3461,7 +3479,7 @@
 
 /* Free everything we malloc.  */
 #ifdef MATCH_MAY_ALLOCATE
-#define FREE_VAR(var) if (var) then { REGEX_FREE (var); var = NULL; } else
+#define FREE_VAR(var) if (var) { REGEX_FREE (var); var = NULL; } else
 #define FREE_VARIABLES()						\
   do {									\
     REGEX_FREE_STACK (fail_stack.stack);				\