[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.32 and 1.39

version 1.32, 2005/03/03 06:38:15 version 1.39, 2015/08/04 07:41:49
Line 1 
Line 1 
 /* -*- mode: C; coding: euc-japan -*- */  /* -*- mode: C; coding: euc-japan -*- */
 /* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.31 2003/11/12 15:24:06 iwane Exp $ */  /* $OpenXM: OpenXM/src/ox_toolkit/ox.c,v 1.38 2015/08/04 05:24:44 noro Exp $ */
   
 /*  /*
    This module includes functions for sending/receiveng CMO's.     This module includes functions for sending/receiveng CMO's.
Line 16 
Line 16 
 #include <sys/file.h>  #include <sys/file.h>
 #include <time.h>  #include <time.h>
   
   #include <mpfr.h>
   /* 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)
   
   #if SIZEOF_LONG==4
   typedef long long L64;
   typedef unsigned long long UL64;
   #else
   typedef long L64;
   typedef unsigned long UL64;
   #endif
   
 #include "mysocket.h"  #include "mysocket.h"
 #include "ox_toolkit.h"  #include "ox_toolkit.h"
 #include "parse.h"  #include "parse.h"
Line 54  static cmo_zz*      receive_cmo_zz(OXFILE *oxfp);
Line 70  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 void         receive_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) */
 static hook_t hook_before_send_cmo = NULL;  static hook_t hook_before_send_cmo = NULL;
Line 208  static cmo_zz* receive_cmo_zz(OXFILE *oxfp)
Line 226  static cmo_zz* receive_cmo_zz(OXFILE *oxfp)
     return c;      return c;
 }  }
   
   static cmo_qq* receive_cmo_qq(OXFILE *oxfp)
   {
       mpz_t num, den;
       mpz_init(num);
       mpz_init(den);
       receive_mpz(oxfp, num);
       receive_mpz(oxfp, den);
       return new_cmo_qq_set_mpz(num, den);
   }
   
   static cmo_bf* receive_cmo_bf(OXFILE *oxfp)
   {
       mpfr_t num;
       mpfr_init(num);
       receive_mpfr(oxfp, num);
       return new_cmo_bf_set_mpfr(num);
   }
   
 static cmo_zero* receive_cmo_zero(OXFILE *oxfp)  static cmo_zero* receive_cmo_zero(OXFILE *oxfp)
 {  {
     return new_cmo_zero();      return new_cmo_zero();
Line 329  cmo *receive_cmo_tag(OXFILE *oxfp, int tag)
Line 365  cmo *receive_cmo_tag(OXFILE *oxfp, int tag)
     case CMO_ZZ:      case CMO_ZZ:
         m = (cmo *)receive_cmo_zz(oxfp);          m = (cmo *)receive_cmo_zz(oxfp);
         break;          break;
       case CMO_QQ:
           m = (cmo *)receive_cmo_qq(oxfp);
           break;
       case CMO_BIGFLOAT:
           m = (cmo *)receive_cmo_bf(oxfp);
           break;
     case CMO_ZERO:      case CMO_ZERO:
         m = (cmo *)receive_cmo_zero(oxfp);          m = (cmo *)receive_cmo_zero(oxfp);
         break;          break;
Line 364  cmo *receive_cmo_tag(OXFILE *oxfp, int tag)
Line 406  cmo *receive_cmo_tag(OXFILE *oxfp, int tag)
         m = (cmo *)receive_cmo_error2(oxfp);          m = (cmo *)receive_cmo_error2(oxfp);
         break;          break;
     case CMO_DATUM:      case CMO_DATUM:
     case CMO_QQ:  
     default:      default:
         m = NULL;          m = NULL;
         ox_printf("the CMO (%d) is not implemented.\n", tag);          ox_printf("the CMO (%d) is not implemented.\n", tag);
Line 375  cmo *receive_cmo_tag(OXFILE *oxfp, int tag)
Line 416  cmo *receive_cmo_tag(OXFILE *oxfp, int tag)
 static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz)  static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz)
 {  {
     int i;      int i;
       int n = sizeof(mpz->_mp_d[0]) / sizeof(int);
     int size  = receive_int32(oxfp);      int size  = receive_int32(oxfp);
     int len   = abs(size);      int len   = abs(size);
     resize_mpz(mpz, size);      int *ptr;
       if (n == 1) {
           resize_mpz(mpz, size);
       } else if (size >= 0) {
           resize_mpz(mpz, (size+1) / n);
       } else {
           resize_mpz(mpz, (size-1) / n);
       }
   
       ptr = (int *)mpz->_mp_d;
     for(i=0; i<len; i++) {      for(i=0; i<len; i++) {
         mpz->_mp_d[i] = receive_int32(oxfp);          ptr[i] = receive_int32(oxfp);
     }      }
 }  }
   
Line 593  static int send_cmo_zz(OXFILE *oxfp, cmo_zz* c)
Line 643  static int send_cmo_zz(OXFILE *oxfp, cmo_zz* c)
     return 0;      return 0;
 }  }
   
   static int send_cmo_qq(OXFILE *oxfp, cmo_qq* c)
   {
       send_mpz(oxfp, mpq_numref(c->mpq));
       send_mpz(oxfp, mpq_denref(c->mpq));
       return 0;
   }
   
   static int send_cmo_bf(OXFILE *oxfp, cmo_bf* c)
   {
       send_mpfr(oxfp, c->mpfr);
       return 0;
   }
   
 static int send_cmo_recursive_polynomial(OXFILE *oxfp, cmo_recursive_polynomial* c)  static int send_cmo_recursive_polynomial(OXFILE *oxfp, cmo_recursive_polynomial* c)
 {  {
         send_cmo(oxfp, (cmo *)c->ringdef);          send_cmo(oxfp, (cmo *)c->ringdef);
Line 656  void send_cmo(OXFILE *oxfp, cmo* c)
Line 719  void send_cmo(OXFILE *oxfp, cmo* c)
     case CMO_ZZ:      case CMO_ZZ:
         send_cmo_zz(oxfp, (cmo_zz *)c);          send_cmo_zz(oxfp, (cmo_zz *)c);
         break;          break;
       case CMO_QQ:
           send_cmo_qq(oxfp, (cmo_qq *)c);
           break;
       case CMO_BIGFLOAT:
           send_cmo_bf(oxfp, (cmo_bf *)c);
           break;
     case CMO_DISTRIBUTED_POLYNOMIAL:      case CMO_DISTRIBUTED_POLYNOMIAL:
         send_cmo_distributed_polynomial(oxfp, (cmo_distributed_polynomial *)c);          send_cmo_distributed_polynomial(oxfp, (cmo_distributed_polynomial *)c);
         break;          break;
Line 683  void send_cmo(OXFILE *oxfp, cmo* c)
Line 752  void send_cmo(OXFILE *oxfp, cmo* c)
 static int send_mpz(OXFILE *oxfp, mpz_ptr mpz)  static int send_mpz(OXFILE *oxfp, mpz_ptr mpz)
 {  {
     int i;      int i;
     int len = abs(mpz->_mp_size);          int n = sizeof(mpz->_mp_d[0]) / sizeof(int);
     send_int32(oxfp, mpz->_mp_size);      int len = abs(mpz->_mp_size) * n;
           int *ptr = (int *)mpz->_mp_d;
       int size;
       if (len > 0 && ptr[len-1] == 0) {
           len--;
       }
       size = mpz->_mp_size < 0 ? -len : len;
       send_int32(oxfp, size);
     for(i=0; i<len; i++) {      for(i=0; i<len; i++) {
         send_int32(oxfp, mpz->_mp_d[i]);          send_int32(oxfp, ptr[i]);
     }      }
       return 0;
   }
   
   void send_int64(OXFILE *oxfp,UL64 a)
   {
     send_int32(oxfp, a>>32);
     send_int32(oxfp, a&0xffffffff);
   }
   
   UL64 receive_int64(OXFILE *oxfp)
   {
     UL64 u,l;
   
     u = receive_int32(oxfp);
     l = receive_int32(oxfp);
     return (u<<32)|l;
   }
   
   static void receive_mpfr(OXFILE *oxfp, mpfr_ptr mpfr)
   {
     int sgn,prec,len,i;
     long *ptr;
     L64 exp;
   
     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
   }
   
   static int send_mpfr(OXFILE *oxfp, mpfr_ptr mpfr)
   {
   
     int i,len;
     long *ptr;
   
     send_int32(oxfp, MPFR_SIGN(mpfr));
     send_int32(oxfp, MPFR_PREC(mpfr));
     send_int64(oxfp, MPFR_EXP(mpfr));
     len = MPFR_LIMB_SIZE(mpfr);
     ptr = MPFR_MANT(mpfr);
   #if SIZEOF_LONG==4
     send_int32(oxfp, len);
     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]);
   #endif
     return 0;      return 0;
 }  }
   

Legend:
Removed from v.1.32  
changed lines
  Added in v.1.39

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