aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/libghostty-vt/src/lib/compat/reader.zig
blob: 2881344088a218047907b739aed894d0c11ee823 (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
//! Code taken from older reader implementations, still may be useful to keep
//! around in general. See README.md for license and details.
const std = @import("std");

/// Pulled from old stdlib as this function has been removed.
pub fn readSkipUntilDelimiterOrEof(reader: *std.Io.Reader, delimiter: u8) std.Io.Reader.Error!void {
    while (true) {
        const byte = readByte(reader) catch |err| switch (err) {
            error.EndOfStream => return,
            else => |e| return e,
        };
        if (byte == delimiter) return;
    }
}

/// Pulled from old stdlib as this function has been removed.
pub fn readStructEndian(
    reader: *std.Io.Reader,
    comptime T: type,
    endian: std.builtin.Endian,
) std.Io.Reader.Error!T {
    var result: [1]T = undefined;
    try reader.readSliceEndian(T, &result, endian);
    return result[0];
}

/// Pulled from old stdlib as this function has been removed.
pub fn readerInt(reader: *std.Io.Reader, comptime T: type, endian: std.builtin.Endian) std.Io.Reader.Error!T {
    const bytes = try readBytesNoEof(reader, @divExact(@typeInfo(T).int.bits, 8));
    return std.mem.readInt(T, &bytes, endian);
}

/// Pulled from old stdlib as this function has been removed.
pub fn readByteSigned(reader: *std.Io.Reader) std.Io.Reader.Error!i8 {
    return @as(i8, @bitCast(try readByte(reader)));
}

/// Pulled from old stdlib as this function has been removed.
pub fn readByte(reader: *std.Io.Reader) std.Io.Reader.Error!u8 {
    var result: [1]u8 = undefined;
    try reader.readSliceAll(&result);
    return result[0];
}

/// Pulled from old stdlib as this function has been removed.
pub fn readSkipBytes(reader: *std.Io.Reader, num_bytes: u64) std.Io.Reader.Error!void {
    const buf_size = 512;

    var buf: [buf_size]u8 = undefined;
    var remaining = num_bytes;

    while (remaining > 0) {
        const amt = @min(remaining, buf_size);
        try reader.readSliceAll(buf[0..amt]);
        remaining -= amt;
    }
}

/// Pulled from old stdlib as this function has been removed.
fn readBytesNoEof(reader: *std.Io.Reader, comptime num_bytes: usize) std.Io.Reader.Error![num_bytes]u8 {
    var bytes: [num_bytes]u8 = undefined;
    try reader.readSliceAll(&bytes);
    return bytes;
}