summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gloves.zig67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/gloves.zig b/src/gloves.zig
new file mode 100644
index 0000000..b99df55
--- /dev/null
+++ b/src/gloves.zig
@@ -0,0 +1,67 @@
+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()});
+}