X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fhashcomp.cpp;h=8febcbb5f6b08784a3d5d92a0595cec4e80a340c;hb=58a0a7e01422e62de1565a8eb0a1febdc463d04d;hp=08ce154e81fe38dca1a984ab2dc731bef39c1908;hpb=35b70631f0532a5828b04a8e0c02092a285f331a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/hashcomp.cpp b/src/hashcomp.cpp index 08ce154e8..8febcbb5f 100644 --- a/src/hashcomp.cpp +++ b/src/hashcomp.cpp @@ -193,46 +193,54 @@ size_t irc::insensitive::operator()(const std::string &s) const return t; } -irc::tokenstream::tokenstream(const std::string &source) : spacesepstream(source) +irc::tokenstream::tokenstream(const std::string& msg, size_t start) + : message(msg, start) + , position(0) { } -bool irc::tokenstream::GetToken(std::string &token) +bool irc::tokenstream::GetMiddle(std::string& token) { - bool first = !pos; - - if (!spacesepstream::GetToken(token)) + // If we are past the end of the string we can't do anything. + if (position >= message.length()) + { + token.clear(); return false; + } - /* This is the last parameter */ - if (token[0] == ':' && !first) + // If we can't find another separator this is the last token in the message. + size_t separator = message.find(' ', position); + if (separator == std::string::npos) { - token.erase(token.begin()); - if (!StreamEnd()) - { - token += ' '; - token += GetRemaining(); - } - pos = tokens.length() + 1; + token.assign(message, position, std::string::npos); + position = message.length(); + return true; } + token.assign(message, position, separator - position); + position = message.find_first_not_of(' ', separator); return true; } -bool irc::tokenstream::GetToken(int &token) +bool irc::tokenstream::GetTrailing(std::string& token) { - std::string tok; - bool returnval = GetToken(tok); - token = ConvToInt(tok); - return returnval; -} + // If we are past the end of the string we can't do anything. + if (position >= message.length()) + { + token.clear(); + return false; + } -bool irc::tokenstream::GetToken(long &token) -{ - std::string tok; - bool returnval = GetToken(tok); - token = ConvToInt(tok); - return returnval; + // If this is true then we have a token! + if (message[position] == ':') + { + token.assign(message, position + 1, std::string::npos); + position = message.length(); + return true; + } + + // There is no token so it must be a token. + return GetMiddle(token); } irc::sepstream::sepstream(const std::string& source, char separator, bool allowempty) @@ -279,18 +287,6 @@ bool irc::sepstream::StreamEnd() return this->pos > this->tokens.length(); } -std::string irc::stringjoiner(const std::vector& sequence, char separator) -{ - std::string joined; - if (sequence.empty()) - return joined; // nothing to do here - - for (std::vector::const_iterator i = sequence.begin(); i != sequence.end(); ++i) - joined.append(*i).push_back(separator); - joined.erase(joined.end()-1); - return joined; -} - irc::portparser::portparser(const std::string &source, bool allow_overlapped) : sep(source), in_range(0), range_begin(0), range_end(0), overlapped(allow_overlapped) {