feat(zig): native Arboricx bundle parser and C ABI
This commit is contained in:
27
ext/zig/src/ternary.zig
Normal file
27
ext/zig/src/ternary.zig
Normal file
@@ -0,0 +1,27 @@
|
||||
const std = @import("std");
|
||||
const tree = @import("tree.zig");
|
||||
const Arena = @import("arena.zig").Arena;
|
||||
|
||||
pub fn parseTernary(source: []const u8, arena: *Arena) !u32 {
|
||||
var pos: usize = 0;
|
||||
return try parseTernaryRec(source, &pos, arena);
|
||||
}
|
||||
|
||||
fn parseTernaryRec(source: []const u8, pos: *usize, arena: *Arena) !u32 {
|
||||
if (pos.* >= source.len) return error.UnexpectedEnd;
|
||||
const ch = source[pos.*];
|
||||
pos.* += 1;
|
||||
return switch (ch) {
|
||||
'0' => try arena.alloc(.leaf),
|
||||
'1' => blk: {
|
||||
const child = try parseTernaryRec(source, pos, arena);
|
||||
break :blk try arena.alloc(.{ .stem = .{ .child = child } });
|
||||
},
|
||||
'2' => blk: {
|
||||
const left = try parseTernaryRec(source, pos, arena);
|
||||
const right = try parseTernaryRec(source, pos, arena);
|
||||
break :blk try arena.alloc(.{ .fork = .{ .left = left, .right = right } });
|
||||
},
|
||||
else => error.InvalidChar,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user