summaryrefslogtreecommitdiff
path: root/src/libzisp/value
diff options
context:
space:
mode:
authorTaylan Kammer <taylan.kammer@gmail.com>2025-02-25 20:49:49 +0100
committerTaylan Kammer <taylan.kammer@gmail.com>2025-02-25 20:49:49 +0100
commitca8de6eb6bd0fe1ee3ef22c659cf416d41bc7a2f (patch)
tree4fc98874a5aafecca3aeb95efccb5d95eb386459 /src/libzisp/value
parent0f432b2c76813f2c0f9e508f10227df491712837 (diff)
update
Diffstat (limited to 'src/libzisp/value')
-rw-r--r--src/libzisp/value/char.zig4
-rw-r--r--src/libzisp/value/rune.zig13
-rw-r--r--src/libzisp/value/sstr.zig27
3 files changed, 35 insertions, 9 deletions
diff --git a/src/libzisp/value/char.zig b/src/libzisp/value/char.zig
index 98bb26f..eb4bbc9 100644
--- a/src/libzisp/value/char.zig
+++ b/src/libzisp/value/char.zig
@@ -16,12 +16,12 @@ pub fn assert(v: Value) void {
}
pub fn pack(c: u21) Value {
- return .{ .char = .{ .char = c } };
+ return .{ .char = .{ .value = c } };
}
pub fn unpack(v: Value) u21 {
assert(v);
- return @truncate(v.char.char);
+ return @truncate(v.char.value);
}
// Zisp API
diff --git a/src/libzisp/value/rune.zig b/src/libzisp/value/rune.zig
index ab251b4..3a4dc61 100644
--- a/src/libzisp/value/rune.zig
+++ b/src/libzisp/value/rune.zig
@@ -2,6 +2,7 @@ const std = @import("std");
const value = @import("../value.zig");
+const ShortString = value.ShortString;
const Value = value.Value;
// Zig API
@@ -48,12 +49,16 @@ pub fn pack(s: []const u8) Value {
return v;
}
-pub fn unpack(v: Value) struct { [6]u8, u3 } {
- const s: [6]u8 = @bitCast(v.rune.name);
+pub fn unpack(v: Value) ShortString {
+ var s = ShortString{ .buffer = @bitCast(v.sstr.string) };
inline for (0..6) |i| {
- if (s[i] == 0) return .{ s, i };
+ if (s.buffer[i] == 0) {
+ s.len = i;
+ return s;
+ }
}
- return .{ s, 6 };
+ s.len = 6;
+ return s;
}
// Zisp API
diff --git a/src/libzisp/value/sstr.zig b/src/libzisp/value/sstr.zig
index 2be2647..a2f6bf8 100644
--- a/src/libzisp/value/sstr.zig
+++ b/src/libzisp/value/sstr.zig
@@ -1,11 +1,15 @@
const std = @import("std");
-const Value = @import("../value.zig").Value;
+const value = @import("../value.zig");
+
+const ShortString = value.ShortString;
+const OtherTag = value.OtherTag;
+const Value = value.Value;
// Zig API
pub fn check(v: Value) bool {
- return v.isOther(.sstr);
+ return v.isOther(.sstr) or v.isOther(.sstr_lit);
}
pub fn assert(v: Value) void {
@@ -43,8 +47,16 @@ fn assertValidSstr(s: []const u8) void {
// Note: rune.zig uses equivalent code; probably good to keep in sync.
pub fn pack(s: []const u8) Value {
+ return _pack(s, .sstr);
+}
+
+pub fn packLiteral(s: []const u8) Value {
+ return _pack(s, .sstr_lit);
+}
+
+fn _pack(s: []const u8, tag: OtherTag) Value {
assertValidSstr(s);
- var v = Value{ .sstr = .{ .string = 0 } };
+ var v = Value{ .sstr = .{ .string = 0, .tag = tag } };
const dest: [*]u8 = @ptrCast(&v.sstr.string);
@memcpy(dest, s);
return v;
@@ -59,4 +71,13 @@ pub fn unpack(v: Value) struct { [6]u8, u3 } {
return .{ s, 6 };
}
+pub fn unpack1(v: Value) struct { [6]u8, u3 } {
+ assert(v);
+ const s: [6]u8 = @bitCast(v.sstr.string);
+ for (0..6) |i| {
+ if (s[i] == 0) return .{ s, @intCast(i) };
+ }
+ return .{ s, 6 };
+}
+
// No Zisp API for sstr specifically, since it's a string. See string.zig.