From 439491a80e7da458fc79a8b729004bcc45dae17e Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Fri, 13 Nov 2009 01:34:55 -0600 Subject: [PATCH] Support negative fixnums in input, and perform some extra validation. --- reader.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/reader.c b/reader.c index bc5b4dc..b63909f 100644 --- a/reader.c +++ b/reader.c @@ -74,6 +74,7 @@ static value_t read_one_value(reader_state_t *state) return read_special(state); case '(': return read_list(state); + case '-': case '0' ... '9': return read_number(state); case '\"': @@ -218,6 +219,14 @@ static value_t read_list(reader_state_t *state) static value_t read_number(reader_state_t *state) { fixnum_t num = 0; + bool negative = false; + + if (state->ch == '-') + { + negative = true; + next_char(state); + release_assert(isdigit(state->ch)); + } while (isdigit(state->ch)) { @@ -227,6 +236,10 @@ static value_t read_number(reader_state_t *state) next_char(state); } + if (negative) + num = -num; + + release_assert((FIXNUM_MIN <= num) && (num <= FIXNUM_MAX)); return fixnum_value(num); }