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 | |
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')
-rw-r--r-- | src/channel.c | 4 | ||||
-rw-r--r-- | src/client.c | 6 | ||||
-rw-r--r-- | src/conf.c | 16 | ||||
-rw-r--r-- | src/hostmask.c | 12 | ||||
-rw-r--r-- | src/match.c | 123 | ||||
-rw-r--r-- | src/s_serv.c | 14 | ||||
-rw-r--r-- | src/send.c | 6 |
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; } @@ -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; } @@ -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 |