← index
cplusplus2x.Examples/C++20/MasterX/src/apps/ats/ats_export.cpp
Source: cplusplus2x.Examples/C++20/MasterX/src/apps/ats/ats_export.cpp
#define VERSION_INFO "1.0"
#include "code.hpp"
#include "function.hpp"
#include <unordered_map>

class ATS_Export {
  public:
    ATS_Export() {
        code.symbols["version"].create("version", symbol::Value(VERSION_INFO, 1.0));
        code.symbols["author"].create("author", symbol::Value("lostjared", 0));
    }

    std::string scanATS(std::string input_line) {
        std::istringstream stream_value(input_line);
        lex::Scanner scan(stream_value);
        std::vector<lex::Token> v;
        stream.str("");
        while (scan.valid()) {
            lex::Token s;
            scan >> s;
            if (s.getTokenType() != lex::TOKEN_EOF)
                v.push_back(s);
        }
        if (v.size() == 0)
            return "No instructions.\n";

        std::string first_token;
        first_token = icode::lcase(v[0].getToken());
        if (first_token == "quit")
            return "";
        auto rt = function_map.find(first_token);
        if (rt == function_map.end()) {
            interp::inputText(v, input_line);
            if (stream.str().length() == 0) {
                return "OK ...";
            }
            return stream.str();
        }

        int token_count = v.size() - 1;
        if ((rt->second.greater == false && token_count == rt->second.args) || (rt->second.args == -1) || (rt->second.greater == true && token_count >= rt->second.args))
            rt->second.func(input_line, v);
        else {
            stream << "Error: " << first_token << " requires: " << rt->second.args << " arguments. You gave " << token_count << "\n";
        }
        return stream.str();
    }
};

ATS_Export ats;

std::string scanATS(std::string input) {
    return ats.scanATS(input);
}