Files
foobar2000-sdk/pfc/wildcard.cpp
2021-12-14 00:28:25 -07:00

51 lines
1.2 KiB
C++

#include "pfc.h"
static bool test_recur(const char * fn,const char * rm,bool b_sep)
{
for(;;)
{
if ((b_sep && *rm==';') || *rm==0) return *fn==0;
else if (*rm=='*')
{
rm++;
do
{
if (test_recur(fn,rm,b_sep)) return true;
} while(pfc::utf8_advance(fn));
return false;
}
else if (*fn==0) return false;
else if (*rm!='?' && pfc::charLower(pfc::utf8_get_char(fn))!=pfc::charLower(pfc::utf8_get_char(rm))) return false;
fn = pfc::utf8_char_next(fn); rm = pfc::utf8_char_next(rm);
}
}
bool wildcard_helper::test_path(const char * path,const char * pattern,bool b_sep) {return test(path + pfc::scan_filename(path),pattern,b_sep);}
bool wildcard_helper::test(const char * fn,const char * pattern,bool b_sep)
{
if (!b_sep) return test_recur(fn,pattern,false);
const char * rm=pattern;
while(*rm)
{
if (test_recur(fn,rm,true)) return true;
while(*rm && *rm!=';') rm++;
if (*rm==';')
{
while(*rm==';') rm++;
while(*rm==' ') rm++;
}
};
return false;
}
bool wildcard_helper::has_wildcards(const char * str) {return strchr(str,'*') || strchr(str,'?');}
const char * wildcard_helper::get_wildcard_list() {return "*?";}
bool wildcard_helper::is_wildcard(char c) {
return c == '*' || c == '?';
}