Annotation of OpenXM_contrib2/asir2000/io/bsave.c, Revision 1.1
1.1 ! noro 1: /* $OpenXM: OpenXM/src/asir99/io/bsave.c,v 1.1.1.1 1999/11/10 08:12:30 noro Exp $ */
! 2: /* saveXXX must not use GC_malloc(), GC_malloc_atomic(). */
! 3:
! 4: #include "ca.h"
! 5: #include "parse.h"
! 6: #if INET
! 7: #include "com.h"
! 8: #endif
! 9:
! 10: #if PARI
! 11: #include "genpari.h"
! 12: int get_lg(GEN);
! 13: #endif
! 14:
! 15: void saveerror(FILE *,ERR);
! 16: void saveui(FILE *,USINT);
! 17: void savedp(FILE *,DP);
! 18: void savestr(FILE *,char *);
! 19: void savestring(FILE *,STRING);
! 20: void savemat(FILE *,MAT);
! 21: void savevect(FILE *,VECT);
! 22: void savelist(FILE *,LIST);
! 23: void saver(FILE *,R);
! 24: void savep(FILE *,P);
! 25: void savegf2n(FILE *,GF2N);
! 26: void savegfpn(FILE *,GFPN);
! 27: void savelm(FILE *,LM);
! 28: void savemi(FILE *,MQ);
! 29: void savecplx(FILE *,C);
! 30: void savebf(FILE *,BF);
! 31: void savereal(FILE *,Real);
! 32: void saveq(FILE *,Q);
! 33: void savenum(FILE *,Num);
! 34: void savepfins(FILE *,V);
! 35: void savegfmmat(FILE *,GFMMAT);
! 36:
! 37: #define O_GF2MAT 12
! 38: #define O_MATHCAP 13
! 39: #define O_F 14
! 40: #define O_GFMMAT 15
! 41:
! 42: void (*savef[])() = { 0, savenum, savep, saver, savelist, savevect,
! 43: savemat, savestring, 0, savedp, saveui, saveerror,0,0,0,savegfmmat };
! 44: void (*nsavef[])() = { saveq, savereal, 0, savebf, savecplx ,savemi, savelm, savegf2n, savegfpn};
! 45:
! 46: static short zeroval = 0;
! 47:
! 48: void saveobj(s,p)
! 49: FILE *s;
! 50: Obj p;
! 51: {
! 52: if ( !p )
! 53: write_short(s,&zeroval);
! 54: else if ( !savef[OID(p)] )
! 55: error("saveobj : not implemented");
! 56: else
! 57: (*savef[OID(p)])(s,p);
! 58: }
! 59:
! 60: void savenum(s,p)
! 61: FILE *s;
! 62: Num p;
! 63: {
! 64: if ( !nsavef[NID(p)] )
! 65: error("savenum : not implemented");
! 66: else {
! 67: write_short(s,&OID(p)); write_char(s,&NID(p));
! 68: write_char(s,&(p->pad));
! 69: (*nsavef[NID(p)])(s,p);
! 70: }
! 71: }
! 72:
! 73: void saveq(s,p)
! 74: FILE *s;
! 75: Q p;
! 76: {
! 77: int size[2];
! 78: int len = 2;
! 79:
! 80: size[0] = PL(NM(p)); size[1] = DN(p) ? PL(DN(p)) : 0;
! 81: write_intarray(s,size,len);
! 82: write_intarray(s,BD(NM(p)),size[0]);
! 83: if ( size[1] )
! 84: write_intarray(s,BD(DN(p)),size[1]);
! 85: }
! 86:
! 87: void savereal(s,p)
! 88: FILE *s;
! 89: Real p;
! 90: { write_double(s,&BDY(p)); }
! 91:
! 92: /*
! 93: * BDY(p) = | z[0] | z[1] | z[2] | ... | z[lg(z)-1] |
! 94: * -> | id(2) | nid(1) | sgn(1) | expo>>32 | expo&0xffffffff | len | ... |
! 95: */
! 96:
! 97: void savebf(s,p)
! 98: FILE *s;
! 99: BF p;
! 100: {
! 101: #if PARI
! 102: GEN z;
! 103: int sign;
! 104: unsigned long expo;
! 105: unsigned int len,t;
! 106:
! 107: z = (GEN)BDY(p);
! 108: sign = signe(z);
! 109: len = lg(z)-2;
! 110: expo = expo(z);
! 111:
! 112: write_int(s,&sign);
! 113:
! 114: #if defined(LONG_IS_32BIT)
! 115: write_int(s,(int *)&zeroval); /* expo>>32 is always 0 */
! 116: write_int(s,(int *)&expo);
! 117: write_int(s,&len);
! 118: write_intarray(s,(int *)&z[2],len);
! 119: #elif defined(LONG_IS_64BIT)
! 120: t = expo>>32; write_int(s,(int *)&t);
! 121: t = expo&0xffffffff; write_int(s,&t);
! 122: t = 2*len; write_int(s,&t);
! 123: write_longarray(s,&z[2],len);
! 124: #endif
! 125: #else
! 126: error("savebf : PARI is not combined");
! 127: #endif
! 128: }
! 129:
! 130: void savecplx(s,p)
! 131: FILE *s;
! 132: C p;
! 133: { saveobj(s,(Obj)p->r); saveobj(s,(Obj)p->i); }
! 134:
! 135: void savemi(s,p)
! 136: FILE *s;
! 137: MQ p;
! 138: { write_int(s,&CONT(p)); }
! 139:
! 140: void savelm(s,p)
! 141: FILE *s;
! 142: LM p;
! 143: {
! 144: int size;
! 145:
! 146: size = PL(BDY(p));
! 147: write_int(s,&size);
! 148: write_intarray(s,BD(BDY(p)),size);
! 149: }
! 150:
! 151: void savegf2n(s,p)
! 152: FILE *s;
! 153: GF2N p;
! 154: {
! 155: int len;
! 156:
! 157: len = p->body->w;
! 158: write_int(s,&len);
! 159: write_intarray(s,p->body->b,len);
! 160: }
! 161:
! 162: void savegfpn(s,p)
! 163: FILE *s;
! 164: GFPN p;
! 165: {
! 166: int d,i;
! 167:
! 168: d = p->body->d;
! 169: write_int(s,&d);
! 170: for ( i = 0; i <= d; i++ )
! 171: saveobj(s,(Obj)p->body->c[i]);
! 172: }
! 173:
! 174: void savep(s,p)
! 175: FILE *s;
! 176: P p;
! 177: {
! 178: DCP dc;
! 179: int n;
! 180: int vindex;
! 181:
! 182: if ( NUM(p) )
! 183: savenum(s,(Num)p);
! 184: else {
! 185: vindex = save_convv(VR(p));
! 186: for ( dc = DC(p), n = 0; dc; dc = NEXT(dc), n++ );
! 187: write_short(s,&OID(p));
! 188: write_int(s,&vindex);
! 189: if ( vindex < 0 )
! 190: savepfins(s,VR(p));
! 191: write_int(s,&n);
! 192: for ( dc = DC(p); dc; dc = NEXT(dc) ) {
! 193: saveobj(s,(Obj)DEG(dc)); saveobj(s,(Obj)COEF(dc));
! 194: }
! 195: }
! 196: }
! 197:
! 198: /* save a pure function (v->attr = V_PF) */
! 199: /* |name(str)|argc(int)|darray(intarray)|args| */
! 200:
! 201: void savepfins(s,v)
! 202: FILE *s;
! 203: V v;
! 204: {
! 205: PFINS ins;
! 206: PF pf;
! 207: int argc,i;
! 208: int *darray;
! 209:
! 210: ins = (PFINS)v->priv;
! 211: pf = ins->pf;
! 212: savestr(s,NAME(pf));
! 213: argc = pf->argc;
! 214: write_int(s,&argc);
! 215: darray = (int *)ALLOCA(argc*sizeof(int));
! 216: for ( i = 0; i < argc; i++ )
! 217: darray[i] = ins->ad[i].d;
! 218: write_intarray(s,darray,argc);
! 219: for ( i = 0; i < argc; i++ )
! 220: saveobj(s,ins->ad[i].arg);
! 221: }
! 222:
! 223: void saver(s,p)
! 224: FILE *s;
! 225: R p;
! 226: {
! 227: if ( !RAT(p) )
! 228: savep(s,(P)p);
! 229: else {
! 230: write_short(s,&OID(p)); write_short(s,&p->reduced);
! 231: savep(s,NM(p)); savep(s,DN(p));
! 232: }
! 233: }
! 234:
! 235: void savelist(s,p)
! 236: FILE *s;
! 237: LIST p;
! 238: {
! 239: int n;
! 240: NODE tn;
! 241:
! 242: for ( tn = BDY(p), n = 0; tn; tn = NEXT(tn), n++ );
! 243: write_short(s,&OID(p)); write_int(s,&n);
! 244: for ( tn = BDY(p); tn; tn = NEXT(tn) )
! 245: saveobj(s,(Obj)BDY(tn));
! 246: }
! 247:
! 248: void savevect(s,p)
! 249: FILE *s;
! 250: VECT p;
! 251: {
! 252: int i,len = 2;
! 253:
! 254: write_short(s,&OID(p)); write_int(s,&p->len);
! 255: for ( i = 0, len = p->len; i < len; i++ )
! 256: saveobj(s,(Obj)BDY(p)[i]);
! 257: }
! 258:
! 259: void savemat(s,p)
! 260: FILE *s;
! 261: MAT p;
! 262: {
! 263: int i,j,row,col;
! 264: int len = 3;
! 265:
! 266: write_short(s,&OID(p)); write_int(s,&p->row); write_int(s,&p->col);
! 267: for ( i = 0, row = p->row, col = p->col; i < row; i++ )
! 268: for ( j = 0; j < col; j++ )
! 269: saveobj(s,(Obj)BDY(p)[i][j]);
! 270: }
! 271:
! 272: void savestring(s,p)
! 273: FILE *s;
! 274: STRING p;
! 275: {
! 276: write_short(s,&OID(p)); savestr(s,BDY(p));
! 277: }
! 278:
! 279: void savestr(s,p)
! 280: FILE *s;
! 281: char *p;
! 282: {
! 283: int size;
! 284:
! 285: size = p ? strlen(p) : 0; write_int(s,&size);
! 286: if ( size )
! 287: write_string(s,p,size);
! 288: }
! 289:
! 290: void savedp(s,p)
! 291: FILE *s;
! 292: DP p;
! 293: {
! 294: int nv,n,i,sugar;
! 295: MP m,t;
! 296:
! 297: nv = p->nv; m = p->body; sugar = p->sugar;
! 298: for ( n = 0, t = m; t; t = NEXT(t), n++ );
! 299: write_short(s,&OID(p)); write_int(s,&nv); write_int(s,&sugar); write_int(s,&n);
! 300: for ( i = 0, t = m; i < n; i++, t = NEXT(t) ) {
! 301: saveobj(s,(Obj)t->c);
! 302: write_int(s,&t->dl->td); write_intarray(s,&(t->dl->d[0]),nv);
! 303: }
! 304: }
! 305:
! 306: void saveui(s,u)
! 307: FILE *s;
! 308: USINT u;
! 309: {
! 310: write_short(s,&OID(u)); write_int(s,&BDY(u));
! 311: }
! 312:
! 313: void saveerror(s,e)
! 314: FILE *s;
! 315: ERR e;
! 316: {
! 317: write_short(s,&OID(e)); saveobj(s,(Obj)BDY(e));
! 318: }
! 319:
! 320: void savegfmmat(s,p)
! 321: FILE *s;
! 322: GFMMAT p;
! 323: {
! 324: int i,j,row,col;
! 325:
! 326: write_short(s,&OID(p)); write_int(s,&p->row); write_int(s,&p->col);
! 327: for ( i = 0, row = p->row, col = p->col; i < row; i++ )
! 328: write_intarray(s,p->body[i],col);
! 329: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>