diff options
author | tjr <tjr@FreeBSD.org> | 2005-05-14 06:12:03 +0000 |
---|---|---|
committer | tjr <tjr@FreeBSD.org> | 2005-05-14 06:12:03 +0000 |
commit | 5364440b9fa7030e02c2c85e7e21a6de2022396b (patch) | |
tree | dd146b3851a55b5a8ff3324b6a5f465cf7d3db0f /gnu | |
parent | bff87236c6ebbe4c0724506ffbe20cda3c40eac0 (diff) | |
download | FreeBSD-src-5364440b9fa7030e02c2c85e7e21a6de2022396b.zip FreeBSD-src-5364440b9fa7030e02c2c85e7e21a6de2022396b.tar.gz |
Automatically disable DFA when processing multibyte input. GREP_USE_DFA
environment variable overrides.
Obtained from: Fedora (Tim Waugh)
Diffstat (limited to 'gnu')
-rw-r--r-- | gnu/usr.bin/grep/search.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/gnu/usr.bin/grep/search.c b/gnu/usr.bin/grep/search.c index 7800b1c..ab28313 100644 --- a/gnu/usr.bin/grep/search.c +++ b/gnu/usr.bin/grep/search.c @@ -329,12 +329,34 @@ EGexecute (char const *buf, size_t size, size_t *match_size, int exact) 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) @@ -402,7 +424,8 @@ EGexecute (char const *buf, size_t size, size_t *match_size, int exact) #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 @@ -411,7 +434,9 @@ EGexecute (char const *buf, size_t size, size_t *match_size, int exact) #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. */ @@ -453,7 +478,7 @@ EGexecute (char const *buf, size_t size, size_t *match_size, int exact) --beg; } /* Successful, no backreferences encountered! */ - if (!backref) + if (use_dfa && !backref) goto success_in_beg_and_end; } else |