summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.zig6
-rw-r--r--src/test/data/string.txt2
-rw-r--r--src/test/parse.zig14
-rw-r--r--src/test/strings.zig24
-rw-r--r--src/zisp/io.zig2
-rw-r--r--src/zisp/io/Parser.zig38
-rw-r--r--src/zisp/io/parse.zig47
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";