adding sexp_make_unsigned_integer, using that in the stubber for unsigned types

This commit is contained in:
Alex Shinn 2009-12-29 14:27:53 +09:00
parent f897ecc9c1
commit e5bcac2142
3 changed files with 26 additions and 5 deletions

View file

@ -474,10 +474,12 @@ sexp sexp_make_flonum(sexp ctx, double f);
#endif #endif
#if SEXP_USE_BIGNUMS #if SEXP_USE_BIGNUMS
SEXP_API sexp sexp_make_integer(sexp ctx, sexp_sint_t x); SEXP_API sexp sexp_make_integer(sexp ctx, sexp_lsint_t x);
SEXP_API sexp sexp_make_unsigned_integer(sexp ctx, sexp_luint_t x);
#define sexp_exact_integerp(x) (sexp_fixnump(x) || sexp_bignump(x)) #define sexp_exact_integerp(x) (sexp_fixnump(x) || sexp_bignump(x))
#else #else
#define sexp_make_integer(ctx, x) sexp_make_fixnum(x) #define sexp_make_integer(ctx, x) sexp_make_fixnum(x)
#define sexp_make_unsigned_integer(ctx, x) sexp_make_fixnum(x)
#define sexp_exact_integerp(x) sexp_fixnump(x) #define sexp_exact_integerp(x) sexp_fixnump(x)
#endif #endif

View file

@ -25,14 +25,31 @@ sexp sexp_fixnum_to_bignum (sexp ctx, sexp a) {
return res; return res;
} }
sexp sexp_make_integer (sexp ctx, sexp_sint_t x) { sexp sexp_make_integer (sexp ctx, sexp_lsint_t x) {
sexp res; sexp res;
if ((SEXP_MIN_FIXNUM < x) && (x < SEXP_MAX_FIXNUM)) { if ((SEXP_MIN_FIXNUM < x) && (x < SEXP_MAX_FIXNUM)) {
res = sexp_make_fixnum(x); res = sexp_make_fixnum(x);
} else { } else {
res = sexp_make_bignum(ctx, 1); res = sexp_make_bignum(ctx, 1);
sexp_bignum_sign(res) = (x < 0 ? -1 : 1); if (x < 0) {
sexp_bignum_data(res)[0] = x * sexp_bignum_sign(res); sexp_bignum_sign(res) = -1;
sexp_bignum_data(res)[0] = -x;
} else {
sexp_bignum_sign(res) = 1;
sexp_bignum_data(res)[0] = x;
}
}
return res;
}
sexp sexp_make_unsigned_integer (sexp ctx, sexp_luint_t x) {
sexp res;
if (x < SEXP_MAX_FIXNUM) {
res = sexp_make_fixnum(x);
} else {
res = sexp_make_bignum(ctx, 1);
sexp_bignum_sign(res) = 1;
sexp_bignum_data(res)[0] = x;
} }
return res; return res;
} }

View file

@ -452,7 +452,9 @@
(cat "sexp_make_boolean(" val ")")) (cat "sexp_make_boolean(" val ")"))
((eq? base 'time_t) ((eq? base 'time_t)
(cat "sexp_make_integer(ctx, sexp_shift_epoch(" val "))")) (cat "sexp_make_integer(ctx, sexp_shift_epoch(" val "))"))
((int-type? base) ((unsigned-int-type? base)
(cat "sexp_make_unsigned_integer(ctx, " val ")"))
((signed-int-type? base)
(cat "sexp_make_integer(ctx, " val ")")) (cat "sexp_make_integer(ctx, " val ")"))
((eq? base 'char) ((eq? base 'char)
(if (type-array type) (if (type-array type)