=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/cio.c,v retrieving revision 1.17 retrieving revision 1.23 diff -u -p -r1.17 -r1.23 --- OpenXM_contrib2/asir2000/io/cio.c 2015/08/12 10:45:12 1.17 +++ OpenXM_contrib2/asir2000/io/cio.c 2016/06/29 05:10:14 1.23 @@ -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.16 2015/08/06 10:01:52 fujimoto Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/io/cio.c,v 1.22 2016/06/28 11:59:30 ohara 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)); @@ -173,7 +176,9 @@ int cmo_tag(Obj obj,int *tag) case N_R: *tag = CMO_IEEE_DOUBLE_FLOAT; break; case N_B: - *tag = CMO_BIGFLOAT; break; + *tag = CMO_BIGFLOAT32; break; + case N_C: + *tag = CMO_COMPLEX; break; default: return 0; } @@ -243,25 +248,19 @@ void write_cmo_real(FILE *s,Real real) void write_cmo_bf(FILE *s,BF bf) { - unsigned int r,u,l; - int len,t,i; - L exp; - UL *ptr; + unsigned int r; + int len_r,len; + unsigned int *ptr; - r = CMO_BIGFLOAT; write_int(s,&r); - write_int(s,&MPFR_SIGN(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 + r = CMO_BIGFLOAT32; write_int(s,&r); + r = MPFR_PREC(bf->body); write_int(s,&r); + r = MPFR_SIGN(bf->body); write_int(s,&r); + r = MPFR_EXP(bf->body); write_int(s,&r); + len_r = MPFR_LIMB_SIZE_REAL(bf->body); + len = MPFR_LIMB_SIZE_BODY(bf->body); write_int(s,&len); - write_intarray(s,MPFR_MANT(bf->body),len); -#else /* SIZEOF_LONG == 8 */ - t = 2*len; - write_int(s,&t); - write_longarray(s,MPFR_MANT(bf->body),len); -#endif + ptr = (unsigned int *)MPFR_MANT(bf->body); + write_intarray(s,ptr+(len_r-len),len); } void write_cmo_zz(FILE *s,int sgn,N n) @@ -347,6 +346,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; @@ -482,6 +490,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; @@ -537,9 +546,15 @@ void read_cmo(FILE *s,Obj *rp) case CMO_IEEE_DOUBLE_FLOAT: read_double(s,&dbl); MKReal(dbl,real); *rp = (Obj)real; break; - case CMO_BIGFLOAT: + case CMO_BIGFLOAT32: 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,24 +653,21 @@ void read_cmo_zz(FILE *s,int *sgn,N *rp) void read_cmo_bf(FILE *s,BF *bf) { BF r; - int sgn,prec,len,i; - unsigned int u,l; - UL *ptr; - L exp; + int sgn,prec,exp,len,len_r; + unsigned int *ptr; NEWBF(r); - read_int(s,&sgn); read_int(s,&prec); - read_int64(s,&exp); + read_int(s,&sgn); + read_int(s,&exp); read_int(s,&len); mpfr_init2(r->body,prec); MPFR_SIGN(r->body) = sgn; MPFR_EXP(r->body) = exp; -#if SIZEOF_LONG == 4 - read_intarray(s,MPFR_MANT(r->body),len); -#else /* SIZEOF_LONG == 8 */ - read_longarray(s,MPFR_MANT(r->body),len); -#endif + *(MPFR_MANT(r->body)) = 0; + ptr = (unsigned int *)MPFR_MANT(r->body); + len_r = MPFR_LIMB_SIZE_REAL(r->body); + read_intarray(s,ptr+(len_r-len),len); *bf = r; } @@ -737,6 +749,7 @@ void read_cmo_p(FILE *s,P *rp) P v,p; VL tvl,rvl; char *name; + FUNC f; read_cmo(s,&obj); vlist = (LIST)obj; nv = length(BDY(vlist)); @@ -744,7 +757,12 @@ void read_cmo_p(FILE *s,P *rp) for ( i = 0, t = BDY(vlist); i < nv; t = NEXT(t), i++ ) { /* cmoname_to_localname(BDY((STRING)BDY(t)),&name); */ name = BDY((STRING)BDY(t)); - makevar(name,&v); vtab[i] = VR(v); + gen_searchf_searchonly(name,&f,1); + if ( f ) + makesrvar(f,&v); + else + makevar(name,&v); + vtab[i] = VR(v); } remote_vtab = vtab; read_cmo(s,&obj); p = (P)obj;