///|
fn to_c_str(s : String) -> Bytes {
  let buffer = @buffer.new()
  @encoding.encode_to(s, buffer, encoding=UTF8)
  buffer.write_byte(0)
  return buffer.contents()
}

///|
fn to_mbt_str(bs : Bytes) -> String {
  @encoding.decode_lossy(bs, encoding=UTF8)
}

///|
fn read_str(ptr : @c.Pointer[Byte], len~ : Int = 0) -> String {
  if ptr.is_null() {
    return ""
  }
  if len == 0 {
    let buffer = @buffer.new()
    for i = 0; ptr[i] != 0; i = i + 1 {
      buffer.write_byte(ptr[i])
    }
    buffer.contents() |> to_mbt_str()
  } else {
    read_bytes(ptr, len) |> to_mbt_str()
  }
}

///|
fn read_bytes(ptr : @c.Pointer[Byte], len : Int) -> Bytes {
  let buffer = @buffer.new()
  for i = 0; i < len; i = i + 1 {
    buffer.write_byte(ptr[i])
  }
  buffer.contents()
}