=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/ox.c,v retrieving revision 1.44 retrieving revision 1.49 diff -u -p -r1.44 -r1.49 --- OpenXM/src/ox_toolkit/ox.c 2015/08/18 02:24:04 1.44 +++ OpenXM/src/ox_toolkit/ox.c 2022/03/28 09:12:38 1.49 @@ -1,28 +1,30 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.43 2015/08/17 05:18:35 noro Exp $ */ +/* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.48 2016/06/30 01:14:00 ohara Exp $ */ /* This module includes functions for sending/receiveng CMO's. - Some commnets is written in Japanese by the EUC-JP coded - character set. */ #include #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 +72,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) */ @@ -177,11 +181,12 @@ static cmo_int32* receive_cmo_int32(OXFILE *oxfp) static cmo_string* receive_cmo_string(OXFILE *oxfp) { + int i,n; int len = receive_int32(oxfp); char* s = MALLOC(len+1); memset(s, '\0', len+1); - if (len > 0) { - oxf_read(s, 1, len, oxfp); + for(i=0; i_mpfr_d; - mpfr->_mpfr_exp = exp; -#if SIZEOF_LONG==4 - for ( i = 0; i < len; i++ ) - ptr[i] = receive_int32(oxfp); -#else - 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 + 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>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 + send_int32(oxfp, MPFR_PREC(mpfr)); + send_int32(oxfp, MPFR_SIGN(mpfr)); + send_int32(oxfp, MPFR_EXP(mpfr)); + len_r = MPFR_LIMB_SIZE_REAL(mpfr); + len = MPFR_LIMB_SIZE_BODY(mpfr); + ptr = (unsigned int *)MPFR_MANT(mpfr); + send_int32(oxfp, len); + for(i=(len_r-len); i