Annotation of OpenXM_contrib2/asir2000/io/cio.c, Revision 1.1
1.1 ! noro 1: /* $OpenXM: OpenXM/src/asir99/io/cio.c,v 1.2 1999/11/18 02:24:01 noro Exp $ */
! 2: #include "ca.h"
! 3: #include "parse.h"
! 4: #include "ox.h"
! 5:
! 6: #define ISIZ sizeof(int)
! 7:
! 8: int write_cmo_zz(FILE *,int,N);
! 9: int read_cmo_zz(FILE *,int *,N *);
! 10:
! 11: int valid_as_cmo(obj)
! 12: Obj obj;
! 13: {
! 14: NODE m;
! 15:
! 16: if ( !obj )
! 17: return 1;
! 18: switch ( OID(obj) ) {
! 19: case O_MATHCAP: case O_P: case O_R: case O_DP: case O_STR:
! 20: case O_ERR: case O_USINT: case O_VOID:
! 21: return 1;
! 22: case O_N:
! 23: if ( NID((Num)obj) == N_Q )
! 24: return 1;
! 25: else
! 26: return 0;
! 27: case O_LIST:
! 28: for ( m = BDY((LIST)obj); m; m = NEXT(m) )
! 29: if ( !valid_as_cmo(BDY(m)) )
! 30: return 0;
! 31: return 1;
! 32: default:
! 33: return 0;
! 34: }
! 35: }
! 36:
! 37: write_cmo(s,obj)
! 38: FILE *s;
! 39: Obj obj;
! 40: {
! 41: int r;
! 42: char errmsg[BUFSIZ];
! 43:
! 44: if ( !obj ) {
! 45: r = CMO_NULL; write_int(s,&r);
! 46: return;
! 47: }
! 48: switch ( OID(obj) ) {
! 49: case O_N:
! 50: write_cmo_q(s,obj);
! 51: break;
! 52: case O_P:
! 53: write_cmo_p(s,obj);
! 54: break;
! 55: case O_R:
! 56: write_cmo_r(s,obj);
! 57: break;
! 58: case O_DP:
! 59: write_cmo_dp(s,obj);
! 60: break;
! 61: case O_LIST:
! 62: write_cmo_list(s,obj);
! 63: break;
! 64: case O_STR:
! 65: write_cmo_string(s,obj);
! 66: break;
! 67: case O_USINT:
! 68: write_cmo_uint(s,obj);
! 69: break;
! 70: case O_MATHCAP:
! 71: write_cmo_mathcap(s,obj);
! 72: break;
! 73: case O_ERR:
! 74: write_cmo_error(s,obj);
! 75: break;
! 76: case O_VOID:
! 77: r = ((USINT)obj)->body; write_int(s,&r);
! 78: break;
! 79: default:
! 80: sprintf(errmsg, "write_cmo : id=%d not implemented.",OID(obj));
! 81: error(errmsg);
! 82: break;
! 83: }
! 84: }
! 85:
! 86: write_cmo_mathcap(s,mc)
! 87: FILE *s;
! 88: MATHCAP mc;
! 89: {
! 90: unsigned int r;
! 91:
! 92: r = CMO_MATHCAP; write_int(s,&r);
! 93: write_cmo(s,BDY(mc));
! 94: }
! 95:
! 96: write_cmo_uint(s,ui)
! 97: FILE *s;
! 98: USINT ui;
! 99: {
! 100: unsigned int r;
! 101:
! 102: r = CMO_INT32; write_int(s,&r);
! 103: r = ui->body; write_int(s,&r);
! 104: }
! 105:
! 106: write_cmo_q(s,q)
! 107: FILE *s;
! 108: Q q;
! 109: {
! 110: int r;
! 111:
! 112: if ( q && DN(q) ) {
! 113: r = CMO_QQ; write_int(s,&r);
! 114: write_cmo_zz(s,SGN(q),NM(q));
! 115: write_cmo_zz(s,1,DN(q));
! 116: } else {
! 117: r = CMO_ZZ; write_int(s,&r);
! 118: write_cmo_zz(s,SGN(q),NM(q));
! 119: }
! 120: }
! 121:
! 122: write_cmo_zz(s,sgn,n)
! 123: FILE *s;
! 124: int sgn;
! 125: N n;
! 126: {
! 127: int i,l,bytes;
! 128: unsigned int t;
! 129: unsigned int *b;
! 130: unsigned char c;
! 131:
! 132: #if 1
! 133: l = PL(n);
! 134: bytes = sgn*l;
! 135: write_int(s,&bytes);
! 136: write_intarray(s,BD(n),l);
! 137: #else
! 138: l = PL(n); b = (unsigned int *)BD(n);
! 139: bytes = sgn*4*l;
! 140: write_int(s,&bytes);
! 141: for ( i = l-1; i >= 0; i-- ) {
! 142: t = b[i];
! 143: c = t>>24; write_char(s,&c);
! 144: c = (t>>16)&0xff; write_char(s,&c);
! 145: c = (t>>8)&0xff; write_char(s,&c);
! 146: c = t&0xff; write_char(s,&c);
! 147: }
! 148: #endif
! 149: }
! 150:
! 151: write_cmo_p(s,p)
! 152: FILE *s;
! 153: P p;
! 154: {
! 155: int r,i;
! 156: VL t,vl;
! 157: char *namestr;
! 158: STRING name;
! 159: NODE n0,n;
! 160:
! 161: r = CMO_RECURSIVE_POLYNOMIAL; write_int(s,&r);
! 162: get_vars((Obj)p,&vl);
! 163:
! 164: /* indeterminate list */
! 165: r = CMO_LIST; write_int(s,&r);
! 166: for ( t = vl, i = 0; t; t = NEXT(t), i++ );
! 167: write_int(s,&i);
! 168: r = CMO_INDETERMINATE;
! 169: for ( t = vl; t; t = NEXT(t) ) {
! 170: write_int(s,&r);
! 171: /* localname_to_cmoname(NAME(t->v),&namestr); */
! 172: namestr = NAME(t->v);
! 173: MKSTR(name,namestr);
! 174: write_cmo(s,name);
! 175: }
! 176:
! 177: /* body */
! 178: write_cmo_upoly(s,vl,p);
! 179: }
! 180:
! 181: write_cmo_upoly(s,vl,p)
! 182: FILE *s;
! 183: VL vl;
! 184: P p;
! 185: {
! 186: int r,i;
! 187: V v;
! 188: DCP dc,dct;
! 189: VL vlt;
! 190:
! 191: if ( NUM(p) )
! 192: write_cmo(s,p);
! 193: else {
! 194: r = CMO_UNIVARIATE_POLYNOMIAL; write_int(s,&r);
! 195: v = VR(p);
! 196: dc = DC(p);
! 197: for ( i = 0, dct = dc; dct; dct = NEXT(dct), i++ );
! 198: write_int(s,&i);
! 199: for ( i = 0, vlt = vl; vlt->v != v; vlt = NEXT(vlt), i++ );
! 200: write_int(s,&i);
! 201: for ( dct = dc; dct; dct = NEXT(dct) ) {
! 202: i = QTOS(DEG(dct)); write_int(s,&i);
! 203: write_cmo_upoly(s,vl,COEF(dct));
! 204: }
! 205: }
! 206: }
! 207:
! 208: write_cmo_r(s,f)
! 209: FILE *s;
! 210: R f;
! 211: {
! 212: int r;
! 213:
! 214: r = CMO_RATIONAL; write_int(s,&r);
! 215: write_cmo(s,NM(f));
! 216: write_cmo(s,DN(f));
! 217: }
! 218:
! 219: write_cmo_dp(s,dp)
! 220: FILE *s;
! 221: DP dp;
! 222: {
! 223: int i,n,nv,r;
! 224: MP m;
! 225:
! 226: for ( n = 0, m = BDY(dp); m; m = NEXT(m), n++ );
! 227: r = CMO_DISTRIBUTED_POLYNOMIAL; write_int(s,&r);
! 228: r = n; write_int(s,&r);
! 229: r = CMO_DMS_GENERIC; write_int(s,&r);
! 230: nv = dp->nv;
! 231: for ( i = 0, m = BDY(dp); i < n; i++, m = NEXT(m) )
! 232: write_cmo_monomial(s,m,nv);
! 233: }
! 234:
! 235: write_cmo_monomial(s,m,n)
! 236: FILE *s;
! 237: MP m;
! 238: int n;
! 239: {
! 240: int i,r;
! 241: int *p;
! 242:
! 243: r = CMO_MONOMIAL32; write_int(s,&r);
! 244: write_int(s,&n);
! 245: for ( i = 0, p = m->dl->d; i < n; i++ ) {
! 246: write_int(s,p++);
! 247: }
! 248: write_cmo_q(s,m->c);
! 249: }
! 250:
! 251: write_cmo_list(s,list)
! 252: FILE *s;
! 253: LIST list;
! 254: {
! 255: NODE m;
! 256: int i,n,r;
! 257:
! 258: for ( n = 0, m = BDY(list); m; m = NEXT(m), n++ );
! 259: r = CMO_LIST; write_int(s,&r);
! 260: write_int(s,&n);
! 261: for ( i = 0, m = BDY(list); i < n; i++, m = NEXT(m) )
! 262: write_cmo(s,BDY(m));
! 263: }
! 264:
! 265: write_cmo_string(s,str)
! 266: FILE *s;
! 267: STRING str;
! 268: {
! 269: int r;
! 270:
! 271: r = CMO_STRING; write_int(s,&r);
! 272: savestr(s,BDY(str));
! 273: }
! 274:
! 275: write_cmo_error(s,e)
! 276: FILE *s;
! 277: ERR e;
! 278: {
! 279: int r;
! 280:
! 281: r = CMO_ERROR2; write_int(s,&r);
! 282: write_cmo(s,BDY(e));
! 283: }
! 284:
! 285: read_cmo(s,rp)
! 286: FILE *s;
! 287: Obj *rp;
! 288: {
! 289: int id;
! 290: int n,sgn,dummy;
! 291: Q q,qnm,qdn;
! 292: N nm,dn;
! 293: P p,pnm,pdn;
! 294: R r;
! 295: STRING str;
! 296: USINT t;
! 297: DP dp;
! 298: char *b;
! 299: Obj obj;
! 300: ERR e;
! 301: MATHCAP mc;
! 302:
! 303: read_int(s,&id);
! 304: switch ( id ) {
! 305: /* level 0 objects */
! 306: case CMO_NULL:
! 307: *rp = 0;
! 308: break;
! 309: case CMO_INT32:
! 310: read_cmo_uint(s,rp);
! 311: break;
! 312: case CMO_DATUM:
! 313: case CMO_STRING:
! 314: loadstring(s,&str); *rp = (Obj)str;
! 315: break;
! 316: case CMO_MATHCAP:
! 317: read_cmo(s,&obj); MKMATHCAP(mc,(LIST)obj);
! 318: *rp = (Obj)mc;
! 319: break;
! 320: case CMO_ERROR:
! 321: MKERR(e,0); *rp = (Obj)e;
! 322: break;
! 323: case CMO_ERROR2:
! 324: read_cmo(s,&obj); MKERR(e,obj); *rp = (Obj)e;
! 325: break;
! 326: /* level 1 objects */
! 327: case CMO_LIST:
! 328: read_cmo_list(s,rp);
! 329: break;
! 330: case CMO_MONOMIAL32:
! 331: read_cmo_monomial(s,rp);
! 332: break;
! 333: case CMO_ZZ:
! 334: read_cmo_zz(s,&sgn,&nm);
! 335: NTOQ(nm,sgn,q); *rp = (Obj)q;
! 336: break;
! 337: case CMO_QQ:
! 338: read_cmo_zz(s,&sgn,&nm);
! 339: read_cmo_zz(s,&dummy,&dn);
! 340: NDTOQ(nm,dn,sgn,q); *rp = (Obj)q;
! 341: break;
! 342: case CMO_DISTRIBUTED_POLYNOMIAL:
! 343: read_cmo_dp(s,&dp); *rp = (Obj)dp;
! 344: break;
! 345: case CMO_RECURSIVE_POLYNOMIAL:
! 346: read_cmo_p(s,&p); *rp = (Obj)p;
! 347: break;
! 348: case CMO_UNIVARIATE_POLYNOMIAL:
! 349: read_cmo_upoly(s,&p); *rp = (Obj)p;
! 350: break;
! 351: case CMO_INDETERMINATE:
! 352: read_cmo(s,&str); *rp = (Obj)str;
! 353: break;
! 354: case CMO_RATIONAL:
! 355: read_cmo(s,&pnm); read_cmo(s,&pdn);
! 356: divr(CO,(Obj)pnm,(Obj)pdn,rp);
! 357: break;
! 358: case CMO_ZERO:
! 359: *rp = 0;
! 360: break;
! 361: case CMO_DMS_OF_N_VARIABLES:
! 362: read_cmo(s,rp);
! 363: break;
! 364: case CMO_RING_BY_NAME:
! 365: read_cmo(s,rp);
! 366: break;
! 367: default:
! 368: MKUSINT(t,id);
! 369: t->id = O_VOID;
! 370: *rp = (Obj)t;
! 371: break;
! 372: }
! 373: }
! 374:
! 375: read_cmo_uint(s,rp)
! 376: FILE *s;
! 377: USINT *rp;
! 378: {
! 379: unsigned int body;
! 380:
! 381: read_int(s,&body);
! 382: MKUSINT(*rp,body);
! 383: }
! 384:
! 385: read_cmo_zz(s,sgn,rp)
! 386: FILE *s;
! 387: int *sgn;
! 388: N *rp;
! 389: {
! 390: int l,i,words;
! 391: N n;
! 392: unsigned int *b;
! 393: unsigned int h;
! 394: unsigned char c;
! 395:
! 396: read_int(s,&l);
! 397: if ( l == 0 ) {
! 398: *sgn = 0;
! 399: *rp = 0;
! 400: return;
! 401: }
! 402: if ( l < 0 ) {
! 403: *sgn = -1; l = -l;
! 404: } else
! 405: *sgn = 1;
! 406: #if 1
! 407: *rp = n = NALLOC(l); PL(n) = l;
! 408: read_intarray(s,BD(n),l);
! 409: #else
! 410: words = (l+3)/4;
! 411: *rp = n = NALLOC(words); PL(n) = words; b = BD(n);
! 412: h = 0;
! 413: switch ( l % 4 ) {
! 414: case 0:
! 415: read_char(s,&c); h = c;
! 416: case 3:
! 417: read_char(s,&c); h = (h<<8)|c;
! 418: case 2:
! 419: read_char(s,&c); h = (h<<8)|c;
! 420: case 1:
! 421: read_char(s,&c); h = (h<<8)|c;
! 422: }
! 423: b[words-1] = h;
! 424: for ( i = words-2; i >= 0; i-- ) {
! 425: read_char(s,&c); h = c;
! 426: read_char(s,&c); h = (h<<8)|c;
! 427: read_char(s,&c); h = (h<<8)|c;
! 428: read_char(s,&c); h = (h<<8)|c;
! 429: b[i] = h;
! 430: }
! 431: #endif
! 432: }
! 433:
! 434: read_cmo_list(s,rp)
! 435: FILE *s;
! 436: Obj *rp;
! 437: {
! 438: int len;
! 439: Obj *w;
! 440: int i;
! 441: Obj r,r1;
! 442: NODE n0,n1;
! 443: LIST list;
! 444:
! 445: read_int(s,&len);
! 446: w = (Obj *)ALLOCA(len*sizeof(Obj));
! 447: for ( i = 0; i < len; i++ )
! 448: read_cmo(s,&w[i]);
! 449: for ( i = len-1, n0 = 0; i >= 0; i-- ) {
! 450: MKNODE(n1,w[i],n0); n0 = n1;
! 451: }
! 452: MKLIST(list,n0);
! 453: *rp = (Obj)list;
! 454: }
! 455:
! 456: read_cmo_dp(s,rp)
! 457: FILE *s;
! 458: DP *rp;
! 459: {
! 460: int len;
! 461: int i;
! 462: NODE n0,n1;
! 463: MP mp0,mp;
! 464: int nv,d;
! 465: DP dp;
! 466: Obj obj;
! 467:
! 468: read_int(s,&len);
! 469: /* skip the ring definition */
! 470: read_cmo(s,&obj);
! 471: for ( mp0 = 0, i = 0, d = 0; i < len; i++ ) {
! 472: read_cmo(s,&dp);
! 473: if ( !mp0 ) {
! 474: nv = dp->nv;
! 475: mp0 = dp->body;
! 476: mp = mp0;
! 477: } else {
! 478: NEXT(mp) = dp->body;
! 479: mp = NEXT(mp);
! 480: }
! 481: d = MAX(d,dp->sugar);
! 482: }
! 483: MKDP(nv,mp0,dp);
! 484: dp->sugar = d; *rp = dp;
! 485: }
! 486:
! 487: read_cmo_monomial(s,rp)
! 488: FILE *s;
! 489: DP *rp;
! 490: {
! 491: MP m;
! 492: DP dp;
! 493: int i,sugar,n;
! 494: DL dl;
! 495:
! 496: read_int(s,&n);
! 497: NEWMP(m); NEWDL(dl,n); m->dl = dl;
! 498: read_intarray(s,dl->d,n);
! 499: for ( sugar = 0, i = 0; i < n; i++ )
! 500: sugar += dl->d[i];
! 501: dl->td = sugar;
! 502: read_cmo(s,&m->c);
! 503: NEXT(m) = 0; MKDP(n,m,dp); dp->sugar = sugar; *rp = dp;
! 504: }
! 505:
! 506: static V *remote_vtab;
! 507:
! 508: read_cmo_p(s,rp)
! 509: FILE *s;
! 510: P *rp;
! 511: {
! 512: LIST vlist;
! 513: int nv,i;
! 514: V *vtab;
! 515: V v1,v2;
! 516: NODE t;
! 517: P v,p;
! 518: VL tvl,rvl;
! 519: char *name;
! 520:
! 521: read_cmo(s,&vlist);
! 522: nv = length(BDY(vlist));
! 523: vtab = (V *)ALLOCA(nv*sizeof(V));
! 524: for ( i = 0, t = BDY(vlist); i < nv; t = NEXT(t), i++ ) {
! 525: /* cmoname_to_localname(BDY((STRING)BDY(t)),&name); */
! 526: name = BDY((STRING)BDY(t));
! 527: makevar(name,&v); vtab[i] = VR(v);
! 528: }
! 529: remote_vtab = vtab;
! 530: read_cmo(s,&p);
! 531: for ( i = 0; i < nv-1; i++ ) {
! 532: v1 = vtab[i]; v2 = vtab[i+1];
! 533: for ( tvl = CO; tvl->v != v1 && tvl->v != v2; tvl = NEXT(tvl) );
! 534: if ( tvl->v == v2 )
! 535: break;
! 536: }
! 537: if ( i < nv-1 ) {
! 538: for ( i = nv-1, rvl = 0; i >= 0; i-- ) {
! 539: NEWVL(tvl); tvl->v = vtab[i]; NEXT(tvl) = rvl; rvl = tvl;
! 540: }
! 541: reorderp(CO,rvl,p,rp);
! 542: } else
! 543: *rp = p;
! 544: }
! 545:
! 546: read_cmo_upoly(s,rp)
! 547: FILE *s;
! 548: P *rp;
! 549: {
! 550: int n,ind,i,d;
! 551: P c;
! 552: Q q;
! 553: DCP dc0,dc;
! 554:
! 555: read_int(s,&n);
! 556: read_int(s,&ind);
! 557: for ( i = 0, dc0 = 0; i < n; i++ ) {
! 558: read_int(s,&d);
! 559: read_cmo(s,&c);
! 560: if ( c ) {
! 561: if ( OID(c) == O_USINT ) {
! 562: UTOQ(((USINT)c)->body,q); c = (P)q;
! 563: }
! 564: NEXTDC(dc0,dc);
! 565: STOQ(d,q);
! 566: dc->c = c; dc->d = q;
! 567: }
! 568: }
! 569: if ( dc0 )
! 570: NEXT(dc) = 0;
! 571: MKP(remote_vtab[ind],dc0,*rp);
! 572: }
! 573:
! 574: localname_to_cmoname(a,b)
! 575: char *a;
! 576: char **b;
! 577: {
! 578: int l;
! 579: char *t;
! 580:
! 581: l = strlen(a);
! 582: if ( l >= 2 && a[0] == '@' && isupper(a[1]) ) {
! 583: t = *b = (char *)MALLOC_ATOMIC(l);
! 584: strcpy(t,a+1);
! 585: } else {
! 586: t = *b = (char *)MALLOC_ATOMIC(l+1);
! 587: strcpy(t,a);
! 588: }
! 589: }
! 590:
! 591: cmoname_to_localname(a,b)
! 592: char *a;
! 593: char **b;
! 594: {
! 595: int l;
! 596: char *t;
! 597:
! 598: l = strlen(a);
! 599: if ( isupper(a[0]) ) {
! 600: t = *b = (char *)MALLOC_ATOMIC(l+2);
! 601: strcpy(t+1,a);
! 602: t[0] = '@';
! 603: } else {
! 604: t = *b = (char *)MALLOC_ATOMIC(l+1);
! 605: strcpy(t,a);
! 606: }
! 607: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>