#include // cout #include // assert() #include // strstr() #include #include // system() #include #include // _chdir() #include // stringstream #include #include "../../../add_on/scriptbuilder/scriptbuilder.h" #include "../../../add_on/scriptstdstring/scriptstdstring.h" #include "../../../add_on/scriptarray/scriptarray.h" #include "../../../add_on/scriptdictionary/scriptdictionary.h" #include "../../../add_on/scriptfile/scriptfile.h" #include "../../../add_on/scriptfile/scriptfilesystem.h" #include "../../../add_on/scripthelper/scripthelper.h" #include "../../../add_on/debugger/debugger.h" #include "../../../add_on/contextmgr/contextmgr.h" #include "../../../add_on/datetime/datetime.h" #ifdef _WIN32 #include // WriteConsoleW #include // CreateToolhelp32Snapshot, Process32First, Process32Next #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 #endif #endif #if defined(_MSC_VER) #include // MSVC debugging routines #endif using namespace std; // Function prototypes int ConfigureEngine(asIScriptEngine *engine); void InitializeDebugger(asIScriptEngine *engine); int CompileScript(asIScriptEngine *engine, const char *scriptFile); int ExecuteScript(asIScriptEngine *engine, const char *scriptFile); void MessageCallback(const asSMessageInfo *msg, void *param); asIScriptContext *RequestContextCallback(asIScriptEngine *engine, void *param); void ReturnContextCallback(asIScriptEngine *engine, asIScriptContext *ctx, void *param); void PrintString(const string &str); string GetInput(); int ExecSystemCmd(const string &cmd); int ExecSystemCmd(const string &str, string &out); CScriptArray *GetCommandLineArgs(); void SetWorkDir(const string &file); void WaitForUser(); int PragmaCallback(const string &pragmaText, CScriptBuilder &builder, void *userParam); // The command line arguments CScriptArray *g_commandLineArgs = 0; int g_argc = 0; char **g_argv = 0; // The context manager is used to manage the execution of co-routines CContextMgr *g_ctxMgr = 0; // The debugger is used to debug the script bool g_doDebug = false; CDebugger *g_dbg = 0; // Context pool vector g_ctxPool; int main(int argc, char **argv) { #if defined(_MSC_VER) // Tell MSVC to report any memory leaks _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF); _CrtSetReportMode(_CRT_ASSERT,_CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_ASSERT,_CRTDBG_FILE_STDERR); // Use _CrtSetBreakAlloc(n) to find a specific memory leak #endif #if defined(_WIN32) // Turn on support for virtual terminal sequences to add support for colored text in the console // Ref: https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences // Ref: https://stackoverflow.com/questions/2048509/how-to-echo-with-different-colors-in-the-windows-command-line HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); if (hOut == INVALID_HANDLE_VALUE) return -1; DWORD dwMode = 0; if (!GetConsoleMode(hOut, &dwMode)) return -1; dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; if (!SetConsoleMode(hOut, dwMode)) return -1; #endif int r; // Validate the command line arguments bool argsValid = true; if( argc < 2 ) argsValid = false; else if( argc == 2 && strcmp(argv[1], "-d") == 0 ) argsValid = false; if( !argsValid ) { cout << "AngelScript command line runner. Version " << ANGELSCRIPT_VERSION_STRING << endl << endl; cout << "Usage: " << endl; cout << "asrun [-d]