Skip to content

Commit 3a14a54

Browse files
authored
common : add character class support to glob_match (#21111)
* add character class support to glob_match * remove pointless reference
1 parent 9681897 commit 3a14a54

1 file changed

Lines changed: 61 additions & 1 deletion

File tree

common/common.cpp

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,47 @@ bool string_parse_kv_override(const char * data, std::vector<llama_model_kv_over
656656
return true;
657657
}
658658

659-
// simple glob: * matches non-/ chars, ** matches anything including /
659+
static inline bool glob_class_match(const char c, const char * pattern, const char * class_end) {
660+
const char * class_start = pattern;
661+
bool negated = false;
662+
663+
if (*class_start == '!') {
664+
negated = true;
665+
class_start++;
666+
}
667+
668+
// If first character after negation is ']' or '-', treat it as literal
669+
if (*class_start == ']' || *class_start == '-') {
670+
if (class_start < class_end && *class_start == c) {
671+
return !negated;
672+
}
673+
class_start++;
674+
}
675+
676+
bool matched = false;
677+
678+
while (class_start < class_end) {
679+
if (class_start + 2 < class_end && class_start[1] == '-' && class_start[2] != ']') {
680+
char start_char = *class_start;
681+
char end_char = class_start[2];
682+
if (c >= start_char && c <= end_char) {
683+
matched = true;
684+
break;
685+
}
686+
class_start += 3;
687+
} else {
688+
if (*class_start == c) {
689+
matched = true;
690+
break;
691+
}
692+
class_start++;
693+
}
694+
}
695+
696+
return negated ? !matched : matched;
697+
}
698+
699+
// simple glob: * matches non-/ chars, ** matches anything including /, [] matches character class
660700
static inline bool glob_match(const char * pattern, const char * str) {
661701
if (*pattern == '\0') {
662702
return *str == '\0';
@@ -678,6 +718,26 @@ static inline bool glob_match(const char * pattern, const char * str) {
678718
if (*pattern == '?' && *str != '\0' && *str != '/') {
679719
return glob_match(pattern + 1, str + 1);
680720
}
721+
if (*pattern == '[') {
722+
const char * class_end = pattern + 1;
723+
// If first character after '[' is ']' or '-', treat it as literal
724+
if (*class_end == ']' || *class_end == '-') {
725+
class_end++;
726+
}
727+
while (*class_end != '\0' && *class_end != ']') {
728+
class_end++;
729+
}
730+
if (*class_end == ']') {
731+
if (*str == '\0') return false;
732+
bool matched = glob_class_match(*str, pattern + 1, class_end);
733+
return matched && glob_match(class_end + 1, str + 1);
734+
} else {
735+
if (*str == '[') {
736+
return glob_match(pattern + 1, str + 1);
737+
}
738+
return false;
739+
}
740+
}
681741
if (*pattern == *str) {
682742
return glob_match(pattern + 1, str + 1);
683743
}

0 commit comments

Comments
 (0)