diff options
-rw-r--r-- | src/sexpr-wasm.c | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/sexpr-wasm.c b/src/sexpr-wasm.c index f57cc7df..d9a9b815 100644 --- a/src/sexpr-wasm.c +++ b/src/sexpr-wasm.c @@ -166,6 +166,42 @@ static void parse_options(int argc, char** argv) { } } +typedef struct WasmFileInfo { + FILE* file; + size_t offset; +} WasmFileInfo; + +static void write_binary_file(size_t offset, + const void* data, + size_t size, + void* user_data) { + WasmFileInfo* info = user_data; + if (offset != info->offset) { + fseek(info->file, offset, SEEK_SET); + info->offset = offset; + } + fwrite(data, size, 1, info->file); + info->offset += size; +} + +static WasmResult open_binary_file(WasmBinaryWriter* writer, + WasmFileInfo* info, + const char* filename) { + info->file = fopen(filename, "wb"); + if (!info->file) + return WASM_ERROR; + + info->offset = 0; + writer->user_data = info; + writer->write_data = write_binary_file; + return WASM_OK; +} + +static void close_binary_file(WasmBinaryWriter* writer) { + WasmFileInfo* info = writer->user_data; + fclose(info->file); +} + int main(int argc, char** argv) { parse_options(argc, argv); @@ -183,9 +219,19 @@ int main(int argc, char** argv) { if (result == WASM_OK) { WasmBinaryWriter writer = {}; + WasmFileInfo info = {}; if (s_verbose) writer.log_writes = 1; - result |= wasm_write_binary(&writer, &parser.script); + + if (s_outfile) { + if (open_binary_file(&writer, &info, s_outfile) == WASM_OK) { + result |= wasm_write_binary(&writer, &parser.script); + close_binary_file(&writer); + } + } else if (s_verbose) { + /* don't write file output, but we still write the verbose output */ + result |= wasm_write_binary(&writer, &parser.script); + } } } |