2 SCM_TO_TYPE_PROTO (SCM val
)
6 scm_t_signed_bits n
= SCM_I_INUM (val
);
8 && ((scm_t_uintmax
)n
) >= TYPE_MIN
&& ((scm_t_uintmax
)n
) <= TYPE_MAX
)
13 scm_out_of_range (NULL
, val
);
17 else if (SCM_BIGP (val
))
19 if (TYPE_MAX
<= SCM_MOST_POSITIVE_FIXNUM
)
21 else if (TYPE_MAX
<= ULONG_MAX
)
23 if (mpz_fits_ulong_p (SCM_I_BIG_MPZ (val
)))
25 unsigned long n
= mpz_get_ui (SCM_I_BIG_MPZ (val
));
26 #if SIZEOF_TYPE != 0 && SIZEOF_TYPE > SCM_SIZEOF_LONG
29 if (n
>= TYPE_MIN
&& n
<= TYPE_MAX
)
43 if (mpz_sgn (SCM_I_BIG_MPZ (val
)) < 0)
46 if (mpz_sizeinbase (SCM_I_BIG_MPZ (val
), 2)
47 > CHAR_BIT
*sizeof (TYPE
))
50 mpz_export (&n
, &count
, 1, sizeof (TYPE
), 0, 0, SCM_I_BIG_MPZ (val
));
52 if (n
>= TYPE_MIN
&& n
<= TYPE_MAX
)
60 scm_wrong_type_arg_msg (NULL
, 0, val
, "exact integer");
66 SCM_FROM_TYPE_PROTO (TYPE val
)
68 #if SIZEOF_TYPE != 0 && SIZEOF_TYPE < SIZEOF_SCM_T_BITS
69 return SCM_I_MAKINUM (val
);
71 if (SCM_POSFIXABLE (val
))
72 return SCM_I_MAKINUM (val
);
73 else if (val
<= ULONG_MAX
)
75 SCM z
= scm_double_cell (scm_tc16_big
, 0, 0, 0);
76 mpz_init_set_ui (SCM_I_BIG_MPZ (z
), val
);
81 SCM z
= scm_double_cell (scm_tc16_big
, 0, 0, 0);
82 mpz_init (SCM_I_BIG_MPZ (z
));
83 mpz_import (SCM_I_BIG_MPZ (z
), 1, 1, sizeof (TYPE
), 0, 0, &val
);
93 #undef SCM_TO_TYPE_PROTO
94 #undef SCM_FROM_TYPE_PROTO