static void parse_options(int argc, char** argv) { WasmOptionParser parser; WASM_ZERO_MEMORY(parser); parser.description = s_description; parser.options = s_options; parser.num_options = WASM_ARRAY_SIZE(s_options); parser.on_option = on_option; parser.on_argument = on_argument; parser.on_error = on_option_error; wasm_parse_options(&parser, argc, argv); if (!s_infile) { wasm_print_help(&parser, PROGRAM_NAME); WASM_FATAL("No filename given.\n"); } }
static WasmResult scan_forward_for_line_offset_in_file( WasmAstLexer* lexer, int line, size_t line_start_offset, WasmLineOffsetPosition find_position, int find_line, size_t* out_line_offset) { FILE* lexer_file = lexer->source.file; WasmResult result = WASM_ERROR; long old_offset = ftell(lexer_file); if (old_offset == -1) return WASM_ERROR; size_t buffer_file_offset = line_start_offset; if (fseek(lexer_file, buffer_file_offset, SEEK_SET) == -1) goto cleanup; while (1) { char buffer[8 * 1024]; const size_t buffer_size = WASM_ARRAY_SIZE(buffer); size_t read_bytes = fread(buffer, 1, buffer_size, lexer_file); if (read_bytes == 0) { /* end of buffer */ if (find_position == WASM_LINE_OFFSET_POSITION_START) { result = WASM_ERROR; } else { *out_line_offset = buffer_file_offset + read_bytes; result = WASM_OK; } goto cleanup; } const char* buffer_end = buffer + read_bytes; result = scan_forward_for_line_offset_in_buffer( buffer, buffer_end, line, buffer_file_offset, find_position, find_line, &line, out_line_offset); if (result == WASM_OK) goto cleanup; buffer_file_offset += read_bytes; } cleanup: /* if this fails, we're screwed */ if (fseek(lexer_file, old_offset, SEEK_SET) == -1) return WASM_ERROR; return result; }
static void write_command_type(Context* ctx, const WasmCommand* command) { static const char* s_command_names[] = { "module", "action", "register", "assert_malformed", "assert_invalid", "assert_unlinkable", "assert_uninstantiable", "assert_return", "assert_return_nan", "assert_trap", }; WASM_STATIC_ASSERT(WASM_ARRAY_SIZE(s_command_names) == WASM_NUM_COMMAND_TYPES); write_key(ctx, "type"); write_string(ctx, s_command_names[command->type]); }
" $ wasm-wast test.wasm --debug-names -o test.wast\n"; static WasmOption s_options[] = { {FLAG_VERBOSE, 'v', "verbose", NULL, NOPE, "use multiple times for more info"}, {FLAG_HELP, 'h', "help", NULL, NOPE, "print this help message"}, {FLAG_OUTPUT, 'o', "output", "FILENAME", YEP, "output file for the generated wast file, by default use stdout"}, {FLAG_USE_LIBC_ALLOCATOR, 0, "use-libc-allocator", NULL, NOPE, "use malloc, free, etc. instead of stack allocator"}, {FLAG_DEBUG_NAMES, 0, "debug-names", NULL, NOPE, "Read debug names from the binary file"}, {FLAG_GENERATE_NAMES, 0, "generate-names", NULL, NOPE, "Give auto-generated names to non-named functions, types, etc."}, }; WASM_STATIC_ASSERT(NUM_FLAGS == WASM_ARRAY_SIZE(s_options)); static void on_option(struct WasmOptionParser* parser, struct WasmOption* option, const char* argument) { switch (option->id) { case FLAG_VERBOSE: s_verbose++; wasm_init_file_writer_existing(&s_log_stream_writer, stdout); wasm_init_stream(&s_log_stream, &s_log_stream_writer.base, NULL); s_read_binary_options.log_stream = &s_log_stream; break; case FLAG_HELP: wasm_print_help(parser, PROGRAM_NAME); exit(0);
WASM_INTERPRETER_THREAD_OPTIONS_DEFAULT; static WasmBool s_trace; static WasmBool s_use_libc_allocator; static WasmStream* s_stdout_stream; static WasmBinaryErrorHandler s_error_handler = WASM_BINARY_ERROR_HANDLER_DEFAULT; #define V(name, str) str, static const char* s_trap_strings[] = {FOREACH_INTERPRETER_RESULT(V)}; #undef V static const char* s_type_names[] = { "void", "i32", "i64", "f32", "f64", }; WASM_STATIC_ASSERT(WASM_ARRAY_SIZE(s_type_names) == WASM_NUM_TYPES); enum { DONT_RAISE_ERROR = SQFalse, RAISE_ERROR = SQTrue, }; enum { WITHOUT_RETVAL = SQFalse, WITH_RETVAL = SQTrue, }; typedef struct SquirrelModuleContext { WasmAllocator* allocator; HSQUIRRELVM squirrel_vm; HSQOBJECT import_array;