=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/cmo.c,v retrieving revision 1.17 retrieving revision 1.24 diff -u -p -r1.17 -r1.24 --- OpenXM/src/ox_toolkit/cmo.c 2003/11/02 03:09:16 1.17 +++ OpenXM/src/ox_toolkit/cmo.c 2015/08/17 05:18:35 1.24 @@ -1,5 +1,5 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_toolkit/cmo.c,v 1.16 2003/09/18 12:46:08 ohara Exp $ */ +/* $OpenXM: OpenXM/src/ox_toolkit/cmo.c,v 1.23 2015/08/04 05:24:44 noro Exp $ */ /* This module includes functions for sending/receiveng CMO's. @@ -11,6 +11,7 @@ #include #include #include +#include #include "ox_toolkit.h" #include "parse.h" @@ -165,6 +166,26 @@ cmo_list* new_cmo_list() return c; } +cmo_list* new_cmo_list_array(void *array[], int n) +{ + int i; + cmo_list* c = new_cmo_list(); + for(i=0; itag = CMO_QQ; + mpq_init(c->mpq); + return c; +} + +cmo_bf* new_cmo_bf() +{ + cmo_bf* c = MALLOC(sizeof(cmo_bf)); + c->tag = CMO_BIGFLOAT; + mpfr_init(c->mpfr); + return c; +} + +cmo_qq* new_cmo_qq_set_mpq(mpq_ptr q) +{ + cmo_qq* c = new_cmo_qq(); + mpq_set(c->mpq, q); + return c; +} + +cmo_qq* new_cmo_qq_set_mpz(mpz_ptr num, mpz_ptr den) +{ + cmo_qq* c = new_cmo_qq(); + mpq_set_num(c->mpq, num); + mpq_set_den(c->mpq, den); + return c; +} + +cmo_bf* new_cmo_bf_set_mpfr(mpfr_ptr num) +{ + cmo_bf* c = new_cmo_bf(); + mpfr_init2(c->mpfr,num->_mpfr_prec); + mpfr_set(c->mpfr,num,MPFR_RNDN); + return c; +} + cmo_zero* new_cmo_zero() { cmo_zero* m = MALLOC_ATOMIC(sizeof(cmo_zero)); @@ -235,7 +295,7 @@ cmo_zero* new_cmo_zero() cmo_double *new_cmo_double(double d) { cmo_double* m = MALLOC_ATOMIC(sizeof(cmo_double)); - m->tag = CMO_64BIT_MACHINE_DOUBLE; + m->tag = CMO_IEEE_DOUBLE_FLOAT; m->d = d; return m; } @@ -397,11 +457,26 @@ char *new_string_set_cmo(cmo *m) return new_string_set_cmo_null(); case CMO_LIST: return new_string_set_cmo_list((cmo_list *)m); - case CMO_64BIT_MACHINE_DOUBLE: + case CMO_64BIT_MACHINE_DOUBLE: + case CMO_IEEE_DOUBLE_FLOAT: return new_string_set_cmo_double((cmo_double *)m); default: ox_printf("unconvertible <%s>\n", get_symbol_by_tag(m->tag)); /* yet not implemented. */ return NULL; } +} + +int cmo_to_int(cmo *n) +{ + switch(n->tag) { + case CMO_ZERO: + return 0; + case CMO_INT32: + return ((cmo_int32 *)n)->i; + case CMO_ZZ: + return mpz_get_si(((cmo_zz *)n)->mpz); + default: + return 0; + } }