=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/cio.c,v retrieving revision 1.14 retrieving revision 1.20 diff -u -p -r1.14 -r1.20 --- OpenXM_contrib2/asir2000/io/cio.c 2015/08/04 10:19:31 1.14 +++ OpenXM_contrib2/asir2000/io/cio.c 2015/08/18 02:26:05 1.20 @@ -44,12 +44,12 @@ * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. - * $OpenXM: OpenXM_contrib2/asir2000/io/cio.c,v 1.13 2015/08/04 06:20:45 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/io/cio.c,v 1.19 2015/08/14 13:51:55 fujimoto Exp $ */ #include "ca.h" #include "parse.h" #include "ox.h" -#if !defined(VISUAL) +#if !defined(VISUAL) && !defined(__MINGW32__) #include #endif @@ -68,7 +68,7 @@ int valid_as_cmo(Obj obj) return 1; case O_N: nid = NID((Num)obj); - if ( nid == N_Q || nid == N_R || nid == N_B ) + if ( nid == N_Q || nid == N_R || nid == N_B || nid == N_C ) return 1; else return 0; @@ -106,6 +106,9 @@ void write_cmo(FILE *s,Obj obj) case N_B: write_cmo_bf(s,(BF)obj); break; + case N_C: + write_cmo_complex(s,(C)obj); + break; default: sprintf(errmsg, "write_cmo : number id=%d not implemented.", NID((Num)obj)); @@ -147,6 +150,9 @@ void write_cmo(FILE *s,Obj obj) fnodetotree(BDY((QUOTE)obj),&l); write_cmo_tree(s,l); break; + case O_MAT: + write_cmo_matrix_as_list(s,(MAT)obj); + break; default: sprintf(errmsg, "write_cmo : id=%d not implemented.",OID(obj)); error(errmsg); @@ -171,6 +177,8 @@ int cmo_tag(Obj obj,int *tag) *tag = CMO_IEEE_DOUBLE_FLOAT; break; case N_B: *tag = CMO_BIGFLOAT; break; + case N_C: + *tag = CMO_COMPLEX; break; default: return 0; } @@ -247,23 +255,17 @@ void write_cmo_bf(FILE *s,BF bf) r = CMO_BIGFLOAT; write_int(s,&r); write_int(s,&MPFR_SIGN(bf->body)); - write_int(s,&MPFR_PREC(bf->body)); + write_int(s,(unsigned int *)&MPFR_PREC(bf->body)); exp = MPFR_EXP(bf->body); write_int64(s,&exp); len = MPFR_LIMB_SIZE(bf->body); #if SIZEOF_LONG == 4 write_int(s,&len); - write_intarray(s,MPFR_MANT(bf->body),len); + write_intarray(s,(int *)MPFR_MANT(bf->body),len); #else /* SIZEOF_LONG == 8 */ - t = 2*len; + t = (MPFR_PREC(bf->body)+31)/32; write_int(s,&t); - ptr = (UL *)MPFR_MANT(bf->body); - for ( i = 0; i < len; i++ ) { - u = ptr[i]>>32; - l = ptr[i]&0xffffffff; - write_int(s,&u); - write_int(s,&l); - } + write_longarray(s,MPFR_MANT(bf->body),t); #endif } @@ -350,6 +352,15 @@ void write_cmo_r(FILE *s,R f) write_cmo(s,(Obj)DN(f)); } +void write_cmo_complex(FILE *s,C f) +{ + int r; + + r = CMO_COMPLEX; write_int(s,&r); + write_cmo(s,(Obj)f->r); + write_cmo(s,(Obj)f->i); +} + void write_cmo_dp(FILE *s,DP dp) { int i,n,nv,r; @@ -460,6 +471,23 @@ void write_cmo_tree(FILE *s,LIST l) } } +void write_cmo_matrix_as_list(FILE *s,MAT a) +{ + int i,j,r,row,col; + + /* CMO_LIST row (CMO_LIST col a[0][0] ... a[0][col-1]) ... (CMO_LIST col a[row-1][0] ... a[row-1][col-1] */ + row = a->row; col = a->col; + r = CMO_LIST; + write_int(s,&r); + write_int(s,&row); + for ( i = 0; i < row; i++ ) { + write_int(s,&r); + write_int(s,&col); + for ( j = 0; j < col; j++ ) + write_cmo(s,a->body[i][j]); + } +} + void read_cmo(FILE *s,Obj *rp) { int id; @@ -468,6 +496,7 @@ void read_cmo(FILE *s,Obj *rp) N nm,dn; P p,pnm,pdn; Real real; + C c; double dbl; STRING str; USINT t; @@ -526,6 +555,12 @@ void read_cmo(FILE *s,Obj *rp) case CMO_BIGFLOAT: read_cmo_bf(s,&bf); *rp = (Obj)bf; break; + case CMO_COMPLEX: + NEWC(c); + read_cmo(s,(Obj *)&c->r); + read_cmo(s,(Obj *)&c->i); + *rp = (Obj)c; + break; case CMO_DISTRIBUTED_POLYNOMIAL: read_cmo_dp(s,&dp); *rp = (Obj)dp; break; @@ -638,15 +673,9 @@ void read_cmo_bf(FILE *s,BF *bf) MPFR_SIGN(r->body) = sgn; MPFR_EXP(r->body) = exp; #if SIZEOF_LONG == 4 - read_intarray(s,MPFR_MANT(r->body),len); + read_intarray(s,(int *)MPFR_MANT(r->body),len); #else /* SIZEOF_LONG == 8 */ - len >>= 1; - ptr = (UL *)MPFR_MANT(r->body); - for ( i = 0; i < len; i++ ) { - read_int(s,&u); - read_int(s,&l); - ptr[i] = ((UL)u)<<32|((UL)l)&0xffffffff; - } + read_longarray(s,MPFR_MANT(r->body),len); #endif *bf = r; }