summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTaylan Kammer <taylan.kammer@gmail.com>2025-03-19 20:00:16 +0100
committerTaylan Kammer <taylan.kammer@gmail.com>2025-03-19 20:00:16 +0100
commit91629014bfe50e1d45cffedd618ab28a063f7689 (patch)
treeaaff58af70db655a2d73c715846390bf0277f012
parent000a408f29c92b1a718f640f320cf531c187d794 (diff)
Parser can handle non-short strings.
-rw-r--r--src/libzisp/io/parser.zig28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/libzisp/io/parser.zig b/src/libzisp/io/parser.zig
index e501462..d02eda3 100644
--- a/src/libzisp/io/parser.zig
+++ b/src/libzisp/io/parser.zig
@@ -239,6 +239,7 @@ const ShortString = value.ShortString;
const Value = value.Value;
const cons = value.pair.cons;
+const intern = value.istr.intern;
// zig fmt: off
const DOT = value.rune.pack("DOT");
@@ -682,7 +683,18 @@ fn readQuotedSstr(s: *State) !?Value {
}
fn readQuotedLongString(s: *State) !Value {
- return err(s, "TODO: NOT YET IMPLEMENTED");
+ var chars = std.ArrayList(u8).init(s.alloc);
+ defer chars.deinit();
+
+ // TODO: Handle escapes.
+ while (!s.eof()) {
+ const c = s.getc();
+ if (c == '"') {
+ return intern(chars.items, true);
+ }
+ chars.append(c) catch @panic("OOM");
+ }
+ return error.Unclosed;
}
fn startBareString(s: *State) void {
@@ -712,7 +724,19 @@ fn isSstrChar(c: u8) bool {
}
fn readBareLongString(s: *State) Value {
- return err(s, "TODO: NOT YET IMPLEMENTED");
+ var chars = std.ArrayList(u8).init(s.alloc);
+ defer chars.deinit();
+
+ while (!s.eof()) {
+ const c = s.peek();
+ if (isSstrChar(c)) {
+ chars.append(c) catch @panic("OOM");
+ s.skip();
+ } else {
+ break;
+ }
+ }
+ return intern(chars.items, false);
}
fn startQuote(s: *State) void {