=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/bsave.c,v retrieving revision 1.13 retrieving revision 1.18 diff -u -p -r1.13 -r1.18 --- OpenXM_contrib2/asir2000/io/bsave.c 2003/12/22 09:33:47 1.13 +++ OpenXM_contrib2/asir2000/io/bsave.c 2015/08/13 00:13:03 1.18 @@ -44,7 +44,7 @@ * 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/bsave.c,v 1.12 2003/02/14 22:29:15 ohara Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/io/bsave.c,v 1.17 2015/08/04 06:20:45 noro Exp $ */ /* saveXXX must not use GC_malloc(), GC_malloc_atomic(). */ @@ -52,19 +52,17 @@ #include "parse.h" #include "com.h" -#if defined(PARI) -#include "genpari.h" -int get_lg(GEN); -#endif +void savenbp(FILE *s,NBP p); void (*savef[])() = { 0, savenum, savep, saver, savelist, savevect, - savemat, savestring, 0, savedp, saveui, saveerror,0,0,0,savegfmmat, savebytearray }; + savemat, savestring, 0, savedp, saveui, saveerror,0,0,0,savegfmmat, + savebytearray, 0, 0, 0, 0, 0, 0, 0, 0, savenbp }; #if defined(INTERVAL) void saveitv(); void saveitvd(); -void (*nsavef[])() = { saveq, savereal, 0, savebf, saveitv, saveitvd, 0, saveitv, savecplx ,savemi, savelm, savegf2n, savegfpn, savegfs, savegfsn}; +void (*nsavef[])() = { saveq, savereal, 0, savebf, saveitv, saveitvd, 0, saveitv, savecplx ,savemi, savelm, savegf2n, savegfpn, savegfs, savegfsn,savedalg}; #else -void (*nsavef[])() = { saveq, savereal, 0, savebf, savecplx ,savemi, savelm, savegf2n, savegfpn, savegfs, savegfsn}; +void (*nsavef[])() = { saveq, savereal, 0, savebf, savecplx ,savemi, savelm, savegf2n, savegfpn, savegfs, savegfsn,savedalg}; #endif static short zeroval = 0; @@ -112,33 +110,27 @@ void savereal(FILE *s,Real p) void savebf(FILE *s,BF p) { -#if defined(PARI) - GEN z; - int sign; - unsigned long expo; - unsigned int len,t; + unsigned int zero = 0; + unsigned int prec; + L exp; + int sgn,len,t; - z = (GEN)BDY(p); - sign = signe(z); - len = lg(z)-2; - expo = expo(z); + prec = MPFR_PREC(p->body); + exp = MPFR_EXP(p->body); + sgn = MPFR_SIGN(p->body); + len = MPFR_LIMB_SIZE(p->body); - write_int(s,&sign); - -#if defined(LONG_IS_32BIT) - write_int(s,(int *)&zeroval); /* expo>>32 is always 0 */ - write_int(s,(int *)&expo); + write_int(s,&sgn); + write_int(s,(int *)&prec); + write_int64(s,(UL *)&exp); +#if SIZEOF_LONG == 4 write_int(s,&len); - write_intarray(s,(int *)&z[2],len); -#elif defined(LONG_IS_64BIT) - t = expo>>32; write_int(s,(int *)&t); - t = expo&0xffffffff; write_int(s,&t); - t = 2*len; write_int(s,&t); - write_longarray(s,&z[2],len); + write_intarray(s,p->body->_mpfr_d,len); +#else /* SIZEOF_LONG == 8 */ + t = (prec+31)/32; + write_int(s,&t); + write_longarray(s,p->body->_mpfr_d,t); #endif -#else - error("savebf : PARI is not combined"); -#endif } #if defined(INTERVAL) @@ -201,6 +193,12 @@ void savegfsn(FILE *s,GFSN p) write_intarray(s,COEF(BDY(p)),d+1); } +void savedalg(FILE *s,DAlg p) +{ + saveobj(s,(Obj)p->nm); + saveobj(s,(Obj)p->dn); +} + void savep(FILE *s,P p) { DCP dc; @@ -338,4 +336,21 @@ void savebytearray(FILE *s,BYTEARRAY p) { write_short(s,&OID(p)); write_int(s,&p->len); write_string(s,p->body,p->len); +} + +void savenbp(FILE *s,NBP p) +{ + int i,n; + NODE t; + NBM m; + + write_short(s,&OID(p)); + for ( n = 0, t = BDY(p); t; t = NEXT(t), n++ ); + write_int(s,&n); + for ( i = 0, t = BDY(p); i < n; t = NEXT(t), i++ ) { + m = (NBM)BDY(t); + saveobj(s,(Obj)m->c); + write_int(s,&m->d); + write_intarray(s,m->b,(m->d+31)/32); + } }