summaryrefslogtreecommitdiff
path: root/src/wasm2asm-main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm2asm-main.cpp')
-rw-r--r--src/wasm2asm-main.cpp67
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;
}