diff options
| author | Taylan Kammer <taylan.kammer@gmail.com> | 2025-03-19 20:00:16 +0100 |
|---|---|---|
| committer | Taylan Kammer <taylan.kammer@gmail.com> | 2025-03-19 20:00:16 +0100 |
| commit | 91629014bfe50e1d45cffedd618ab28a063f7689 (patch) | |
| tree | aaff58af70db655a2d73c715846390bf0277f012 | |
| parent | 000a408f29c92b1a718f640f320cf531c187d794 (diff) | |
Parser can handle non-short strings.
| -rw-r--r-- | src/libzisp/io/parser.zig | 28 |
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 { |
