///|
/// RFC 5531 record markers; fragment size need not be XDR-word aligned.
/// The returned framed buffer, including headers, must fit max_bytes.
pub fn fragment_record(
  record : Array[Byte],
  fragment_size : Int,
  limits? : Limits = Limits::default(),
) -> Array[Byte] raise XdrError {
  limits.validate()
  if fragment_size < 1 || fragment_size > limits.max_bytes {
    raise Invalid(0, "invalid fragment size")
  }
  if record.length() > limits.max_bytes {
    raise Invalid(0, "record byte limit")
  }
  let count = if record.is_empty() {
    1
  } else {
    (record.length() - 1) / fragment_size + 1
  }
  if count > limits.max_items ||
    count > (limits.max_bytes - record.length()) / 4 {
    raise Invalid(0, "framed record budget")
  }
  let w = Writer::new(limits~)
  let mut offset = 0
  for i = 0; i < count; i = i + 1 {
    let size = if fragment_size < record.length() - offset {
      fragment_size
    } else {
      record.length() - offset
    }
    let last = i == count - 1
    let marker = size.reinterpret_as_uint() |
      (if last { 0x80000000U } else { 0U })
    w.write_uint(marker)
    w.write_raw(Array::makei(size, j => record[offset + j]))
    offset += size
  }
  w.bytes()
}