diff options
author | michael <michael@82007160-df01-0410-b94d-b575c5fd34c7> | 2012-11-13 20:28:53 +0000 |
---|---|---|
committer | michael <michael@82007160-df01-0410-b94d-b575c5fd34c7> | 2012-11-13 20:28:53 +0000 |
commit | ebb5967a19ee6abdd70a965ff8ca127df47f136f (patch) | |
tree | 4b83ace97e2b2d855be8474612014d9af787215e /src/match.c | |
parent | e13f9deabc82ad42abb8adf1ab8d416a764aeafc (diff) |
- changed match() polarity. match() now returns 0 on match and 1 on non-match
This cleans up several places where function pointers of different matching
functions like irccmp/strcmp/match are passed to other functions.
- added improved collapse() to match.c
git-svn-id: svn://svn.ircd-hybrid.org/svnroot/ircd-hybrid/trunk@1652 82007160-df01-0410-b94d-b575c5fd34c7
Diffstat (limited to 'src/match.c')
-rw-r--r-- | src/match.c | 123 |
1 files changed, 66 insertions, 57 deletions
diff --git a/src/match.c b/src/match.c index 4c4513e..714809b 100644 --- a/src/match.c +++ b/src/match.c @@ -65,13 +65,13 @@ match(const char *mask, const char *name) if (!*m) { if (!*n) - return 1; - if (!ma) return 0; + if (!ma) + return 1; for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--) ; if (*m == '*') - return 1; + return 0; m = ma; n = ++na; } @@ -79,13 +79,13 @@ match(const char *mask, const char *name) { while (*m == '*') m++; - return *m == 0; + return *m != '\0'; } if (ToLower(*m) != ToLower(*n) && *m != '?' && (*m != '#' || !IsDigit(*n))) { if (!ma) - return 0; + return 1; m = ma; n = ++na; } @@ -93,7 +93,7 @@ match(const char *mask, const char *name) m++, n++; } - return 0; + return 1; } /* match_esc() @@ -125,13 +125,13 @@ match_esc(const char *mask, const char *name) if (!*m) { if (!*n) - return 1; - if (!ma) return 0; + if (!ma) + return 1; for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--) ; if (*m == '*') - return 1; + return 0; m = ma; n = ++na; } @@ -139,18 +139,18 @@ match_esc(const char *mask, const char *name) { while (*m == '*') m++; - return *m == 0; + return *m != '\0'; } if (*m != '?' && (*m != '#' || IsDigit(*n))) { if (*m == '\\') if (!*++m) - return 0; + return 1; if (ToLower(*m) != ToLower(*n)) { if (!ma) - return 0; + return 1; m = ma; n = ++na; } @@ -161,7 +161,7 @@ match_esc(const char *mask, const char *name) m++, n++; } - return 0; + return 1; } /* match_chan() @@ -179,63 +179,72 @@ match_chan(const char *mask, const char *name) ++name, ++mask; } - return match_esc(mask, name); + return match_esc(mask, name) == 0; } -/* collapse() +/* + * collapse() + * Collapse a pattern string into minimal components. + * This particular version is "in place", so that it changes the pattern + * which is to be reduced to a "minimal" size. * - * collapses a string containing multiple *'s. + * (C) Carlo Wood - 6 Oct 1998 + * Speedup rewrite by Andrea Cocito, December 1998. + * Note that this new optimized algorithm can *only* work in place. */ -char * -collapse(char *pattern) -{ - char *p = pattern, *po = pattern; - char c; - - if (p == NULL) - return NULL; - - while ((c = *p++)) - { - if (c != '*') - *po++ = c; - else if (*p != '*') - *po++ = '*'; - } - *po = 0; - - return pattern; -} - -/* collapse_esc() - * - * The collapse() function with support for escaping characters +/*! \brief Collapse a mask string to remove redundancies. + * Specifically, it replaces a sequence of '*' followed by additional + * '*' or '?' with the same number of '?'s as the input, followed by + * one '*'. This minimizes useless backtracking when matching later. + * \param mask Mask string to collapse. + * \return Pointer to the start of the string. */ char * -collapse_esc(char *pattern) +collapse(char *mask) { - char *p = pattern, *po = pattern; - char c; + int star = 0; + char *m = mask; + char *b = NULL; - if (p == NULL) - return NULL; - - while ((c = *p++)) + if (m) { - if (c != '*') + do { - *po++ = c; - if (c == '\\' && *p) - *po++ = *p++; - } - else if (*p != '*') - *po++ = '*'; + if ((*m == '*') && ((m[1] == '*') || (m[1] == '?'))) + { + b = m; + + do + { + if (*m == '*') + star = 1; + else + { + if (star && (*m != '?')) + { + *b++ = '*'; + star = 0; + } + + *b++ = *m; + + if ((*m == '\\') && ((m[1] == '*') || (m[1] == '?'))) + *b++ = *++m; + } + } while (*m++); + + break; + } + else + { + if ((*m == '\\') && ((m[1] == '*') || (m[1] == '?'))) + m++; + } + } while (*m++); } - *po = 0; - - return pattern; + return mask; } /* |