]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/wildcard.cpp
kick_channel -> chanrec::KickUser(), server_kick_channel -> chanrec::ServerKickUser()
[user/henk/code/inspircd.git] / src / wildcard.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *     
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 using namespace std;
18
19 #include <string>
20 #include "inspircd_config.h"
21 #include "inspircd.h"
22 #include "helperfuncs.h"
23 #include "inspstring.h"
24
25 extern char lowermap[255];
26
27 // Wed 27 Apr 2005 - Brain
28 // I've taken our our old wildcard routine -
29 // although comprehensive, it was topheavy and very
30 // slow, and ate masses of cpu when doing lots of
31 // comparisons. This is the 'de-facto' routine used
32 // by many, nobody really knows who wrote it first
33 // or what license its under, i've seen examples of it
34 // (unattributed to any author) all over the 'net.
35 // For now, we'll just consider this public domain.
36
37 bool match(const char *str, const char *mask)
38 {
39         unsigned char *cp, *mp;
40         unsigned char* string = (unsigned char*)str;
41         unsigned char* wild = (unsigned char*)mask;
42
43         while ((*string) && (*wild != '*'))
44         {
45                 if ((lowermap[*wild] != lowermap[*string]) && (*wild != '?'))
46                 {
47                         return 0;
48                 }
49                 wild++;
50                 string++;
51         }
52
53         while (*string)
54         {
55                 if (*wild == '*')
56                 {
57                         if (!*++wild)
58                         {
59                                 return 1;
60                         }
61                         mp = wild;
62                         cp = string+1;
63                 }
64                 else
65                 if ((lowermap[*wild] == lowermap[*string]) || (*wild == '?'))
66                 {
67                         wild++;
68                         string++;
69                 }
70                 else
71                 {
72                         wild = mp;
73                         string = cp++;
74                 }
75
76         }
77
78         while (*wild == '*')
79         {
80                 wild++;
81         }
82
83         return !*wild;
84 }
85
86 /* Overloaded function that has the option of using cidr */
87 bool match(const char *str, const char *mask, bool use_cidr_match)
88 {
89         if (use_cidr_match && MatchCIDR(str, mask, true))
90                 return true;
91         return match(str, mask);
92 }