| /////////////////////////////////////////////////////////////////////////////// | |
| // Tokenizer.cpp | |
| // ============= | |
| // General purpose string tokenizer (C++ string version) | |
| // | |
| // The default delimiters are space(" "), tab(\t, \v), newline(\n), | |
| // carriage return(\r), and form feed(\f). | |
| // If you want to use different delimiters, then use setDelimiter() to override | |
| // the delimiters. Note that the delimiter string can hold multiple characters. | |
| // | |
| // AUTHOR: Song Ho Ahn (song.ahn@gmail.com) | |
| // CREATED: 2005-05-25 | |
| // UPDATED: 2011-03-08 | |
| /////////////////////////////////////////////////////////////////////////////// | |
| #include "Tokenizer.h" | |
| /////////////////////////////////////////////////////////////////////////////// | |
| // constructor | |
| /////////////////////////////////////////////////////////////////////////////// | |
| Tokenizer::Tokenizer() : buffer(""), token(""), delimiter(DEFAULT_DELIMITER) | |
| { | |
| currPos = buffer.begin(); | |
| } | |
| Tokenizer::Tokenizer(const std::string& str, const std::string& delimiter) : buffer(str), token(""), delimiter(delimiter) | |
| { | |
| currPos = buffer.begin(); | |
| } | |
| /////////////////////////////////////////////////////////////////////////////// | |
| // destructor | |
| /////////////////////////////////////////////////////////////////////////////// | |
| Tokenizer::~Tokenizer() | |
| { | |
| } | |
| /////////////////////////////////////////////////////////////////////////////// | |
| // reset string buffer, delimiter and the currsor position | |
| /////////////////////////////////////////////////////////////////////////////// | |
| void Tokenizer::set(const std::string& str, const std::string& delimiter) | |
| { | |
| this->buffer = str; | |
| this->delimiter = delimiter; | |
| this->currPos = buffer.begin(); | |
| } | |
| void Tokenizer::setString(const std::string& str) | |
| { | |
| this->buffer = str; | |
| this->currPos = buffer.begin(); | |
| } | |
| void Tokenizer::setDelimiter(const std::string& delimiter) | |
| { | |
| this->delimiter = delimiter; | |
| this->currPos = buffer.begin(); | |
| } | |
| /////////////////////////////////////////////////////////////////////////////// | |
| // return the next token | |
| // If cannot find a token anymore, return "". | |
| /////////////////////////////////////////////////////////////////////////////// | |
| std::string Tokenizer::next() | |
| { | |
| if(buffer.size() <= 0) return ""; // skip if buffer is empty | |
| token.clear(); // reset token string | |
| this->skipDelimiter(); // skip leading delimiters | |
| // append each char to token string until it meets delimiter | |
| while(currPos != buffer.end() && !isDelimiter(*currPos)) | |
| { | |
| token += *currPos; | |
| ++currPos; | |
| } | |
| return token; | |
| } | |
| /////////////////////////////////////////////////////////////////////////////// | |
| // skip ang leading delimiters | |
| /////////////////////////////////////////////////////////////////////////////// | |
| void Tokenizer::skipDelimiter() | |
| { | |
| while(currPos != buffer.end() && isDelimiter(*currPos)) | |
| ++currPos; | |
| } | |
| /////////////////////////////////////////////////////////////////////////////// | |
| // return true if the current character is delimiter | |
| /////////////////////////////////////////////////////////////////////////////// | |
| bool Tokenizer::isDelimiter(char c) | |
| { | |
| return (delimiter.find(c) != std::string::npos); | |
| } | |
| /////////////////////////////////////////////////////////////////////////////// | |
| // split the input string into multiple tokens | |
| // This function scans tokens from the current cursor position. | |
| /////////////////////////////////////////////////////////////////////////////// | |
| std::vector<std::string> Tokenizer::split() | |
| { | |
| std::vector<std::string> tokens; | |
| std::string token; | |
| while((token = this->next()) != "") | |
| { | |
| tokens.push_back(token); | |
| } | |
| return tokens; | |
| } |