From f51d67a86b1bcdc7f594c245f6c60d739a14d786 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Tue, 6 Sep 2011 00:27:30 +0900 Subject: [PATCH] more numeric reader tweaks --- include/chibi/sexp.h | 4 ++-- sexp.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/chibi/sexp.h b/include/chibi/sexp.h index 77728fa0..fa1b1e0c 100755 --- a/include/chibi/sexp.h +++ b/include/chibi/sexp.h @@ -657,9 +657,9 @@ SEXP_API sexp sexp_make_unsigned_integer(sexp ctx, sexp_luint_t x); #if SEXP_USE_FLONUMS #define sexp_fixnum_to_flonum(ctx, x) (sexp_make_flonum(ctx, sexp_unbox_fixnum(x))) #if SEXP_USE_RATIOS -#define sexp_realp(x) (sexp_exact_integerp(x) || sexp_flonump(x)) -#else #define sexp_realp(x) (sexp_exact_integerp(x) || sexp_flonump(x) || sexp_ratiop(x)) +#else +#define sexp_realp(x) (sexp_exact_integerp(x) || sexp_flonump(x)) #endif #else #define sexp_fixnum_to_flonum(ctx, x) (x) diff --git a/sexp.c b/sexp.c index 8c896551..9fe47dbe 100644 --- a/sexp.c +++ b/sexp.c @@ -1915,6 +1915,8 @@ sexp sexp_read_number (sexp ctx, sexp in, int base) { if ((c!=EOF) && ! is_separator(c)) return sexp_read_error(ctx, "invalid numeric syntax", sexp_make_character(c), in); + else if (tmp < 0) + return sexp_read_error(ctx, "digitless numeric literal", SEXP_NULL, in); sexp_push_char(ctx, c, in); } @@ -2386,10 +2388,8 @@ sexp sexp_string_to_number_op (sexp ctx sexp_api_params(self, n), sexp str, sexp if (isdigit(sexp_string_data(str)[1]) || sexp_string_data(str)[1] == '.' || sexp_string_data(str)[1] == '#') sexp_read_char(ctx, in); - else - return SEXP_FALSE; } - in = ((sexp_string_data(str)[0] == '#') ? + in = ((sexp_string_data(str)[0] == '#') || base == 10 ? sexp_read(ctx, in) : sexp_read_number(ctx, in, base)); sexp_gc_release1(ctx); return sexp_numberp(in) ? in : SEXP_FALSE;