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