Files
dlang-sqlite/dlang.sqlite/dlang/libs/io.hpp
T
2026-10-12 23:24:32 +02:00

85 lines
1.6 KiB
C++

#ifndef DLANG_LIBS_IO_HPP
#define DLANG_LIBS_IO_HPP
#include <fstream>
#include "../vm.hpp"
#include "../helpers.hpp"
static void NativeRead(DlangVM* vm)
{
bool binary = false;
if (dlang_isboolean(vm))
binary = dlang_toboolean(vm);
std::string path = dlang_tostring(vm);
std::ifstream stream(path, (binary ? std::ios::binary : std::ios::in));
if (!stream.is_open())
{
dlang_pushstring(vm, "Failed to open file!");
return;
}
std::string content(
(std::istreambuf_iterator<char>(stream)),
std::istreambuf_iterator<char>()
);
stream.close();
dlang_pushstring(vm, content);
}
static void NativeWrite(DlangVM* vm)
{
bool binary = false;
if (dlang_isboolean(vm))
binary = dlang_toboolean(vm);
std::string content = dlang_tostring(vm);
std::string path = dlang_tostring(vm);
std::ofstream stream(path, (binary ? std::ios::binary : std::ios::out));
if (!stream.is_open())
{
dlang_pushboolean(vm, false);
return;
}
stream.write(reinterpret_cast<const char*>(content.data()), content.size());
stream.close();
dlang_pushboolean(vm, true);
}
static void NativeInput(DlangVM* vm)
{
if (dlang_isstring(vm))
{
auto promp = dlang_tostring(vm);
printf("%s", promp.c_str());
}
std::string inputLine;
if (std::getline(std::cin, inputLine))
dlang_pushstring(vm, inputLine);
else
dlang_pushstring(vm, "");
}
inline void openlib_io(DlangVM* vm)
{
dlang_newtable(vm);
dlang_pushcfunction(vm, NativeRead);
dlang_setfield(vm, "read");
dlang_pushcfunction(vm, NativeWrite);
dlang_setfield(vm, "write");
dlang_pushcfunction(vm, NativeInput);
dlang_setfield(vm, "input");
dlang_setglobal(vm, "io");
}
#endif