feat: loading stories from source files
This commit is contained in:
parent
01cc996183
commit
d9f0a04417
4 changed files with 68 additions and 55 deletions
|
|
@ -6,6 +6,7 @@ const AstGen = @import("AstGen.zig");
|
|||
const Module = @import("compile.zig").Module;
|
||||
pub const Object = @import("Story/Object.zig");
|
||||
const Dumper = @import("Story/Dumper.zig");
|
||||
const ink = @import("root.zig");
|
||||
const assert = std.debug.assert;
|
||||
const Story = @This();
|
||||
|
||||
|
|
@ -845,20 +846,20 @@ pub fn selectChoiceIndex(story: *Story, index: usize) !void {
|
|||
_ = story.arena.reset(.retain_capacity);
|
||||
}
|
||||
|
||||
pub const LoadOptions = struct {
|
||||
dump_writer: ?*std.Io.Writer = null,
|
||||
error_writer: *std.Io.Writer,
|
||||
use_color: bool = true,
|
||||
dump_ast: bool = false,
|
||||
dump_ir: bool = false,
|
||||
dump_trace: bool = false,
|
||||
};
|
||||
|
||||
pub fn dump(story: *Story, writer: *std.Io.Writer) !void {
|
||||
return Dumper.dump(story, writer);
|
||||
}
|
||||
|
||||
pub fn loadFromString(
|
||||
pub const LoadOptions = struct {
|
||||
filename: []const u8,
|
||||
error_writer: *std.Io.Writer,
|
||||
dump_writer: ?*std.Io.Writer = null,
|
||||
dump_use_color: bool = true,
|
||||
dump_ast: bool = false,
|
||||
dump_ir: bool = false,
|
||||
};
|
||||
|
||||
pub fn fromSourceBytes(
|
||||
gpa: std.mem.Allocator,
|
||||
source_bytes: [:0]const u8,
|
||||
options: LoadOptions,
|
||||
|
|
@ -870,9 +871,9 @@ pub fn loadFromString(
|
|||
|
||||
var comp = try Module.compile(gpa, arena, .{
|
||||
.source_bytes = source_bytes,
|
||||
.filename = "<STDIN>",
|
||||
.filename = options.filename,
|
||||
.dump_writer = options.dump_writer,
|
||||
.dump_use_color = options.use_color,
|
||||
.dump_use_color = options.dump_use_color,
|
||||
.dump_ast = options.dump_ast,
|
||||
.dump_ir = options.dump_ir,
|
||||
});
|
||||
|
|
@ -897,7 +898,7 @@ pub fn loadFromString(
|
|||
.gpa = gpa,
|
||||
.arena = .init(gpa),
|
||||
.can_advance = false,
|
||||
.dump_writer = if (options.dump_trace) options.dump_writer else null,
|
||||
.dump_writer = null,
|
||||
.stack = eval_stack_ptr,
|
||||
.call_stack = call_stack_ptr,
|
||||
};
|
||||
|
|
@ -909,3 +910,36 @@ pub fn loadFromString(
|
|||
}
|
||||
return story;
|
||||
}
|
||||
|
||||
var read_buffer: [4096]u8 align(std.heap.page_size_min) = undefined;
|
||||
|
||||
pub const LoadFileOptions = struct {
|
||||
error_writer: *std.Io.Writer,
|
||||
};
|
||||
|
||||
pub fn readSourceFile(
|
||||
gpa: std.mem.Allocator,
|
||||
filename: []const u8,
|
||||
options: LoadFileOptions,
|
||||
) !Story {
|
||||
// FIXME: Temporary until 0.16.x
|
||||
var arena_allocator = std.heap.ArenaAllocator.init(gpa);
|
||||
defer arena_allocator.deinit();
|
||||
|
||||
const arena = arena_allocator.allocator();
|
||||
const source_bytes: [:0]const u8 = s: {
|
||||
var f = try std.fs.cwd().openFile(filename, .{});
|
||||
defer f.close();
|
||||
|
||||
var file_reader: std.fs.File.Reader = f.reader(&read_buffer);
|
||||
break :s try ink.readSourceFileToEndAlloc(arena, &file_reader);
|
||||
};
|
||||
return Story.fromSourceBytes(gpa, source_bytes, .{
|
||||
.filename = filename,
|
||||
.error_writer = options.error_writer,
|
||||
.dump_writer = null,
|
||||
.dump_use_color = false,
|
||||
.dump_ast = false,
|
||||
.dump_ir = false,
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue