diff options
Diffstat (limited to 'src/wasm2asm-main.cpp')
-rw-r--r-- | src/wasm2asm-main.cpp | 67 |
1 files changed, 33 insertions, 34 deletions
diff --git a/src/wasm2asm-main.cpp b/src/wasm2asm-main.cpp index 12a802107..c75272b8d 100644 --- a/src/wasm2asm-main.cpp +++ b/src/wasm2asm-main.cpp @@ -18,58 +18,57 @@ // wasm2asm console tool // -#include "wasm2asm.h" + +#include "support/colors.h" +#include "support/command-line.h" +#include "support/file.h" #include "wasm-s-parser.h" +#include "wasm2asm.h" using namespace cashew; using namespace wasm; -namespace wasm { -int debug = 0; -} - -int main(int argc, char **argv) { - debug = getenv("WASM2ASM_DEBUG") ? getenv("WASM2ASM_DEBUG")[0] - '0' : 0; - - char *infile = argv[1]; +int main(int argc, const char *argv[]) { + Options options("wasm2asm", "Transform .wast files to asm.js"); + options + .add("--output", "-o", "Output file (stdout if not specified)", + Options::Arguments::One, + [](Options *o, const std::string &argument) { + o->extra["output"] = argument; + Colors::disable(); + }) + .add_positional("INFILE", Options::Arguments::One, + [](Options *o, const std::string &argument) { + o->extra["infile"] = argument; + }); + options.parse(argc, argv); - if (debug) std::cerr << "loading '" << infile << "'...\n"; - FILE *f = fopen(argv[1], "r"); - assert(f); - fseek(f, 0, SEEK_END); - int size = ftell(f); - char *input = new char[size+1]; - rewind(f); - int num = fread(input, 1, size, f); - // On Windows, ftell() gives the byte position (\r\n counts as two bytes), but when - // reading, fread() returns the number of characters read (\r\n is read as one char \n, and counted as one), - // so return value of fread can be less than size reported by ftell, and that is normal. - assert((num > 0 || size == 0) && num <= size); - fclose(f); - input[num] = 0; + auto input( + read_file<std::vector<char>>(options.extra["infile"], options.debug)); - if (debug) std::cerr << "s-parsing...\n"; - SExpressionParser parser(input); - Element& root = *parser.root; + if (options.debug) std::cerr << "s-parsing..." << std::endl; + SExpressionParser parser(input.data()); + Element &root = *parser.root; - if (debug) std::cerr << "w-parsing...\n"; + if (options.debug) std::cerr << "w-parsing..." << std::endl; AllocatingModule wasm; SExpressionWasmBuilder builder(wasm, *root[0], [&]() { abort(); }); - if (debug) std::cerr << "asming...\n"; - Wasm2AsmBuilder wasm2asm; + if (options.debug) std::cerr << "asming..." << std::endl; + Wasm2AsmBuilder wasm2asm(options.debug); Ref asmjs = wasm2asm.processWasm(&wasm); - if (debug) { - std::cerr << "a-printing...\n"; + if (options.debug) { + std::cerr << "a-printing..." << std::endl; asmjs->stringify(std::cout, true); std::cout << '\n'; } - if (debug) std::cerr << "j-printing...\n"; + if (options.debug) std::cerr << "j-printing..." << std::endl; JSPrinter jser(true, true, asmjs); jser.printAst(); - std::cout << jser.buffer << "\n"; + Output output(options.extra["output"], options.debug); + output << jser.buffer << std::endl; - if (debug) std::cerr << "done.\n"; + if (options.debug) std::cerr << "done." << std::endl; } |