#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); }