summaryrefslogtreecommitdiff
path: root/src/libzisp/io/parser.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/libzisp/io/parser.zig')
-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 {