summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2012-11-13 20:28:53 +0000
committermichael <michael@82007160-df01-0410-b94d-b575c5fd34c7>2012-11-13 20:28:53 +0000
commitebb5967a19ee6abdd70a965ff8ca127df47f136f (patch)
tree4b83ace97e2b2d855be8474612014d9af787215e /src
parente13f9deabc82ad42abb8adf1ab8d416a764aeafc (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')
-rw-r--r--src/channel.c4
-rw-r--r--src/client.c6
-rw-r--r--src/conf.c16
-rw-r--r--src/hostmask.c12
-rw-r--r--src/match.c123
-rw-r--r--src/s_serv.c14
-rw-r--r--src/send.c6
7 files changed, 95 insertions, 86 deletions
diff --git a/src/channel.c b/src/channel.c
index 28eade6..e6b0e46 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -595,12 +595,12 @@ find_bmask(const struct Client *who, const dlink_list *const list)
{
const struct Ban *bp = ptr->data;
- if (match(bp->name, who->name) && match(bp->username, who->username))
+ if (!match(bp->name, who->name) && !match(bp->username, who->username))
{
switch (bp->type)
{
case HM_HOST:
- if (match(bp->host, who->host) || match(bp->host, who->sockhost))
+ if (!match(bp->host, who->host) || !match(bp->host, who->sockhost))
return 1;
break;
case HM_IPV4:
diff --git a/src/client.c b/src/client.c
index ac21ea6..0ec54a3 100644
--- a/src/client.c
+++ b/src/client.c
@@ -1121,9 +1121,9 @@ find_accept(const char *nick, const char *user,
{
struct split_nuh_item *accept_p = ptr->data;
- if (cmpfunc(accept_p->nickptr, nick) == do_match &&
- cmpfunc(accept_p->userptr, user) == do_match &&
- cmpfunc(accept_p->hostptr, host) == do_match)
+ if (!cmpfunc(accept_p->nickptr, nick) &&
+ !cmpfunc(accept_p->userptr, user) &&
+ !cmpfunc(accept_p->hostptr, host))
return accept_p;
}
diff --git a/src/conf.c b/src/conf.c
index 7d04bd0..765c47a 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -969,7 +969,7 @@ attach_connect_block(struct Client *client_p, const char *name,
{
conf = ptr->data;
- if (match(conf->name, name) == 0 || match(conf->host, host) == 0)
+ if (match(conf->name, name) || match(conf->host, host))
continue;
attach_conf(client_p, conf);
@@ -1001,7 +1001,7 @@ find_conf_name(dlink_list *list, const char *name, enum maskitem_type type)
if (conf->type == type)
{
if (conf->name && (irccmp(conf->name, name) == 0 ||
- match(conf->name, name)))
+ !match(conf->name, name)))
return conf;
}
}
@@ -1113,7 +1113,7 @@ find_matching_name_conf(enum maskitem_type type, const char *name, const char *u
continue;
if (EmptyString(conf->user) || EmptyString(conf->host))
return conf;
- if (match(conf->user, user) && match(conf->host, host))
+ if (!match(conf->user, user) && !match(conf->host, host))
return conf;
}
}
@@ -1124,9 +1124,9 @@ find_matching_name_conf(enum maskitem_type type, const char *name, const char *u
{
conf = ptr->data;
- if ((name != NULL) && match(name, conf->name))
+ if ((name != NULL) && !match(name, conf->name))
return conf;
- else if ((host != NULL) && match(host, conf->host))
+ else if ((host != NULL) && !match(host, conf->host))
return conf;
}
break;
@@ -1174,7 +1174,7 @@ find_exact_name_conf(enum maskitem_type type, const struct Client *who, const ch
return (conf);
if (EmptyString(conf->user) || EmptyString(conf->host))
return (conf);
- if (match(conf->user, user) && match(conf->host, host))
+ if (!match(conf->user, user) && !match(conf->host, host))
return (conf);
}
}
@@ -1194,12 +1194,12 @@ find_exact_name_conf(enum maskitem_type type, const struct Client *who, const ch
return conf;
if (EmptyString(conf->user) || EmptyString(conf->host))
return NULL;
- if (match(conf->user, who->username))
+ if (!match(conf->user, who->username))
{
switch (conf->htype)
{
case HM_HOST:
- if (match(conf->host, who->host) || match(conf->host, who->sockhost))
+ if (!match(conf->host, who->host) || !match(conf->host, who->sockhost))
if (!conf->class->max_total || conf->class->ref_count < conf->class->max_total)
return conf;
break;
diff --git a/src/hostmask.c b/src/hostmask.c
index 35a9fc3..1e85857 100644
--- a/src/hostmask.c
+++ b/src/hostmask.c
@@ -480,7 +480,7 @@ find_conf_by_address(const char *name, struct irc_ssaddr *addr, unsigned int typ
arec->masktype == HM_IPV6 &&
match_ipv6(addr, &arec->Mask.ipa.addr,
arec->Mask.ipa.bits) &&
- (type & 0x1 || cmpfunc(arec->username, username) == do_match) &&
+ (type & 0x1 || !cmpfunc(arec->username, username)) &&
(IsNeedPassword(arec->conf) || arec->conf->passwd == NULL ||
match_conf_password(password, arec->conf)))
{
@@ -505,7 +505,7 @@ find_conf_by_address(const char *name, struct irc_ssaddr *addr, unsigned int typ
arec->masktype == HM_IPV4 &&
match_ipv4(addr, &arec->Mask.ipa.addr,
arec->Mask.ipa.bits) &&
- (type & 0x1 || cmpfunc(arec->username, username) == do_match) &&
+ (type & 0x1 || !cmpfunc(arec->username, username)) &&
(IsNeedPassword(arec->conf) || arec->conf->passwd == NULL ||
match_conf_password(password, arec->conf)))
{
@@ -529,8 +529,8 @@ find_conf_by_address(const char *name, struct irc_ssaddr *addr, unsigned int typ
if ((arec->type == (type & ~0x1)) &&
arec->precedence > hprecv &&
(arec->masktype == HM_HOST) &&
- cmpfunc(arec->Mask.hostname, name) == do_match &&
- (type & 0x1 || cmpfunc(arec->username, username) == do_match) &&
+ !cmpfunc(arec->Mask.hostname, name) &&
+ (type & 0x1 || !cmpfunc(arec->username, username)) &&
(IsNeedPassword(arec->conf) || arec->conf->passwd == NULL ||
match_conf_password(password, arec->conf)))
{
@@ -551,8 +551,8 @@ find_conf_by_address(const char *name, struct irc_ssaddr *addr, unsigned int typ
if (arec->type == (type & ~0x1) &&
arec->precedence > hprecv &&
arec->masktype == HM_HOST &&
- cmpfunc(arec->Mask.hostname, name) == do_match &&
- (type & 0x1 || cmpfunc(arec->username, username) == do_match) &&
+ !cmpfunc(arec->Mask.hostname, name) &&
+ (type & 0x1 || cmpfunc(arec->username, username)) &&
(IsNeedPassword(arec->conf) || arec->conf->passwd == NULL ||
match_conf_password(password, arec->conf)))
{
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;
}
/*
diff --git a/src/s_serv.c b/src/s_serv.c
index b6ccd60..c83b54d 100644
--- a/src/s_serv.c
+++ b/src/s_serv.c
@@ -170,7 +170,7 @@ hunt_server(struct Client *client_p, struct Client *source_p, const char *comman
if (parc <= server || EmptyString(parv[server]))
return HUNTED_ISME;
- if (!strcmp(parv[server], me.id) || match(parv[server], me.name))
+ if (!strcmp(parv[server], me.id) || !match(parv[server], me.name))
return HUNTED_ISME;
/* These are to pickup matches that would cause the following
@@ -213,7 +213,7 @@ hunt_server(struct Client *client_p, struct Client *source_p, const char *comman
{
target_tmp = ptr->data;
- if (match(parv[server], target_tmp->name))
+ if (!match(parv[server], target_tmp->name))
{
if (target_tmp->from == source_p->from && !MyConnect(target_tmp))
continue;
@@ -238,7 +238,7 @@ hunt_server(struct Client *client_p, struct Client *source_p, const char *comman
if (IsMe(target_p) || MyClient(target_p))
return HUNTED_ISME;
- if (!match(target_p->name, parv[server]))
+ if (match(target_p->name, parv[server]))
parv[server] = target_p->name;
/* This is a little kludgy but should work... */
@@ -389,15 +389,15 @@ check_server(const char *name, struct Client *client_p)
{
conf = ptr->data;
- if (!match(name, conf->name))
+ if (match(name, conf->name))
continue;
error = -3;
/* XXX: Fix me for IPv6 */
/* XXX sockhost is the IPv4 ip as a string */
- if (match(conf->host, client_p->host) ||
- match(conf->host, client_p->sockhost))
+ if (!match(conf->host, client_p->host) ||
+ !match(conf->host, client_p->sockhost))
{
error = -2;
@@ -1470,7 +1470,7 @@ find_servconn_in_progress(const char *name)
cptr = ptr->data;
if (cptr && cptr->name[0])
- if (match(name, cptr->name))
+ if (!match(name, cptr->name))
return cptr;
}
diff --git a/src/send.c b/src/send.c
index 903f089..7a3a8cb 100644
--- a/src/send.c
+++ b/src/send.c
@@ -707,9 +707,9 @@ static int
match_it(const struct Client *one, const char *mask, int what)
{
if (what == MATCH_HOST)
- return match(mask, one->host);
+ return !match(mask, one->host);
- return match(mask, one->servptr->name);
+ return !match(mask, one->servptr->name);
}
/* sendto_match_butone()
@@ -820,7 +820,7 @@ sendto_match_servs(struct Client *source_p, const char *mask, int cap,
if (target_p->from->localClient->serial == current_serial)
continue;
- if (match(mask, target_p->name))
+ if (!match(mask, target_p->name))
{
/*
* if we set the serial here, then we'll never do a