@@ -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
660700static 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