=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/ox.c,v retrieving revision 1.39 retrieving revision 1.46 diff -u -p -r1.39 -r1.46 --- OpenXM/src/ox_toolkit/ox.c 2015/08/04 07:41:49 1.39 +++ OpenXM/src/ox_toolkit/ox.c 2016/06/28 11:59:15 1.46 @@ -1,5 +1,5 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.38 2015/08/04 05:24:44 noro Exp $ */ +/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.45 2015/08/27 03:03:33 ohara Exp $ */ /* This module includes functions for sending/receiveng CMO's. @@ -11,18 +11,22 @@ #include #include #include -#include #include -#include #include +#include +#if !defined(_MSC_VER) +#include +#include +#endif #include /* XXX : defined in mpfr-impl.h */ #define MPFR_PREC(x) ((x)->_mpfr_prec) #define MPFR_EXP(x) ((x)->_mpfr_exp) #define MPFR_MANT(x) ((x)->_mpfr_d) -#define MPFR_LAST_LIMB(x) ((MPFR_PREC (x) - 1) / GMP_NUMB_BITS) -#define MPFR_LIMB_SIZE(x) (MPFR_LAST_LIMB (x) + 1) +#define RAT_CEIL(nm,dn) (((nm)+(dn)-1)/((dn))) +#define MPFR_LIMB_SIZE_REAL(x) (RAT_CEIL(MPFR_PREC((x)),sizeof(mp_limb_t)*CHAR_BIT) * (sizeof(mp_limb_t)/sizeof(int)) ) +#define MPFR_LIMB_SIZE_BODY(x) (RAT_CEIL(MPFR_PREC((x)),sizeof(unsigned int)*CHAR_BIT)) #if SIZEOF_LONG==4 typedef long long L64; @@ -70,7 +74,9 @@ static cmo_zz* receive_cmo_zz(OXFILE *oxfp); static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz); static int send_cmo_zz(OXFILE *oxfp, cmo_zz* c); static int send_mpz(OXFILE *oxfp, mpz_ptr mpz); +static cmo_bf* receive_cmo_bf(OXFILE *oxfp); static void receive_mpfr(OXFILE *oxfp, mpfr_ptr mpfr); +static int send_cmo_bf(OXFILE *oxfp, cmo_bf* c); static int send_mpfr(OXFILE *oxfp, mpfr_ptr mpfr); /* hook functions. (yet not implemented) */ @@ -244,6 +250,16 @@ static cmo_bf* receive_cmo_bf(OXFILE *oxfp) return new_cmo_bf_set_mpfr(num); } +static cmo_complex* receive_cmo_complex(OXFILE *oxfp) +{ + cmo *re, *im; + + re = receive_cmo(oxfp); + im = receive_cmo(oxfp); + return new_cmo_complex_set_re_im(re,im); +} + + static cmo_zero* receive_cmo_zero(OXFILE *oxfp) { return new_cmo_zero(); @@ -371,6 +387,9 @@ cmo *receive_cmo_tag(OXFILE *oxfp, int tag) case CMO_BIGFLOAT: m = (cmo *)receive_cmo_bf(oxfp); break; + case CMO_COMPLEX: + m = (cmo *)receive_cmo_complex(oxfp); + break; case CMO_ZERO: m = (cmo *)receive_cmo_zero(oxfp); break; @@ -656,6 +675,13 @@ static int send_cmo_bf(OXFILE *oxfp, cmo_bf* c) return 0; } +static int send_cmo_complex(OXFILE *oxfp, cmo_complex* c) +{ + send_cmo(oxfp, c->re); + send_cmo(oxfp, c->im); + return 0; +} + static int send_cmo_recursive_polynomial(OXFILE *oxfp, cmo_recursive_polynomial* c) { send_cmo(oxfp, (cmo *)c->ringdef); @@ -725,6 +751,9 @@ void send_cmo(OXFILE *oxfp, cmo* c) case CMO_BIGFLOAT: send_cmo_bf(oxfp, (cmo_bf *)c); break; + case CMO_COMPLEX: + send_cmo_complex(oxfp, (cmo_complex *)c); + break; case CMO_DISTRIBUTED_POLYNOMIAL: send_cmo_distributed_polynomial(oxfp, (cmo_distributed_polynomial *)c); break; @@ -767,67 +796,52 @@ static int send_mpz(OXFILE *oxfp, mpz_ptr mpz) return 0; } -void send_int64(OXFILE *oxfp,UL64 a) +int send_int64(OXFILE *oxfp,UL64 a) { - send_int32(oxfp, a>>32); - send_int32(oxfp, a&0xffffffff); + return oxfp->send_double(oxfp,((double *)&a)[0]); } UL64 receive_int64(OXFILE *oxfp) { - UL64 u,l; - - u = receive_int32(oxfp); - l = receive_int32(oxfp); - return (u<<32)|l; + double d = receive_double(oxfp); + return ((UL64 *)&d)[0]; } static void receive_mpfr(OXFILE *oxfp, mpfr_ptr mpfr) { - int sgn,prec,len,i; - long *ptr; - L64 exp; + int sgn,prec,exp,len_r,len,i; + unsigned int *ptr; - sgn = receive_int32(oxfp); - prec = receive_int32(oxfp); - exp = receive_int64(oxfp); - /* len = length as an int array (int = 4bytes) */ - len = receive_int32(oxfp); - - mpfr_init2(mpfr,prec); - MPFR_SIGN(mpfr) = sgn; - ptr = mpfr->_mpfr_d; - mpfr->_mpfr_exp = exp; -#if SIZEOF_LONG==4 - for ( i = 0; i < len; i++ ) - ptr[i] = receive_int32(oxfp); -#else - len >>= 1; - for ( i = 0; i < len; i++ ) - ptr[i] = receive_int64(oxfp); -#endif + prec = receive_int32(oxfp); + sgn = receive_int32(oxfp); + exp = receive_int32(oxfp); + len = receive_int32(oxfp); + mpfr_init2(mpfr,prec); /* initialized by NaN */ + MPFR_SIGN(mpfr) = sgn; + MPFR_EXP(mpfr) = exp; + *(MPFR_MANT(mpfr))=0; /* initialized by 0 */ + ptr = (unsigned int *)MPFR_MANT(mpfr); + len_r = MPFR_LIMB_SIZE_REAL(mpfr); + for(i=(len_r-len); i