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:
parent
c12e5ef485
commit
939cdb5f09
4 changed files with 189 additions and 216 deletions
|
|
@ -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, ¶meters) 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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue