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;
33const extras = @import("extras");
44const tracer = @import("tracer");
55
6const buf_size = 64;
76const Error = std.mem.Allocator.Error;
87const ObjectHashMap = std.AutoArrayHashMapUnmanaged(StringIndex, ValueIndex);
98
......@@ -14,8 +13,7 @@ pub fn parse(alloc: std.mem.Allocator, path: string, inreader: anytype) anyerror
1413 _ = path;
1514
1615 var counter = std.io.countingReader(inreader);
17 var buf = std.io.bufferedReader(counter.reader());
18 const anyreader = extras.AnyReader.from(buf.reader());
16 const anyreader = extras.AnyReader.from(counter.reader());
1917 var p = Parser.init(alloc, anyreader);
2018 defer p.temp.deinit(alloc);
2119 defer p.strings_map.deinit(alloc);
......@@ -265,16 +263,15 @@ const Parser = struct {
265263
266264 fn peekAmt(p: *Parser, amt: usize) !void {
267265 if (p.avail() >= amt) return;
266 const buf_size = std.mem.page_size;
268267 const diff_amt = amt - p.avail();
269268 std.debug.assert(diff_amt <= buf_size);
270269 var buf: [buf_size]u8 = undefined;
271 var target_buf = buf[0..diff_amt];
272 const len = try p.any.readAll(target_buf);
270 const len = try p.any.readAll(&buf);
273271 if (len == 0) p.end = true;
274272 if (len == 0) return error.EndOfStream;
275 std.debug.assert(len <= diff_amt);
276 try p.temp.appendSlice(p.arena, target_buf[0..len]);
277 if (len != diff_amt) return error.EndOfStream;
273 try p.temp.appendSlice(p.arena, buf[0..len]);
274 if (amt > len) return error.EndOfStream;
278275 }
279276
280277 pub fn eatByte(p: *Parser, test_c: u8) !?u8 {