diff options
| author | Taylan Kammer <taylan.kammer@gmail.com> | 2026-01-07 03:30:11 +0100 |
|---|---|---|
| committer | Taylan Kammer <taylan.kammer@gmail.com> | 2026-01-07 03:30:11 +0100 |
| commit | 344ab30c2155b855a1fcd98027199026d4f467d7 (patch) | |
| tree | c029d65e5463a8b7f67ac5a932de22e2ffef5d22 /src | |
| parent | c575aafc23cf20cee76653a179384357cdb918f2 (diff) | |
Code cleanup.
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.zig | 6 | ||||
| -rw-r--r-- | src/test/data/string.txt | 2 | ||||
| -rw-r--r-- | src/test/parse.zig | 14 | ||||
| -rw-r--r-- | src/test/strings.zig | 24 | ||||
| -rw-r--r-- | src/zisp/io.zig | 2 | ||||
| -rw-r--r-- | src/zisp/io/Parser.zig | 38 | ||||
| -rw-r--r-- | src/zisp/io/parse.zig | 47 |
7 files changed, 64 insertions, 69 deletions
diff --git a/src/main.zig b/src/main.zig index 9cd3049..4f1127c 100644 --- a/src/main.zig +++ b/src/main.zig @@ -2,15 +2,15 @@ const std = @import("std"); const zisp = @import("zisp"); -const gstIo = std.Io.Threaded.global_single_threaded.io(); +const gst_io = std.Io.Threaded.global_single_threaded.io(); pub fn main() !void { var stdin_buffer: [4096]u8 = undefined; - var stdin_reader = std.Io.File.stdin().reader(gstIo, &stdin_buffer); + var stdin_reader = std.Io.File.stdin().reader(gst_io, &stdin_buffer); const reader = &stdin_reader.interface; var stdout_buffer: [4096]u8 = undefined; - var stdout_writer = std.Io.File.stdout().writer(gstIo, &stdout_buffer); + var stdout_writer = std.Io.File.stdout().writer(gst_io, &stdout_buffer); const writer = &stdout_writer.interface; while (true) { diff --git a/src/test/data/string.txt b/src/test/data/string.txt index 31382be..79f0abf 100644 --- a/src/test/data/string.txt +++ b/src/test/data/string.txt @@ -1 +1 @@ -foo bar baz
\ No newline at end of file +This is a very long string blah blub blip blop yadda yadda jabba dooba. diff --git a/src/test/parse.zig b/src/test/parse.zig index af807b4..94ccbe5 100644 --- a/src/test/parse.zig +++ b/src/test/parse.zig @@ -3,7 +3,7 @@ const std = @import("std"); const testing = std.testing; const expect = testing.expect; -const gstIo = std.Io.Threaded.global_single_threaded.io(); +const gst_io = std.Io.Threaded.global_single_threaded.io(); pub const io = @import("../zisp/io.zig"); pub const value = @import("../zisp/value.zig"); @@ -136,7 +136,7 @@ test "print2" { fn parseAndPrint(str: []const u8) !void { var buf: [64]u8 = undefined; - var fw = std.Io.File.stderr().writer(gstIo, &buf); + var fw = std.Io.File.stderr().writer(gst_io, &buf); const w = &fw.interface; const v = parse(str); @@ -166,18 +166,18 @@ test "print7" { } fn parseBench(path: []const u8, iters: usize) !void { - const file = try std.Io.Dir.cwd().openFile(gstIo, path, .{}); - defer file.close(gstIo); + const file = try std.Io.Dir.cwd().openFile(gst_io, path, .{}); + defer file.close(gst_io); - var sfa = io.parse.DefaultSfa.init(std.heap.smp_allocator); - var parser = try io.parse.initSfa(&sfa); + var sfa = io.Parser.DefaultSfa.withFallback(std.heap.smp_allocator); + var parser = try io.Parser.initWithSfa(&sfa, gst_io); defer parser.deinit(); var timer = try std.time.Timer.start(); for (0..iters) |i| { _ = i; var buf: [4096]u8 = undefined; - var reader = file.reader(gstIo, &buf); + var reader = file.reader(gst_io, &buf); var v: Value = undefined; while (true) { v = parser.run(&reader.interface) catch |e| { diff --git a/src/test/strings.zig b/src/test/strings.zig index 3a0585e..58a460b 100644 --- a/src/test/strings.zig +++ b/src/test/strings.zig @@ -13,27 +13,19 @@ test "istr" { const s1 = "foo bar baz"; const v1 = istr.intern(s1); const v1_len: usize = @intCast(fx.unpack(istr.len(v1))); - try testing.expectEqualStrings(s1, istr.assert(v1).bytes()); try testing.expectEqual(s1.len, v1_len); - const path = "src/test/data/string.txt"; - var file = try std.Io.Dir.cwd().openFile(gstIo, path, .{}); - defer file.close(gstIo); - - var s2_buf: [4096]u8 = undefined; - const s2_len = try file.readStreaming(gstIo, &.{&s2_buf}); - var s2: []u8 = s2_buf[0..s2_len]; - + const s2 = @embedFile("data/string.txt"); const v2 = istr.intern(s2); const v2_len: usize = @intCast(fx.unpack(istr.len(v2))); + try testing.expectEqualStrings(s2, istr.assert(v2).bytes()); + try testing.expectEqual(s2.len, v2_len); - var s2_orig_buf: [4096]u8 = undefined; - @memcpy(&s2_orig_buf, &s2_buf); - const s2_orig = s2_orig_buf[0..s2_len]; - - s2[0] = s2[0] +% 1; + // Check that modifying a slice doesn't affect the string. - try testing.expectEqualStrings(s2_orig, istr.assert(v2).bytes()); - try testing.expectEqual(s2_len, v2_len); + var s3 = "test".*; + const v3 = istr.intern(&s3); + s3[0] = 'x'; + try testing.expectEqualStrings("test", istr.assert(v3).bytes()); } diff --git a/src/zisp/io.zig b/src/zisp/io.zig index bedf07f..e6f7c78 100644 --- a/src/zisp/io.zig +++ b/src/zisp/io.zig @@ -6,3 +6,5 @@ pub const encode = @import("io/encode.zig"); pub const read = @import("io/read.zig"); pub const write = @import("io/write.zig"); + +pub const Parser = @import("io/Parser.zig"); diff --git a/src/zisp/io/Parser.zig b/src/zisp/io/Parser.zig index 2c381e1..2bb7624 100644 --- a/src/zisp/io/Parser.zig +++ b/src/zisp/io/Parser.zig @@ -118,6 +118,34 @@ pub const Alloc = struct { chars: std.mem.Allocator, }; +pub fn Sfa(init_stack: usize, init_chars: usize) type { + return struct { + const Self = @This(); + + pub const init_stack_capacity: usize = init_stack; + pub const init_chars_capacity: usize = init_chars; + + pub const init_stack_mem: usize = init_stack * @sizeOf(Context); + pub const init_chars_mem: usize = init_chars; + + stack: std.heap.StackFallbackAllocator(init_stack_mem), + chars: std.heap.StackFallbackAllocator(init_chars_mem), + + pub fn withFallback(fallback: std.mem.Allocator) Self { + return .{ + .stack = std.heap.stackFallback(init_stack_mem, fallback), + .chars = std.heap.stackFallback(init_chars_mem, fallback), + }; + } + + pub fn allocator(s: *Self) Alloc { + return .{ .stack = s.stack.get(), .chars = s.chars.get() }; + } + }; +} + +pub const DefaultSfa = Sfa(32, 2048); + alloc: Alloc, io: std.Io, input: *std.Io.Reader = undefined, @@ -141,6 +169,16 @@ pub fn init( return p; } +pub fn initWithSfa(sfa: anytype, io: std.Io) !Parser { + const SfaType = @typeInfo(@TypeOf(sfa)).pointer.child; + return init( + sfa.allocator(), + io, + SfaType.init_stack_capacity, + SfaType.init_chars_capacity, + ); +} + pub fn deinit(p: *Parser) void { p.stack.deinit(p.alloc.stack); p.chars.deinit(p.alloc.chars); diff --git a/src/zisp/io/parse.zig b/src/zisp/io/parse.zig index 0d7cfa8..4d00ca9 100644 --- a/src/zisp/io/parse.zig +++ b/src/zisp/io/parse.zig @@ -10,46 +10,6 @@ const Value = value.Value; const is_test = builtin.is_test; const is_debug = builtin.mode == .Debug; -const ctx_size = @sizeOf(Parser.Context); - -pub fn Sfa(init_stack: usize, init_chars: usize) type { - return struct { - const Self = @This(); - - pub const init_stack_capacity: usize = init_stack; - pub const init_chars_capacity: usize = init_chars; - - pub const init_stack_mem: usize = init_stack * ctx_size; - pub const init_chars_mem: usize = init_chars; - - stack: std.heap.StackFallbackAllocator(init_stack_mem), - chars: std.heap.StackFallbackAllocator(init_chars_mem), - - pub fn init(fallback: std.mem.Allocator) Self { - return .{ - .stack = std.heap.stackFallback(init_stack_mem, fallback), - .chars = std.heap.stackFallback(init_chars_mem, fallback), - }; - } - - pub fn allocator(s: *Self) Parser.Alloc { - return .{ .stack = s.stack.get(), .chars = s.chars.get() }; - } - }; -} - -pub const DefaultSfa = Sfa(32, 2048); - -pub fn initSfa(alloc: anytype) !Parser { - const SfaType = @typeInfo(@TypeOf(alloc)).pointer.child; - return Parser.init( - alloc.allocator(), - std.Io.Threaded.global_single_threaded.io(), - SfaType.init_stack_capacity, - SfaType.init_chars_capacity, - ); -} - pub fn fromReader(input: *std.Io.Reader) Value { return _fromReader(input, true); } @@ -59,8 +19,11 @@ pub fn _fromReader( comptime panic: bool, ) if (panic) Value else error{ ParseError, OutOfMemory }!Value { const alloc = std.heap.smp_allocator; - var sfa = DefaultSfa.init(alloc); - var p = initSfa(&sfa) catch |e| if (panic) @panic("OOM") else return e; + const io = std.Io.Threaded.global_single_threaded.io(); + var sfa = Parser.DefaultSfa.withFallback(alloc); + var p = Parser.initWithSfa(&sfa, io) catch |e| { + if (panic) @panic("OOM") else return e; + }; defer p.deinit(); return p.run(input) catch |e| if (panic) { const format = "Parse error: {s}, unread_char: {s}\n"; |
