aboutsummaryrefslogtreecommitdiff
path: root/src/lib/resources.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/resources.zig')
-rw-r--r--src/lib/resources.zig41
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);
+ }
}