79 lines
1.8 KiB
Plaintext
79 lines
1.8 KiB
Plaintext
#extern(vm) fn vm_alloc(sz: usize): *any;
|
|
#extern(vm) fn vm_free(p: *any);
|
|
#extern(vm) fn vm_realloc(p: *any, sz: usize): *any;
|
|
#extern(vm) fn vm_memcpy(dst: *any, src: *any, n: usize): *any;
|
|
#extern(vm) fn vm_memcmp(a: *any, b: *any, n: usize): isize;
|
|
|
|
fn alloc(sz: usize): *any {
|
|
if sz == 0 { ret null; }
|
|
ret vm_alloc(sz);
|
|
}
|
|
|
|
fn free(p: *any) {
|
|
if p == null { ret; }
|
|
vm_free(p);
|
|
}
|
|
|
|
fn realloc(p: *any, sz: usize): *any {
|
|
if p == null { ret alloc(sz); }
|
|
if sz == 0 { free(p); ret null; }
|
|
ret vm_realloc(p, sz);
|
|
}
|
|
|
|
fn copy(dst: *any, src: *any, n: usize): *any {
|
|
if n == 0 { ret dst; }
|
|
ret vm_memcpy(dst, src, n);
|
|
}
|
|
|
|
fn cmp(a: *any, b: *any, n: usize): isize {
|
|
if n == 0 { ret 0; }
|
|
ret vm_memcmp(a, b, n);
|
|
}
|
|
|
|
fn set(dst: *any, byte: u8, n: usize): *any {
|
|
var d = dst as *u8;
|
|
var i: usize = 0;
|
|
while i < n {
|
|
d[i] = byte;
|
|
i = i + 1;
|
|
}
|
|
ret dst;
|
|
}
|
|
|
|
fn zero(dst: *any, n: usize): *any {
|
|
ret set(dst, 0 as u8, n);
|
|
}
|
|
|
|
fn main(): void {
|
|
var p = alloc(16);
|
|
@assert(p != null, "alloc");
|
|
var q = alloc(16);
|
|
@assert(p != q, "distinct");
|
|
@assert(alloc(0) == null, "alloc(0)");
|
|
|
|
var a: u8 = 42;
|
|
var b: u8 = 0;
|
|
copy(&b as *any, &a as *any, 1);
|
|
@assert(b == 42, "copy");
|
|
|
|
var x: u8 = 1;
|
|
var y: u8 = 2;
|
|
@assert(cmp(&x as *any, &y as *any, 1) < 0, "cmp lt");
|
|
@assert(cmp(&y as *any, &x as *any, 1) > 0, "cmp gt");
|
|
@assert(cmp(&x as *any, &x as *any, 1) == 0, "cmp eq");
|
|
|
|
var buf = alloc(8);
|
|
zero(buf, 8);
|
|
var bp = buf as *u8;
|
|
@assert(bp[0] == 0, "zero");
|
|
@assert(bp[7] == 0, "zero end");
|
|
set(buf, 0xAB as u8, 8);
|
|
@assert(bp[0] == 0xAB as u8, "set");
|
|
|
|
var r = realloc(p, 32);
|
|
@assert(r != null, "realloc");
|
|
free(r);
|
|
free(q);
|
|
free(buf);
|
|
free(null);
|
|
} |