/**
Copyright (c) 2014 Alex Tsui

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "ParseHelper.h"
#include <list>
#include <sstream>

ParseHelper::ContinuationParseState::
ContinuationParseState( ParseHelper& parent_ ):
    ParseState( parent_ )
{ }

bool ParseHelper::ContinuationParseState::
process( const std::string& str )
{
    if ( str.size() && str[str.size()-1] == '\\' )
    {
        parent.commandBuffer.push_back( str );
        return true;
    }
    else
    {
        std::list<std::string> tmp_list;
        tmp_list.push_back(str);
        while (parent.commandBuffer.size() && parent.commandBuffer.back()[
            parent.commandBuffer.back().size()-1] == '\\')
        {
            tmp_list.push_back(parent.commandBuffer.back());
            parent.commandBuffer.pop_back();
        }
        std::stringstream ss;
        while (tmp_list.size())
        {
            ss << tmp_list.back();
            tmp_list.pop_back();
            if (tmp_list.size())
                ss << "\n";
        }
        parent.commandBuffer.push_back(ss.str());
        parent.stateStack.pop_back();
        return false;
    }
}
