summaryrefslogtreecommitdiff
path: root/src/wildcard.cpp
blob: c6883a4bc74a1ad063403de10e79adc0bdadc0b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "services.h"

bool Anope::Match(const Anope::string &str, const Anope::string &mask, bool case_sensitive)
{
	size_t s = 0, m = 0, str_len = str.length(), mask_len = mask.length();

	while (s < str_len && m < mask_len && mask[m] != '*')
	{
		char string = str[s], wild = mask[m];
		if (case_sensitive)
		{
			if (wild != string && wild != '?')
				return false;
		}
		else
		{
			if (tolower(wild) != tolower(string) && wild != '?')
				return false;
		}

		++m;
		++s;
	}

	size_t sp = 0, mp = 0;
	while (s < str_len)
	{
		char string = str[s], wild = mask[m];
		if (wild == '*')
		{
			if (++m == mask_len)
				return 1;

			mp = m;
			sp = s + 1;
		}
		else
		{
			if (case_sensitive)
			{
				if (wild == string || wild == '?')
				{
					++m;
					++s;
				}
				else
				{
					m = mp;
					s = sp++;
				}
			}
			else
			{
				if (tolower(wild) == tolower(string) || wild == '?')
				{
					++m;
					++s;
				}
				else
				{
					m = mp;
					s = sp++;
				}
			}
		}
	}

	if (mask[m] == '*')
		++m;

	return m == mask_len;
}