authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2024-05-29 11:58:36 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2024-05-29 11:58:36 -07:00
logdc83c8ece0399da8df86248fde91d48dd55076eb
tree05978d9825eeda6cbac32db9c4f6f5b27119fc35
parentf090898e13b96d1e5f115e3c274be64d6374dcd3

parse: read a whole page of data at a time


1 files changed, 5 insertions(+), 8 deletions(-)

json.zig+5-8
...@@ -3,7 +3,6 @@ const string = []const u8;...@@ -3,7 +3,6 @@ const string = []const u8;
3const extras = @import("extras");3const extras = @import("extras");
4const tracer = @import("tracer");4const tracer = @import("tracer");
55
6const buf_size = 64;
7const Error = std.mem.Allocator.Error;6const Error = std.mem.Allocator.Error;
8const ObjectHashMap = std.AutoArrayHashMapUnmanaged(StringIndex, ValueIndex);7const ObjectHashMap = std.AutoArrayHashMapUnmanaged(StringIndex, ValueIndex);
98
...@@ -14,8 +13,7 @@ pub fn parse(alloc: std.mem.Allocator, path: string, inreader: anytype) anyerror...@@ -14,8 +13,7 @@ pub fn parse(alloc: std.mem.Allocator, path: string, inreader: anytype) anyerror
14 _ = path;13 _ = path;
1514
16 var counter = std.io.countingReader(inreader);15 var counter = std.io.countingReader(inreader);
17 var buf = std.io.bufferedReader(counter.reader());16 const anyreader = extras.AnyReader.from(counter.reader());
18 const anyreader = extras.AnyReader.from(buf.reader());
19 var p = Parser.init(alloc, anyreader);17 var p = Parser.init(alloc, anyreader);
20 defer p.temp.deinit(alloc);18 defer p.temp.deinit(alloc);
21 defer p.strings_map.deinit(alloc);19 defer p.strings_map.deinit(alloc);
...@@ -265,16 +263,15 @@ const Parser = struct {...@@ -265,16 +263,15 @@ const Parser = struct {
265263
266 fn peekAmt(p: *Parser, amt: usize) !void {264 fn peekAmt(p: *Parser, amt: usize) !void {
267 if (p.avail() >= amt) return;265 if (p.avail() >= amt) return;
266 const buf_size = std.mem.page_size;
268 const diff_amt = amt - p.avail();267 const diff_amt = amt - p.avail();
269 std.debug.assert(diff_amt <= buf_size);268 std.debug.assert(diff_amt <= buf_size);
270 var buf: [buf_size]u8 = undefined;269 var buf: [buf_size]u8 = undefined;
271 var target_buf = buf[0..diff_amt];270 const len = try p.any.readAll(&buf);
272 const len = try p.any.readAll(target_buf);
273 if (len == 0) p.end = true;271 if (len == 0) p.end = true;
274 if (len == 0) return error.EndOfStream;272 if (len == 0) return error.EndOfStream;
275 std.debug.assert(len <= diff_amt);273 try p.temp.appendSlice(p.arena, buf[0..len]);
276 try p.temp.appendSlice(p.arena, target_buf[0..len]);274 if (amt > len) return error.EndOfStream;
277 if (len != diff_amt) return error.EndOfStream;
278 }275 }
279276
280 pub fn eatByte(p: *Parser, test_c: u8) !?u8 {277 pub fn eatByte(p: *Parser, test_c: u8) !?u8 {