#ifndef VF_MEM_H
#define VF_MEM_H
//@ predicate vf_kmalloc_block(void *array, int size);
void vf_kfree(void *ptr);
/*@ requires
vf_kmalloc_block(ptr, ?size)
&*& chars(ptr, ?cs)
&*& length(cs) == size;
@*/
//@ ensures true;
void *vf_kmalloc(int size);
//@ requires size >= 0;
/*@ ensures
result == 0 ?
true
:
vf_kmalloc_block(result, size)
&*& chars(result, ?chars)
&*& length(chars) == size
;
@*/
/*@
fixpoint bool equals<t>(unit u, t x, t y){
switch(u){
case unit: return x == y;
}
}
@*/
void *vf_kzalloc(int size);
//@ requires size >= 0;
/*@ ensures
result == 0 ?
true
:
vf_kmalloc_block(result, size)
&*& chars(result, ?chars)
&*& length(chars) == size
&*& forall(chars, (equals)(unit, '\0')) == true
;
@*/
void vf_memcpy(void *dest, void *src, int count);
/*@ requires count > 0
&*& [?frac]chars(src, ?srcList)
&*& chars(dest, ?destList)
&*& length(srcList) >= count
&*& length(destList) >= count;
@*/
/*@ ensures
[frac]chars(src, srcList)
&*& chars(
dest,
append(take(count, srcList),
drop(count, destList))
);
@*/
#endif