summaryrefslogtreecommitdiffstats
path: root/abs/core-testing/grep/10-dfa-optional.patch
blob: 784eba90b8c48110a21b48260d32431cc16d8dcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
--- grep-2.5.1a/src/search.c.dfa-optional	2005-01-07 14:58:45.714869815 +0000
+++ grep-2.5.1a/src/search.c	2005-01-07 14:58:45.725867716 +0000
@@ -327,12 +327,34 @@
   int backref, start, len;
   struct kwsmatch kwsm;
   size_t i, ret_val;
+  static int use_dfa;
+  static int use_dfa_checked = 0;
 #ifdef MBS_SUPPORT
   int mb_cur_max = MB_CUR_MAX;
   mbstate_t mbs;
   memset (&mbs, '\0', sizeof (mbstate_t));
 #endif /* MBS_SUPPORT */
 
+  if (!use_dfa_checked)
+    {
+      char *grep_use_dfa = getenv ("GREP_USE_DFA");
+      if (!grep_use_dfa)
+	{
+#ifdef MBS_SUPPORT
+	  /* Turn off DFA when processing multibyte input. */
+	  use_dfa = (MB_CUR_MAX == 1);
+#else
+	  use_dfa = 1;
+#endif /* MBS_SUPPORT */
+	}
+      else
+	{
+	  use_dfa = atoi (grep_use_dfa);
+	}
+
+      use_dfa_checked = 1;
+    }
+
   buflim = buf + size;
 
   for (beg = end = buf; end < buflim; beg = end)
@@ -400,7 +422,8 @@
 #endif /* MBS_SUPPORT */
 		  (kwsm.index < kwset_exact_matches))
 		goto success_in_beg_and_end;
-	      if (dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
+	      if (use_dfa &&
+		  dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
 		continue;
 	    }
 	  else
@@ -409,7 +432,9 @@
 #ifdef MBS_SUPPORT
 	      size_t bytes_left = 0;
 #endif /* MBS_SUPPORT */
-	      size_t offset = dfaexec (&dfa, beg, buflim - beg, &backref);
+	      size_t offset = 0;
+	      if (use_dfa)
+		offset = dfaexec (&dfa, beg, buflim - beg, &backref);
 	      if (offset == (size_t) -1)
 		break;
 	      /* Narrow down to the line we've found. */
@@ -451,7 +476,7 @@
 		--beg;
 	    }
 	  /* Successful, no backreferences encountered! */
-	  if (!backref)
+	  if (use_dfa && !backref)
 	    goto success_in_beg_and_end;
 	}
       else