]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/wildcard.cpp
ce4d7d3147f549332dba73a512c837f5d2e6ab5d
[user/henk/code/inspircd.git] / src / wildcard.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  Inspire is copyright (C) 2002-2004 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 #include <string>
18 #include "inspircd_config.h"
19 #include "inspircd.h"
20
21 void Delete(char* str,int pos)
22 {
23         char moo[MAXBUF];
24         strlcpy(moo,str,MAXBUF);
25         moo[pos] = '\0';
26         strlcpy(str,moo,MAXBUF);
27         strlcat(str,moo+pos+1,MAXBUF);
28 }
29
30 void Insert(char* substr,char* str,int pos)
31 {
32         std::string a = str;
33         a.insert(pos,substr);
34         strlcpy(str,a.c_str(),MAXBUF);
35 }
36
37
38 int MWC = 0;
39
40 bool match2(char* literal,char* mask)
41 {
42
43 char OldM[MAXBUF];
44 int I,I2;
45
46 if (MWC)
47         return true;
48
49 if ((strstr(mask,"*")==0) && (strlen(literal) != strlen(mask)))
50         return 0;
51  I=0;
52  I2=0;
53  while (I < strlen(mask))
54  {
55    if (I2 >= strlen(literal))
56            return 0;
57  
58    if ((mask[I]=='*') && (MWC==0))
59    {
60      strlcpy(OldM,mask,MAXBUF);
61      
62      Delete(mask,I);
63      
64      while (strlen(mask)<255)
65      {
66        match2(literal,mask);
67        if (MWC==2)
68                return 1;
69
70        Insert("?",mask,I);
71      }
72      strlcpy(mask,OldM,MAXBUF);
73      Delete(mask,I);
74      Insert("?",mask,I);
75    }
76    if (mask[I]=='?')
77    {
78      I++;
79      I2++;
80      continue;
81    }
82    if (mask[I] != literal[I2])
83            return 0;
84    if (MWC)
85            return 1;
86    I++;
87    I2++;
88  }
89  if (strlen(literal)==strlen(mask))
90                  MWC=2;
91
92 }
93
94 bool match(const char* literal, const char* mask)
95 {
96         char L[10240];
97         char M[10240];
98         MWC = 0;
99         strlcpy(L,literal,10240);
100         strlcpy(M,mask,10240);
101         strlower(L);
102         strlower(M);
103         match2(L,M);
104         return (MWC == 2);
105 }
106