diff --git a/common/common.cpp b/common/common.cpp index affb3d7bac..c5ed79783d 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -656,7 +656,47 @@ bool string_parse_kv_override(const char * data, std::vector= start_char && c <= end_char) { + matched = true; + break; + } + class_start += 3; + } else { + if (*class_start == c) { + matched = true; + break; + } + class_start++; + } + } + + return negated ? !matched : matched; +} + +// simple glob: * matches non-/ chars, ** matches anything including /, [] matches character class static inline bool glob_match(const char * pattern, const char * str) { if (*pattern == '\0') { return *str == '\0'; @@ -678,6 +718,26 @@ static inline bool glob_match(const char * pattern, const char * str) { if (*pattern == '?' && *str != '\0' && *str != '/') { return glob_match(pattern + 1, str + 1); } + if (*pattern == '[') { + const char * class_end = pattern + 1; + // If first character after '[' is ']' or '-', treat it as literal + if (*class_end == ']' || *class_end == '-') { + class_end++; + } + while (*class_end != '\0' && *class_end != ']') { + class_end++; + } + if (*class_end == ']') { + if (*str == '\0') return false; + bool matched = glob_class_match(*str, pattern + 1, class_end); + return matched && glob_match(class_end + 1, str + 1); + } else { + if (*str == '[') { + return glob_match(pattern + 1, str + 1); + } + return false; + } + } if (*pattern == *str) { return glob_match(pattern + 1, str + 1); }