diff options
Diffstat (limited to 'vendor/libghostty-vt/src/terminal/c/allocator.zig')
| -rw-r--r-- | vendor/libghostty-vt/src/terminal/c/allocator.zig | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/src/terminal/c/allocator.zig b/vendor/libghostty-vt/src/terminal/c/allocator.zig new file mode 100644 index 00000000..ca698f3c --- /dev/null +++ b/vendor/libghostty-vt/src/terminal/c/allocator.zig @@ -0,0 +1,67 @@ +const std = @import("std"); +const testing = std.testing; +const lib = @import("../lib.zig"); +const CAllocator = lib.alloc.Allocator; + +/// Allocate a buffer of `len` bytes using the given allocator +/// (or the default allocator if NULL). +/// +/// Returns a pointer to the allocated buffer, or NULL if the +/// allocation failed. +pub fn alloc( + alloc_: ?*const CAllocator, + len: usize, +) callconv(lib.calling_conv) ?[*]u8 { + const allocator = lib.alloc.default(alloc_); + const buf = allocator.alloc(u8, len) catch return null; + return buf.ptr; +} + +/// Free memory that was allocated by a libghostty-vt function. +/// +/// This must be used to free buffers returned by functions like +/// `format_alloc`. Pass the same allocator (or NULL for the default) +/// that was used for the allocation. +pub fn free( + alloc_: ?*const CAllocator, + ptr: ?[*]u8, + len: usize, +) callconv(lib.calling_conv) void { + const mem = ptr orelse return; + const allocator = lib.alloc.default(alloc_); + allocator.free(mem[0..len]); +} + +test "alloc returns non-null" { + const ptr = alloc(&lib.alloc.test_allocator, 16); + try testing.expect(ptr != null); + free(&lib.alloc.test_allocator, ptr, 16); +} + +test "alloc with null allocator" { + const ptr = alloc(null, 8); + try testing.expect(ptr != null); + free(null, ptr, 8); +} + +test "alloc zero length" { + const ptr = alloc(&lib.alloc.test_allocator, 0); + defer free(&lib.alloc.test_allocator, ptr, 0); +} + +test "free null pointer" { + free(&lib.alloc.test_allocator, null, 0); +} + +test "free allocated memory" { + const allocator = lib.alloc.default(&lib.alloc.test_allocator); + const mem = try allocator.alloc(u8, 16); + free(&lib.alloc.test_allocator, mem.ptr, mem.len); +} + +test "free with null allocator" { + // null allocator falls back to the default (test allocator in tests) + const allocator = lib.alloc.default(null); + const mem = try allocator.alloc(u8, 8); + free(null, mem.ptr, mem.len); +} |
