static char* get_module_filename(Context* ctx) {
  size_t buflen = ctx->json_filename_noext.length + 20;
  char* str = wasm_alloc(ctx->allocator, buflen, WASM_DEFAULT_ALIGN);
  size_t length = wasm_snprintf(
      str, buflen, PRIstringslice ".%" PRIzd ".wasm",
      WASM_PRINTF_STRING_SLICE_ARG(ctx->json_filename_noext), ctx->num_modules);
  convert_backslash_to_slash(str, length);
  return str;
}
static WasmStringSlice create_assert_func_name(WasmAllocator* allocator,
                                               const char* format,
                                               int format_index) {
  WasmStringSlice name;
  char buffer[256];
  int buffer_len = wasm_snprintf(buffer, 256, format, format_index);
  name.start = wasm_strndup(allocator, buffer, buffer_len);
  name.length = buffer_len;
  return name;
}
void wasm_print_help(WasmOptionParser* parser, const char* program_name) {
  int i;
  /* TODO(binji): do something more generic for filename here */
  printf("usage: %s [options] filename\n\n", program_name);
  printf("%s\n", parser->description);
  printf("options:\n");

  const int extra_space = 8;
  int longest_name_length = 0;
  for (i = 0; i < parser->num_options; ++i) {
    WasmOption* option = &parser->options[i];
    int length;
    if (option->long_name) {
      if (option->metavar) {
        length =
            wasm_snprintf(NULL, 0, "%s=%s", option->long_name, option->metavar);
      } else {
        length = wasm_snprintf(NULL, 0, "%s", option->long_name);
      }
    } else {
      continue;
    }

    if (length > longest_name_length)
      longest_name_length = length;
  }

  size_t buffer_size = longest_name_length + 1;
  char* buffer = alloca(buffer_size);

  for (i = 0; i < parser->num_options; ++i) {
    WasmOption* option = &parser->options[i];
    if (!option->short_name && !option->long_name)
      continue;

    if (option->short_name)
      printf("  -%c, ", option->short_name);
    else
      printf("      ");

    char format[20];
    if (option->long_name) {
      wasm_snprintf(format, sizeof(format), "--%%-%ds",
                    longest_name_length + extra_space);

      if (option->metavar) {
        wasm_snprintf(buffer, buffer_size, "%s=%s", option->long_name,
                      option->metavar);
        printf(format, buffer);
      } else {
        printf(format, option->long_name);
      }
    } else {
      /* +2 for the extra "--" above */
      wasm_snprintf(format, sizeof(format), "%%-%ds",
                    longest_name_length + extra_space + 2);
      printf(format, "");
    }

    if (option->help)
      printf("%s", option->help);
    printf("\n");
  }
}