You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
1.8 KiB
C++
103 lines
1.8 KiB
C++
//
|
|
// Created by koncord on 09.05.16.
|
|
//
|
|
|
|
#ifndef _WIN32
|
|
#include <dlfcn.h>
|
|
#endif
|
|
|
|
#include <stdexcept>
|
|
#include "LangNative.hpp"
|
|
#include <Script/SystemInterface.hpp>
|
|
#include <Script/Script.hpp>
|
|
|
|
using namespace std;
|
|
|
|
template<typename R>
|
|
bool SetScript(lib_t lib, const char *name, R value)
|
|
{
|
|
SystemInterface<R *> result(lib, name);
|
|
|
|
if (result)
|
|
*result.result = value;
|
|
|
|
return result.operator bool();
|
|
}
|
|
|
|
void LangNative::LoadProgram(const char *filename)
|
|
{
|
|
FILE *file = fopen(filename, "rb");
|
|
|
|
if (!file)
|
|
throw runtime_error("Script not found: " + string(filename));
|
|
|
|
fclose(file);
|
|
|
|
#ifdef _WIN32
|
|
lib = LoadLibrary(filename);
|
|
#else
|
|
lib = dlopen(filename, RTLD_LAZY);
|
|
#endif
|
|
|
|
if (!lib)
|
|
throw runtime_error("Was not able to load C++ script: " + string(filename));
|
|
|
|
try
|
|
{
|
|
|
|
const char *prefix = SystemInterface<const char *>(lib, "prefix").result;
|
|
string pf(prefix);
|
|
|
|
for (const auto &function : ScriptFunctions::functions)
|
|
if (!SetScript(lib, string(pf + function.name).c_str(), function.func.addr))
|
|
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Script function pointer not found: %s", function.name);
|
|
}
|
|
catch (...)
|
|
{
|
|
FreeProgram();
|
|
throw;
|
|
}
|
|
}
|
|
|
|
int LangNative::FreeProgram()
|
|
{
|
|
#ifdef _WIN32
|
|
FreeLibrary(lib);
|
|
#else
|
|
dlclose(lib);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
bool LangNative::IsCallbackPresent(const char *name)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
boost::any LangNative::Call(const char *name, const char *argl, int buf, ...)
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
boost::any LangNative::Call(const char *name, const char *argl, const std::vector<boost::any> &args)
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
|
|
lib_t LangNative::GetInterface()
|
|
{
|
|
return lib;
|
|
}
|
|
|
|
|
|
LangNative::LangNative()
|
|
{
|
|
|
|
}
|
|
|
|
LangNative::~LangNative()
|
|
{
|
|
|
|
}
|