#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 == '?';
}
