const std = @import("std"); // https://github.com/ghostty-org/ghostty/blob/9fb03ba55c9e53901193187d5c43341f5b1b430d/src/pty.zig#L11 pub const winsize = extern struct { ws_row: u16 = 100, ws_col: u16 = 80, ws_xpixel: u16 = 800, ws_ypixel: u16 = 600, }; var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; const alloc = gpa.allocator(); const ArrayList = std.ArrayList; pub fn main() !void { var child = std.process.Child.init(&.{"./study-samples/split"}, alloc); child.stdin_behavior = .Pipe; child.stdout_behavior = .Pipe; child.stderr_behavior = .Pipe; var stdin_buf: [0x100]u8 = undefined; var stdin = std.fs.File.stdin().readerStreaming(&stdin_buf); var stdout: ArrayList(u8) = .empty; defer stdout.deinit(alloc); var stderr: ArrayList(u8) = .empty; defer stderr.deinit(alloc); try child.spawn(); var child_writer_buf: [0x100]u8 = undefined; var child_stdin_writer = child.stdin.?.writer(&child_writer_buf); while (true) { if (stdin.interface.streamDelimiter(&child_stdin_writer.interface, '\n')) |_| {} else |_| { break; } // if (n == 0) break; _ = try child_stdin_writer.interface.writeByte('\n'); if (child_stdin_writer.interface.flush()) |_| {} else |_| { break; } try child.collectOutput(alloc, &stdout, &stderr, 0x1000); std.debug.print("{s}\n {s}\n", .{ stdout.items, stderr.items }); } errdefer { _ = child.kill() catch {}; } const term = try child.wait(); switch (term) { .Signal => |s| { inline for (@typeInfo(std.os.linux.SIG).@"struct".decls) |f| { const field = @field(std.os.linux.SIG, f.name); const t = @TypeOf(field); if (t == comptime_int) { if (field == s) std.debug.print("Returned with Signal: {s} ({d})\n", .{ f.name, s }); } } }, else => std.debug.print("{any}\n", .{ .term = term }), } // std.debug.print("*** If you this message alone... Something probably went wrong\nIs this leaking? {any}\n", .{gpa.detectLeaks()}); }