diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2016-11-19 03:12:56 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2016-11-19 03:14:18 -0800 |
commit | 6a3f4e447af3698b1e26337211a587ff54aab99d (patch) | |
tree | d18ad8f097ca67a99c5c954f592e975e782fca69 /src/pcresearch.c | |
parent | 575bdb1bc65d0aa73df127ec1bf70ab6ec3db174 (diff) | |
download | grep-6a3f4e447af3698b1e26337211a587ff54aab99d.tar.gz |
grep: fix -zxP bug
* NEWS: Document this.
* src/pcresearch.c (Pcompile): Search a line at a time if -x is
used, since -x uses ^ and $.
* tests/pcre: Test this.
Diffstat (limited to 'src/pcresearch.c')
-rw-r--r-- | src/pcresearch.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/src/pcresearch.c b/src/pcresearch.c index 439945aa..01616c2c 100644 --- a/src/pcresearch.c +++ b/src/pcresearch.c @@ -128,22 +128,28 @@ Pcompile (char const *pattern, size_t size) if (! eolbyte) { - bool escaped = false; - bool after_unescaped_left_bracket = false; - for (p = pattern; *p; p++) - if (escaped) - escaped = after_unescaped_left_bracket = false; - else - { - if (*p == '$' || (*p == '^' && !after_unescaped_left_bracket) - || (*p == '(' && (p[1] == '?' || p[1] == '*'))) + bool line_at_a_time = match_lines; + if (! line_at_a_time) + { + bool escaped = false; + bool after_unescaped_left_bracket = false; + for (p = pattern; *p; p++) + if (escaped) + escaped = after_unescaped_left_bracket = false; + else { - flags = (flags & ~ PCRE_MULTILINE) | PCRE_DOLLAR_ENDONLY; - break; + if (*p == '$' || (*p == '^' && !after_unescaped_left_bracket) + || (*p == '(' && (p[1] == '?' || p[1] == '*'))) + { + line_at_a_time = true; + break; + } + escaped = *p == '\\'; + after_unescaped_left_bracket = *p == '['; } - escaped = *p == '\\'; - after_unescaped_left_bracket = *p == '['; - } + } + if (line_at_a_time) + flags = (flags & ~ PCRE_MULTILINE) | PCRE_DOLLAR_ENDONLY; } *n = '\0'; |