PorygonLang/src/ScriptOptions.cpp

58 lines
2.1 KiB
C++

#include <iostream>
#include <fstream>
#include <sys/stat.h>
#include "ScriptOptions.hpp"
#include "Utilities/StringUtils.hpp"
#include "Script.hpp"
Porygon::ScriptOptions Porygon::ScriptOptions::DefaultScriptOptions;
std::streambuf* Porygon::ScriptOptions::_printBuffer = std::cout.rdbuf();
std::ostream* Porygon::ScriptOptions::_printStream = new std::ostream(Porygon::ScriptOptions::_printBuffer);
void Porygon::ScriptOptions::DefaultPrint(const char16_t *s) {
Porygon::ScriptOptions::GetDefaultScriptOptions()->GetPrintStream() << Porygon::Utilities::StringUtils::FromUTF8(s) << std::endl;
}
bool Porygon::ScriptOptions::DefaultModuleExists(const char* moduleName, size_t size) {
struct stat buffer;
return (stat (moduleName, &buffer) == 0);
}
Porygon::Script *Porygon::ScriptOptions::DefaultResolveModule(const char* moduleName, size_t size) {
auto stream = std::ifstream(moduleName);
std::basic_stringstream<char16_t> stringStream;
stringStream << stream.rdbuf();
auto str = std::u16string(stringStream.str());
return Porygon::Script::Create(str);
}
extern "C"{
void SetDefaultPrintFunc(void (*func)(const char16_t*)){
Porygon::ScriptOptions::GetDefaultScriptOptions()->SetPrintFunc(func);
}
void SetDefaultModuleExists(bool (*func)(const char* moduleName, size_t size)){
Porygon::ScriptOptions::GetDefaultScriptOptions()->SetModuleExistsFunc(func);
}
void SetDefaultResolveModule(Porygon::Script * (*func)(const char* moduleName, size_t size)){
Porygon::ScriptOptions::GetDefaultScriptOptions()->SetResolveModuleFunc(func);
}
Porygon::ScriptOptions* CreateOptions(){
return new Porygon::ScriptOptions();
}
void SetOptionPrintFunc(Porygon::ScriptOptions* opt, void (*func)(const char16_t*)){
opt->SetPrintFunc(func);
}
void SetOptionModuleExistsFunc(Porygon::ScriptOptions* opt, bool (*func)(const char* moduleName, size_t size)){
opt->SetModuleExistsFunc(func);
}
void SetOptionResolveModuleFunc(Porygon::ScriptOptions* opt, Porygon::Script* (*func)(const char* moduleName, size_t size)){
opt->SetResolveModuleFunc(func);
}
}