version 1.17, 2015/08/04 06:20:45 |
version 1.21, 2020/10/04 03:14:08 |
|
|
* OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY |
* OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* $OpenXM: OpenXM_contrib2/asir2000/io/bsave.c,v 1.16 2009/03/16 16:43:03 ohara Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/io/bsave.c,v 1.20 2018/03/29 01:32:53 noro Exp $ |
*/ |
*/ |
/* saveXXX must not use GC_malloc(), GC_malloc_atomic(). */ |
/* saveXXX must not use GC_malloc(), GC_malloc_atomic(). */ |
|
|
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
#include "com.h" |
#include "com.h" |
|
#include "ox.h" |
|
|
void savenbp(FILE *s,NBP p); |
void savenbp(FILE *s,NBP p); |
|
|
void (*savef[])() = { 0, savenum, savep, saver, savelist, savevect, |
void (*savef[])() = { 0, savenum, savep, saver, savelist, savevect, |
savemat, savestring, 0, savedp, saveui, saveerror,0,0,0,savegfmmat, |
savemat, savestring, 0, savedp, saveui, saveerror,0,0,0,savegfmmat, |
savebytearray, 0, 0, 0, 0, 0, 0, 0, 0, savenbp }; |
savebytearray, 0, 0, 0, 0, 0, 0, 0, 0, savenbp }; |
#if defined(INTERVAL) |
#if defined(INTERVAL) |
void saveitv(); |
void saveitv(); |
void saveitvd(); |
void saveitvd(); |
Line 69 static short zeroval = 0; |
|
Line 70 static short zeroval = 0; |
|
|
|
void saveobj(FILE *s,Obj p) |
void saveobj(FILE *s,Obj p) |
{ |
{ |
if ( !p ) |
if ( !p ) |
write_short(s,&zeroval); |
write_short(s,&zeroval); |
else if ( !savef[OID(p)] ) |
else if ( !savef[OID(p)] ) |
error("saveobj : not implemented"); |
error("saveobj : not implemented"); |
else |
else |
(*savef[OID(p)])(s,p); |
(*savef[OID(p)])(s,p); |
} |
} |
|
|
void savenum(FILE *s,Num p) |
void savenum(FILE *s,Num p) |
{ |
{ |
if ( !nsavef[NID(p)] ) |
if ( !nsavef[NID(p)] ) |
error("savenum : not implemented"); |
error("savenum : not implemented"); |
else { |
else { |
write_short(s,&OID(p)); write_char(s,&NID(p)); |
write_short(s,&OID(p)); write_char(s,&NID(p)); |
write_char(s,&(p->pad)); |
write_char(s,&(p->pad)); |
(*nsavef[NID(p)])(s,p); |
(*nsavef[NID(p)])(s,p); |
} |
} |
} |
} |
|
|
void saveq(FILE *s,Q p) |
void saveq(FILE *s,Q p) |
{ |
{ |
int size[2]; |
int size[2]; |
int len = 2; |
int len = 2; |
|
|
size[0] = PL(NM(p)); size[1] = DN(p) ? PL(DN(p)) : 0; |
size[0] = PL(NM(p)); size[1] = DN(p) ? PL(DN(p)) : 0; |
write_intarray(s,size,len); |
write_intarray(s,size,len); |
write_intarray(s,BD(NM(p)),size[0]); |
write_intarray(s,BD(NM(p)),size[0]); |
if ( size[1] ) |
if ( size[1] ) |
write_intarray(s,BD(DN(p)),size[1]); |
write_intarray(s,BD(DN(p)),size[1]); |
} |
} |
|
|
void savereal(FILE *s,Real p) |
void savereal(FILE *s,Real p) |
Line 112 void savebf(FILE *s,BF p) |
|
Line 113 void savebf(FILE *s,BF p) |
|
{ |
{ |
unsigned int zero = 0; |
unsigned int zero = 0; |
unsigned int prec; |
unsigned int prec; |
L exp; |
L exp; |
int sgn,len,t; |
int sgn,len,t; |
|
|
prec = MPFR_PREC(p->body); |
prec = MPFR_PREC(p->body); |
exp = MPFR_EXP(p->body); |
exp = MPFR_EXP(p->body); |
sgn = MPFR_SIGN(p->body); |
sgn = MPFR_SIGN(p->body); |
len = MPFR_LIMB_SIZE(p->body); |
len = MPFR_LIMB_SIZE(p->body); |
|
|
write_int(s,&sgn); |
write_int(s,&sgn); |
write_int(s,(int *)&prec); |
write_int(s,(int *)&prec); |
write_int64(s,(UL *)&exp); |
write_int64(s,(UL *)&exp); |
|
#if defined(VISUAL) |
|
#if !defined(_WIN64) |
|
write_int(s,&len); |
|
write_intarray(s,p->body->_mpfr_d,len); |
|
#else |
|
t = (prec+31)/32; |
|
write_int(s,&t); |
|
write_longarray(s,(long long *)p->body->_mpfr_d,t); |
|
#endif |
|
#else |
#if SIZEOF_LONG == 4 |
#if SIZEOF_LONG == 4 |
write_int(s,&len); |
write_int(s,&len); |
write_intarray(s,p->body->_mpfr_d,len); |
write_intarray(s,p->body->_mpfr_d,len); |
#else /* SIZEOF_LONG == 8 */ |
#else /* SIZEOF_LONG == 8 */ |
t = 2*len; |
t = (prec+31)/32; |
write_int(s,&t); |
write_int(s,&t); |
write_longarray(s,p->body->_mpfr_d,len); |
write_longarray(s,p->body->_mpfr_d,t); |
#endif |
#endif |
|
#endif |
} |
} |
|
|
#if defined(INTERVAL) |
#if defined(INTERVAL) |
void saveitv(FILE *s,Itv p) |
void saveitv(FILE *s,Itv p) |
{ |
{ |
saveobj(s,(Obj)INF(p)); |
saveobj(s,(Obj)INF(p)); |
saveobj(s,(Obj)SUP(p)); |
saveobj(s,(Obj)SUP(p)); |
} |
} |
|
|
void saveitvd(FILE *s,IntervalDouble p) |
void saveitvd(FILE *s,IntervalDouble p) |
{ |
{ |
write_double(s,&INF(p)); |
write_double(s,&INF(p)); |
write_double(s,&SUP(p)); |
write_double(s,&SUP(p)); |
} |
} |
#endif |
#endif |
|
|
Line 155 void savemi(FILE *s,MQ p) |
|
Line 167 void savemi(FILE *s,MQ p) |
|
|
|
void savelm(FILE *s,LM p) |
void savelm(FILE *s,LM p) |
{ |
{ |
int size; |
int size; |
|
|
size = PL(BDY(p)); |
size = PL(BDY(p)); |
write_int(s,&size); |
write_int(s,&size); |
write_intarray(s,BD(BDY(p)),size); |
write_intarray(s,BD(BDY(p)),size); |
} |
} |
|
|
void savegf2n(FILE *s,GF2N p) |
void savegf2n(FILE *s,GF2N p) |
{ |
{ |
int len; |
int len; |
|
|
len = p->body->w; |
len = p->body->w; |
write_int(s,&len); |
write_int(s,&len); |
write_intarray(s,p->body->b,len); |
write_intarray(s,p->body->b,len); |
} |
} |
|
|
void savegfpn(FILE *s,GFPN p) |
void savegfpn(FILE *s,GFPN p) |
{ |
{ |
int d,i; |
int d,i; |
|
|
d = p->body->d; |
d = p->body->d; |
write_int(s,&d); |
write_int(s,&d); |
for ( i = 0; i <= d; i++ ) |
for ( i = 0; i <= d; i++ ) |
saveobj(s,(Obj)p->body->c[i]); |
saveobj(s,(Obj)p->body->c[i]); |
} |
} |
|
|
void savegfs(FILE *s,GFS p) |
void savegfs(FILE *s,GFS p) |
Line 186 void savegfs(FILE *s,GFS p) |
|
Line 198 void savegfs(FILE *s,GFS p) |
|
|
|
void savegfsn(FILE *s,GFSN p) |
void savegfsn(FILE *s,GFSN p) |
{ |
{ |
int d; |
int d; |
|
|
d = DEG(BDY(p)); |
d = DEG(BDY(p)); |
write_int(s,&d); |
write_int(s,&d); |
write_intarray(s,COEF(BDY(p)),d+1); |
write_intarray(s,COEF(BDY(p)),d+1); |
} |
} |
|
|
void savedalg(FILE *s,DAlg p) |
void savedalg(FILE *s,DAlg p) |
{ |
{ |
saveobj(s,(Obj)p->nm); |
saveobj(s,(Obj)p->nm); |
saveobj(s,(Obj)p->dn); |
saveobj(s,(Obj)p->dn); |
} |
} |
|
|
void savep(FILE *s,P p) |
void savep(FILE *s,P p) |
{ |
{ |
DCP dc; |
DCP dc; |
int n; |
int n; |
int vindex; |
int vindex; |
|
|
if ( NUM(p) ) |
if ( NUM(p) ) |
savenum(s,(Num)p); |
savenum(s,(Num)p); |
else { |
else { |
vindex = save_convv(VR(p)); |
vindex = save_convv(VR(p)); |
for ( dc = DC(p), n = 0; dc; dc = NEXT(dc), n++ ); |
for ( dc = DC(p), n = 0; dc; dc = NEXT(dc), n++ ); |
write_short(s,&OID(p)); |
write_short(s,&OID(p)); |
write_int(s,&vindex); |
write_int(s,&vindex); |
if ( vindex < 0 ) |
if ( vindex < 0 ) |
savepfins(s,VR(p)); |
savepfins(s,VR(p)); |
write_int(s,&n); |
write_int(s,&n); |
for ( dc = DC(p); dc; dc = NEXT(dc) ) { |
for ( dc = DC(p); dc; dc = NEXT(dc) ) { |
saveobj(s,(Obj)DEG(dc)); saveobj(s,(Obj)COEF(dc)); |
saveobj(s,(Obj)DEG(dc)); saveobj(s,(Obj)COEF(dc)); |
} |
} |
} |
} |
} |
} |
|
|
/* save a pure function (v->attr = V_PF) */ |
/* save a pure function (v->attr = V_PF) */ |
Line 226 void savep(FILE *s,P p) |
|
Line 238 void savep(FILE *s,P p) |
|
|
|
void savepfins(FILE *s,V v) |
void savepfins(FILE *s,V v) |
{ |
{ |
PFINS ins; |
PFINS ins; |
PF pf; |
PF pf; |
int argc,i; |
int argc,i; |
int *darray; |
int *darray; |
|
|
ins = (PFINS)v->priv; |
ins = (PFINS)v->priv; |
pf = ins->pf; |
pf = ins->pf; |
savestr(s,NAME(pf)); |
savestr(s,NAME(pf)); |
argc = pf->argc; |
argc = pf->argc; |
write_int(s,&argc); |
write_int(s,&argc); |
darray = (int *)ALLOCA(argc*sizeof(int)); |
darray = (int *)ALLOCA(argc*sizeof(int)); |
for ( i = 0; i < argc; i++ ) |
for ( i = 0; i < argc; i++ ) |
darray[i] = ins->ad[i].d; |
darray[i] = ins->ad[i].d; |
write_intarray(s,darray,argc); |
write_intarray(s,darray,argc); |
for ( i = 0; i < argc; i++ ) |
for ( i = 0; i < argc; i++ ) |
saveobj(s,ins->ad[i].arg); |
saveobj(s,ins->ad[i].arg); |
} |
} |
|
|
void saver(FILE *s,R p) |
void saver(FILE *s,R p) |
{ |
{ |
if ( !RAT(p) ) |
if ( !RAT(p) ) |
savep(s,(P)p); |
savep(s,(P)p); |
else { |
else { |
write_short(s,&OID(p)); write_short(s,&p->reduced); |
write_short(s,&OID(p)); write_short(s,&p->reduced); |
savep(s,NM(p)); savep(s,DN(p)); |
savep(s,NM(p)); savep(s,DN(p)); |
} |
} |
} |
} |
|
|
void savelist(FILE *s,LIST p) |
void savelist(FILE *s,LIST p) |
{ |
{ |
int n; |
int n; |
NODE tn; |
NODE tn; |
|
|
for ( tn = BDY(p), n = 0; tn; tn = NEXT(tn), n++ ); |
for ( tn = BDY(p), n = 0; tn; tn = NEXT(tn), n++ ); |
write_short(s,&OID(p)); write_int(s,&n); |
write_short(s,&OID(p)); write_int(s,&n); |
for ( tn = BDY(p); tn; tn = NEXT(tn) ) |
for ( tn = BDY(p); tn; tn = NEXT(tn) ) |
saveobj(s,(Obj)BDY(tn)); |
saveobj(s,(Obj)BDY(tn)); |
} |
} |
|
|
void savevect(FILE *s,VECT p) |
void savevect(FILE *s,VECT p) |
{ |
{ |
int i,len = 2; |
int i,len = 2; |
|
|
write_short(s,&OID(p)); write_int(s,&p->len); |
write_short(s,&OID(p)); write_int(s,&p->len); |
for ( i = 0, len = p->len; i < len; i++ ) |
for ( i = 0, len = p->len; i < len; i++ ) |
saveobj(s,(Obj)BDY(p)[i]); |
saveobj(s,(Obj)BDY(p)[i]); |
} |
} |
|
|
void savemat(FILE *s,MAT p) |
void savemat(FILE *s,MAT p) |
{ |
{ |
int i,j,row,col; |
int i,j,row,col; |
int len = 3; |
int len = 3; |
|
|
write_short(s,&OID(p)); write_int(s,&p->row); write_int(s,&p->col); |
write_short(s,&OID(p)); write_int(s,&p->row); write_int(s,&p->col); |
for ( i = 0, row = p->row, col = p->col; i < row; i++ ) |
for ( i = 0, row = p->row, col = p->col; i < row; i++ ) |
for ( j = 0; j < col; j++ ) |
for ( j = 0; j < col; j++ ) |
saveobj(s,(Obj)BDY(p)[i][j]); |
saveobj(s,(Obj)BDY(p)[i][j]); |
} |
} |
|
|
void savestring(FILE *s,STRING p) |
void savestring(FILE *s,STRING p) |
{ |
{ |
write_short(s,&OID(p)); savestr(s,BDY(p)); |
write_short(s,&OID(p)); savestr(s,BDY(p)); |
} |
} |
|
|
void savestr(FILE *s,char *p) |
void savestr(FILE *s,char *p) |
{ |
{ |
int size; |
int size; |
|
|
size = p ? strlen(p) : 0; write_int(s,&size); |
size = p ? strlen(p) : 0; write_int(s,&size); |
if ( size ) |
if ( size ) |
write_string(s,p,size); |
write_string(s,p,size); |
} |
} |
|
|
void savedp(FILE *s,DP p) |
void savedp(FILE *s,DP p) |
{ |
{ |
int nv,n,i,sugar; |
int nv,n,i,sugar; |
MP m,t; |
MP m,t; |
|
|
nv = p->nv; m = p->body; sugar = p->sugar; |
nv = p->nv; m = p->body; sugar = p->sugar; |
for ( n = 0, t = m; t; t = NEXT(t), n++ ); |
for ( n = 0, t = m; t; t = NEXT(t), n++ ); |
write_short(s,&OID(p)); write_int(s,&nv); write_int(s,&sugar); write_int(s,&n); |
write_short(s,&OID(p)); write_int(s,&nv); write_int(s,&sugar); write_int(s,&n); |
for ( i = 0, t = m; i < n; i++, t = NEXT(t) ) { |
for ( i = 0, t = m; i < n; i++, t = NEXT(t) ) { |
saveobj(s,(Obj)t->c); |
saveobj(s,(Obj)t->c); |
write_int(s,&t->dl->td); write_intarray(s,&(t->dl->d[0]),nv); |
write_int(s,&t->dl->td); write_intarray(s,&(t->dl->d[0]),nv); |
} |
} |
} |
} |
|
|
void saveui(FILE *s,USINT u) |
void saveui(FILE *s,USINT u) |
{ |
{ |
write_short(s,&OID(u)); write_int(s,&BDY(u)); |
write_short(s,&OID(u)); write_int(s,&BDY(u)); |
} |
} |
|
|
void saveerror(FILE *s,ERR e) |
void saveerror(FILE *s,ERR e) |
{ |
{ |
write_short(s,&OID(e)); saveobj(s,(Obj)BDY(e)); |
write_short(s,&OID(e)); saveobj(s,(Obj)BDY(e)); |
} |
} |
|
|
void savegfmmat(FILE *s,GFMMAT p) |
void savegfmmat(FILE *s,GFMMAT p) |
{ |
{ |
int i,row,col; |
int i,row,col; |
|
|
write_short(s,&OID(p)); write_int(s,&p->row); write_int(s,&p->col); |
write_short(s,&OID(p)); write_int(s,&p->row); write_int(s,&p->col); |
for ( i = 0, row = p->row, col = p->col; i < row; i++ ) |
for ( i = 0, row = p->row, col = p->col; i < row; i++ ) |
write_intarray(s,p->body[i],col); |
write_intarray(s,p->body[i],col); |
} |
} |
|
|
void savebytearray(FILE *s,BYTEARRAY p) |
void savebytearray(FILE *s,BYTEARRAY p) |
{ |
{ |
write_short(s,&OID(p)); write_int(s,&p->len); |
write_short(s,&OID(p)); write_int(s,&p->len); |
write_string(s,p->body,p->len); |
write_string(s,p->body,p->len); |
} |
} |
|
|
void savenbp(FILE *s,NBP p) |
void savenbp(FILE *s,NBP p) |
{ |
{ |
int i,n; |
int i,n; |
NODE t; |
NODE t; |
NBM m; |
NBM m; |
|
|
write_short(s,&OID(p)); |
write_short(s,&OID(p)); |
for ( n = 0, t = BDY(p); t; t = NEXT(t), n++ ); |
for ( n = 0, t = BDY(p); t; t = NEXT(t), n++ ); |
write_int(s,&n); |
write_int(s,&n); |
for ( i = 0, t = BDY(p); i < n; t = NEXT(t), i++ ) { |
for ( i = 0, t = BDY(p); i < n; t = NEXT(t), i++ ) { |
m = (NBM)BDY(t); |
m = (NBM)BDY(t); |
saveobj(s,(Obj)m->c); |
saveobj(s,(Obj)m->c); |
write_int(s,&m->d); |
write_int(s,&m->d); |
write_intarray(s,m->b,(m->d+31)/32); |
write_intarray(s,m->b,(m->d+31)/32); |
} |
} |
} |
} |