From e594b6ce7036e491adfb2f16a7baab9c423262ce Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Thu, 5 Mar 2026 20:25:03 +0000 Subject: [PATCH] reader: read_str restores stream position for no closing speechmarks Say you have the following Lisp code: `"hello world` (no closing speechmark). This read_str implementation will now place stream->position at the first speechmark rather than at the EOF (what happened previously) which is a bit nicer. --- include/alisp/reader.h | 2 +- src/reader.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/include/alisp/reader.h b/include/alisp/reader.h index 2a8a1c4..8810e52 100644 --- a/include/alisp/reader.h +++ b/include/alisp/reader.h @@ -17,7 +17,7 @@ typedef enum READ_ERR_EOF, READ_ERR_EXPECTED_CLOSED_BRACE, READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET, - READ_ERR_EXPECTED_SPEECHMARKS, + READ_ERR_EXPECTED_CLOSING_SPEECHMARKS, READ_ERR_UNEXPECTED_CLOSED_BRACE, READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET, READ_ERR_UNKNOWN_CHAR, diff --git a/src/reader.c b/src/reader.c index e07c662..bb5150e 100644 --- a/src/reader.c +++ b/src/reader.c @@ -24,8 +24,8 @@ const char *read_err_to_cstr(read_err_t err) return "EXPECTED_CLOSED_BRACE"; case READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET: return "EXPECTED_CLOSED_SQUARE_BRACKET"; - case READ_ERR_EXPECTED_SPEECHMARKS: - return "EXPECTED_SPEECHMARKS"; + case READ_ERR_EXPECTED_CLOSING_SPEECHMARKS: + return "EXPECTED_CLOSING_SPEECHMARKS"; case READ_ERR_UNEXPECTED_CLOSED_BRACE: return "UNEXPECTED_CLOSED_BRACE"; case READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET: @@ -196,11 +196,14 @@ read_err_t read_vec(sys_t *sys, stream_t *stream, lisp_t **ret) read_err_t read_str(sys_t *sys, stream_t *stream, lisp_t **ret) { + u64 old_pos = stream->position; + (void)stream_next(stream); sv_t contents = stream_till(stream, "\""); - if (stream_peek(stream) != '\"') + if (stream_eoc(stream) || stream_peek(stream) != '\"') { - return READ_ERR_EXPECTED_SPEECHMARKS; + stream->position = old_pos; + return READ_ERR_EXPECTED_CLOSING_SPEECHMARKS; } stream_next(stream);