[BACK]Return to ox.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_toolkit

Diff for /OpenXM/src/ox_toolkit/ox.c between version 1.45 and 1.46

version 1.45, 2015/08/27 03:03:33 version 1.46, 2016/06/28 11:59:15
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.44 2015/08/18 02:24:04 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.     This module includes functions for sending/receiveng CMO's.
Line 13 
Line 13 
 #include <string.h>  #include <string.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <time.h>  #include <time.h>
   #include <limits.h>
 #if !defined(_MSC_VER)  #if !defined(_MSC_VER)
 #include <unistd.h>  #include <unistd.h>
 #include <sys/file.h>  #include <sys/file.h>
Line 23 
Line 24 
 #define MPFR_PREC(x)      ((x)->_mpfr_prec)  #define MPFR_PREC(x)      ((x)->_mpfr_prec)
 #define MPFR_EXP(x)       ((x)->_mpfr_exp)  #define MPFR_EXP(x)       ((x)->_mpfr_exp)
 #define MPFR_MANT(x)      ((x)->_mpfr_d)  #define MPFR_MANT(x)      ((x)->_mpfr_d)
 #define MPFR_LAST_LIMB(x) ((MPFR_PREC (x) - 1) / GMP_NUMB_BITS)  #define RAT_CEIL(nm,dn) (((nm)+(dn)-1)/((dn)))
 #define MPFR_LIMB_SIZE(x) (MPFR_LAST_LIMB (x) + 1)  #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  #if SIZEOF_LONG==4
 typedef long long L64;  typedef long long L64;
Line 72  static cmo_zz*      receive_cmo_zz(OXFILE *oxfp);
Line 74  static cmo_zz*      receive_cmo_zz(OXFILE *oxfp);
 static void         receive_mpz(OXFILE *oxfp, mpz_ptr mpz);  static void         receive_mpz(OXFILE *oxfp, mpz_ptr mpz);
 static int          send_cmo_zz(OXFILE *oxfp, cmo_zz* c);  static int          send_cmo_zz(OXFILE *oxfp, cmo_zz* c);
 static int          send_mpz(OXFILE *oxfp, mpz_ptr mpz);  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 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);  static int          send_mpfr(OXFILE *oxfp, mpfr_ptr mpfr);
   
 /* hook functions. (yet not implemented) */  /* hook functions. (yet not implemented) */
Line 800  int send_int64(OXFILE *oxfp,UL64 a)
Line 804  int send_int64(OXFILE *oxfp,UL64 a)
 UL64 receive_int64(OXFILE *oxfp)  UL64 receive_int64(OXFILE *oxfp)
 {  {
         double d = receive_double(oxfp);          double d = receive_double(oxfp);
   return ((UL64 *)&d)[0];      return ((UL64 *)&d)[0];
 }  }
   
 static void receive_mpfr(OXFILE *oxfp, mpfr_ptr mpfr)  static void receive_mpfr(OXFILE *oxfp, mpfr_ptr mpfr)
 {  {
   int sgn,prec,len,i;      int sgn,prec,exp,len_r,len,i;
   unsigned int hi,lo;      unsigned int *ptr;
   unsigned long *ptr;  
   L64 exp;  
   
   sgn  = receive_int32(oxfp);      prec = receive_int32(oxfp);
   prec  = receive_int32(oxfp);      sgn  = receive_int32(oxfp);
   exp = receive_int64(oxfp);      exp  = receive_int32(oxfp);
   /* len = length as an int array (int = 4bytes) */      len  = receive_int32(oxfp);
   len  = receive_int32(oxfp);      mpfr_init2(mpfr,prec); /* initialized by NaN */
       MPFR_SIGN(mpfr) = sgn;
   mpfr_init2(mpfr,prec);      MPFR_EXP(mpfr)  = exp;
   MPFR_SIGN(mpfr) = sgn;      *(MPFR_MANT(mpfr))=0; /* initialized by 0 */
   ptr = mpfr->_mpfr_d;      ptr   = (unsigned int *)MPFR_MANT(mpfr);
   mpfr->_mpfr_exp = exp;      len_r = MPFR_LIMB_SIZE_REAL(mpfr);
 #if SIZEOF_LONG==4      for(i=(len_r-len); i<len_r; i++) {
   for ( i = 0; i < len; i++ )          ptr[i] = receive_int32(oxfp);
     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  
 }  }
   
 static int send_mpfr(OXFILE *oxfp, mpfr_ptr mpfr)  static int send_mpfr(OXFILE *oxfp, mpfr_ptr mpfr)
 {  {
       int i,len_r,len;
       unsigned int *ptr;
   
   int i,len,t;      send_int32(oxfp, MPFR_PREC(mpfr));
   unsigned long *ptr;      send_int32(oxfp, MPFR_SIGN(mpfr));
   UL64 uexp;      send_int32(oxfp, MPFR_EXP(mpfr));
       len_r = MPFR_LIMB_SIZE_REAL(mpfr);
   send_int32(oxfp, MPFR_SIGN(mpfr));      len   = MPFR_LIMB_SIZE_BODY(mpfr);
   send_int32(oxfp, MPFR_PREC(mpfr));      ptr   = (unsigned int *)MPFR_MANT(mpfr);
   send_int64(oxfp, MPFR_EXP(mpfr));      send_int32(oxfp, len);
   len = MPFR_LIMB_SIZE(mpfr);      for(i=(len_r-len); i<len_r; i++) {
   ptr = MPFR_MANT(mpfr);          send_int32(oxfp, ptr[i]);
 #if SIZEOF_LONG==4      }
   send_int32(oxfp, len);  
   for ( i = 0; i < len; i++ )  
     send_int32(oxfp,ptr[i]);  
 #else /* SIZEOF_LONG==8 */  
   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;      return 0;
 }  }
   

Legend:
Removed from v.1.45  
changed lines
  Added in v.1.46

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>