X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fhashcomp.cpp;h=88b9b582cfa86a7feec9bc56c8010db08f05679a;hb=1b7c615062a7b203c7fc3ce4c56e16eb671f7c15;hp=34f53ea288f9114a1026d41dedb18210e997a242;hpb=085cd4278f0f495c6d008a3d157026b33a23b787;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/hashcomp.cpp b/src/hashcomp.cpp index 34f53ea28..88b9b582c 100644 --- a/src/hashcomp.cpp +++ b/src/hashcomp.cpp @@ -3,31 +3,24 @@ * +------------------------------------+ * * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. - * E-mail: - * - * + * E-mail: + * + * * * Written by Craig Edwards, Craig McLure, and others. * This program is free but copyrighted software; see - * the file COPYING for details. + * the file COPYING for details. * * --------------------------------------------------- */ using namespace std; -#include "inspircd_config.h" #include "inspircd.h" -#include #include "hashcomp.h" -#include "helperfuncs.h" #include - #define nspace __gnu_cxx -// from helperfuncs.cpp -extern const char lowermap[255]; - /****************************************************** * * The hash functions of InspIRCd are the centrepoint @@ -52,14 +45,33 @@ extern const char lowermap[255]; * be considered the lowercase of {, } and |. * * This file also contains hashing methods for hashing - * in_addr structs, we use this if we want to cache IP + * insp_inaddr structs, we use this if we want to cache IP * addresses. * ******************************************************/ using namespace std; +using namespace irc::sockets; + +/* convert a string to lowercase. Note following special circumstances + * taken from RFC 1459. Many "official" server branches still hold to this + * rule so i will too; + * + * Because of IRC's scandanavian origin, the characters {}| are + * considered to be the lower case equivalents of the characters []\, + * respectively. This is a critical issue when determining the + * equivalence of two nicknames. + */ +void nspace::strlower(char *n) +{ + if (n) + { + for (char* t = n; *t; t++) + *t = lowermap[(unsigned char)*t]; + } +} -size_t nspace::hash::operator()(const struct in_addr &a) const +size_t nspace::hash::operator()(const insp_inaddr &a) const { size_t q; memcpy(&q,&a,sizeof(size_t)); @@ -68,10 +80,15 @@ size_t nspace::hash::operator()(const struct in_addr &a) const size_t nspace::hash::operator()(const string &s) const { - char a[MAXBUF]; + char a[s.length()]; + size_t t = 0; static struct hash strhash; - strlcpy(a,s.c_str(),MAXBUF); - strlower(a); + + for (const char* x = s.c_str(); *x; x++) /* Faster to do it this way than */ + a[t++] = lowermap[(unsigned char)*x]; /* Seperate strlcpy and strlower */ + + a[t] = 0; + return strhash(a); } @@ -85,9 +102,16 @@ bool irc::StrHashComp::operator()(const std::string& s1, const std::string& s2) return (lowermap[*n1] == lowermap[*n2]); } -bool irc::InAddr_HashComp::operator()(const in_addr &s1, const in_addr &s2) const +bool irc::InAddr_HashComp::operator()(const insp_inaddr &s1, const insp_inaddr &s2) const { +#ifdef IPV6 + for (int n = 0; n < 16; n++) + if (s2.s6_addr[n] != s1.s6_addr[n]) + return false; + return true; +#else return (s1.s_addr == s1.s_addr); +#endif } /****************************************************** @@ -97,9 +121,7 @@ bool irc::InAddr_HashComp::operator()(const in_addr &s1, const in_addr &s2) cons * std::string which is not only case-insensitive but * can also do scandanavian comparisons, e.g. { = [, etc. * - * This class depends on the global 'lowermap' which is - * initialized at startup by inspircd.cpp, and contains - * the 'scandanavian' casemappings for fast irc compare. + * This class depends on the const array 'lowermap'. * ******************************************************/ @@ -180,6 +202,7 @@ std::istream& operator>>(std::istream &is, irc::string &str) irc::tokenstream::tokenstream(const std::string &source) : tokens(source), last_pushed(false) { + /* Record starting position and current position */ last_starting_position = tokens.begin(); n = tokens.begin(); } @@ -212,7 +235,12 @@ const std::string irc::tokenstream::GetToken() */ last_starting_position = n+1; last_pushed = true; - return std::string(lsp, n+1 == tokens.end() ? n+1 : n++); + + std::string strip(lsp, n+1 == tokens.end() ? n+1 : n++); + while ((strip.length()) && (strip.find_last_of(' ') == strip.length() - 1)) + strip.erase(strip.end() - 1); + + return strip; } n++;