diff options
Diffstat (limited to 'src/lib/resources.zig')
-rw-r--r-- | src/lib/resources.zig | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/src/lib/resources.zig b/src/lib/resources.zig index 25835d5..93e9f04 100644 --- a/src/lib/resources.zig +++ b/src/lib/resources.zig @@ -278,7 +278,6 @@ fn addFile(path: []const u8, file: File) !void { .tag = .file, .data = .{ .file = .{ - .openFn = open, .readFn = read, .writeFn = null, .closeFn = close, @@ -303,30 +302,36 @@ fn addDir(path: []const u8) !void { }); } -fn open(initializer: ?*anyopaque, _: u16) callconv(.C) Result(*anyopaque) { - const file_template: *File = @alignCast(@ptrCast(initializer orelse { - return Result(*anyopaque).fromAnyTypeOrError(Error.NoTarFileInitializer); - })); - +fn open(context: *vfs.FileContext) !void { const allocator = vfs.treeRoot().allocator; - const context = allocator.create(File) catch |err| { - return Result(*anyopaque).fromAnyTypeOrError(err); - }; - context.* = file_template.*; - return Result(*anyopaque).fromAnyTypeOrError(context); + const inner = context.inner orelse return Error.NoTarFileInitializer; + const old_context: *File = @alignCast(@ptrCast(inner)); + + const new_context = try allocator.create(File); + new_context.* = old_context.*; + + context.inner = new_context; } -fn read(context: *anyopaque, ptr: [*]u8, len: usize) callconv(.C) Result(usize) { - const ctx: *File = @alignCast(@ptrCast(context)); +fn read(context: *vfs.FileContext, ptr: [*]u8, len: usize) callconv(.C) Result(usize) { + if (context.inner == null) { + open(context) catch |err| { + return Result(usize).fromAnyTypeOrError(err); + }; + } + + const inner: *File = @alignCast(@ptrCast(context.inner.?)); const buffer = ptr[0..len]; - return Result(usize).fromAnyTypeOrError(ctx.read(buffer)); + return Result(usize).fromAnyTypeOrError(inner.read(buffer)); } -fn close(context: *anyopaque) callconv(.C) void { - const ctx: *File = @alignCast(@ptrCast(context)); +fn close(context: *vfs.FileContext) callconv(.C) void { + if (context.inner) |inner_opaque| { + const allocator = vfs.treeRoot().allocator; - const allocator = vfs.treeRoot().allocator; - allocator.destroy(ctx); + const inner: *File = @alignCast(@ptrCast(inner_opaque)); + allocator.destroy(inner); + } } |