Support compiling to and running from binary files

This commit is contained in:
2020-09-07 20:29:19 +02:00
parent 52df0a0d52
commit 4071dcc5a8
2 changed files with 37 additions and 5 deletions

View File

@@ -12,7 +12,7 @@ int main(int argc, char ** argv)
std::string outputFile("program.bin");
auto cli = (
clipp::value("input file").set(inputFile),
clipp::value("input file (*.wasm or *.bin)").set(inputFile),
(
clipp::required("-e", "--execute").set(execute),
clipp::option("-m", "--memory-size") & clipp::value("memory size in bytes (defaults to 4096)", memorySize),

View File

@@ -184,12 +184,42 @@ void Wassembler::EnableByteTranslationLogging()
bool Wassembler::CompileAndRun(std::string const & filePath)
{
std::vector<std::string> lines;
std::vector<std::uint8_t> bytes;
if (filePath.size() > 4 && filePath.compare(filePath.size() - 4, 4, ".bin") == 0)
{
std::ifstream inputFile(filePath);
if (!inputFile.is_open())
{
std::printf("Error: Cannot open file %s for reading", filePath.c_str());
return false;
}
std::size_t previousSize = 0;
bytes.resize(100);
while(inputFile.read(reinterpret_cast<char*>(&bytes[previousSize]), 100))
{
previousSize = bytes.size();
bytes.resize(bytes.size() + 100);
}
bytes.resize(bytes.size() - (100 - inputFile.gcount()));
}
else if (filePath.size() > 5 &&
filePath.compare(filePath.size() - 5, 5, ".wasm") == 0)
{
if (!CompileFile(filePath, bytes))
{
return false;
}
}
else
{
std::printf(
"Error: unrecognized file extension on input file %s",
filePath.c_str());
return false;
}
try
{
@@ -221,9 +251,11 @@ bool Wassembler::CompileToFile(
std::printf("Error: Cannot open file %s for writing", outputFilePath.c_str());
return false;
}
for(std::size_t i = 0; i < bytes.size(); ++i)
if (!output.write(reinterpret_cast<char*>(bytes.data()), bytes.size()))
{
output << bytes[i];
std::printf("Error: An error occurred whilst writing to %s", outputFilePath.c_str());
return false;
}
return true;