=================================================================== RCS file: /home/cvs/OpenXM/src/ox_toolkit/cmo.c,v retrieving revision 1.18 retrieving revision 1.29 diff -u -p -r1.18 -r1.29 --- OpenXM/src/ox_toolkit/cmo.c 2005/03/03 07:25:17 1.18 +++ OpenXM/src/ox_toolkit/cmo.c 2018/04/05 05:30:20 1.29 @@ -1,16 +1,15 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_toolkit/cmo.c,v 1.17 2003/11/02 03:09:16 iwane Exp $ */ +/* $OpenXM: OpenXM/src/ox_toolkit/cmo.c,v 1.28 2018/04/03 09:58:30 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 "ox_toolkit.h" #include "parse.h" @@ -110,6 +109,25 @@ cmo *list_nth(cmo_list* this, int n) return NULL; } +cell *list_nth_cell(cmo_list* this, int n) +{ + cell* el; + if(list_length(this) > n) { + el = list_first(this); + while(n-- > 0) { + el = list_next(el); + } + return el; + } + return NULL; +} + +char *cmo_indeterminate_get_name(cmo_indeterminate *this) +{ + cmo_string *ob = (cmo_string *)this->ob; + return ob->s; +} + /* for GNU mpz */ void resize_mpz(mpz_ptr mpz, int size) { @@ -165,6 +183,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; - c->num = c->den = NULL; + mpq_init(c->mpq); return c; } +cmo_bf* new_cmo_bf() +{ + cmo_bf* c = MALLOC(sizeof(cmo_bf)); + c->tag = CMO_BIGFLOAT32; + mpfr_init(c->mpfr); + return c; +} + +cmo_complex* new_cmo_complex() +{ + cmo_complex* c = MALLOC(sizeof(cmo_complex)); + c->tag = CMO_COMPLEX; + return c; +} + cmo_qq* new_cmo_qq_set_mpq(mpq_ptr q) { - cmo_qq* c = new_cmo_qq_noinit(); - c->num = new_cmo_zz_set_mpz(mpq_numref(q)); - c->den = new_cmo_zz_set_mpz(mpq_denref(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_noinit(); - c->num = new_cmo_zz_set_mpz(num); - c->den = new_cmo_zz_set_mpz(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_complex* new_cmo_complex_set_re_im(cmo *re,cmo *im) +{ + cmo_complex* c = new_cmo_complex(); + c->re = re; + c->im = im; + return c; +} + cmo_zero* new_cmo_zero() { cmo_zero* m = MALLOC_ATOMIC(sizeof(cmo_zero)); @@ -287,6 +355,11 @@ cmo_indeterminate* new_cmo_indeterminate(cmo* ob) return c; } +cmo_indeterminate* new_cmo_indeterminate_set_name(char *variable) +{ + return new_cmo_indeterminate(new_cmo_string(variable)); +} + cmo_distributed_polynomial* new_cmo_distributed_polynomial() { cmo_distributed_polynomial* c = MALLOC(sizeof(cmo_distributed_polynomial)); @@ -428,5 +501,19 @@ char *new_string_set_cmo(cmo *m) 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; } }