summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libzisp.zig7
-rw-r--r--src/libzisp/io/unparser.zig17
2 files changed, 23 insertions, 1 deletions
diff --git a/src/libzisp.zig b/src/libzisp.zig
index 400f9fb..4bf8b08 100644
--- a/src/libzisp.zig
+++ b/src/libzisp.zig
@@ -302,3 +302,10 @@ test "parse4" {
const f, const fl = value.sstr.unpack(value.pair.cdr(val));
try std.testing.expectEqualStrings("bar", f[0..fl]);
}
+
+test "unparse" {
+ try std.testing.expectEqualStrings(
+ "#foo",
+ io.unparser.unparse(io.parser.parseCode("#foo")),
+ );
+}
diff --git a/src/libzisp/io/unparser.zig b/src/libzisp/io/unparser.zig
index eb27e20..83186c2 100644
--- a/src/libzisp/io/unparser.zig
+++ b/src/libzisp/io/unparser.zig
@@ -1 +1,16 @@
-// wip
+const std = @import("std");
+
+const value = @import("../value.zig");
+
+const Value = value.Value;
+
+pub fn unparse(v: Value) []u8 {
+ var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
+ var out: std.ArrayList(u8) = .init(gpa.allocator());
+ if (value.rune.check(v)) {
+ const name, const len = value.rune.unpack(v);
+ out.append('#') catch @panic("");
+ out.appendSlice(name[0..len]) catch @panic("");
+ }
+ return out.toOwnedSlice() catch @panic("");
+}