#include "services.h" static bool match_internal(const unsigned char *str, const unsigned char *mask, bool case_sensitive) { unsigned char *cp = NULL, *mp = NULL; unsigned char *string = const_cast(str); // XXX: unsafe cast unsigned char *wild = const_cast(mask); // XXX: unsafe cast while (*string && *wild != '*') { if (case_sensitive) { if (*wild != *string && *wild != '?') return false; } else { if (tolower(*wild) != tolower(*string) && *wild != '?') return false; } wild++; string++; } while (*string) { if (*wild == '*') { if (!*++wild) return 1; mp = wild; cp = string + 1; } else { if (case_sensitive) { if (*wild == *string || *wild == '?') { ++wild; ++string; } else { wild = mp; string = cp++; } } else { if (tolower(*wild) == tolower(*string) || *wild == '?') { ++wild; ++string; } else { wild = mp; string = cp++; } } } } while (*wild == '*') ++wild; return !*wild; } bool Anope::Match(const std::string &str, const std::string &mask, bool case_sensitive) { return match_internal(reinterpret_cast(str.c_str()), reinterpret_cast(mask.c_str()), case_sensitive); }