#include "Utils/StringTokenizer.hpp" namespace Chattr { StringTokenizer::StringTokenizer(gsl::czstring string, std::uint32_t size) { set(string, size); } void StringTokenizer::set(gsl::czstring string, std::uint32_t size) { int length = 0; bool token = false; bool quote = false, doubleQuote = false; for (int i = 0; i < size; i++) { if (string[i] == ' ' && token != true) continue; if (token == false) tokens.push(&string[i]); token = true; switch (string[i]) { case '\"': doubleQuote = !doubleQuote; length++; break; case '\'': quote = !quote; length++; break; case '\t': case '\n': case ' ': if (quote || doubleQuote) { length++; break; } tokens_length.push(length); length = 0; token = false; break; case '\0': tokens_length.push(length); length = 0; break; default: length++; } } if (quote || doubleQuote) { spdlog::error("quote or doublequote is not closed"); tokens = std::queue(); tokens_length = std::queue(); } if (length != 0) tokens_length.push(length); } std::vector StringTokenizer::get() { std::vector retValue; while (!tokens.empty()) { if (tokens_length.front() != 0) retValue.push_back(std::string(tokens.front(), tokens_length.front())); tokens.pop(); tokens_length.pop(); } while (!tokens_length.empty()) tokens_length.pop(); return retValue; } StringTokenizer::operator std::vector() { return get(); } }