NixyPlayer

Форк
0
/
main.cpp 
104 строки · 3.0 Кб
1
#include <NixyPlayerContext.h>
2
#include <dylib/dylib.hpp>
3
#include <tiny-js/TinyJS.h>
4
#include <tiny-js/TinyJS_Functions.h>
5
#include <tiny-js/TinyJS_MathFunctions.h>
6
#include <utils.h>
7

8
#include <fstream>
9
#include <iostream>
10
#include <map>
11
#include <vector>
12
#include <ranges>
13
#include <sstream>
14

15
#include "constants.h"
16

17
using std::cout;
18
using std::endl;
19
using std::map;
20
using std::string;
21
using std::vector;
22

23
int main(int argc, char **argv) {
24
    bool verbose = false;
25

26
    for (int i = 0; i < argc; ++i) {
27
        if (string(argv[i]) == "--verbose" || string(argv[i]) == "-v") {
28
            verbose = true;
29
        }
30
    }
31

32
    if (verbose) {
33
        cout << "Welcome to Nixy Player (" << NixyPlayerVersion << ")" << endl;
34
        cout << "Verbose mode enabled" << endl;
35
        for (int i = 0; i < argc; ++i) {
36
            cout << "argv " << i << " - " << argv[i] << endl;
37
        }
38
    }
39
    if (argc < 2) {
40
        cout << "No start JavaScript file provided as first argument. Error 1"
41
             << endl;
42
        exit(1);
43
    }
44

45
    string startFileContent = fileContent(argv[1], verbose);
46

47
    CTinyJS *tinyJS = new CTinyJS();
48

49
    registerFunctions(tinyJS);
50
    registerMathFunctions(tinyJS);
51

52
    auto extensions = fileContent("extensions.nixyp", verbose);
53

54
    NixyPlayerContext context{tinyJS, verbose};
55

56
    std::stringstream ss(extensions);  
57
    string extension;
58

59
    vector<dylib *> libs;
60

61
    while (ss >> extension) {
62
        dylib* lib = new dylib(extension, dylib::no_filename_decorations);
63
        lib->verbose = verbose;
64
        libs.push_back(lib);
65
        auto jsExtensionsMapPointer = lib->get_function<map<string, string>*()>("registerNixyPlayerExtensions");
66
        auto jsExtensionsMap = jsExtensionsMapPointer();
67

68
        for (auto jsExtension : *jsExtensionsMap) {
69
            if (verbose) {
70
                cout << "jsExtension: " << jsExtension.first << endl;
71
            }
72
            const char *jsExtensionFunctionName = jsExtension.second.c_str();
73
                if (lib->has_symbol(jsExtensionFunctionName)) {
74
                    if (verbose) {
75
                        cout << "Library: " << extension << " has " << jsExtensionFunctionName << endl;
76
                    }
77
                }
78
                else {
79
                    cout << "Library: " << extension << " does not have " << jsExtensionFunctionName << ". Error 5" << endl;
80
                    exit(5);
81
                }
82
            JSCallback jsExtensionFunctionPointer = reinterpret_cast<JSCallback>(lib->get_function<void>(jsExtensionFunctionName));
83
            tinyJS->addNative(jsExtension.first,
84
                              jsExtensionFunctionPointer,
85
                              &context);
86
        }
87
    }
88

89
    try {
90
        tinyJS->execute(startFileContent);
91
    } catch (CScriptException *error) {
92
        cout << "---[SCRIPT ERROR START]---" << endl;
93
        cout << "Tiny-JS error: " << error->text << endl;
94
        cout << "---[SCRIPT ERROR END]---" << endl;
95
        cout << "Error 2" << endl;
96
        exit(2);
97
    }
98

99
    for (auto lib : libs) {
100
        delete(lib);
101
    }
102

103
    return 0;
104
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.