NixyPlayer
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
17using std::cout;
18using std::endl;
19using std::map;
20using std::string;
21using std::vector;
22
23int main(int argc, char **argv) {
24bool verbose = false;
25
26for (int i = 0; i < argc; ++i) {
27if (string(argv[i]) == "--verbose" || string(argv[i]) == "-v") {
28verbose = true;
29}
30}
31
32if (verbose) {
33cout << "Welcome to Nixy Player (" << NixyPlayerVersion << ")" << endl;
34cout << "Verbose mode enabled" << endl;
35for (int i = 0; i < argc; ++i) {
36cout << "argv " << i << " - " << argv[i] << endl;
37}
38}
39if (argc < 2) {
40cout << "No start JavaScript file provided as first argument. Error 1"
41<< endl;
42exit(1);
43}
44
45string startFileContent = fileContent(argv[1], verbose);
46
47CTinyJS *tinyJS = new CTinyJS();
48
49registerFunctions(tinyJS);
50registerMathFunctions(tinyJS);
51
52auto extensions = fileContent("extensions.nixyp", verbose);
53
54NixyPlayerContext context{tinyJS, verbose};
55
56std::stringstream ss(extensions);
57string extension;
58
59vector<dylib *> libs;
60
61while (ss >> extension) {
62dylib* lib = new dylib(extension, dylib::no_filename_decorations);
63lib->verbose = verbose;
64libs.push_back(lib);
65auto jsExtensionsMapPointer = lib->get_function<map<string, string>*()>("registerNixyPlayerExtensions");
66auto jsExtensionsMap = jsExtensionsMapPointer();
67
68for (auto jsExtension : *jsExtensionsMap) {
69if (verbose) {
70cout << "jsExtension: " << jsExtension.first << endl;
71}
72const char *jsExtensionFunctionName = jsExtension.second.c_str();
73if (lib->has_symbol(jsExtensionFunctionName)) {
74if (verbose) {
75cout << "Library: " << extension << " has " << jsExtensionFunctionName << endl;
76}
77}
78else {
79cout << "Library: " << extension << " does not have " << jsExtensionFunctionName << ". Error 5" << endl;
80exit(5);
81}
82JSCallback jsExtensionFunctionPointer = reinterpret_cast<JSCallback>(lib->get_function<void>(jsExtensionFunctionName));
83tinyJS->addNative(jsExtension.first,
84jsExtensionFunctionPointer,
85&context);
86}
87}
88
89try {
90tinyJS->execute(startFileContent);
91} catch (CScriptException *error) {
92cout << "---[SCRIPT ERROR START]---" << endl;
93cout << "Tiny-JS error: " << error->text << endl;
94cout << "---[SCRIPT ERROR END]---" << endl;
95cout << "Error 2" << endl;
96exit(2);
97}
98
99for (auto lib : libs) {
100delete(lib);
101}
102
103return 0;
104}