=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/ox.c,v retrieving revision 1.32 retrieving revision 1.35 diff -u -p -r1.32 -r1.35 --- OpenXM/src/ox_toolkit/ox.c 2005/03/03 06:38:15 1.32 +++ OpenXM/src/ox_toolkit/ox.c 2013/10/20 14:58:20 1.35 @@ -1,5 +1,5 @@ /* -*- 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.34 2007/03/14 10:30:54 ohara Exp $ */ /* This module includes functions for sending/receiveng CMO's. @@ -208,6 +208,16 @@ static cmo_zz* receive_cmo_zz(OXFILE *oxfp) 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_zero* receive_cmo_zero(OXFILE *oxfp) { return new_cmo_zero(); @@ -329,6 +339,9 @@ cmo *receive_cmo_tag(OXFILE *oxfp, int tag) case CMO_ZZ: m = (cmo *)receive_cmo_zz(oxfp); break; + case CMO_QQ: + m = (cmo *)receive_cmo_qq(oxfp); + break; case CMO_ZERO: m = (cmo *)receive_cmo_zero(oxfp); break; @@ -364,7 +377,6 @@ cmo *receive_cmo_tag(OXFILE *oxfp, int tag) m = (cmo *)receive_cmo_error2(oxfp); break; case CMO_DATUM: - case CMO_QQ: default: m = NULL; ox_printf("the CMO (%d) is not implemented.\n", tag); @@ -375,13 +387,20 @@ cmo *receive_cmo_tag(OXFILE *oxfp, int tag) static void receive_mpz(OXFILE *oxfp, mpz_ptr mpz) { int i; + int n = sizeof(mpz->_mp_d[0]) / sizeof(int); int size = receive_int32(oxfp); int len = abs(size); - resize_mpz(mpz, size); + int *ptr; + if (n == 1) { + resize_mpz(mpz, size); + } else { + resize_mpz(mpz, (size+1) / n); + } - for(i=0; i_mp_d[i] = receive_int32(oxfp); - } + ptr = (int *)mpz->_mp_d; + for(i= len-1; i>=0; i--) { + ptr[i] = receive_int32(oxfp); + } } void send_ox_command(OXFILE *oxfp, int sm_command) @@ -593,6 +612,13 @@ static int send_cmo_zz(OXFILE *oxfp, cmo_zz* c) 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_recursive_polynomial(OXFILE *oxfp, cmo_recursive_polynomial* c) { send_cmo(oxfp, (cmo *)c->ringdef); @@ -656,6 +682,9 @@ void send_cmo(OXFILE *oxfp, cmo* c) case CMO_ZZ: send_cmo_zz(oxfp, (cmo_zz *)c); break; + case CMO_QQ: + send_cmo_qq(oxfp, (cmo_qq *)c); + break; case CMO_DISTRIBUTED_POLYNOMIAL: send_cmo_distributed_polynomial(oxfp, (cmo_distributed_polynomial *)c); break; @@ -683,10 +712,12 @@ void send_cmo(OXFILE *oxfp, cmo* c) static int send_mpz(OXFILE *oxfp, mpz_ptr mpz) { int i; - int len = abs(mpz->_mp_size); - send_int32(oxfp, mpz->_mp_size); + int n = sizeof(mpz->_mp_d[0]) / sizeof(int); + int len = abs(mpz->_mp_size) * n; + int *ptr = (int *)mpz->_mp_d; + send_int32(oxfp, mpz->_mp_size * n); for(i=0; i_mp_d[i]); + send_int32(oxfp, ptr[i]); } return 0; }