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

Annotation of OpenXM_contrib2/asir2000/io/bload.c, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/io/bload.c,v 1.1.1.1 1999/11/10 08:12:30 noro Exp $ */
                      2: #include "ca.h"
                      3: #include "parse.h"
                      4: #if INET
                      5: #include "com.h"
                      6: #endif
                      7: #if PARI
                      8: #include "genpari.h"
                      9: int get_lg(GEN);
                     10: #endif
                     11:
                     12: void loaderror(FILE *,ERR *);
                     13: void loadui(FILE *,USINT *);
                     14: void loaddp(FILE *,DP *);
                     15: void loadstr(FILE *,char **);
                     16: void loadstring(FILE *,STRING *);
                     17: void loadmat(FILE *,MAT *);
                     18: void loadvect(FILE *,VECT *);
                     19: void loadlist(FILE *,LIST *);
                     20: void loadr(FILE *,R *);
                     21: void loadp(FILE *,P *);
                     22: void loadgf2n(FILE *,GF2N *);
                     23: void loadgfpn(FILE *,GFPN *);
                     24: void loadlm(FILE *,LM *);
                     25: void loadmi(FILE *,MQ *);
                     26: void loadcplx(FILE *,C *);
                     27: void loadbf(FILE *,BF *);
                     28: void loadreal(FILE *,Real *);
                     29: void loadq(FILE *,Q *);
                     30: void loadnum(FILE *,Num *);
                     31: void loadgfmmat(FILE *,GFMMAT *);
                     32:
                     33: V loadpfins(FILE *);
                     34:
                     35: extern VL file_vl;
                     36:
                     37: void (*loadf[])() = { 0, loadnum, loadp, loadr, loadlist, loadvect, loadmat,
                     38:        loadstring, 0, loaddp, loadui, loaderror,0,0,0,loadgfmmat };
                     39: void (*nloadf[])() = { loadq, loadreal, 0, loadbf, loadcplx, loadmi, loadlm, loadgf2n, loadgfpn };
                     40:
                     41: void loadobj(s,p)
                     42: FILE *s;
                     43: Obj *p;
                     44: {
                     45:        short id;
                     46:
                     47:        read_short(s,&id);
                     48:        if ( !id )
                     49:                *p = 0;
                     50:        else if ( !loadf[id] )
                     51:                error("loadobj : not implemented");
                     52:        else
                     53:                (*loadf[id])(s,p);
                     54: }
                     55:
                     56: void loadnum(s,p)
                     57: FILE *s;
                     58: Num *p;
                     59: {
                     60:        char nid;
                     61:
                     62:        read_char(s,&nid);
                     63:        if ( !nloadf[nid] )
                     64:                error("loadnum : not implemented");
                     65:        else
                     66:                (*nloadf[nid])(s,p);
                     67: }
                     68:
                     69: void loadq(s,p)
                     70: FILE *s;
                     71: Q *p;
                     72: {
                     73:        int size[2];
                     74:        char sgn;
                     75:        int len = 2;
                     76:        N nm,dn;
                     77:
                     78:        read_char(s,&sgn); read_intarray(s,size,len);
                     79:        nm = NALLOC(size[0]); PL(nm) = size[0];
                     80:        read_intarray(s,BD(nm),size[0]);
                     81:        if ( size[1] ) {
                     82:                dn = NALLOC(size[1]); PL(dn) = size[1];
                     83:                read_intarray(s,BD(dn),size[1]);
                     84:        } else
                     85:                dn = 0;
                     86:        NDTOQ(nm,dn,sgn,*p);
                     87: }
                     88:
                     89: void loadreal(s,p)
                     90: FILE *s;
                     91: Real *p;
                     92: {
                     93:        Real q;
                     94:        char dmy;
                     95:
                     96:        read_char(s,&dmy);
                     97:        NEWReal(q); read_double(s,&BDY(q));
                     98:        *p = q;
                     99: }
                    100:
                    101: void loadbf(s,p)
                    102: FILE *s;
                    103: BF *p;
                    104: {
                    105: #if PARI
                    106:        GEN z;
                    107:        unsigned int uexpo,lexpo;
                    108:        UL expo;
                    109:        char dmy;
                    110:        int sign;
                    111:        unsigned int len;
                    112:        BF q;
                    113:
                    114:        read_char(s,&dmy);
                    115:        read_int(s,&sign);
                    116:        read_int(s,&uexpo);
                    117:        read_int(s,&lexpo);
                    118:
                    119: #if defined(LONG_IS_32BIT)
                    120:        if ( uexpo )
                    121:                error("loadbf : exponent too large");
                    122:        read_int(s,&len);
                    123:        NEWBF(q,len+2);
                    124:        z = (GEN)BDY(q);
                    125:        settyp(z,t_REAL);
                    126:        setlg(z,len+2);
                    127:        setsigne(z,(long)sign);
                    128:        setexpo(z,(long)lexpo);
                    129:        read_intarray(s,(int *)(z+2),len);
                    130: #elif defined(LONG_IS_64BIT)
                    131:        expo = (((UL)uexpo)<<32)|((UL)lexpo);
                    132:        read_int(s,&len);
                    133:        NEWBF(q,(len+5)/2); /* 2+(len+1)/2 */
                    134:        z = (GEN)BDY(q);
                    135:        settyp(z,t_REAL);
                    136:        setlg(z,(len+5)/2);
                    137:        setsigne(z,(long)sign);
                    138:        setexpo(z,(long)expo);
                    139:        read_longarray(s,z+2,len);
                    140: #endif
                    141:        *p = q;
                    142: #else
                    143:        error("loadbf : PARI is not combined");
                    144: #endif
                    145: }
                    146:
                    147: void loadcplx(s,p)
                    148: FILE *s;
                    149: C *p;
                    150: {
                    151:        C q;
                    152:        char dmy;
                    153:
                    154:        read_char(s,&dmy);
                    155:        NEWC(q); loadobj(s,(Obj *)&q->r); loadobj(s,(Obj *)&q->i);
                    156:        *p = q;
                    157: }
                    158:
                    159: void loadmi(s,p)
                    160: FILE *s;
                    161: MQ *p;
                    162: {
                    163:        MQ q;
                    164:        char dmy;
                    165:
                    166:        read_char(s,&dmy);
                    167:        NEWMQ(q); read_int(s,(int *)&CONT(q));
                    168:        *p = q;
                    169: }
                    170:
                    171: void loadlm(s,p)
                    172: FILE *s;
                    173: LM *p;
                    174: {
                    175:        int size;
                    176:        char dmy;
                    177:        N body;
                    178:
                    179:        read_char(s,&dmy); read_int(s,&size);
                    180:        body = NALLOC(size); PL(body) = size;
                    181:        read_intarray(s,BD(body),size);
                    182:        MKLM(body,*p);
                    183: }
                    184:
                    185: void loadgf2n(s,p)
                    186: FILE *s;
                    187: GF2N *p;
                    188: {
                    189:        char dmy;
                    190:        int len;
                    191:        UP2 body;
                    192:
                    193:        read_char(s,&dmy); read_int(s,&len);
                    194:        NEWUP2(body,len); body->w = len;
                    195:        read_intarray(s,body->b,len);
                    196:        MKGF2N(body,*p);
                    197: }
                    198:
                    199: void loadgfpn(s,p)
                    200: FILE *s;
                    201: GFPN *p;
                    202: {
                    203:        char dmy;
                    204:        int d,i;
                    205:        UP body;
                    206:
                    207:        read_char(s,&dmy); read_int(s,&d);
                    208:        body = UPALLOC(d);
                    209:        body->d = d;
                    210:        for ( i = 0; i <= d; i++ )
                    211:                loadobj(s,(Obj *)&body->c[i]);
                    212:        MKGFPN(body,*p);
                    213: }
                    214:
                    215: void loadp(s,p)
                    216: FILE *s;
                    217: P *p;
                    218: {
                    219:        V v;
                    220:        int n,vindex;
                    221:        DCP dc,dc0;
                    222:        P t;
                    223:
                    224:        read_int(s,&vindex);
                    225:        if ( vindex < 0 )
                    226:        /* v is a pure function */
                    227:                v = loadpfins(s);
                    228:        else
                    229:                v = (V)load_convv(vindex);
                    230:        read_int(s,&n);
                    231:        for ( dc0 = 0; n; n-- ) {
                    232:                NEXTDC(dc0,dc); loadobj(s,(Obj *)&DEG(dc)); loadobj(s,(Obj *)&COEF(dc));
                    233:        }
                    234:        NEXT(dc) = 0;
                    235:        MKP(v,dc0,t);
                    236:        if ( vindex < 0 || file_vl )
                    237:                reorderp(CO,file_vl,t,p);
                    238:        else
                    239:                *p = t;
                    240: }
                    241:
                    242: /* |name(str)|argc(int)|darray(intarray)|args| */
                    243:
                    244: V loadpfins(s)
                    245: FILE *s;
                    246: {
                    247:        char *name;
                    248:        FUNC fp;
                    249:        int argc,i;
                    250:        V v;
                    251:        int *darray;
                    252:        Obj *args;
                    253:        PF pf;
                    254:        char *buf;
                    255:        V *a;
                    256:        P u;
                    257:
                    258:        loadstr(s,&name);
                    259:        read_int(s,&argc);
                    260:        searchpf(name,&fp);
                    261:        if ( fp ) {
                    262:                pf = fp->f.puref;
                    263:                if ( pf->argc != argc )
                    264:                        error("loadpfins : argument mismatch");
                    265:        } else {
                    266:                a = (V *)MALLOC(argc*sizeof(V));
                    267:                buf = (char *)ALLOCA(BUFSIZ);
                    268:                for ( i = 0; i < argc; i++ ) {
                    269:                        sprintf(buf,"_%c",'a'+i);
                    270:                        makevar(buf,&u); a[i] = VR(u);
                    271:                }
                    272:                mkpf(name,0,argc,a,0,0,0,&pf);
                    273:        }
                    274:        darray = (int *)ALLOCA(argc*sizeof(int));
                    275:        args = (Obj *)ALLOCA(argc*sizeof(int));
                    276:        read_intarray(s,darray,argc);
                    277:        for ( i = 0; i < argc; i++ )
                    278:                loadobj(s,&args[i]);
                    279:        _mkpfins_with_darray(pf,args,darray,&v);
                    280:        return v;
                    281: }
                    282:
                    283: void loadr(s,p)
                    284: FILE *s;
                    285: R *p;
                    286: {
                    287:        R r;
                    288:
                    289:        NEWR(r); read_short(s,&r->reduced);
                    290:        loadobj(s,(Obj *)&NM(r)); loadobj(s,(Obj *)&DN(r)); *p = r;
                    291: }
                    292:
                    293: void loadlist(s,p)
                    294: FILE *s;
                    295: LIST *p;
                    296: {
                    297:        int n;
                    298:        NODE tn,tn0;
                    299:
                    300:        read_int(s,&n);
                    301:        for ( tn0 = 0; n; n-- ) {
                    302:                NEXTNODE(tn0,tn); loadobj(s,(Obj *)&BDY(tn));
                    303:        }
                    304:        if ( tn0 )
                    305:                NEXT(tn) = 0;
                    306:        MKLIST(*p,tn0);
                    307: }
                    308:
                    309: void loadvect(s,p)
                    310: FILE *s;
                    311: VECT *p;
                    312: {
                    313:        int i,len;
                    314:        VECT vect;
                    315:
                    316:        read_int(s,&len); MKVECT(vect,len);
                    317:        for ( i = 0; i < len; i++ )
                    318:                loadobj(s,(Obj *)&BDY(vect)[i]);
                    319:        *p = vect;
                    320: }
                    321:
                    322: void loadmat(s,p)
                    323: FILE *s;
                    324: MAT *p;
                    325: {
                    326:        int row,col,i,j;
                    327:        MAT mat;
                    328:
                    329:        read_int(s,&row); read_int(s,&col); MKMAT(mat,row,col);
                    330:        for ( i = 0; i < row; i++ )
                    331:                for ( j = 0; j < col; j++ )
                    332:                        loadobj(s,(Obj *)&BDY(mat)[i][j]);
                    333:        *p = mat;
                    334: }
                    335:
                    336: void loadstring(s,p)
                    337: FILE *s;
                    338: STRING *p;
                    339: {
                    340:        char *t;
                    341:
                    342:        loadstr(s,&t); MKSTR(*p,t);
                    343: }
                    344:
                    345: void loadstr(s,p)
                    346: FILE *s;
                    347: char **p;
                    348: {
                    349:        int len;
                    350:        char *t;
                    351:
                    352:        read_int(s,&len);
                    353:        if ( len ) {
                    354:                t = (char *)MALLOC(len+1); read_string(s,t,len); t[len] = 0;
                    355:        } else
                    356:                t = "";
                    357:        *p = t;
                    358: }
                    359:
                    360: void loaddp(s,p)
                    361: FILE *s;
                    362: DP *p;
                    363: {
                    364:        int nv,n,i,sugar;
                    365:        DP dp;
                    366:        MP m,m0;
                    367:        DL dl;
                    368:
                    369:        read_int(s,&nv); read_int(s,&sugar); read_int(s,&n);
                    370:        for ( i = 0, m0 = 0; i < n; i++ ) {
                    371:                NEXTMP(m0,m);
                    372:                loadobj(s,(Obj *)&(m->c));
                    373:                NEWDL(dl,nv); m->dl = dl;
                    374:                read_int(s,&dl->td); read_intarray(s,&(dl->d[0]),nv);
                    375:        }
                    376:        NEXT(m) = 0; MKDP(nv,m0,dp); dp->sugar = sugar; *p = dp;
                    377: }
                    378:
                    379: void loadui(s,u)
                    380: FILE *s;
                    381: USINT *u;
                    382: {
                    383:        unsigned int b;
                    384:
                    385:        read_int(s,&b); MKUSINT(*u,b);
                    386: }
                    387:
                    388: void loaderror(s,e)
                    389: FILE *s;
                    390: ERR *e;
                    391: {
                    392:        Obj b;
                    393:
                    394:        loadobj(s,&b); MKERR(*e,b);
                    395: }
                    396:
                    397:
                    398: void loadgfmmat(s,p)
                    399: FILE *s;
                    400: GFMMAT *p;
                    401: {
                    402:        int i,j,row,col;
                    403:        unsigned int **a;
                    404:        GFMMAT mat;
                    405:
                    406:        read_int(s,&row); read_int(s,&col);
                    407:        a = (unsigned int **)almat(row,col);
                    408:        TOGFMMAT(row,col,a,mat);
                    409:        for ( i = 0; i < row; i++ )
                    410:                read_intarray(s,a[i],col);
                    411:        *p = mat;
                    412: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>