diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/jq/tokenize.zig | 24 | ||||
| -rw-r--r-- | src/root.zig | 8 |
2 files changed, 28 insertions, 4 deletions
diff --git a/src/jq/tokenize.zig b/src/jq/tokenize.zig index 9c00602..75113f0 100644 --- a/src/jq/tokenize.zig +++ b/src/jq/tokenize.zig @@ -153,6 +153,21 @@ fn tokenizeIdentifier(allocator: std.mem.Allocator, reader: *std.Io.Reader, firs return buffer.toOwnedSlice(allocator); } +fn tokenizeNumber(reader: *std.Io.Reader, first: u8) error{ReadFailed}!i64 { + var value: i64 = first - '0'; + + while (try peekByte(reader)) |c| { + if (std.ascii.isDigit(c)) { + value = value * 10 + (c - '0'); + reader.toss(1); + } else { + break; + } + } + + return value; +} + pub fn tokenize(allocator: std.mem.Allocator, reader: *std.Io.Reader) ![]Token { var tokens = try std.array_list.Aligned(Token, null).initCapacity(allocator, 16); @@ -194,7 +209,7 @@ pub fn tokenize(allocator: std.mem.Allocator, reader: *std.Io.Reader) ![]Token { '|' => if (try takeByteIf(reader, '=')) .pipe_equal else .pipe, '}' => .brace_right, else => if (std.ascii.isDigit(c)) - .{ .number = (c - '0') } + .{ .number = try tokenizeNumber(reader, c) } else if (isIdentifierStart(c)) .{ .identifier = try tokenizeIdentifier(allocator, reader, c) } else @@ -269,12 +284,13 @@ test "tokenize number" { var allocator = std.heap.ArenaAllocator.init(std.testing.allocator); defer allocator.deinit(); - var reader = std.Io.Reader.fixed("5"); + var reader = std.Io.Reader.fixed("5 123"); const tokens = try tokenize(allocator.allocator(), &reader); - try std.testing.expectEqual(2, tokens.len); + try std.testing.expectEqual(3, tokens.len); try std.testing.expectEqual(Token{ .number = 5 }, tokens[0]); - try std.testing.expectEqual(.end, tokens[1]); + try std.testing.expectEqual(Token{ .number = 123 }, tokens[1]); + try std.testing.expectEqual(.end, tokens[2]); } test "tokenize array index" { diff --git a/src/root.zig b/src/root.zig index ab8fbbe..fa48c7b 100644 --- a/src/root.zig +++ b/src/root.zig @@ -49,4 +49,12 @@ test "array index filter" { try testRun("null", allocator, "[]", ".[0]"); try testRun("1", allocator, "[1,2,3]", ".[0]"); try testRun("null", allocator, "[1,2,3]", ".[5]"); + try testRun("11", allocator, "[0,1,2,3,4,5,6,7,8,9,10,11,12]", ".[11]"); + try testRun("100", allocator, + \\[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, + \\ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, + \\ 41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60, + \\ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80, + \\ 81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100] + , ".[100]"); } |
