2 SCM_TO_TYPE_PROTO (SCM val
)
6 scm_t_signed_bits n
= SCM_I_INUM (val
);
7 #if SIZEOF_TYPE != 0 && SIZEOF_TYPE > SIZEOF_SCM_T_BITS
10 if (n
>= TYPE_MIN
&& n
<= TYPE_MAX
)
18 else if (SCM_BIGP (val
))
20 if (TYPE_MIN
>= SCM_MOST_NEGATIVE_FIXNUM
21 && TYPE_MAX
<= SCM_MOST_POSITIVE_FIXNUM
)
23 else if (TYPE_MIN
>= LONG_MIN
&& TYPE_MAX
<= LONG_MAX
)
25 if (mpz_fits_slong_p (SCM_I_BIG_MPZ (val
)))
27 long n
= mpz_get_si (SCM_I_BIG_MPZ (val
));
28 #if SIZEOF_TYPE != 0 && SIZEOF_TYPE > SCM_SIZEOF_LONG
31 if (n
>= TYPE_MIN
&& n
<= TYPE_MAX
)
45 if (mpz_sizeinbase (SCM_I_BIG_MPZ (val
), 2)
46 > CHAR_BIT
*sizeof (scm_t_uintmax
))
49 mpz_export (&n
, &count
, 1, sizeof (scm_t_uintmax
), 0, 0,
52 if (mpz_sgn (SCM_I_BIG_MPZ (val
)) >= 0)
64 if (n
>= TYPE_MIN
&& n
<= TYPE_MAX
)
69 scm_out_of_range (NULL
, val
);
76 scm_wrong_type_arg_msg (NULL
, 0, val
, "exact integer");
82 SCM_FROM_TYPE_PROTO (TYPE val
)
84 #if SIZEOF_TYPE != 0 && SIZEOF_TYPE < SIZEOF_SCM_T_BITS
85 return SCM_I_MAKINUM (val
);
87 if (SCM_FIXABLE (val
))
88 return SCM_I_MAKINUM (val
);
89 else if (val
>= LONG_MIN
&& val
<= LONG_MAX
)
91 SCM z
= scm_double_cell (scm_tc16_big
, 0, 0, 0);
92 mpz_init_set_si (SCM_I_BIG_MPZ (z
), val
);
97 SCM z
= scm_double_cell (scm_tc16_big
, 0, 0, 0);
98 mpz_init (SCM_I_BIG_MPZ (z
));
102 mpz_import (SCM_I_BIG_MPZ (z
), 1, 1, sizeof (TYPE
), 0, 0,
104 mpz_neg (SCM_I_BIG_MPZ (z
), SCM_I_BIG_MPZ (z
));
107 mpz_import (SCM_I_BIG_MPZ (z
), 1, 1, sizeof (TYPE
), 0, 0,
119 #undef SCM_TO_TYPE_PROTO
120 #undef SCM_FROM_TYPE_PROTO