/**
 * @license
 * Copyright 2015 The Emscripten Authors
 * SPDX-License-Identifier: MIT
 */

// When bootstrapping struct info, we can't use the full library because
// it itself depends on the struct info information.

#if !BOOTSTRAPPING_STRUCT_INFO
assert(false, "libbootstrap.js only designed for use with BOOTSTRAPPING_STRUCT_INFO")
#endif

assert(Object.keys(LibraryManager.library).length === 0);
addToLibrary({
  $callRuntimeCallbacks: () => {},

  $HEAP8: undefined,
  $HEAPU8: undefined,
  $HEAP16: undefined,
  $HEAPU16: undefined,
  $HEAP32: undefined,
  $HEAPU32: undefined,
  $HEAPF32: undefined,
  $HEAPF64: undefined,
#if WASM_BIGINT
  $HEAP64: undefined,
  $HEAPU64: undefined,
#endif

  $wasmMemory: 'memory',

  $ExitStatus: class {
    name = 'ExitStatus';
    constructor(status) {
      this.message = `Program terminated with exit(${status})`;
      this.status = status;
    }
  },

  $exitJS__deps: ['$ExitStatus'],
  $exitJS: (code) => quit_(code, new ExitStatus(code)),

  $handleException: (e) => {
    if (e instanceof ExitStatus || e == 'unwind') {
      return EXITSTATUS;
    }
    quit_(1, e);
  },

  fd_write__sig: 'iippp',
  fd_write: (fd, iov, iovcnt, pnum) => {
    // implementation almost copied from libwasi.js one for SYSCALLS_REQUIRE_FILESYSTEM=0
    // (the only difference is that we can't use C_STRUCTS here)
    var num = 0;
    for (var i = 0; i < iovcnt; i++) {
      var ptr = {{{ makeGetValue('iov', 0, '*') }}};
      var len = {{{ makeGetValue('iov', POINTER_SIZE, '*') }}};
      iov += {{{ POINTER_SIZE }}} * 2;
      process.stdout.write(HEAPU8.subarray(ptr, ptr + len));
      num += len;
    }
    {{{ makeSetValue('pnum', 0, 'num', '*') }}};
    return 0;
  },
});
