this repo has no description
13
fork

Configure Feed

Select the types of activity you want to include in your feed.

widgets(terminal): use buffered reader in parser

Use a buffered reader so we can inspect the read state. We need this to
know if we have a finished read on a printable byte

+15 -8
+13 -5
src/widgets/terminal/Parser.zig
··· 4 4 const std = @import("std"); 5 5 const Reader = std.io.AnyReader; 6 6 const ansi = @import("ansi.zig"); 7 + const BufferedReader = std.io.BufferedReader(4096, std.io.AnyReader); 7 8 8 9 /// A terminal event 9 10 const Event = union(enum) { ··· 21 22 /// a leftover byte from a ground event 22 23 pending_byte: ?u8 = null, 23 24 24 - pub fn parseReader(self: *Parser, reader: Reader) !Event { 25 + pub fn parseReader(self: *Parser, buffered: *BufferedReader) !Event { 26 + const reader = buffered.reader().any(); 25 27 self.buf.clearRetainingCapacity(); 26 28 while (true) { 27 29 const b = if (self.pending_byte) |p| p else try reader.readByte(); ··· 56 58 => return .{ .c0 = @enumFromInt(b) }, 57 59 else => { 58 60 try self.buf.append(b); 59 - return self.parseGround(reader); 61 + return self.parseGround(buffered); 60 62 }, 61 63 } 62 64 } 63 65 } 64 66 65 - inline fn parseGround(self: *Parser, reader: Reader) !Event { 67 + inline fn parseGround(self: *Parser, reader: *BufferedReader) !Event { 68 + var buf: [1]u8 = undefined; 66 69 while (true) { 67 - const b = try reader.readByte(); 70 + if (reader.start == reader.end) return .{ .print = self.buf.items }; 71 + const n = try reader.read(&buf); 72 + if (n == 0) return error.EOF; 73 + const b = buf[0]; 68 74 switch (b) { 69 75 0x00...0x1f => { 70 76 self.pending_byte = b; 71 77 return .{ .print = self.buf.items }; 72 78 }, 73 - else => try self.buf.append(b), 79 + else => { 80 + try self.buf.append(b); 81 + }, 74 82 } 75 83 } 76 84 }
+2 -3
src/widgets/terminal/Terminal.zig
··· 251 251 defer parser.buf.deinit(); 252 252 253 253 // Use our anyReader to make a buffered reader, then get *that* any reader 254 - var buffered = std.io.bufferedReader(self.anyReader()); 255 - const reader = buffered.reader().any(); 254 + var reader = std.io.bufferedReader(self.anyReader()); 256 255 257 256 while (!self.should_quit) { 258 - const event = try parser.parseReader(reader); 257 + const event = try parser.parseReader(&reader); 259 258 self.back_mutex.lock(); 260 259 defer self.back_mutex.unlock(); 261 260