summaryrefslogtreecommitdiff
path: root/src/gloves.zig
blob: b99df55a5e1495132afc84dafcc5dda41db2fc67 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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()});
}