summaryrefslogtreecommitdiff
path: root/src/pcre2_convert.c
diff options
context:
space:
mode:
authorzherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069>2017-05-23 15:17:44 +0000
committerzherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069>2017-05-23 15:17:44 +0000
commit9868f55dc8e6e322febf7d6c366c1ea413be2807 (patch)
tree4d987e7be9684bcaf7c5c82a9986e32084ee02b9 /src/pcre2_convert.c
parent24360bb0154064ded1f49f0dcf15d870042e682b (diff)
downloadpcre2-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.c40
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;
}