summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wildcard.cpp61
1 files changed, 28 insertions, 33 deletions
diff --git a/src/wildcard.cpp b/src/wildcard.cpp
index 1716068d1..c6883a4bc 100644
--- a/src/wildcard.cpp
+++ b/src/wildcard.cpp
@@ -1,77 +1,72 @@
#include "services.h"
-static bool match_internal(const unsigned char *str, const unsigned char *mask, bool case_sensitive)
+bool Anope::Match(const Anope::string &str, const Anope::string &mask, bool case_sensitive)
{
- const unsigned char *cp = NULL, *mp = NULL;
- const unsigned char *string = str;
- const unsigned char *wild = mask;
+ size_t s = 0, m = 0, str_len = str.length(), mask_len = mask.length();
- while (*string && *wild != '*')
+ while (s < str_len && m < mask_len && mask[m] != '*')
{
+ char string = str[s], wild = mask[m];
if (case_sensitive)
{
- if (*wild != *string && *wild != '?')
+ if (wild != string && wild != '?')
return false;
}
else
{
- if (tolower(*wild) != tolower(*string) && *wild != '?')
+ if (tolower(wild) != tolower(string) && wild != '?')
return false;
}
- ++wild;
- ++string;
+ ++m;
+ ++s;
}
- while (*string)
+ size_t sp = 0, mp = 0;
+ while (s < str_len)
{
- if (*wild == '*')
+ char string = str[s], wild = mask[m];
+ if (wild == '*')
{
- if (!*++wild)
+ if (++m == mask_len)
return 1;
- mp = wild;
- cp = string + 1;
+ mp = m;
+ sp = s + 1;
}
else
{
if (case_sensitive)
{
- if (*wild == *string || *wild == '?')
+ if (wild == string || wild == '?')
{
- ++wild;
- ++string;
+ ++m;
+ ++s;
}
else
{
- wild = mp;
- string = cp++;
+ m = mp;
+ s = sp++;
}
}
else
{
- if (tolower(*wild) == tolower(*string) || *wild == '?')
+ if (tolower(wild) == tolower(string) || wild == '?')
{
- ++wild;
- ++string;
+ ++m;
+ ++s;
}
else
{
- wild = mp;
- string = cp++;
+ m = mp;
+ s = sp++;
}
}
}
-
}
- while (*wild == '*')
- ++wild;
-
- return !*wild;
-}
+ if (mask[m] == '*')
+ ++m;
-bool Anope::Match(const Anope::string &str, const Anope::string &mask, bool case_sensitive)
-{
- return match_internal(reinterpret_cast<const unsigned char *>(str.c_str()), reinterpret_cast<const unsigned char *>(mask.c_str()), case_sensitive);
+ return m == mask_len;
}