Fixed macOS compilation and refactored mods/ir to use std.Io.Reader.

Signed-off-by: Lorenzo Torres <lorenzotorres@outlook.it>
This commit is contained in:
Ernesto Lanchares 2025-08-29 21:20:10 +00:00 committed by Lorenzo Torres
parent c12e5ef485
commit 939cdb5f09
4 changed files with 189 additions and 216 deletions

View file

@ -30,10 +30,10 @@ var loadedMods: std.ArrayListUnmanaged(ModInfo) = .{};
fn openOrCreateDir(fs: std.fs.Dir, path: []const u8) !std.fs.Dir {
var dir: std.fs.Dir = undefined;
dir = fs.openDir(path, .{.iterate = true}) catch |err| {
dir = fs.openDir(path, .{ .iterate = true }) catch |err| {
if (err == std.fs.Dir.OpenError.FileNotFound) {
try fs.makeDir(path);
dir = try fs.openDir(path, .{.iterate = true});
dir = try fs.openDir(path, .{ .iterate = true });
return dir;
} else {
return err;
@ -44,7 +44,7 @@ fn openOrCreateDir(fs: std.fs.Dir, path: []const u8) !std.fs.Dir {
fn untarToDirAndGetFile(fs: std.fs.Dir, name: []const u8, unpack: []const u8) !std.fs.File {
var buffer: [1024]u8 = undefined;
var modDir = try openOrCreateDir(fs,unpack);
var modDir = try openOrCreateDir(fs, unpack);
defer modDir.close();
var tarFile = try fs.openFile(try std.fmt.bufPrint(&buffer, "{s}.tar", .{name}), .{});
defer tarFile.close();
@ -56,7 +56,7 @@ fn untarToDirAndGetFile(fs: std.fs.Dir, name: []const u8, unpack: []const u8) !s
}
fn loadMod(entry: std.fs.Dir.Entry) !void {
const modName = entry.name.ptr[0..entry.name.len - 4];
const modName = entry.name.ptr[0 .. entry.name.len - 4];
const fullDir = std.fmt.allocPrint(allocator, "assets/mods/{s}", .{modName}) catch @panic("Failed to allocate for fullDir");
defer allocator.free(fullDir);
const modDir = try std.fmt.allocPrint(allocator, "{s}_siderosmod__", .{fullDir});
@ -64,18 +64,19 @@ fn loadMod(entry: std.fs.Dir.Entry) !void {
global_runtime.* = mods.GlobalRuntime.init(allocator);
std.fs.cwd().deleteTree(modDir) catch |err| {
std.debug.panic("Failed to delete {s} (reason: {any})", .{modDir, err});
std.debug.panic("Failed to delete {s} (reason: {any})", .{ modDir, err });
};
var file = untarToDirAndGetFile(std.fs.cwd(), fullDir, modDir) catch |err| {
return err;
};
defer std.fs.cwd().deleteTree(modDir) catch |err| {
std.debug.panic("Failed to delete {s} (reason: {any})", .{modDir, err});
std.debug.panic("Failed to delete {s} (reason: {any})", .{ modDir, err });
};
defer file.close();
// TODO(luccie): Make this be able to construct a buffer for the whole file
const buffer = try allocator.alloc(u8, 1_000_000);
var parser = mods.Parser.init(allocator, file.reader(buffer)) catch @panic("Failed to init parser");
var reader = file.reader(buffer);
var parser = mods.Parser.init(allocator, &reader.interface) catch @panic("Failed to init parser");
defer parser.deinit();
parser.parseModule() catch |err| {
// TODO(luccie): Find a better option for the expression `parser.reader.buffer[parser.reader.seek]`
@ -101,30 +102,30 @@ fn loadMod(entry: std.fs.Dir.Entry) !void {
var parameters = [_]mods.VM.Value{.{ .i32 = @intCast(modIdx) }};
runtime.externalCall(allocator, .init, &parameters) catch @panic("Failed to call to init");
const result = runtime.stack.pop().?.i64;
if (result != 0){
std.debug.print("[ERROR]: Mod {s} init returned {d}\n", .{modName, result});
if (result != 0) {
std.debug.print("[ERROR]: Mod {s} init returned {d}\n", .{ modName, result });
return error.Failure;
}
loadedMods.append(allocator, .{.name = try allocator.dupe(u8, modName), .runtime = runtime, .modIdx = modIdx}) catch @panic("Failed to append to loadedMods");
loadedMods.append(allocator, .{ .name = try allocator.dupe(u8, modName), .runtime = runtime, .modIdx = modIdx }) catch @panic("Failed to append to loadedMods");
}
fn init_mods() void {
var modsDir = std.fs.cwd().openDir("./assets/mods", .{.iterate = true}) catch @panic("Failed to open assets/mods");
var modsDir = std.fs.cwd().openDir("./assets/mods", .{ .iterate = true }) catch @panic("Failed to open assets/mods");
defer modsDir.close();
var modsDirIter = modsDir.iterate();
while (modsDirIter.next() catch @panic("Failed to get next iteration of mods directory")) |entry| {
if (std.mem.indexOf(u8, entry.name, "siderosmod") != null){
if (std.mem.indexOf(u8, entry.name, "siderosmod") != null) {
std.fs.cwd().deleteTree(entry.name) catch |err| {
std.debug.panic("Failed to delete {s} (reason: {any})", .{entry.name, err});
std.debug.panic("Failed to delete {s} (reason: {any})", .{ entry.name, err });
};
continue;
}
if (entry.kind != std.fs.File.Kind.file){
if (entry.kind != std.fs.File.Kind.file) {
std.debug.panic("TODO: Search recursively for mods\n", .{});
}
const extension = entry.name.ptr[entry.name.len - 4..entry.name.len];
if (!std.mem.eql(u8, extension, ".tar")){
const extension = entry.name.ptr[entry.name.len - 4 .. entry.name.len];
if (!std.mem.eql(u8, extension, ".tar")) {
std.debug.print("[WARNING]: Found non tar extension in mods directory\n", .{});
continue;
}
@ -162,7 +163,7 @@ export fn sideros_init(init: api.GameInit) callconv(.c) void {
renderer.terrain_pipeline.setMaps(renderer.device, resources.terrain.texture) catch @panic("TODO: handle this");
pool.addSystemGroup(&[_]ecs.System{systems.render, systems.moveCamera}, true) catch @panic("TODO: Gracefuly handle error");
pool.addSystemGroup(&[_]ecs.System{ systems.render, systems.moveCamera }, true) catch @panic("TODO: Gracefuly handle error");
pool.resources.renderer = &renderer;
pool.tick();
init_mods();
@ -178,8 +179,8 @@ export fn sideros_cleanup() callconv(.c) void {
var runtime = info.runtime;
runtime.externalCall(allocator, .deinit, &.{}) catch @panic("Failed to call deinit");
const result = runtime.stack.pop().?.i64;
if (result != 0){
std.debug.panic("[ERROR]: Mod {s} deinit returned {d}\n", .{info.name, result});
if (result != 0) {
std.debug.panic("[ERROR]: Mod {s} deinit returned {d}\n", .{ info.name, result });
}
defer runtime.deinit(allocator);
defer allocator.free(info.name);