| ... | @@ -251,7 +251,7 @@ const Parser = struct { | ... | @@ -251,7 +251,7 @@ const Parser = struct { |
| 251 | _ = try p.eatByte(test_s[0]); | 251 | _ = try p.eatByte(test_s[0]); |
| 252 | return; | 252 | return; |
| 253 | } | 253 | } |
| 254 | try p.peekAmt(test_s.len); | 254 | try p.peekAmt(test_s.len) orelse return null; |
| 255 | if (std.mem.eql(u8, p.slice()[0..test_s.len], test_s)) { | 255 | if (std.mem.eql(u8, p.slice()[0..test_s.len], test_s)) { |
| 256 | p.idx += test_s.len; | 256 | p.idx += test_s.len; |
| 257 | return; | 257 | return; |
| ... | @@ -259,7 +259,7 @@ const Parser = struct { | ... | @@ -259,7 +259,7 @@ const Parser = struct { |
| 259 | return null; | 259 | return null; |
| 260 | } | 260 | } |
| 261 | | 261 | |
| 262 | fn peekAmt(p: *Parser, amt: usize) !void { | 262 | fn peekAmt(p: *Parser, amt: usize) !?void { |
| 263 | if (p.avail() >= amt) return; | 263 | if (p.avail() >= amt) return; |
| 264 | const buf_size = std.mem.page_size; | 264 | const buf_size = std.mem.page_size; |
| 265 | const diff_amt = amt - p.avail(); | 265 | const diff_amt = amt - p.avail(); |
| ... | @@ -267,16 +267,16 @@ const Parser = struct { | ... | @@ -267,16 +267,16 @@ const Parser = struct { |
| 267 | var buf: [buf_size]u8 = undefined; | 267 | var buf: [buf_size]u8 = undefined; |
| 268 | const len = try p.any.readAll(&buf); | 268 | const len = try p.any.readAll(&buf); |
| 269 | if (len == 0) p.end = true; | 269 | if (len == 0) p.end = true; |
| 270 | if (len == 0) return error.EndOfStream; | 270 | if (len == 0) return null; |
| 271 | try p.temp.appendSlice(p.arena, buf[0..len]); | 271 | try p.temp.appendSlice(p.arena, buf[0..len]); |
| 272 | if (amt > len) return error.EndOfStream; | 272 | if (amt > len) return null; |
| 273 | } | 273 | } |
| 274 | | 274 | |
| 275 | pub fn eatByte(p: *Parser, test_c: u8) !?u8 { | 275 | pub fn eatByte(p: *Parser, test_c: u8) !?u8 { |
| 276 | const t = tracer.trace(@src(), " '{c}'", .{test_c}); | 276 | const t = tracer.trace(@src(), " '{c}'", .{test_c}); |
| 277 | defer t.end(); | 277 | defer t.end(); |
| 278 | | 278 | |
| 279 | try p.peekAmt(1); | 279 | try p.peekAmt(1) orelse return null; |
| 280 | if (p.slice()[0] == test_c) { | 280 | if (p.slice()[0] == test_c) { |
| 281 | p.idx += 1; | 281 | p.idx += 1; |
| 282 | return test_c; | 282 | return test_c; |
| ... | @@ -288,7 +288,7 @@ const Parser = struct { | ... | @@ -288,7 +288,7 @@ const Parser = struct { |
| 288 | const t = tracer.trace(@src(), " ({d},{d})", .{ from, to }); | 288 | const t = tracer.trace(@src(), " ({d},{d})", .{ from, to }); |
| 289 | defer t.end(); | 289 | defer t.end(); |
| 290 | | 290 | |
| 291 | try p.peekAmt(1); | 291 | try p.peekAmt(1) orelse return null; |
| 292 | if (p.slice()[0] >= from and p.slice()[0] <= to) { | 292 | if (p.slice()[0] >= from and p.slice()[0] <= to) { |
| 293 | defer p.idx += 1; | 293 | defer p.idx += 1; |
| 294 | return p.slice()[0]; | 294 | return p.slice()[0]; |
| ... | @@ -301,7 +301,7 @@ const Parser = struct { | ... | @@ -301,7 +301,7 @@ const Parser = struct { |
| 301 | defer t.end(); | 301 | defer t.end(); |
| 302 | | 302 | |
| 303 | std.debug.assert(extras.matchesAll(u8, test_s, std.ascii.isASCII)); | 303 | std.debug.assert(extras.matchesAll(u8, test_s, std.ascii.isASCII)); |
| 304 | try p.peekAmt(1); | 304 | try p.peekAmt(1) orelse return null; |
| 305 | if (std.mem.indexOfScalar(u8, test_s, p.slice()[0])) |idx| { | 305 | if (std.mem.indexOfScalar(u8, test_s, p.slice()[0])) |idx| { |
| 306 | p.idx += 1; | 306 | p.idx += 1; |
| 307 | return test_s[idx]; | 307 | return test_s[idx]; |
| ... | @@ -310,15 +310,15 @@ const Parser = struct { | ... | @@ -310,15 +310,15 @@ const Parser = struct { |
| 310 | } | 310 | } |
| 311 | | 311 | |
| 312 | pub fn shift(p: *Parser) !u21 { | 312 | pub fn shift(p: *Parser) !u21 { |
| 313 | try p.peekAmt(1); | 313 | try p.peekAmt(1) orelse return error.EndOfStream; |
| 314 | const len = try std.unicode.utf8ByteSequenceLength(p.slice()[0]); | 314 | const len = try std.unicode.utf8ByteSequenceLength(p.slice()[0]); |
| 315 | try p.peekAmt(len); | 315 | try p.peekAmt(len) orelse return error.EndOfStream; |
| 316 | defer p.idx += len; | 316 | defer p.idx += len; |
| 317 | return std.unicode.utf8Decode(p.slice()[0..len]); | 317 | return std.unicode.utf8Decode(p.slice()[0..len]); |
| 318 | } | 318 | } |
| 319 | | 319 | |
| 320 | pub fn shiftBytesN(p: *Parser, comptime n: usize) ![n]u8 { | 320 | pub fn shiftBytesN(p: *Parser, comptime n: usize) ![n]u8 { |
| 321 | try p.peekAmt(n); | 321 | try p.peekAmt(n) orelse return error.EndOfStream; |
| 322 | defer p.idx += n; | 322 | defer p.idx += n; |
| 323 | return p.slice()[0..n].*; | 323 | return p.slice()[0..n].*; |
| 324 | } | 324 | } |