bkabrda / rpms / grep

Forked from rpms/grep 6 years ago
Clone
acd16e9
--- grep-2.5.1/src/search.c	2004-11-07 20:11:07.437866925 +0000
acd16e9
+++ grep-2.5.1/src/search.c	2004-11-10 09:40:44.994750111 +0000
553606a
@@ -305,11 +305,33 @@
d619d25
   int backref, start, len;
d619d25
   struct kwsmatch kwsm;
d619d25
   size_t i, ret_val;
d619d25
+  static int use_dfa;
d619d25
+  static int use_dfa_checked = 0;
d619d25
 #ifdef MBS_SUPPORT
d619d25
   mbstate_t mbs;
d619d25
   memset (&mbs, '\0', sizeof (mbstate_t));
d619d25
 #endif /* MBS_SUPPORT */
d619d25
 
d619d25
+  if (!use_dfa_checked)
d619d25
+    {
553606a
+      char *grep_use_dfa = getenv ("GREP_USE_DFA");
553606a
+      if (!grep_use_dfa)
553606a
+	{
553606a
+#ifdef MBS_SUPPORT
553606a
+	  /* Turn off DFA when processing multibyte input. */
553606a
+	  use_dfa = (MB_CUR_MAX == 1);
553606a
+#else
553606a
+	  use_dfa = 1;
553606a
+#endif /* MBS_SUPPORT */
553606a
+	}
553606a
+      else
553606a
+	{
553606a
+	  use_dfa = atoi (grep_use_dfa);
553606a
+	}
553606a
+
d619d25
+      use_dfa_checked = 1;
d619d25
+    }
d619d25
+
d619d25
   buflim = buf + size;
d619d25
 
d619d25
   for (beg = end = buf; end < buflim; beg = end)
553606a
@@ -365,7 +387,8 @@
d619d25
 		--beg;
d619d25
 	      if (kwsm.index < kwset_exact_matches)
d619d25
 		goto success_in_beg_and_end;
d619d25
-	      if (dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
d619d25
+	      if (use_dfa &&
d619d25
+		  dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
d619d25
 		continue;
d619d25
 	    }
d619d25
 	  else
553606a
@@ -374,7 +397,9 @@
d619d25
 #ifdef MBS_SUPPORT
d619d25
 	      size_t bytes_left = 0;
d619d25
 #endif /* MBS_SUPPORT */
d619d25
-	      size_t offset = dfaexec (&dfa, beg, buflim - beg, &backref);
d619d25
+	      size_t offset = 0;
d619d25
+	      if (use_dfa)
d619d25
+		offset = dfaexec (&dfa, beg, buflim - beg, &backref);
d619d25
 	      if (offset == (size_t) -1)
d619d25
 		break;
d619d25
 	      /* Narrow down to the line we've found. */
acd16e9
@@ -416,7 +441,7 @@
acd16e9
 		--beg;
acd16e9
 	    }
acd16e9
 	  /* Successful, no backreferences encountered! */
acd16e9
-	  if (!backref)
acd16e9
+	  if (use_dfa && !backref)
acd16e9
 	    goto success_in_beg_and_end;
acd16e9
 	}
acd16e9
       else