/[svn]/ircd-hybrid/trunk/src/match.c
ViewVC logotype

Diff of /ircd-hybrid/trunk/src/match.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1651 by michael, Sat Oct 27 21:02:32 2012 UTC revision 1652 by michael, Tue Nov 13 20:28:53 2012 UTC
# Line 65  match(const char *mask, const char *name Line 65  match(const char *mask, const char *name
65      if (!*m)      if (!*m)
66      {      {
67        if (!*n)        if (!*n)
         return 1;  
       if (!ma)  
68          return 0;          return 0;
69          if (!ma)
70            return 1;
71        for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--)        for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--)
72          ;          ;
73        if (*m == '*')        if (*m == '*')
74          return 1;          return 0;
75        m = ma;        m = ma;
76        n = ++na;        n = ++na;
77      }      }
# Line 79  match(const char *mask, const char *name Line 79  match(const char *mask, const char *name
79      {      {
80        while (*m == '*')        while (*m == '*')
81          m++;          m++;
82        return *m == 0;        return *m != '\0';
83      }      }
84    
85      if (ToLower(*m) != ToLower(*n) && *m != '?' && (*m != '#' || !IsDigit(*n)))      if (ToLower(*m) != ToLower(*n) && *m != '?' && (*m != '#' || !IsDigit(*n)))
86      {      {
87        if (!ma)        if (!ma)
88          return 0;          return 1;
89        m = ma;        m = ma;
90        n = ++na;        n = ++na;
91      }      }
# Line 93  match(const char *mask, const char *name Line 93  match(const char *mask, const char *name
93        m++, n++;        m++, n++;
94    }    }
95    
96    return 0;    return 1;
97  }  }
98    
99  /* match_esc()  /* match_esc()
# Line 125  match_esc(const char *mask, const char * Line 125  match_esc(const char *mask, const char *
125      if (!*m)      if (!*m)
126      {      {
127        if (!*n)        if (!*n)
         return 1;  
       if (!ma)  
128          return 0;          return 0;
129          if (!ma)
130            return 1;
131        for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--)        for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--)
132          ;          ;
133        if (*m == '*')        if (*m == '*')
134          return 1;          return 0;
135        m = ma;        m = ma;
136        n = ++na;        n = ++na;
137      }      }
# Line 139  match_esc(const char *mask, const char * Line 139  match_esc(const char *mask, const char *
139      {      {
140        while (*m == '*')        while (*m == '*')
141          m++;          m++;
142        return *m == 0;        return *m != '\0';
143      }      }
144    
145      if (*m != '?' && (*m != '#' || IsDigit(*n)))      if (*m != '?' && (*m != '#' || IsDigit(*n)))
146      {      {
147        if (*m == '\\')        if (*m == '\\')
148          if (!*++m)          if (!*++m)
149            return 0;            return 1;
150        if (ToLower(*m) != ToLower(*n))        if (ToLower(*m) != ToLower(*n))
151        {        {
152          if (!ma)          if (!ma)
153            return 0;            return 1;
154          m = ma;          m = ma;
155          n = ++na;          n = ++na;
156        }        }
# Line 161  match_esc(const char *mask, const char * Line 161  match_esc(const char *mask, const char *
161        m++, n++;        m++, n++;
162    }    }
163    
164    return 0;    return 1;
165  }  }
166    
167  /* match_chan()  /* match_chan()
# Line 179  match_chan(const char *mask, const char Line 179  match_chan(const char *mask, const char
179      ++name, ++mask;      ++name, ++mask;
180    }    }
181    
182    return match_esc(mask, name);    return match_esc(mask, name) == 0;
183  }  }
184    
185  /* collapse()  /*
186     * collapse()
187     * Collapse a pattern string into minimal components.
188     * This particular version is "in place", so that it changes the pattern
189     * which is to be reduced to a "minimal" size.
190   *   *
191   * collapses a string containing multiple *'s.   * (C) Carlo Wood - 6 Oct 1998
192     * Speedup rewrite by Andrea Cocito, December 1998.
193     * Note that this new optimized algorithm can *only* work in place.
194   */   */
 char *  
 collapse(char *pattern)  
 {  
   char *p = pattern, *po = pattern;  
   char c;  
195    
196    if (p == NULL)  /*! \brief Collapse a mask string to remove redundancies.
197      return NULL;   * Specifically, it replaces a sequence of '*' followed by additional
198     * '*' or '?' with the same number of '?'s as the input, followed by
199    while ((c = *p++))   * one '*'.  This minimizes useless backtracking when matching later.
200    {   * \param mask Mask string to collapse.
201      if (c != '*')   * \return Pointer to the start of the string.
       *po++ = c;  
     else if (*p != '*')  
       *po++ = '*';  
   }  
   
   *po = 0;  
   
   return pattern;  
 }  
   
 /* collapse_esc()  
  *  
  * The collapse() function with support for escaping characters  
202   */   */
203  char *  char *
204  collapse_esc(char *pattern)  collapse(char *mask)
205  {  {
206    char *p = pattern, *po = pattern;    int star = 0;
207    char c;    char *m = mask;
208      char *b = NULL;
209    
210    if (p == NULL)    if (m)
     return NULL;  
   
   while ((c = *p++))  
211    {    {
212      if (c != '*')      do
213      {      {
214        *po++ = c;        if ((*m == '*') && ((m[1] == '*') || (m[1] == '?')))
215        if (c == '\\' && *p)        {
216          *po++ = *p++;          b = m;
     }  
     else if (*p != '*')  
       *po++ = '*';  
   }  
217    
218    *po = 0;          do
219            {
220              if (*m == '*')
221                star = 1;
222              else
223              {
224                if (star && (*m != '?'))
225                {
226                  *b++ = '*';
227                  star = 0;
228                }
229    
230                *b++ = *m;
231    
232                if ((*m == '\\') && ((m[1] == '*') || (m[1] == '?')))
233                  *b++ = *++m;
234              }
235            } while (*m++);
236    
237            break;
238          }
239          else
240          {
241            if ((*m == '\\') && ((m[1] == '*') || (m[1] == '?')))
242              m++;
243          }
244        } while (*m++);
245      }
246    
247    return pattern;    return mask;
248  }  }
249    
250  /*  /*

Legend:
Removed from v.1651  
changed lines
  Added in v.1652

svnadmin@ircd-hybrid.org
ViewVC Help
Powered by ViewVC 1.1.28