From 775d9f51bf4e698efaf0069812e65d206b24f4d0 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Thu, 5 Mar 2026 20:27:13 +0000 Subject: [PATCH] reader: add position restoration for read_vec and read_list Same as read_str really, using a label to push control flow. --- src/reader.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/reader.c b/src/reader.c index bb5150e..34c45a4 100644 --- a/src/reader.c +++ b/src/reader.c @@ -128,6 +128,7 @@ read_err_t read_negative(sys_t *sys, stream_t *stream, lisp_t **ret) read_err_t read_list(sys_t *sys, stream_t *stream, lisp_t **ret) { + u64 old_pos = stream->position; // skip past the open parentheses '(' (void)stream_next(stream); @@ -139,7 +140,7 @@ read_err_t read_list(sys_t *sys, stream_t *stream, lisp_t **ret) read_err_t err = read(sys, stream, &item); if (err == READ_ERR_EOF) { - return READ_ERR_EXPECTED_CLOSED_BRACE; + goto no_close_brace; } else if (err) { @@ -158,16 +159,23 @@ read_err_t read_list(sys_t *sys, stream_t *stream, lisp_t **ret) } if (stream_peek(stream) != ')') - return READ_ERR_EXPECTED_CLOSED_BRACE; + { + goto no_close_brace; + } stream_next(stream); *ret = top; return READ_ERR_OK; +no_close_brace: + stream->position = old_pos; + return READ_ERR_EXPECTED_CLOSED_BRACE; } read_err_t read_vec(sys_t *sys, stream_t *stream, lisp_t **ret) { + u64 old_pos = stream->position; (void)stream_next(stream); + lisp_t *container = make_vec(sys, 0); while (!stream_eoc(stream) && stream_peek(stream) != ']') { @@ -175,7 +183,7 @@ read_err_t read_vec(sys_t *sys, stream_t *stream, lisp_t **ret) read_err_t err = read(sys, stream, &item); if (err == READ_ERR_EOF) { - return READ_ERR_EXPECTED_CLOSED_BRACE; + goto no_close_square_bracket; } else if (err) { @@ -188,10 +196,14 @@ read_err_t read_vec(sys_t *sys, stream_t *stream, lisp_t **ret) } if (stream_peek(stream) != ']') - return READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET; + goto no_close_square_bracket; + stream_next(stream); *ret = container; return READ_ERR_OK; +no_close_square_bracket: + stream->position = old_pos; + return READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET; } read_err_t read_str(sys_t *sys, stream_t *stream, lisp_t **ret)