--- grep-2.5.1/src/search.c.dfa-optional 2004-11-07 20:04:26.181494244 +0000 +++ grep-2.5.1/src/search.c 2004-11-07 20:11:07.437866925 +0000 @@ -305,11 +305,33 @@ 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 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) @@ -365,7 +387,8 @@ --beg; if (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 @@ -374,7 +397,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. */ @@ -450,7 +475,11 @@ if ((start == 0 || !WCHAR ((unsigned char) beg[start - 1])) && (len == end - beg - 1 || !WCHAR ((unsigned char) beg[start + len]))) - goto success_in_start_and_len; + { + if (len == 0) + len++; + goto success_in_start_and_len; + } if (len > 0) { /* Try a shorter length anchored at the same place. */