diff --git a/json.zig b/json.zig index bbfbfd364b95ae571293b8bbda0aaa4798d0935f..33a0a12d78517eefd240b8860509cdeb1d537016 100644 --- a/json.zig +++ b/json.zig @@ -184,7 +184,7 @@ fn parseNumber(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex { if (try p.eatByte('0')) |_| { return try p.addNumber(alloc, "0"); } - while (try p.eatAnyScalar("0123456789")) |d| { + while (try p.eatRange('0', '9')) |d| { try characters.append(d); } if (characters.items.len == 0) { @@ -193,7 +193,7 @@ fn parseNumber(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex { if (try p.eatByte('.')) |c| { try characters.append(c); const l = characters.items.len; - while (try p.eatAnyScalar("0123456789")) |d| { + while (try p.eatRange('0', '9')) |d| { try characters.append(d); } if (characters.items.len == l) return error.JsonExpectedTODO; @@ -202,7 +202,7 @@ fn parseNumber(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex { try characters.append('e'); try characters.append(try p.eatAnyScalar("+-") orelse return error.JsonExpectedTODO); const l = characters.items.len; - while (try p.eatAnyScalar("0123456789")) |d| { + while (try p.eatRange('0', '9')) |d| { try characters.append(d); } if (characters.items.len == l) return error.JsonExpectedTODO; @@ -289,6 +289,18 @@ const Parser = struct { return null; } + pub fn eatRange(p: *Parser, comptime from: u8, comptime to: u8) !?u8 { + const t = tracer.trace(@src(), " ({d},{d})", .{ from, to }); + defer t.end(); + + try p.peekAmt(1); + if (p.slice()[0] >= from and p.slice()[0] <= to) { + defer p.idx += 1; + return p.slice()[0]; + } + return null; + } + pub fn eatAnyScalar(p: *Parser, test_s: string) !?u8 { const t = tracer.trace(@src(), " ({s})", .{test_s}); defer t.end();