#include "nowarnings.h"
#include "Tokenizer.h"

int Tokenizer::split(const string& input, const string& delimiters, StringVector& result, char quoteChar)
{
    size_t subStart = 0;
    size_t subEnd = 0;
    size_t length = 0;
    
    result.clear();   // erase result before we start
    
    while (true)
    {
        if ((subStart = input.find_first_not_of(delimiters, subEnd)) == string::npos)
            break;
        
        // if we're handling quotes
        if (quoteChar && (input[subStart] == quoteChar))
        {
            ++subStart;                   // skip the open quote
            // have to turn quoteChar into a string for find_first_of
            if ((subEnd = input.find_first_of(string(1, quoteChar), subStart))
                == string::npos)
            {
                subEnd = input.size();
                length = subEnd - subStart;
            }
            else
            {
                // subStart has already been incremented to skip the open quote;
                // subEnd excludes the close quote; so we do NOT have to tweak the
                // difference to get a count of the characters between them.
                length = subEnd - subStart;
                ++subEnd;                   // now skip the close quote
            }
        }
        else
        {
            if ((subEnd = input.find_first_of(delimiters, subStart)) == string::npos)
                subEnd = input.size();
            length = subEnd - subStart;
        }
        result.push_back(input.substr(subStart, length));
    }
    return (int)result.size();
}