Files
dlang-http/dlang.http/dlang/libs/dev.hpp
T
2026-10-12 23:32:28 +02:00

124 lines
2.4 KiB
C++

#ifndef DLANG_LIBS_DEV_HPP
#define DLANG_LIBS_DEV_HPP
#include "../vm.hpp"
#include "../helpers.hpp"
static void NativePrint(DlangVM* vm)
{
std::stringstream ss;
auto argCount = dlang_top(vm);
std::vector<StackValue> values;
for (int i = 0; i < argCount; ++i)
values.push_back(dlang_totoken(vm));
for (auto it = values.rbegin(); it != values.rend(); ++it)
{
if (it->type == StackValueType::NIL)
{
printf("nil");
}
else {
std::visit([&ss](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, bool>) {
ss << (arg ? "true" : "false") << " ";
}
else if constexpr (std::is_same_v<T, double>) {
ss << DoubleToString(arg) << " ";
}
else {
ss << arg << " ";
}
}, it->data);
}
}
std::cout << ss.str() << '\n';
}
static void NativeToNumber(DlangVM* vm)
{
auto content = dlang_tostring(vm);
try {
dlang_pushnumber(vm, std::stod(content));
}
catch (...)
{
dlang_pushnumber(vm, 0);
}
}
static void NativeIsNil(DlangVM* vm)
{
dlang_pushboolean(vm, dlang_isnil(vm));
}
static void NativeIsString(DlangVM* vm)
{
dlang_pushboolean(vm, dlang_isstring(vm));
}
static void NativeIsNumber(DlangVM* vm)
{
dlang_pushboolean(vm, dlang_isnumber(vm));
}
static void NativeIsBoolean(DlangVM* vm)
{
dlang_pushboolean(vm, dlang_isboolean(vm));
}
static void NativeRequire(DlangVM* vm)
{
auto name = dlang_tostring(vm);
if (vm->loadedPlugins.Contains(name))
{
dlang_pushstring(vm, "plugin already loaded!");
return;
}
void* rawPtr = pluginManager->GetOrLoadInitFunc("./plugins/" + name);
if (rawPtr)
{
vm->loadedPlugins.push(name);
using InitFunc = void(*)(DlangVM*);
auto init = reinterpret_cast<InitFunc>(rawPtr);
init(vm);
dlang_pushstring(vm, "plugin loaded!");
return;
}
dlang_pushstring(vm, "Failed to load plugin!");
return;
}
inline void openlib_dev(DlangVM* vm)
{
dlang_pushcfunction(vm, NativePrint);
dlang_setglobal(vm, "print");
dlang_pushcfunction(vm, NativeToNumber);
dlang_setglobal(vm, "tonumber");
dlang_pushcfunction(vm, NativeIsNil);
dlang_setglobal(vm, "isnil");
dlang_pushcfunction(vm, NativeIsString);
dlang_setglobal(vm, "isstring");
dlang_pushcfunction(vm, NativeIsNumber);
dlang_setglobal(vm, "isnumber");
dlang_pushcfunction(vm, NativeIsBoolean);
dlang_setglobal(vm, "isbool");
dlang_pushcfunction(vm, NativeRequire);
dlang_setglobal(vm, "require");
}
#endif