packages feed

language-ats-1.7.10.0: test/data/crc32.out

staload UN = "prelude/SATS/unsafe.sats"

fn byteview_read_as_uint8
{l0:addr}{m:nat}{ l1 : addr | l1 <= l0+m }(pf : !bytes_v(l0, m)
| p : ptr(l1)) : uint8 =
  $UN.ptr0_get<uint8>(p)

extern
castfn uint2uint8(uint32) : uint8

extern
castfn uint2uint32(uint) : uint32

// from here: https://docs.microsoft.com/en-us/openspecs/office_protocols/ms-abs/06966aa2-70da-4bf9-8448-3355f277cd77?redirectedfrom=MSDN
fn crc32 {l:addr}{m:nat}(pf : !bytes_v(l, m)
                        | p : ptr(l), l : size_t(m)) : uint32 =
  let
    var crc32_start: uint32 = uint2uint32(0xFFFFFFFFu)
    var i: size_t
    val () = for* { i : nat | i <= m } .<m-i>. (i : size_t(i)) =>
        (i := i2sz(0) ; i < l ; i := i + 1)
        let
          var current_byte = $UN.ptr0_get<uint8>(add_ptr_bsz(p, i))
          var crc_trunc = uint2uint8(crc32_start)
          var ix = g0uint_lxor_uint8(crc_trunc, current_byte)
          var crc_shift = crc32_start >> 8
        in end
  in
    g0uint_lxor_uint32(crc32_start, uint2uint32(0xFFFFFFFFu))
  end