From 8b418f081f7ecbfdd51c84fae2298f927155fac0 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Fri, 10 Aug 2018 07:46:42 +0100 Subject: Split irc::tokenparser::GetToken into GetMiddle and GetTrailing. This simplifies the logic of irc::tokenparser considerably and removes all of the magic index guessing that was used previously. --- src/hashcomp.cpp | 53 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 14 deletions(-) (limited to 'src/hashcomp.cpp') diff --git a/src/hashcomp.cpp b/src/hashcomp.cpp index d510e40b1..47c36b91b 100644 --- a/src/hashcomp.cpp +++ b/src/hashcomp.cpp @@ -193,32 +193,57 @@ 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); + position = message.length(); + return true; } + token.assign(message, position, separator - position); + position = message.find_first_not_of(' ', separator); return true; } +bool irc::tokenstream::GetTrailing(std::string& token) +{ + // If we are past the end of the string we can't do anything. + if (position >= message.length()) + { + token.clear(); + return false; + } + + // If this is true then we have a token! + if (message[position] == ':') + { + token.assign(message, position + 1); + position = message.length(); + ServerInstance->Logs->Log("HASHCOMP", LOG_DEBUG, "TRAILING %s next (none)", token.c_str()); + 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) : tokens(source), sep(separator), pos(0), allow_empty(allowempty) { -- cgit v1.3.1-10-gc9f91