diff options
| author | Taylan Kammer <taylan.kammer@gmail.com> | 2025-02-25 20:49:49 +0100 |
|---|---|---|
| committer | Taylan Kammer <taylan.kammer@gmail.com> | 2025-02-25 20:49:49 +0100 |
| commit | ca8de6eb6bd0fe1ee3ef22c659cf416d41bc7a2f (patch) | |
| tree | 4fc98874a5aafecca3aeb95efccb5d95eb386459 /src/libzisp/value | |
| parent | 0f432b2c76813f2c0f9e508f10227df491712837 (diff) | |
update
Diffstat (limited to 'src/libzisp/value')
| -rw-r--r-- | src/libzisp/value/char.zig | 4 | ||||
| -rw-r--r-- | src/libzisp/value/rune.zig | 13 | ||||
| -rw-r--r-- | src/libzisp/value/sstr.zig | 27 |
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. |
