[BACK]Return to cio.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / io

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>