aboutsummaryrefslogtreecommitdiff
path: root/synth.zig
diff options
context:
space:
mode:
authorNguyễn Gia Phong <cnx@loang.net>2025-10-16 18:27:38 +0900
committerNguyễn Gia Phong <cnx@loang.net>2025-10-16 18:27:38 +0900
commitd8090bb73f404a9abff5b7cc9cfdd8cdb1ee4d5f (patch)
treef61d4bf27654b153329dc75459bbcd8022fff577 /synth.zig
parent6090724f0b2d7a577c2662cddb639e036e275e4f (diff)
downloadtaosc-d8090bb73f404a9abff5b7cc9cfdd8cdb1ee4d5f.tar.gz
Read values from files
Diffstat (limited to 'synth.zig')
-rw-r--r--synth.zig82
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);
}