← index
cplusplus2x.Examples/C++20/MasterX/src/apps/ats/func_setsym.cpp
Source: cplusplus2x.Examples/C++20/MasterX/src/apps/ats/func_setsym.cpp
#include "function.hpp"

namespace token {
    void token_SetSym(const std::string &command, std::vector<lex::Token> &tokens) {
        if (tokens[1].getTokenType() != lex::TOKEN_CHAR) {
            stream << "Error: Command requires variable name.\r\n";
            return;
        }
        std::string var_name = tokens[1].getToken();
        if (!code.symbols.exisits(tokens[1].getToken())) {
            code.symbols[var_name].create(var_name, symbol::Value("", 0));
        }
        std::string var_value = tokens[2].getToken();

        if (!(tokens[2].getTokenType() == lex::TOKEN_OPERATOR && var_value == "-") && tokens.size() >= 4) {
            stream << "Error: Requires two arguments: var value..\r\n";
            return;
        }
        switch (tokens[2].getTokenType()) {
        case lex::TOKEN_CHAR:
            if (!code.symbols.exisits(tokens[2].getToken())) {
                stream << "Error: " << tokens[2].getToken() << " not found!\r\n";
                return;
            }
            code.symbols[var_name].setValue(code.symbols[var_value].getValue());
            break;
        case lex::TOKEN_STRING:
            code.symbols[var_name].setValue(symbol::Value(var_value, 0));
            break;
        case lex::TOKEN_HEX:
            code.symbols[var_name].setValue(symbol::Value(var_value, icode::toHex(var_value)));
            break;
        case lex::TOKEN_DIGIT:
            code.symbols[var_name].setValue(symbol::Value(var_value, atof(tokens[2].getToken().c_str())));
            break;
        case lex::TOKEN_OPERATOR:
            if (tokens.size() == 4 && var_value == "-" && tokens[3].getTokenType() == lex::TOKEN_DIGIT) {
                std::string tok_value = "-" + tokens[3].getToken();
                code.symbols[var_name].setValue(symbol::Value(tok_value, atof(tok_value.c_str())));
                return;
            }
        default:
            stream << "Error: requires variable/digit/string.\r\n";
            return;
        }
    }
} // namespace token