authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-07-10 19:58:18 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-07-10 19:58:18 -07:00
log6299ba686339c2c7c8d83a4648bcd9f0eec3ff77
treea50d0330d2e45ffe319740c981fa3f56738361a3
parentde76815ebec2deead72f0ded8d24b0bb9586c2d8
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

add SkipReader


2 files changed, 76 insertions(+), 0 deletions(-)

nio.zig+2
......@@ -446,6 +446,8 @@ pub const LimitedReader = @import("./limited_reader.zig").LimitedReader;
446446
447447pub const HashWriter = @import("./hash_writer.zig").HashWriter;
448448
449pub const SkipReader = @import("./skip_reader.zig").SkipReader;
450
449451pub const crypto_random: std.Random = .{
450452 .ptr = undefined,
451453 .fillFn = getrandomFill,
skip_reader.zig created+74
......@@ -0,0 +1,74 @@
1const std = @import("std");
2const builtin = @import("builtin");
3const extras = @import("extras");
4const nio = @import("./nio.zig");
5
6pub fn SkipReader(comptime ReaderType: type) type {
7 return struct {
8 source_reader: ReaderType,
9 needles: []const u8,
10
11 const Self = @This();
12
13 pub fn init(source_reader: ReaderType, needles: []const u8) Self {
14 return .{
15 .source_reader = source_reader,
16 .needles = needles,
17 };
18 }
19
20 pub fn from(source_reader: anytype, needles: []const u8) SkipReader(@TypeOf(source_reader)) {
21 return .init(source_reader, needles);
22 }
23
24 const R = nio.Readable(@This(), ._var);
25 pub const readAll = R.readAll;
26 pub const readAtLeast = R.readAtLeast;
27 pub const readNoEof = R.readNoEof;
28 pub const readAllAlloc = R.readAllAlloc;
29 pub const readArray = R.readArray;
30 pub const readByte = R.readByte;
31 pub const readUntilDelimiterArrayList = R.readUntilDelimiterArrayList;
32 pub const readUntilDelimiterAlloc = R.readUntilDelimiterAlloc;
33 pub const readUntilDelimiterOrEofAlloc = R.readUntilDelimiterOrEofAlloc;
34 pub const readUntilDelimitersBuf = R.readUntilDelimitersBuf;
35 pub const readUntilDelimitersArrayList = R.readUntilDelimitersArrayList;
36 pub const readAlloc = R.readAlloc;
37 pub const readInt = R.readInt;
38 pub const readUntilDelimitersAlloc = R.readUntilDelimitersAlloc;
39 pub const readUntilDelimiter = R.readUntilDelimiter;
40 pub const readUntilDelimiterOrEof = R.readUntilDelimiterOrEof;
41 pub const readExpected = R.readExpected;
42 pub const readType = R.readType;
43 pub const skipBytes = R.skipBytes;
44 pub const skipUntilDelimiterOrEof = R.skipUntilDelimiterOrEof;
45 pub const pipeTo = R.pipeTo;
46
47 pub const ReadError = extras.Pointee(ReaderType).ReadError;
48 pub fn read(self: *Self, dest: []u8) ReadError!usize {
49 var i: usize = 0;
50 while (i < dest.len) {
51 dest[i] = self.source_reader.readByte() catch |err| switch (err) {
52 error.EndOfStream => break,
53 else => |e| return e,
54 };
55 if (std.mem.findScalar(u8, self.needles, dest[i]) != null) continue;
56 i += 1;
57 }
58 return i;
59 }
60
61 pub fn anyReadable(self: *Self) nio.AnyReadable {
62 const S = struct {
63 fn read(s: *allowzero anyopaque, buffer: []u8) anyerror!usize {
64 const br: *Self = @ptrCast(@alignCast(s));
65 return br.read(buffer);
66 }
67 };
68 return .{
69 .vtable = &.{ .read = S.read },
70 .state = @ptrCast(self),
71 };
72 }
73 };
74}