///|
fn pdf_bookmark_import_is_whitespace(value : Int) -> Bool {
  @core.pdf_is_whitespace_byte(value)
}

///|
fn pdf_bookmark_import_trim_line_end(line : BytesView) -> BytesView {
  let mut end = line.length()
  while end > 0 {
    let value = line[end - 1].to_int()
    if value == 10 || value == 13 {
      end -= 1
    } else {
      break
    }
  }
  line[:end]
}

///|
fn pdf_bookmark_import_skip_whitespace(
  line : BytesView,
  index : Ref[Int],
) -> Unit {
  while index.val < line.length() &&
        pdf_bookmark_import_is_whitespace(line[index.val].to_int()) {
    index.val += 1
  }
}

///|
fn pdf_bookmark_import_parse_int(line : BytesView, index : Ref[Int]) -> Int? {
  pdf_bookmark_import_skip_whitespace(line, index)
  let start = index.val
  let mut negative = false
  if index.val < line.length() {
    match line[index.val].to_int() {
      43 => index.val += 1
      45 => {
        negative = true
        index.val += 1
      }
      _ => ()
    }
  }
  let digits_start = index.val
  let mut value : Int64 = 0L
  let limit : Int64 = if negative { 2147483648L } else { 2147483647L }
  while index.val < line.length() {
    let digit = line[index.val].to_int()
    if digit < 48 || digit > 57 {
      break
    }
    value = value * 10L + (digit - 48).to_int64()
    if value > limit {
      index.val = start
      return None
    }
    index.val += 1
  }
  if index.val == digits_start {
    index.val = start
    None
  } else if negative {
    Some((0L - value).to_int())
  } else {
    Some(value.to_int())
  }
}