/* Theoretic - Graph Theoretic Byte Code Engineering
 * Copyright (C) 2001-2002  Jay Freeman (saurik)
*/

/*
 *        Redistribution and use in source and binary
 * forms, with or without modification, are permitted
 * provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer in the documentation
 *    and/or other materials provided with the
 *    distribution.
 * 3. The name of the author may not be used to endorse
 *    or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "stdafx.h"

#include "theoretic/VProcessor.h"

namespace Theoretic {

VProcessor::VProcessor(const std::wstring &path) {
    process.initXPath(xpath, XalanDOMString(path.c_str()), resolver);
    expr = &xpath.getExpression();
}

VProcessor::~VProcessor() {
}

VObjectPtr VProcessor::Step(VContext &context, int pos) {
    XPathExpression::OpCodeMapValueType code;
    code = expr->m_opMap[pos];

    switch (code) {
        case XPathExpression::eFROM_CHILDREN: {
            int length = GetArgLen(pos);
            //OpTester tester(context, pos + 3, length);
        } break;

        default:
            throw VPathNotImplementedException();
        break;
    }

    return new VString(L"dude");
}

VObjectPtr VProcessor::Execute(VContext &context, int pos) {
    XPathExpression::OpCodeMapValueType code;
    code = expr->m_opMap[pos];

    switch (code) {
        case XPathExpression::eOP_XPATH:
            Execute(context, pos + 2);
        break;
	    case XPathExpression::eOP_AND:
        break;
	    case XPathExpression::eOP_NOTEQUALS:
            Execute(context, pos + 2);
		break;

        case XPathExpression::eOP_VARIABLE: {
            const XObject &name = expr->m_tokenQueue[expr->m_opMap[pos + 3]];
            return context[name.str().c_str()];
        } break;

        case XPathExpression::eOP_NUMBERLIT: {
            const XToken &literal = expr->m_tokenQueue[expr->m_opMap[pos + 3]];
            return new VNumber(literal.num());
        } break;

        case XPathExpression::eOP_LOCATIONPATH: {
            Step(context, pos + 2);
        } break;

        default:
            throw VPathNotImplementedException();
        break;
    }

    return new VString(L"dude");
}

int VProcessor::GetArgLen(int pos) {
    return expr->m_opMap[pos + XPathExpression::s_opCodeMapLengthIndex + 1] - 3;
}

}