reader: add position restoration for read_vec and read_list
Same as read_str really, using a label to push control flow.
This commit is contained in:
20
src/reader.c
20
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)
|
read_err_t read_list(sys_t *sys, stream_t *stream, lisp_t **ret)
|
||||||
{
|
{
|
||||||
|
u64 old_pos = stream->position;
|
||||||
// skip past the open parentheses '('
|
// skip past the open parentheses '('
|
||||||
(void)stream_next(stream);
|
(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);
|
read_err_t err = read(sys, stream, &item);
|
||||||
if (err == READ_ERR_EOF)
|
if (err == READ_ERR_EOF)
|
||||||
{
|
{
|
||||||
return READ_ERR_EXPECTED_CLOSED_BRACE;
|
goto no_close_brace;
|
||||||
}
|
}
|
||||||
else if (err)
|
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) != ')')
|
if (stream_peek(stream) != ')')
|
||||||
return READ_ERR_EXPECTED_CLOSED_BRACE;
|
{
|
||||||
|
goto no_close_brace;
|
||||||
|
}
|
||||||
|
|
||||||
stream_next(stream);
|
stream_next(stream);
|
||||||
*ret = top;
|
*ret = top;
|
||||||
return READ_ERR_OK;
|
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)
|
read_err_t read_vec(sys_t *sys, stream_t *stream, lisp_t **ret)
|
||||||
{
|
{
|
||||||
|
u64 old_pos = stream->position;
|
||||||
(void)stream_next(stream);
|
(void)stream_next(stream);
|
||||||
|
|
||||||
lisp_t *container = make_vec(sys, 0);
|
lisp_t *container = make_vec(sys, 0);
|
||||||
while (!stream_eoc(stream) && stream_peek(stream) != ']')
|
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);
|
read_err_t err = read(sys, stream, &item);
|
||||||
if (err == READ_ERR_EOF)
|
if (err == READ_ERR_EOF)
|
||||||
{
|
{
|
||||||
return READ_ERR_EXPECTED_CLOSED_BRACE;
|
goto no_close_square_bracket;
|
||||||
}
|
}
|
||||||
else if (err)
|
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) != ']')
|
if (stream_peek(stream) != ']')
|
||||||
return READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET;
|
goto no_close_square_bracket;
|
||||||
|
|
||||||
stream_next(stream);
|
stream_next(stream);
|
||||||
*ret = container;
|
*ret = container;
|
||||||
return READ_ERR_OK;
|
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)
|
read_err_t read_str(sys_t *sys, stream_t *stream, lisp_t **ret)
|
||||||
|
|||||||
Reference in New Issue
Block a user