=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/cio.c,v retrieving revision 1.16 retrieving revision 1.20 diff -u -p -r1.16 -r1.20 --- OpenXM_contrib2/asir2000/io/cio.c 2015/08/06 10:01:52 1.16 +++ 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.15 2015/08/06 09:12:29 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) && !defined(__MINGW32__) && !defined(__MINGW64__) +#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)); @@ -174,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; } @@ -250,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 } @@ -353,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; @@ -488,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; @@ -546,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; @@ -658,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; }