// SPDX-License-Identifier: Apache-2.0

///|
pub fn PEImage::bound_imports(self : Self) -> Array[BoundImport] raise PeError {
  let directory = match self.directory(11) {
    Some(directory) if directory.virtual_address != 0UL && directory.size > 0 =>
      directory
    _ => return []
  }
  let start = self.rva_to_offset(directory.virtual_address)
  let end = start + directory.size
  ensure_range(self.data, start, directory.size)
  let imports = []
  let mut offset = start
  while offset + 8 <= end && imports.length() < 1024 {
    let timestamp_value = read_u32(self.data, offset)
    let name_offset = read_u16(self.data, offset + 4)
    let forwarder_count = read_u16(self.data, offset + 6)
    if timestamp_value == 0UL && name_offset == 0 && forwarder_count == 0 {
      break
    }
    if forwarder_count > 1024 {
      raise PeError(offset + 6, "bound-import forwarder count is too large")
    }
    let name = if name_offset > 0 && start + name_offset < self.data.length() {
      read_ascii_z(
        self.data,
        start + name_offset,
        self.data.length() - (start + name_offset),
      )
    } else {
      ""
    }
    let forwarders = []
    let forwarder_offset = offset + 8
    ensure_range(self.data, forwarder_offset, forwarder_count * 8)
    for index in 0.. 0 &&
        start + item_name_offset < self.data.length() {
        read_ascii_z(
          self.data,
          start + item_name_offset,
          self.data.length() - (start + item_name_offset),
        )
      } else {
        ""
      }
      forwarders.push({
        name: item_name,
        timestamp: checked_int(item_timestamp, item_offset, "bound timestamp"),
      })
    }
    imports.push({
      name,
      timestamp: checked_int(timestamp_value, offset, "bound timestamp"),
      forwarders,
    })
    offset = forwarder_offset + forwarder_count * 8
  }
  imports
}