← index
Simple.Calculator.Web/scan_export.cpp
Source: Simple.Calculator.Web/scan_export.cpp
#include<emscripten.h>
#include<emscripten/bind.h>
#include"lexer.hpp"
#include<sstream>

std::unordered_map<std::string, double> variables;
std::unordered_map<std::string, lex::Func> functions;

double val_sqrt(double d) { return sqrtf(d); }
double val_abs(double d) { return abs(static_cast<int>(d)); }
double val_print(double d) {
    //stream << "value of variable: " << d << "\n";
    return d;
}
double val_cosf(double d) { return cosf(d); }
double val_sinf(double d) { return sinf(d); }
double val_log(double d) { return logf(d); }
double val_tan(double d) { return tanf(d); }
double val_rand(double d) { return std::rand()%static_cast<int>(d); }
double val_exit(double /*d*/) {
    return 0;
}

void add_func(std::initializer_list<lex::Func> lst) {
    for(auto &i : lst) {
        functions[i.name] = i;
    }
}

void initFunctions() {
    std::srand(static_cast<unsigned int>(std::time(0)));
    add_func({
        {"sqrt",val_sqrt}, {"abs",val_abs},
        {"print",val_print}, {"cos",val_cosf},
        {"sin",val_sinf}, {"tan",val_tan},
        {"log",val_log}, {"exit",val_exit},
        {"rand",val_rand}
    });
}
/* end temporary */

class ScanExport {
public:

    ScanExport() {
        initFunctions();
    }

    std::string scanLex(std::string text) {
        std::ostringstream stream;
        if(text.find(";")  == std::string::npos) {
            stream << "Error missing semi-colon\n";
            return stream.str();
        }

        stream << "<table border=\"1\">\n<tr><th>Variable</th><th>Value</th></tr>\n";
        std::istringstream stream_in(text);
        lex::Parser pscan(stream_in, variables, functions);
        if(pscan.eval()) {
            for (auto &s : variables) {
             stream << "<tr><th>" << s.first << "</th><th>" << s.second << "</th></tr>\n";
            }
        }
        stream << "</table>\n";
        return stream.str();
    }

};

using namespace emscripten;

EMSCRIPTEN_BINDINGS(my_Scan) {
    class_<ScanExport>("Scan")
        .constructor()
        .function("scanLex", &ScanExport::scanLex)
    ;
}