X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/32c9168774de6c425e05ed16c2f89dd8d8de0936..dc7da0be90d6033d512f9772894179970af678e7:/libguile/numbers.h diff --git a/libguile/numbers.h b/libguile/numbers.h index e6238fe3c..08b04cfd8 100644 --- a/libguile/numbers.h +++ b/libguile/numbers.h @@ -3,45 +3,35 @@ #ifndef SCM_NUMBERS_H #define SCM_NUMBERS_H -/* Copyright (C) 1995,1996,1998,2000,2001,2002,2003,2004 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,2000,2001,2002,2003,2004,2005, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA */ +#include + #include "libguile/__scm.h" #include "libguile/print.h" -#if SCM_HAVE_FLOATINGPOINT_H -# include -#endif - -#if SCM_HAVE_IEEEFP_H -# include -#endif - -#if SCM_HAVE_NAN_H -# if defined (SCO) -# define _IEEE 1 -# endif -# include -# if defined (SCO) -# undef _IEEE -# endif -#endif /* SCM_HAVE_NAN_H */ +#ifndef SCM_T_WCHAR_DEFINED +typedef scm_t_int32 scm_t_wchar; +#define SCM_T_WCHAR_DEFINED +#endif /* SCM_T_WCHAR_DEFINED */ @@ -66,12 +56,11 @@ #endif /* (-1 == (((-1) << 2) + 2) >> 2) */ -#define SCM_INUMP(x) (2 & SCM_UNPACK (x)) -#define SCM_NINUMP(x) (!SCM_INUMP (x)) -#define SCM_MAKINUM(x) \ +#define SCM_I_INUMP(x) (2 & SCM_UNPACK (x)) +#define SCM_I_NINUMP(x) (!SCM_I_INUMP (x)) +#define SCM_I_MAKINUM(x) \ (SCM_PACK ((((scm_t_signed_bits) (x)) << 2) + scm_tc2_int)) -#define SCM_INUM(x) (SCM_SRS ((scm_t_signed_bits) SCM_UNPACK (x), 2)) - +#define SCM_I_INUM(x) (SCM_SRS ((scm_t_signed_bits) SCM_UNPACK (x), 2)) /* SCM_FIXABLE is true if its long argument can be encoded in an SCM_INUM. */ #define SCM_POSFIXABLE(n) ((n) <= SCM_MOST_POSITIVE_FIXNUM) @@ -79,8 +68,8 @@ #define SCM_FIXABLE(n) (SCM_POSFIXABLE (n) && SCM_NEGFIXABLE (n)) -/* A name for 0. */ -#define SCM_INUM0 (SCM_MAKINUM (0)) +#define SCM_INUM0 (SCM_I_MAKINUM (0)) /* A name for 0 */ +#define SCM_INUM1 (SCM_I_MAKINUM (1)) /* A name for 1 */ /* SCM_MAXEXP is the maximum double precision exponent @@ -92,7 +81,6 @@ # include # ifdef __MINGW32__ # define copysign _copysign -# define isnan _isnan # define finite _finite # endif /* __MINGW32__ */ # endif /* ndef GO32 */ @@ -111,10 +99,12 @@ #endif /* def FLT_MAX */ -/* SCM_INTBUFLEN is the maximum number of characters neccessary for the - * printed or scm_string representation of an exact immediate. +/* SCM_INTBUFLEN is the maximum number of characters neccessary for + * the printed or scm_string representation of an scm_t_intmax in + * radix 2. The buffer passed to scm_iint2str and scm_iuint2str must + * be of this size, for example. */ -#define SCM_INTBUFLEN (5 + SCM_LONG_BIT) +#define SCM_INTBUFLEN (5 + SCM_CHAR_BIT*sizeof(scm_t_intmax)) @@ -135,35 +125,23 @@ #define SCM_INEXACTP(x) \ (!SCM_IMP (x) && (0xfeff & SCM_CELL_TYPE (x)) == scm_tc16_real) -#define SCM_REALP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_real) -#define SCM_COMPLEXP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_complex) +#define SCM_REALP(x) (SCM_HAS_TYP16 (x, scm_tc16_real)) +#define SCM_COMPLEXP(x) (SCM_HAS_TYP16 (x, scm_tc16_complex)) #define SCM_REAL_VALUE(x) (((scm_t_double *) SCM2PTR (x))->real) -#define SCM_COMPLEX_MEM(x) ((scm_t_complex *) SCM_CELL_WORD_1 (x)) -#define SCM_COMPLEX_REAL(x) (SCM_COMPLEX_MEM (x)->real) -#define SCM_COMPLEX_IMAG(x) (SCM_COMPLEX_MEM (x)->imag) +#define SCM_COMPLEX_REAL(x) (((scm_t_complex *) SCM2PTR (x))->real) +#define SCM_COMPLEX_IMAG(x) (((scm_t_complex *) SCM2PTR (x))->imag) /* Each bignum is just an mpz_t stored in a double cell starting at word 1. */ -#define SCM_I_BIG_MPZ(x) (*((mpz_t *) (&(SCM_CELL_WORD_1(x))))) -#define SCM_BIGP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_big) - -#define SCM_NUMBERP(x) (SCM_INUMP(x) || SCM_NUMP(x)) -#define SCM_NUMP(x) (!SCM_IMP(x) \ - && (((0xfcff & SCM_CELL_TYPE (x)) == scm_tc7_number) \ - || ((0xfbff & SCM_CELL_TYPE (x)) == scm_tc7_number))) -/* 0xfcff (#b1100) for 0 free, 1 big, 2 real, 3 complex, then 0xfbff (#b1011) for 4 fraction */ - -#define SCM_FRACTIONP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_fraction) -#define SCM_SLOPPY_FRACTIONP(x) (SCM_TYP16 (x) == scm_tc16_fraction) -#define SCM_FRACTION_NUMERATOR(x) ((SCM) (SCM_CELL_WORD_1 (x))) -#define SCM_FRACTION_DENOMINATOR(x) ((SCM) (SCM_CELL_WORD_2 (x))) -#define SCM_FRACTION_SET_NUMERATOR(x, v) ((SCM) (SCM_SET_CELL_WORD_1 ((x), (v)))) -#define SCM_FRACTION_SET_DENOMINATOR(x, v) ((SCM) (SCM_SET_CELL_WORD_2 ((x), (v)))) - /* I think the left half word is free in the type, so I'll use bit 17 */ -#define SCM_FRACTION_REDUCED_BIT 0x10000 -#define SCM_FRACTION_REDUCED_SET(x) (SCM_SET_CELL_TYPE((x), (SCM_CELL_TYPE (x) | SCM_FRACTION_REDUCED_BIT))) -#define SCM_FRACTION_REDUCED_CLEAR(x) (SCM_SET_CELL_TYPE((x), (SCM_CELL_TYPE (x) & ~SCM_FRACTION_REDUCED_BIT))) -#define SCM_FRACTION_REDUCED(x) (0x10000 & SCM_CELL_TYPE (x)) +#define SCM_I_BIG_MPZ(x) (*((mpz_t *) (SCM_CELL_OBJECT_LOC((x),1)))) +#define SCM_BIGP(x) (SCM_HAS_TYP16 (x, scm_tc16_big)) + +#define SCM_NUMBERP(x) (SCM_I_INUMP(x) || SCM_NUMP(x)) +#define SCM_NUMP(x) (SCM_HAS_TYP7 (x, scm_tc7_number)) + +#define SCM_FRACTIONP(x) (SCM_HAS_TYP16 (x, scm_tc16_fraction)) +#define SCM_FRACTION_NUMERATOR(x) (SCM_CELL_OBJECT_1 (x)) +#define SCM_FRACTION_DENOMINATOR(x) (SCM_CELL_OBJECT_2 (x)) @@ -176,23 +154,46 @@ typedef struct scm_t_double typedef struct scm_t_complex { + SCM type; + SCM pad; double real; double imag; } scm_t_complex; + SCM_API SCM scm_exact_p (SCM x); +SCM_API int scm_is_exact (SCM x); SCM_API SCM scm_odd_p (SCM n); SCM_API SCM scm_even_p (SCM n); -SCM_API SCM scm_inf_p (SCM n); -SCM_API SCM scm_nan_p (SCM n); +SCM_API SCM scm_finite_p (SCM x); +SCM_API SCM scm_inf_p (SCM x); +SCM_API SCM scm_nan_p (SCM x); SCM_API SCM scm_inf (void); SCM_API SCM scm_nan (void); SCM_API SCM scm_abs (SCM x); SCM_API SCM scm_quotient (SCM x, SCM y); SCM_API SCM scm_remainder (SCM x, SCM y); SCM_API SCM scm_modulo (SCM x, SCM y); +SCM_API void scm_euclidean_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_euclidean_quotient (SCM x, SCM y); +SCM_API SCM scm_euclidean_remainder (SCM x, SCM y); +SCM_API void scm_floor_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_floor_quotient (SCM x, SCM y); +SCM_API SCM scm_floor_remainder (SCM x, SCM y); +SCM_API void scm_ceiling_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_ceiling_quotient (SCM x, SCM y); +SCM_API SCM scm_ceiling_remainder (SCM x, SCM y); +SCM_API void scm_truncate_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_truncate_quotient (SCM x, SCM y); +SCM_API SCM scm_truncate_remainder (SCM x, SCM y); +SCM_API void scm_centered_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_centered_quotient (SCM x, SCM y); +SCM_API SCM scm_centered_remainder (SCM x, SCM y); +SCM_API void scm_round_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_round_quotient (SCM x, SCM y); +SCM_API SCM scm_round_remainder (SCM x, SCM y); SCM_API SCM scm_gcd (SCM x, SCM y); SCM_API SCM scm_lcm (SCM n1, SCM n2); SCM_API SCM scm_logand (SCM n1, SCM n2); @@ -201,29 +202,46 @@ SCM_API SCM scm_logxor (SCM n1, SCM n2); SCM_API SCM scm_logtest (SCM n1, SCM n2); SCM_API SCM scm_logbit_p (SCM n1, SCM n2); SCM_API SCM scm_lognot (SCM n); -SCM_API SCM scm_modular_expt (SCM n, SCM k, SCM m); +SCM_API SCM scm_modulo_expt (SCM n, SCM k, SCM m); SCM_API SCM scm_integer_expt (SCM z1, SCM z2); SCM_API SCM scm_ash (SCM n, SCM cnt); SCM_API SCM scm_bit_extract (SCM n, SCM start, SCM end); SCM_API SCM scm_logcount (SCM n); SCM_API SCM scm_integer_length (SCM n); -SCM_API size_t scm_iint2str (long num, int rad, char *p); +SCM_INTERNAL SCM scm_i_euclidean_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_floor_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_ceiling_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_truncate_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_centered_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_round_divide (SCM x, SCM y); + +SCM_INTERNAL SCM scm_i_gcd (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_lcm (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_logand (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_logior (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_logxor (SCM x, SCM y, SCM rest); + +SCM_API size_t scm_iint2str (scm_t_intmax num, int rad, char *p); +SCM_API size_t scm_iuint2str (scm_t_uintmax num, int rad, char *p); SCM_API SCM scm_number_to_string (SCM x, SCM radix); SCM_API int scm_print_real (SCM sexp, SCM port, scm_print_state *pstate); SCM_API int scm_print_complex (SCM sexp, SCM port, scm_print_state *pstate); SCM_API int scm_bigprint (SCM exp, SCM port, scm_print_state *pstate); -SCM_API SCM scm_i_mem2number (const char *mem, size_t len, unsigned int radix); +SCM_API SCM scm_c_locale_stringn_to_number (const char *mem, size_t len, + unsigned int radix); +SCM_INTERNAL SCM scm_i_string_to_number (SCM str, unsigned int radix); SCM_API SCM scm_string_to_number (SCM str, SCM radix); -SCM_API SCM scm_make_real (double x); -SCM_API SCM scm_make_complex (double x, double y); SCM_API SCM scm_bigequal (SCM x, SCM y); SCM_API SCM scm_real_equalp (SCM x, SCM y); SCM_API SCM scm_complex_equalp (SCM x, SCM y); SCM_API SCM scm_number_p (SCM x); +SCM_API SCM scm_complex_p (SCM x); SCM_API SCM scm_real_p (SCM x); +SCM_API SCM scm_rational_p (SCM z); SCM_API SCM scm_integer_p (SCM x); SCM_API SCM scm_inexact_p (SCM x); +SCM_API int scm_is_inexact (SCM x); SCM_API SCM scm_num_eq_p (SCM x, SCM y); SCM_API SCM scm_less_p (SCM x, SCM y); SCM_API SCM scm_gr_p (SCM x, SCM y); @@ -235,21 +253,30 @@ SCM_API SCM scm_negative_p (SCM x); SCM_API SCM scm_max (SCM x, SCM y); SCM_API SCM scm_min (SCM x, SCM y); SCM_API SCM scm_sum (SCM x, SCM y); +SCM_API SCM scm_oneplus (SCM x); SCM_API SCM scm_difference (SCM x, SCM y); +SCM_API SCM scm_oneminus (SCM x); SCM_API SCM scm_product (SCM x, SCM y); -SCM_API double scm_num2dbl (SCM a, const char * why); SCM_API SCM scm_divide (SCM x, SCM y); SCM_API SCM scm_floor (SCM x); SCM_API SCM scm_ceiling (SCM x); -SCM_API double scm_asinh (double x); -SCM_API double scm_acosh (double x); -SCM_API double scm_atanh (double x); -SCM_API double scm_truncate (double x); -SCM_API double scm_round (double x); +SCM_API double scm_c_truncate (double x); +SCM_API double scm_c_round (double x); SCM_API SCM scm_truncate_number (SCM x); SCM_API SCM scm_round_number (SCM x); -SCM_API SCM scm_sys_expt (SCM z1, SCM z2); -SCM_API SCM scm_sys_atan2 (SCM z1, SCM z2); +SCM_API SCM scm_expt (SCM z1, SCM z2); +SCM_API SCM scm_sin (SCM z); +SCM_API SCM scm_cos (SCM z); +SCM_API SCM scm_tan (SCM z); +SCM_API SCM scm_sinh (SCM z); +SCM_API SCM scm_cosh (SCM z); +SCM_API SCM scm_tanh (SCM z); +SCM_API SCM scm_asin (SCM z); +SCM_API SCM scm_acos (SCM z); +SCM_API SCM scm_atan (SCM x, SCM y); +SCM_API SCM scm_sys_asinh (SCM z); +SCM_API SCM scm_sys_acosh (SCM z); +SCM_API SCM scm_sys_atanh (SCM z); SCM_API SCM scm_make_rectangular (SCM z1, SCM z2); SCM_API SCM scm_make_polar (SCM z1, SCM z2); SCM_API SCM scm_real_part (SCM z); @@ -259,88 +286,240 @@ SCM_API SCM scm_angle (SCM z); SCM_API SCM scm_exact_to_inexact (SCM z); SCM_API SCM scm_inexact_to_exact (SCM z); SCM_API SCM scm_trunc (SCM x); - -SCM_API SCM scm_short2num (short n); -SCM_API SCM scm_ushort2num (unsigned short n); -SCM_API SCM scm_int2num (int n); -SCM_API SCM scm_uint2num (unsigned int n); -SCM_API SCM scm_long2num (long n); -SCM_API SCM scm_ulong2num (unsigned long n); -SCM_API SCM scm_size2num (size_t n); -SCM_API SCM scm_ptrdiff2num (scm_t_ptrdiff n); -SCM_API short scm_num2short (SCM num, unsigned long int pos, - const char *s_caller); -SCM_API unsigned short scm_num2ushort (SCM num, unsigned long int pos, - const char *s_caller); -SCM_API int scm_num2int (SCM num, unsigned long int pos, - const char *s_caller); -SCM_API unsigned int scm_num2uint (SCM num, unsigned long int pos, - const char *s_caller); -SCM_API long scm_num2long (SCM num, unsigned long int pos, - const char *s_caller); -SCM_API unsigned long scm_num2ulong (SCM num, unsigned long int pos, - const char *s_caller); -SCM_API scm_t_ptrdiff scm_num2ptrdiff (SCM num, unsigned long int pos, - const char *s_caller); -SCM_API size_t scm_num2size (SCM num, unsigned long int pos, - const char *s_caller); -#if SCM_SIZEOF_LONG_LONG != 0 -SCM_API SCM scm_long_long2num (long long sl); -SCM_API SCM scm_ulong_long2num (unsigned long long sl); -SCM_API long long scm_num2long_long (SCM num, unsigned long int pos, - const char *s_caller); -SCM_API unsigned long long scm_num2ulong_long (SCM num, unsigned long int pos, - const char *s_caller); -#endif - -SCM_API SCM scm_float2num (float n); -SCM_API SCM scm_double2num (double n); -SCM_API float scm_num2float (SCM num, unsigned long int pos, - const char *s_caller); -SCM_API double scm_num2double (SCM num, unsigned long int pos, - const char *s_caller); - +SCM_API SCM scm_log (SCM z); +SCM_API SCM scm_log10 (SCM z); +SCM_API SCM scm_exp (SCM z); +SCM_API SCM scm_sqrt (SCM z); +SCM_API void scm_exact_integer_sqrt (SCM k, SCM *s, SCM *r); + +SCM_INTERNAL SCM scm_i_min (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_max (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_sum (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_difference (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_product (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_divide (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_exact_integer_sqrt (SCM k); /* bignum internal functions */ -SCM_API SCM scm_i_mkbig (void); -SCM_API SCM scm_i_normbig (SCM x); -SCM_API int scm_i_bigcmp (SCM a, SCM b); -SCM_API SCM scm_i_dbl2big (double d); -SCM_API SCM scm_i_dbl2num (double d); -SCM_API double scm_i_big2dbl (SCM b); -SCM_API SCM scm_i_short2big (short n); -SCM_API SCM scm_i_ushort2big (unsigned short n); -SCM_API SCM scm_i_int2big (int n); -SCM_API SCM scm_i_uint2big (unsigned int n); -SCM_API SCM scm_i_long2big (long n); -SCM_API SCM scm_i_ulong2big (unsigned long n); -SCM_API SCM scm_i_size2big (size_t n); -SCM_API SCM scm_i_ptrdiff2big (scm_t_ptrdiff n); - -#if SCM_SIZEOF_LONG_LONG != 0 -SCM_API SCM scm_i_long_long2big (long long n); -SCM_API SCM scm_i_ulong_long2big (unsigned long long n); -#endif - +SCM_INTERNAL SCM scm_i_mkbig (void); +SCM_API /* FIXME: not internal */ SCM scm_i_normbig (SCM x); +SCM_INTERNAL int scm_i_bigcmp (SCM a, SCM b); +SCM_INTERNAL SCM scm_i_dbl2big (double d); +SCM_INTERNAL SCM scm_i_dbl2num (double d); +SCM_API /* FIXME: not internal */ double scm_i_big2dbl (SCM b); +SCM_API /* FIXME: not internal */ SCM scm_i_long2big (long n); +SCM_API /* FIXME: not internal */ SCM scm_i_ulong2big (unsigned long n); +SCM_API /* FIXME: not internal */ SCM scm_i_clonebig (SCM src_big, int same_sign_p); /* ratio functions */ -SCM_API SCM scm_make_ratio (SCM num, SCM den); SCM_API SCM scm_rationalize (SCM x, SCM err); SCM_API SCM scm_numerator (SCM z); SCM_API SCM scm_denominator (SCM z); -SCM_API SCM scm_rational_p (SCM z); /* fraction internal functions */ -SCM_API double scm_i_fraction2double (SCM z); -SCM_API SCM scm_i_fraction_equalp (SCM x, SCM y); -SCM_API int scm_i_print_fraction (SCM sexp, SCM port, scm_print_state *pstate); +SCM_INTERNAL double scm_i_fraction2double (SCM z); +SCM_INTERNAL SCM scm_i_fraction_equalp (SCM x, SCM y); +SCM_INTERNAL int scm_i_print_fraction (SCM sexp, SCM port, scm_print_state *pstate); + +/* general internal functions */ +SCM_INTERNAL void scm_i_print_double (double val, SCM port); +SCM_INTERNAL void scm_i_print_complex (double real, double imag, SCM port); +/* conversion functions for integers */ -#ifdef GUILE_DEBUG -SCM_API SCM scm_sys_check_number_conversions (void); +SCM_API int scm_is_integer (SCM val); +SCM_API int scm_is_signed_integer (SCM val, + scm_t_intmax min, scm_t_intmax max); +SCM_API int scm_is_unsigned_integer (SCM val, + scm_t_uintmax min, scm_t_uintmax max); + +SCM_API SCM scm_from_signed_integer (scm_t_intmax val); +SCM_API SCM scm_from_unsigned_integer (scm_t_uintmax val); + +SCM_API scm_t_intmax scm_to_signed_integer (SCM val, + scm_t_intmax min, + scm_t_intmax max); +SCM_API scm_t_uintmax scm_to_unsigned_integer (SCM val, + scm_t_uintmax min, + scm_t_uintmax max); + +SCM_API scm_t_int8 scm_to_int8 (SCM x); +SCM_API SCM scm_from_int8 (scm_t_int8 x); + +SCM_API scm_t_uint8 scm_to_uint8 (SCM x); +SCM_API SCM scm_from_uint8 (scm_t_uint8 x); + +SCM_API scm_t_int16 scm_to_int16 (SCM x); +SCM_API SCM scm_from_int16 (scm_t_int16 x); + +SCM_API scm_t_uint16 scm_to_uint16 (SCM x); +SCM_API SCM scm_from_uint16 (scm_t_uint16 x); + +SCM_API scm_t_int32 scm_to_int32 (SCM x); +SCM_API SCM scm_from_int32 (scm_t_int32 x); + +SCM_API scm_t_uint32 scm_to_uint32 (SCM x); +SCM_API SCM scm_from_uint32 (scm_t_uint32 x); + +SCM_API scm_t_wchar scm_to_wchar (SCM x); +SCM_API SCM scm_from_wchar (scm_t_wchar x); + +SCM_API scm_t_int64 scm_to_int64 (SCM x); +SCM_API SCM scm_from_int64 (scm_t_int64 x); + +SCM_API scm_t_uint64 scm_to_uint64 (SCM x); +SCM_API SCM scm_from_uint64 (scm_t_uint64 x); + +SCM_API void scm_to_mpz (SCM x, mpz_t rop); +SCM_API SCM scm_from_mpz (mpz_t rop); + + +/* The conversion functions for other types are aliased to the + appropriate ones from above. We pick the right one based on the + size of the type. + + Not each and every possibility is covered by the code below, and + while it is trivial to complete the tests, it might be better to + just test for the 'sane' possibilities. When one of the tests + below fails, chances are good that some silent assumption somewhere + else will also fail. +*/ + +#if SCM_SIZEOF_CHAR == 1 +#define scm_to_schar scm_to_int8 +#define scm_from_schar scm_from_int8 +#define scm_to_uchar scm_to_uint8 +#define scm_from_uchar scm_from_uint8 +#if CHAR_MIN == 0 +#define scm_to_char scm_to_uint8 +#define scm_from_char scm_from_uint8 +#else +#define scm_to_char scm_to_int8 +#define scm_from_char scm_from_int8 #endif +#else +#error sizeof(char) is not 1. +#endif + +#if SCM_SIZEOF_SHORT == 1 +#define scm_to_short scm_to_int8 +#define scm_from_short scm_from_int8 +#define scm_to_ushort scm_to_uint8 +#define scm_from_ushort scm_from_uint8 +#else +#if SCM_SIZEOF_SHORT == 2 +#define scm_to_short scm_to_int16 +#define scm_from_short scm_from_int16 +#define scm_to_ushort scm_to_uint16 +#define scm_from_ushort scm_from_uint16 +#else +#if SCM_SIZEOF_SHORT == 4 +#define scm_to_short scm_to_int32 +#define scm_from_short scm_from_int32 +#define scm_to_ushort scm_to_uint32 +#define scm_from_ushort scm_from_uint32 +#else +#error sizeof(short) is not 1, 2, or 4. +#endif +#endif +#endif + +#if SCM_SIZEOF_INT == 4 +#define scm_to_int scm_to_int32 +#define scm_from_int scm_from_int32 +#define scm_to_uint scm_to_uint32 +#define scm_from_uint scm_from_uint32 +#else +#if SCM_SIZEOF_INT == 8 +#define scm_to_int scm_to_int64 +#define scm_from_int scm_from_int64 +#define scm_to_uint scm_to_uint64 +#define scm_from_uint scm_from_uint64 +#else +#error sizeof(int) is not 4 or 8. +#endif +#endif + +#if SCM_SIZEOF_LONG == 4 +#define scm_to_long scm_to_int32 +#define scm_from_long scm_from_int32 +#define scm_to_ulong scm_to_uint32 +#define scm_from_ulong scm_from_uint32 +#else +#if SCM_SIZEOF_LONG == 8 +#define scm_to_long scm_to_int64 +#define scm_from_long scm_from_int64 +#define scm_to_ulong scm_to_uint64 +#define scm_from_ulong scm_from_uint64 +#else +#error sizeof(long) is not 4 or 8. +#endif +#endif + +#if SCM_SIZEOF_INTMAX == 4 +#define scm_to_intmax scm_to_int32 +#define scm_from_intmax scm_from_int32 +#define scm_to_uintmax scm_to_uint32 +#define scm_from_uintmax scm_from_uint32 +#else +#if SCM_SIZEOF_INTMAX == 8 +#define scm_to_intmax scm_to_int64 +#define scm_from_intmax scm_from_int64 +#define scm_to_uintmax scm_to_uint64 +#define scm_from_uintmax scm_from_uint64 +#else +#error sizeof(scm_t_intmax) is not 4 or 8. +#endif +#endif + +#if SCM_SIZEOF_LONG_LONG == 0 +#else +#if SCM_SIZEOF_LONG_LONG == 8 +#define scm_to_long_long scm_to_int64 +#define scm_from_long_long scm_from_int64 +#define scm_to_ulong_long scm_to_uint64 +#define scm_from_ulong_long scm_from_uint64 +#else +#error sizeof(long long) is not 8. +#endif +#endif + +#if SCM_SIZEOF_SIZE_T == 4 +#define scm_to_ssize_t scm_to_int32 +#define scm_from_ssize_t scm_from_int32 +#define scm_to_size_t scm_to_uint32 +#define scm_from_size_t scm_from_uint32 +#else +#if SCM_SIZEOF_SIZE_T == 8 +#define scm_to_ssize_t scm_to_int64 +#define scm_from_ssize_t scm_from_int64 +#define scm_to_size_t scm_to_uint64 +#define scm_from_size_t scm_from_uint64 +#else +#error sizeof(size_t) is not 4 or 8. +#endif +#endif + +/* conversion functions for double */ + +SCM_API int scm_is_real (SCM val); +SCM_API int scm_is_rational (SCM val); +SCM_API double scm_to_double (SCM val); +SCM_API SCM scm_from_double (double val); + +/* conversion functions for complex */ + +SCM_API int scm_is_complex (SCM val); +SCM_API SCM scm_c_make_rectangular (double re, double im); +SCM_API SCM scm_c_make_polar (double mag, double ang); +SCM_API double scm_c_real_part (SCM z); +SCM_API double scm_c_imag_part (SCM z); +SCM_API double scm_c_magnitude (SCM z); +SCM_API double scm_c_angle (SCM z); + +SCM_API int scm_is_number (SCM val); -SCM_API void scm_init_numbers (void); +SCM_INTERNAL void scm_init_numbers (void); #endif /* SCM_NUMBERS_H */