changeset 2551:b341325934ed

(PREFETCH_NOLIMIT): New function. (re_match_2_internal): Use it and adjust the end_match_2 logic.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 30 May 2000 02:58:58 +0000
parents 3ce1a171e216
children ebebfd95078d
files regex.c
diffstat 1 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/regex.c
+++ b/regex.c
@@ -3952,6 +3952,16 @@
       dend = end_match_2;						\
     }
 
+/* Call before fetching a char with *d if you already checked other limits.
+   This is meant for use in lookahead operations like wordend, etc..
+   where we might need to look at parts of the string that might be
+   outside of the LIMITs (i.e past `stop').  */
+#define PREFETCH_NOLIMIT()						\
+  if (d == end1)							\
+     {									\
+       d = string2;							\
+       dend = end_match_2;						\
+     }									\
 
 /* Test if at very beginning or at very end of the virtual concatenation
    of `string1' and `string2'.	If only one string, it's `string2'.  */
@@ -4497,7 +4507,7 @@
     }
   else
     {
-      if (stop <= size1)
+      if (stop < size1)
 	{
 	  /* Only match within string1.  */
 	  end_match_1 = string1 + stop;
@@ -4512,7 +4522,9 @@
 	  end_match_2 = end_match_1;
 	}
       else
-	{
+	{ /* It's important to use this code when stop == size so that
+	     moving `d' from end1 to string2 will not prevent the d == dend
+	     check from catching the end of string.  */
 	  end_match_1 = end1;
 	  end_match_2 = string2 + stop - size1;
 	}
@@ -5014,12 +5026,11 @@
 	    {
 	      if (!bufp->not_eol) break;
 	    }
-
-	  /* We have to ``prefetch'' the next character.  */
-	  else if ((d == end1 ? *string2 : *d) == '\n'
-		   && bufp->newline_anchor)
+	  else
 	    {
-	      break;
+	      PREFETCH_NOLIMIT ();
+	      if (*d == '\n' && bufp->newline_anchor)
+		break;
 	    }
 	  goto fail;
 
@@ -5254,7 +5265,7 @@
 #ifdef emacs
 	      UPDATE_SYNTAX_TABLE_FORWARD (charpos + 1);
 #endif
-	      PREFETCH ();
+	      PREFETCH_NOLIMIT ();
 	      c2 = RE_STRING_CHAR (d, dend - d);
 	      s2 = SYNTAX (c2);
 
@@ -5341,7 +5352,7 @@
 	      /* Case 3: D is not at the end of string ... */
 	      if (!AT_STRINGS_END (d))
 		{
-		  PREFETCH ();
+		  PREFETCH_NOLIMIT ();
 		  c2 = RE_STRING_CHAR (d, dend - d);
 #ifdef emacs
 		  UPDATE_SYNTAX_TABLE_FORWARD (charpos);