authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2024-06-23 00:58:46 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2024-06-23 00:58:46 -07:00
log03849b83b473f8fbc9c3aac34aa3da5c2e6b9ea3
tree610cf6a7f919d4f76ff2450f24d92e7c661ce788
parent4158c34719217a07146114c12550dbec7d464fab

add eatUntil


1 files changed, 21 insertions(+), 0 deletions(-)

intrusive_parser.zig+21
...@@ -116,6 +116,23 @@ pub const Parser = struct {...@@ -116,6 +116,23 @@ pub const Parser = struct {
116 return amt;116 return amt;
117 }117 }
118118
119 pub fn eatUntil(p: *Parser, test_c: u8) !?struct { usize, usize } {
120 const start = p.idx;
121 var len: usize = 0;
122 while (true) {
123 try p.peekAmt(1) orelse return null;
124 const amt = std.mem.indexOfScalar(u8, p.slice(), test_c) orelse {
125 const left = p.avail();
126 len += left;
127 p.idx += left;
128 continue;
129 };
130 len += amt;
131 p.idx += amt;
132 return .{ start, len };
133 }
134 }
135
119 // tag(u8) + len(u32) + bytes(N)136 // tag(u8) + len(u32) + bytes(N)
120 pub fn addStr(p: *Parser, alloc: std.mem.Allocator, str: string) !usize {137 pub fn addStr(p: *Parser, alloc: std.mem.Allocator, str: string) !usize {
121 const adapter: AdapterStr = .{ .p = p };138 const adapter: AdapterStr = .{ .p = p };
...@@ -193,5 +210,9 @@ pub fn Mixin(comptime T: type) type {...@@ -193,5 +210,9 @@ pub fn Mixin(comptime T: type) type {
193 pub fn trimByte(pp: *T, test_c: u8) !usize {210 pub fn trimByte(pp: *T, test_c: u8) !usize {
194 return pp.parser.trimByte(test_c);211 return pp.parser.trimByte(test_c);
195 }212 }
213
214 pub fn eatUntil(pp: *T, test_c: u8) !usize {
215 return pp.parser.eatUntil(test_c);
216 }
196 };217 };
197}218}