reader: implement reader for strings

This commit is contained in:
2026-03-05 20:13:52 +00:00
parent 1998954b56
commit fee6614670
2 changed files with 21 additions and 0 deletions

View File

@@ -17,6 +17,7 @@ typedef enum
READ_ERR_EOF, READ_ERR_EOF,
READ_ERR_EXPECTED_CLOSED_BRACE, READ_ERR_EXPECTED_CLOSED_BRACE,
READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET, READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET,
READ_ERR_EXPECTED_SPEECHMARKS,
READ_ERR_UNEXPECTED_CLOSED_BRACE, READ_ERR_UNEXPECTED_CLOSED_BRACE,
READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET, READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET,
READ_ERR_UNKNOWN_CHAR, READ_ERR_UNKNOWN_CHAR,

View File

@@ -24,6 +24,8 @@ const char *read_err_to_cstr(read_err_t err)
return "EXPECTED_CLOSED_BRACE"; return "EXPECTED_CLOSED_BRACE";
case READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET: case READ_ERR_EXPECTED_CLOSED_SQUARE_BRACKET:
return "EXPECTED_CLOSED_SQUARE_BRACKET"; return "EXPECTED_CLOSED_SQUARE_BRACKET";
case READ_ERR_EXPECTED_SPEECHMARKS:
return "EXPECTED_SPEECHMARKS";
case READ_ERR_UNEXPECTED_CLOSED_BRACE: case READ_ERR_UNEXPECTED_CLOSED_BRACE:
return "UNEXPECTED_CLOSED_BRACE"; return "UNEXPECTED_CLOSED_BRACE";
case READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET: case READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET:
@@ -192,6 +194,22 @@ read_err_t read_vec(sys_t *sys, stream_t *stream, lisp_t **ret)
return READ_ERR_OK; return READ_ERR_OK;
} }
read_err_t read_str(sys_t *sys, stream_t *stream, lisp_t **ret)
{
(void)stream_next(stream);
sv_t contents = stream_till(stream, "\"");
if (stream_peek(stream) != '\"')
{
return READ_ERR_EXPECTED_SPEECHMARKS;
}
stream_next(stream);
lisp_t *lisp = make_str(sys, contents.size);
vec_append(&as_str(lisp)->data, contents.data, contents.size);
*ret = lisp;
return READ_ERR_OK;
}
read_err_t read_quote(sys_t *sys, stream_t *stream, lisp_t **ret) read_err_t read_quote(sys_t *sys, stream_t *stream, lisp_t **ret)
{ {
lisp_t *to_quote = NIL; lisp_t *to_quote = NIL;
@@ -242,6 +260,8 @@ read_err_t read(sys_t *sys, stream_t *stream, lisp_t **ret)
return read_vec(sys, stream, ret); return read_vec(sys, stream, ret);
else if (c == ']') else if (c == ']')
return READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET; return READ_ERR_UNEXPECTED_CLOSED_SQUARE_BRACKET;
else if (c == '\"')
return read_str(sys, stream, ret);
return READ_ERR_UNKNOWN_CHAR; return READ_ERR_UNKNOWN_CHAR;
} }