diff options
Diffstat (limited to 'synth.zig')
| -rw-r--r-- | synth.zig | 82 |
1 files changed, 76 insertions, 6 deletions
diff --git a/synth.zig b/synth.zig index 2914b6c..453cb46 100644 --- a/synth.zig +++ b/synth.zig @@ -16,12 +16,23 @@ // You should have received a copy of the GNU Affero General Public License // along with taosc. If not, see <https://www.gnu.org/licenses/>. +const Allocator = std.mem.Allocator; +const ArenaAllocator = std.heap.ArenaAllocator; +const Dir = std.fs.Dir; +const File = std.fs.File; +const Reader = std.Io.Reader; +const argsAlloc = std.process.argsAlloc; +const argsFree = std.process.argsFree; const assert = std.debug.assert; +const cwd = std.fs.cwd; +const exit = std.process.exit; +const page_allocator = std.heap.page_allocator; +const parseUnsigned = std.fmt.parseUnsigned; +const print = std.debug.print; const std = @import("std"); const State = extern struct { flags: u16, - stack_size: u32, r15: i64, r14: i64, r13: i64, @@ -37,13 +48,72 @@ const State = extern struct { rdx: i64, rcx: i64, rax: i64, - rsp: i64, + rsp: u64, // internal use only rip: i64, }; +fn countFiles(dir: Dir) Dir.Iterator.Error!usize { + var count: usize = 0; + var entries = dir.iterate(); + while (try entries.next()) |entry| { + assert(entry.kind == .file); + count += 1; + } + return count; +} + +const ReadError = Dir.Iterator.Error || File.OpenError || Reader.Error; + +const Data = struct { + states: []const State, + memory: []const u8, + + fn init(allocator: Allocator, dir: Dir, + stack_len: u64) (Allocator.Error || ReadError)!Data { + const count = try countFiles(dir); + const states = try allocator.alloc(State, count); + const memory = try allocator.alloc(u8, stack_len * count); + var entries = dir.iterate(); + var sp: u64 = 0; + for (states) |*state| { + const entry = try entries.next(); + const file = try dir.openFile(entry.?.name, .{}); + defer file.close(); + var buffer: [4096]u8 = undefined; + var reader = file.reader(&buffer); + assert(try reader.read(@ptrCast(state)) == @sizeOf(State)); + state.rsp = sp; + assert(try reader.read(memory[sp..][0..stack_len]) == stack_len); + sp += stack_len; + print("{}\n", .{ state }); + } + return .{ .states = states, .memory = memory }; + } + + fn deinit(data: Data, allocator: Allocator) void { + allocator.free(data.states); + allocator.free(data.memory); + } +}; + pub fn main() !void { - var reader = std.fs.File.stdin().reader(&.{}); - var state: State = undefined; - assert(try reader.read(@ptrCast(&state)) == @sizeOf(State)); - std.debug.print("{}\n", .{ state }); + var arena = ArenaAllocator.init(page_allocator); + defer arena.deinit(); + const allocator = arena.allocator(); + const args = try argsAlloc(allocator); + defer argsFree(allocator, args); + if (args.len != 4) { + print("Usage: taosc-synth OFF-DIR ON-DIR STACK-SIZE", .{}); + exit(1); + } + var off_dir = try cwd().openDir(args[1], .{ .iterate = true }); + defer off_dir.close(); + var on_dir = try cwd().openDir(args[2], .{ .iterate = true }); + defer on_dir.close(); + const stack_len = try parseUnsigned(u64, args[3], 0); + + const off_data = try Data.init(allocator, off_dir, stack_len); + defer off_data.deinit(allocator); + const on_data = try Data.init(allocator, on_dir, stack_len); + defer on_data.deinit(allocator); } |
