diff --git a/msvc/ecl-threads.def b/msvc/ecl-threads.def index 8eefa3f4f..40383f5d4 100755 --- a/msvc/ecl-threads.def +++ b/msvc/ecl-threads.def @@ -581,6 +581,7 @@ EXPORTS fixint fixnnint + ecl_fixnum_in_range make_integer make_unsigned_integer make_ratio diff --git a/msvc/ecl.def b/msvc/ecl.def index 9e94d6e00..3d6a842a7 100644 --- a/msvc/ecl.def +++ b/msvc/ecl.def @@ -587,6 +587,7 @@ EXPORTS fixint fixnnint + ecl_fixnum_in_range make_integer make_unsigned_integer make_ratio diff --git a/src/CHANGELOG b/src/CHANGELOG index 4991b865e..bce1cc591 100644 --- a/src/CHANGELOG +++ b/src/CHANGELOG @@ -150,10 +150,13 @@ ECL 1.0: assert_type_character(), assert_type_symbol(). - Lisp functions which disappear: si:set-compiled-function-name, - si:extended-string-concatenate, si:wrong-type-argument. + si:extended-string-concatenate. - New C functions: ecl_stream_to_handle(), ecl_base_char_code(), - ecl_type_error(), ecl_check_cl_type(), ecl_check_type_string(). + ecl_type_error(), ecl_check_cl_type(), ecl_check_type_string(), + ecl_fixnum_in_range(). + + - New Lisp functions: si:wrong-type-argument. - Functions renamed: backup_fopen() -> ecl_backup_fopen() char_code() -> ecl_char_code(), cl_log1() -> ecl_log1(), diff --git a/src/c/number.d b/src/c/number.d index d4ed30dc1..11221e2bf 100644 --- a/src/c/number.d +++ b/src/c/number.d @@ -78,6 +78,23 @@ fixnnint(cl_object x) @':datum', x); } +cl_fixnum +ecl_fixnum_in_range(cl_object fun, const char *what, cl_object value, + cl_fixnum min, cl_fixnum max) +{ + do { + if (FIXNUMP(value)) { + cl_fixnum output = value; + if ((min <= output) && (output <= max)) { + return output; + } + } + value = ecl_type_error(fun, what, value, + cl_list(3,@'integer',MAKE_FIXNUM(min), + MAKE_FIXNUM(max))); + } while(1); +} + cl_object make_integer(cl_fixnum l) { diff --git a/src/h/external.h b/src/h/external.h index 671fe87db..b50904656 100644 --- a/src/h/external.h +++ b/src/h/external.h @@ -850,6 +850,8 @@ extern cl_object one_minus(cl_object x); extern cl_fixnum fixint(cl_object x); extern cl_index fixnnint(cl_object x); +extern cl_fixnum ecl_fixnum_in_range(cl_object fun, const char *what, cl_object value, + cl_fixnum min, cl_fixnum max); extern cl_object make_integer(cl_fixnum i); extern cl_object make_unsigned_integer(cl_index i); extern cl_object make_ratio(cl_object num, cl_object den);