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

Annotation of OpenXM_contrib2/asir2000/parse/quote.c, Revision 1.4

1.4     ! noro        1: /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.3 2001/09/04 02:46:15 noro Exp $ */
1.3       noro        2:
1.1       noro        3: #include "ca.h"
                      4: #include "parse.h"
                      5:
                      6: void addquote(vl,a,b,c)
                      7: VL vl;
                      8: QUOTE a,b;
                      9: QUOTE *c;
                     10: {
                     11:        FNODE fn;
                     12:
                     13:        fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));
                     14:        MKQUOTE(*c,fn);
                     15: }
                     16:
                     17: void subquote(vl,a,b,c)
                     18: VL vl;
                     19: QUOTE a,b;
                     20: QUOTE *c;
                     21: {
                     22:        FNODE fn;
                     23:
                     24:        fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));
                     25:        MKQUOTE(*c,fn);
                     26: }
                     27:
                     28: void mulquote(vl,a,b,c)
                     29: VL vl;
                     30: QUOTE a,b;
                     31: QUOTE *c;
                     32: {
                     33:        FNODE fn;
                     34:
                     35:        fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));
                     36:        MKQUOTE(*c,fn);
                     37: }
                     38:
                     39: void divquote(vl,a,b,c)
                     40: VL vl;
                     41: QUOTE a,b;
                     42: QUOTE *c;
                     43: {
                     44:        FNODE fn;
                     45:
                     46:        fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));
                     47:        MKQUOTE(*c,fn);
                     48: }
                     49:
                     50: void pwrquote(vl,a,b,c)
                     51: VL vl;
                     52: QUOTE a,b;
                     53: QUOTE *c;
                     54: {
                     55:        FNODE fn;
                     56:
                     57:        if ( !b || OID(b) != O_QUOTE )
                     58:                error("pwrquote : invalid argument");
                     59:        fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));
                     60:        MKQUOTE(*c,fn);
                     61: }
                     62:
                     63: void chsgnquote(a,c)
                     64: QUOTE a;
                     65: QUOTE *c;
                     66: {
                     67:        FNODE fn;
                     68:
                     69:        fn = mkfnode(3,I_BOP,subfs,0,BDY(a));
                     70:        MKQUOTE(*c,fn);
                     71: }
1.2       noro       72:
                     73: void polytoquote(), dctoquote(), vartoquote();
1.4     ! noro       74: void dptoquote(), mptoquote();
1.2       noro       75:
                     76: void objtoquote(a,c)
                     77: Obj a;
                     78: QUOTE *c;
                     79: {
                     80:        QUOTE nm,dn;
1.4     ! noro       81:        NODE arg,t0,t,t1,t2,t3;
        !            82:        FNODE fn;
        !            83:        Obj *b;
        !            84:        Obj **m;
        !            85:        int i,j,len,row,col;
        !            86:        Q q,qrow,qcol;
        !            87:        FUNC f;
1.2       noro       88:
                     89:        if ( !a ) {
                     90:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                     91:                return;
                     92:        }
                     93:        switch ( OID(a) ) {
                     94:                case O_N:
1.4     ! noro       95:                case O_STR:
1.2       noro       96:                        MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                     97:                        break;
                     98:                case O_P:
                     99:                        polytoquote((P)a,c);
                    100:                        break;
                    101:                case O_R:
                    102:                        polytoquote(NM((R)a),&nm);
                    103:                        polytoquote(DN((R)a),&dn);
                    104:                        divquote(CO,nm,dn,c);
                    105:                        break;
1.4     ! noro      106:                case O_LIST:
        !           107:                        t0 = 0;
        !           108:                        for ( arg = BDY((LIST)a); arg; arg = NEXT(arg) ) {
        !           109:                                NEXTNODE(t0,t);
        !           110:                                objtoquote(BDY(arg),&nm);
        !           111:                                BDY(t) = BDY(nm);
        !           112:                        }
        !           113:                        if ( t0 )
        !           114:                                NEXT(t) = 0;
        !           115:                        MKQUOTE(*c,mkfnode(1,I_LIST,t0));
        !           116:                        break;
        !           117:                case O_VECT:
        !           118:                        len = ((VECT)a)->len;
        !           119:                        b = (Obj *)BDY(((VECT)a));
        !           120:                        t = 0;
        !           121:                        for ( i = len-1; i >= 0; i-- ) {
        !           122:                                objtoquote(b[i],&nm);
        !           123:                                MKNODE(t1,BDY(nm),t);
        !           124:                                t = t1;
        !           125:                        }
        !           126:                        STOQ(len,q);
        !           127:                        t = mknode(2,mkfnode(1,I_FORMULA,q),mkfnode(1,I_LIST,t));
        !           128:                        gen_searchf("vector",&f);
        !           129:                        MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
        !           130:                        break;
        !           131:                case O_MAT:
        !           132:                        row = ((MAT)a)->row;
        !           133:                        col = ((MAT)a)->row;
        !           134:                        m = (Obj **)BDY(((MAT)a));
        !           135:                        t2 = 0;
        !           136:                        for ( i = row-1; i >= 0; i-- ) {
        !           137:                                t = 0;
        !           138:                                for ( j = col-1; j >= 0; j-- ) {
        !           139:                                        objtoquote(m[i][j],&nm);
        !           140:                                        MKNODE(t1,BDY(nm),t);
        !           141:                                        t = t1;
        !           142:                                }
        !           143:                                fn = mkfnode(1,I_LIST,t);
        !           144:                                MKNODE(t3,fn,t2);
        !           145:                                t2 = t3;
        !           146:                        }
        !           147:                        fn = mkfnode(1,I_LIST,t2);
        !           148:
        !           149:                        STOQ(row,qrow);
        !           150:                        STOQ(col,qcol);
        !           151:                        t = mknode(3,
        !           152:                                mkfnode(1,I_FORMULA,qrow),mkfnode(1,I_FORMULA,qcol),fn);
        !           153:                        gen_searchf("matrix",&f);
        !           154:                        MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
        !           155:                        break;
        !           156:                case O_DP:
        !           157:                        dptoquote((DP)a,c);
        !           158:                        break;
1.2       noro      159:                case O_QUOTE:
                    160:                        *c = (QUOTE)a;
                    161:                        break;
                    162:                default:
                    163:                        error("objtoquote : not implemented");
                    164:        }
                    165: }
                    166:
                    167: void polytoquote(a,c)
                    168: P a;
                    169: QUOTE *c;
                    170: {
                    171:        DCP dc,t;
                    172:        DCP *dca;
                    173:        int n,i;
                    174:        QUOTE v,r,s,u;
                    175:
                    176:        if ( !a || (OID(a) == O_N) ) {
                    177:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                    178:                return;
                    179:        }
                    180:        dc = DC((P)a);
                    181:        vartoquote(VR((P)a),&v);
                    182:        for ( t = dc, n = 0; t; t = NEXT(t), n++ );
                    183:        dca = (DCP *)ALLOCA(n*sizeof(DCP));
                    184:        for ( t = dc, i = 0; t; t = NEXT(t), i++ )
                    185:                dca[i] = t;
                    186:        dctoquote(dca[n-1],v,&r);
                    187:        for ( i = n-2; i >= 0; i-- ) {
                    188:                dctoquote(dca[i],v,&s);
                    189:                addquote(CO,s,r,&u);
                    190:                r = u;
                    191:        }
                    192:        *c = r;
                    193: }
                    194:
1.4     ! noro      195: void dptoquote(a,c)
        !           196: DP a;
        !           197: QUOTE *c;
        !           198: {
        !           199:        MP t;
        !           200:        MP *m;
        !           201:        int i,n,nv;
        !           202:        QUOTE s,r,u;
        !           203:
        !           204:        if ( !a ) {
        !           205:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
        !           206:                return;
        !           207:        }
        !           208:        for ( t = BDY(a), n = 0; t; t = NEXT(t), n++ );
        !           209:        m = (MP *)ALLOCA(n*sizeof(MP));
        !           210:        for ( t = BDY(a), i = 0; t; t = NEXT(t), i++ )
        !           211:                m[i] = t;
        !           212:        nv = NV(a);
        !           213:        mptoquote(m[n-1],nv,&r);
        !           214:        for ( i = n-2; i >= 0; i-- ) {
        !           215:                mptoquote(m[i],nv,&s);
        !           216:                addquote(CO,s,r,&u);
        !           217:                r = u;
        !           218:        }
        !           219:        *c = r;
        !           220: }
        !           221:
1.2       noro      222: void dctoquote(dc,v,c)
                    223: DCP dc;
                    224: QUOTE v;
                    225: QUOTE *c;
                    226: {
                    227:        QUOTE r,d,s,u;
                    228:
1.4     ! noro      229:        if ( UNIQ(COEF(dc)) ) {
        !           230:                if ( DEG(dc) ) {
        !           231:                        if ( UNIQ(DEG(dc)) )
        !           232:                                *c = v;
        !           233:                        else {
        !           234:                                objtoquote(DEG(dc),&d);
        !           235:                                pwrquote(CO,v,d,c);
        !           236:                        }
        !           237:                } else
        !           238:                        objtoquote(ONE,c);
        !           239:        } else {
        !           240:                objtoquote(COEF(dc),&u);
        !           241:                if ( DEG(dc) ) {
        !           242:                        if ( UNIQ(DEG(dc)) )
        !           243:                                s = v;
        !           244:                        else {
        !           245:                                objtoquote(DEG(dc),&d);
        !           246:                                pwrquote(CO,v,d,&s);
        !           247:                        }
        !           248:                        mulquote(CO,u,s,c);
        !           249:                } else
        !           250:                        *c = u;
        !           251:        }
        !           252: }
        !           253:
        !           254: void mptoquote(m,n,c)
        !           255: MP m;
        !           256: int n;
        !           257: QUOTE *c;
        !           258: {
        !           259:        QUOTE s,u;
        !           260:        NODE t,t1;
        !           261:        FNODE f;
        !           262:        Q q;
        !           263:        DL dl;
        !           264:        int i;
        !           265:
        !           266:        objtoquote(C(m),&s);
        !           267:        dl = m->dl;
        !           268:        for ( i = n-1; i >= 0; i-- ) {
        !           269:                STOQ(dl->d[i],q);
        !           270:                f = mkfnode(1,I_FORMULA,q);
        !           271:                MKNODE(t1,f,t);
        !           272:                t = t1;
1.2       noro      273:        }
1.4     ! noro      274:        MKQUOTE(u,mkfnode(1,I_EV,t));
        !           275:        mulquote(CO,s,u,c);
1.2       noro      276: }
                    277:
                    278: void vartoquote(v,c)
                    279: V v;
                    280: QUOTE *c;
                    281: {
                    282:        P x;
                    283:        PF pf;
                    284:        PFAD ad;
                    285:        QUOTE a,b;
                    286:        int i;
                    287:        FUNC f;
                    288:        NODE t,t1;
                    289:
                    290:        if ( NAME(v) ) {
                    291:                MKV(v,x);
                    292:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));
                    293:        } else if ( (vid)v->attr == V_PF ) {
                    294:                /* pure function */
                    295:                pf = ((PFINS)v->priv)->pf;
                    296:                ad = ((PFINS)v->priv)->ad;
                    297:                if ( !strcmp(NAME(pf),"pow") ) {
                    298:                        /* pow(a,b) = a^b */
                    299:                        objtoquote(ad[0].arg,&a); objtoquote(ad[1].arg,&b);
                    300:                        pwrquote(CO,a,b,c);
                    301:                } else {
                    302:                        for ( i = 0; i < pf->argc; i++ )
                    303:                                if ( ad[i].d )
                    304:                                        break;
                    305:                        if ( i < pf->argc )
                    306:                                error("vartoquote : not implemented");
                    307:                        gen_searchf(NAME(pf),&f);
                    308:                        t = 0;
                    309:                        for ( i = pf->argc-1; i >= 0; i-- ) {
                    310:                                objtoquote(ad[i].arg,&a);
                    311:                                MKNODE(t1,BDY(a),t);
                    312:                                t = t1;
                    313:                        }
                    314:                        MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                    315:                }
                    316:        }
                    317: }

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