diff options
author | zherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069> | 2017-05-23 15:17:44 +0000 |
---|---|---|
committer | zherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069> | 2017-05-23 15:17:44 +0000 |
commit | 9868f55dc8e6e322febf7d6c366c1ea413be2807 (patch) | |
tree | 4d987e7be9684bcaf7c5c82a9986e32084ee02b9 /src/pcre2_convert.c | |
parent | 24360bb0154064ded1f49f0dcf15d870042e682b (diff) | |
download | pcre2-9868f55dc8e6e322febf7d6c366c1ea413be2807.tar.gz |
Use atomic blocks after starstar during conversion.
git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@798 6239d852-aaf2-0410-a92c-79f79f948069
Diffstat (limited to 'src/pcre2_convert.c')
-rw-r--r-- | src/pcre2_convert.c | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/src/pcre2_convert.c b/src/pcre2_convert.c index 0c2085e..a58a480 100644 --- a/src/pcre2_convert.c +++ b/src/pcre2_convert.c @@ -729,6 +729,8 @@ PCRE2_UCHAR c; BOOL no_backslash = (options & PCRE2_CONVERT_GLOB_NO_BACKSLASH) != 0; BOOL no_wildsep = (options & PCRE2_CONVERT_GLOB_NO_WILD_SEPARATOR) != 0; BOOL no_starstar = (options & PCRE2_CONVERT_GLOB_NO_STARSTAR) != 0; +BOOL in_atomic = FALSE; +BOOL after_starstar = FALSE; BOOL with_escape, is_start; int result, len; @@ -780,6 +782,12 @@ while (pattern < pattern_end) { is_start = pattern == pattern_start + 1; + if (in_atomic) + { + convert_glob_write(&out, CHAR_RIGHT_PARENTHESIS); + in_atomic = FALSE; + } + if (!no_starstar && pattern < pattern_end && *pattern == CHAR_ASTERISK) { if (!is_start && pattern[-2] != separator) @@ -814,6 +822,7 @@ while (pattern < pattern_end) } pattern++; + after_starstar = TRUE; if (is_start) { @@ -825,7 +834,7 @@ while (pattern < pattern_end) out.out_str[5] = CHAR_VERTICAL_LINE; convert_glob_write_str(&out, 6); - convert_glob_print_wildcard(&out, separator, with_escape); + convert_glob_print_separator(&out, separator, with_escape); convert_glob_write(&out, CHAR_RIGHT_PARENTHESIS); continue; } @@ -875,7 +884,18 @@ while (pattern < pattern_end) } if (!is_start) - convert_glob_print_commit(&out); + { + if (after_starstar) + { + out.out_str[0] = CHAR_LEFT_PARENTHESIS; + out.out_str[1] = CHAR_QUESTION_MARK; + out.out_str[2] = CHAR_GREATER_THAN_SIGN; + convert_glob_write_str(&out, 3); + in_atomic = TRUE; + } + else + convert_glob_print_commit(&out); + } if (no_wildsep) convert_glob_write(&out, CHAR_DOT); @@ -923,19 +943,19 @@ while (pattern < pattern_end) if (result == 0 || result == ERROR_NO_SLASH_Z) { - if (result == ERROR_NO_SLASH_Z) - { - convert_glob_write(&out, CHAR_NULL); - result = 0; - } - else + if (result == 0) { out.out_str[0] = CHAR_BACKSLASH; out.out_str[1] = CHAR_z; - out.out_str[2] = CHAR_NULL; - convert_glob_write_str(&out, 3); + convert_glob_write_str(&out, 2); } + if (in_atomic) + convert_glob_write(&out, CHAR_RIGHT_PARENTHESIS); + + convert_glob_write(&out, CHAR_NULL); + result = 0; + if (!dummyrun && out.output_size != (PCRE2_SIZE) (out.output - use_buffer)) result = PCRE2_ERROR_NOMEMORY; } |