=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/ox.c,v retrieving revision 1.39 retrieving revision 1.45 diff -u -p -r1.39 -r1.45 --- OpenXM/src/ox_toolkit/ox.c 2015/08/04 07:41:49 1.39 +++ OpenXM/src/ox_toolkit/ox.c 2015/08/27 03:03:33 1.45 @@ -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.44 2015/08/18 02:24:04 noro Exp $ */ /* This module includes functions for sending/receiveng CMO's. @@ -11,10 +11,12 @@ #include #include #include -#include #include -#include #include +#if !defined(_MSC_VER) +#include +#include +#endif #include /* XXX : defined in mpfr-impl.h */ @@ -244,6 +246,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 +383,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 +671,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 +747,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,30 +792,27 @@ 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; + unsigned int hi,lo; + unsigned long *ptr; L64 exp; sgn = receive_int32(oxfp); prec = receive_int32(oxfp); - exp = receive_int64(oxfp); + exp = receive_int64(oxfp); /* len = length as an int array (int = 4bytes) */ len = receive_int32(oxfp); @@ -802,17 +824,27 @@ static void receive_mpfr(OXFILE *oxfp, mpfr_ptr mpfr) 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); + if ( len%2 ) { + hi = receive_int32(oxfp); + ptr[0] = (((UL64)hi)<<32); + i = 1; + } else + i = 0; + len = (len+1)/2; + for ( ; i < len; i ++ ) { + lo = (unsigned int)receive_int32(oxfp); + hi = (unsigned int)receive_int32(oxfp); + ptr[i] = (((UL64)hi)<<32)|((UL64)lo); + } #endif } static int send_mpfr(OXFILE *oxfp, mpfr_ptr mpfr) { - int i,len; - long *ptr; + int i,len,t; + unsigned long *ptr; + UL64 uexp; send_int32(oxfp, MPFR_SIGN(mpfr)); send_int32(oxfp, MPFR_PREC(mpfr)); @@ -824,9 +856,18 @@ static int send_mpfr(OXFILE *oxfp, mpfr_ptr mpfr) for ( i = 0; i < len; i++ ) send_int32(oxfp,ptr[i]); #else /* SIZEOF_LONG==8 */ - send_int32(oxfp, 2*len); - for ( i = 0; i < len; i++ ) - send_int64(oxfp,ptr[i]); + t = (MPFR_PREC(mpfr)+31)/32; + send_int32(oxfp, t); + if ( t%2 ) { + send_int32(oxfp,(unsigned int)(ptr[0]>>32)); + i = 1; + } else + i = 0; + t = (t+1)/2; + for ( ; i < len; i++ ) { + send_int32(oxfp,(unsigned int)(ptr[i]&0xffffffff)); + send_int32(oxfp,(unsigned int)(ptr[i]>>32)); + } #endif return 0; }