[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.5

1.5     ! noro        1: /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.4 2001/09/04 05:14:04 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;
1.5     ! noro       83:        Obj obj;
1.4       noro       84:        Obj *b;
                     85:        Obj **m;
                     86:        int i,j,len,row,col;
                     87:        Q q,qrow,qcol;
                     88:        FUNC f;
1.2       noro       89:
                     90:        if ( !a ) {
                     91:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                     92:                return;
                     93:        }
                     94:        switch ( OID(a) ) {
                     95:                case O_N:
1.5     ! noro       96:                        if ( negative_number((Num)a) ) {
        !            97:                                arf_chsgn(a,&obj);
        !            98:                                MKQUOTE(*c,mkfnode(1,I_MINUS,
        !            99:                                        mkfnode(1,I_FORMULA,(pointer)obj)));
        !           100:                        } else {
        !           101:                                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
        !           102:                        }
        !           103:                        break;
1.4       noro      104:                case O_STR:
1.2       noro      105:                        MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                    106:                        break;
                    107:                case O_P:
                    108:                        polytoquote((P)a,c);
                    109:                        break;
                    110:                case O_R:
                    111:                        polytoquote(NM((R)a),&nm);
                    112:                        polytoquote(DN((R)a),&dn);
                    113:                        divquote(CO,nm,dn,c);
                    114:                        break;
1.4       noro      115:                case O_LIST:
                    116:                        t0 = 0;
                    117:                        for ( arg = BDY((LIST)a); arg; arg = NEXT(arg) ) {
                    118:                                NEXTNODE(t0,t);
                    119:                                objtoquote(BDY(arg),&nm);
                    120:                                BDY(t) = BDY(nm);
                    121:                        }
                    122:                        if ( t0 )
                    123:                                NEXT(t) = 0;
                    124:                        MKQUOTE(*c,mkfnode(1,I_LIST,t0));
                    125:                        break;
                    126:                case O_VECT:
                    127:                        len = ((VECT)a)->len;
                    128:                        b = (Obj *)BDY(((VECT)a));
                    129:                        t = 0;
                    130:                        for ( i = len-1; i >= 0; i-- ) {
                    131:                                objtoquote(b[i],&nm);
                    132:                                MKNODE(t1,BDY(nm),t);
                    133:                                t = t1;
                    134:                        }
                    135:                        STOQ(len,q);
                    136:                        t = mknode(2,mkfnode(1,I_FORMULA,q),mkfnode(1,I_LIST,t));
                    137:                        gen_searchf("vector",&f);
                    138:                        MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                    139:                        break;
                    140:                case O_MAT:
                    141:                        row = ((MAT)a)->row;
                    142:                        col = ((MAT)a)->row;
                    143:                        m = (Obj **)BDY(((MAT)a));
                    144:                        t2 = 0;
                    145:                        for ( i = row-1; i >= 0; i-- ) {
                    146:                                t = 0;
                    147:                                for ( j = col-1; j >= 0; j-- ) {
                    148:                                        objtoquote(m[i][j],&nm);
                    149:                                        MKNODE(t1,BDY(nm),t);
                    150:                                        t = t1;
                    151:                                }
                    152:                                fn = mkfnode(1,I_LIST,t);
                    153:                                MKNODE(t3,fn,t2);
                    154:                                t2 = t3;
                    155:                        }
                    156:                        fn = mkfnode(1,I_LIST,t2);
                    157:
                    158:                        STOQ(row,qrow);
                    159:                        STOQ(col,qcol);
                    160:                        t = mknode(3,
                    161:                                mkfnode(1,I_FORMULA,qrow),mkfnode(1,I_FORMULA,qcol),fn);
                    162:                        gen_searchf("matrix",&f);
                    163:                        MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                    164:                        break;
                    165:                case O_DP:
                    166:                        dptoquote((DP)a,c);
                    167:                        break;
1.2       noro      168:                case O_QUOTE:
                    169:                        *c = (QUOTE)a;
                    170:                        break;
                    171:                default:
                    172:                        error("objtoquote : not implemented");
                    173:        }
                    174: }
                    175:
                    176: void polytoquote(a,c)
                    177: P a;
                    178: QUOTE *c;
                    179: {
                    180:        DCP dc,t;
                    181:        DCP *dca;
                    182:        int n,i;
                    183:        QUOTE v,r,s,u;
                    184:
                    185:        if ( !a || (OID(a) == O_N) ) {
                    186:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                    187:                return;
                    188:        }
                    189:        dc = DC((P)a);
                    190:        vartoquote(VR((P)a),&v);
                    191:        for ( t = dc, n = 0; t; t = NEXT(t), n++ );
                    192:        dca = (DCP *)ALLOCA(n*sizeof(DCP));
                    193:        for ( t = dc, i = 0; t; t = NEXT(t), i++ )
                    194:                dca[i] = t;
                    195:        dctoquote(dca[n-1],v,&r);
                    196:        for ( i = n-2; i >= 0; i-- ) {
                    197:                dctoquote(dca[i],v,&s);
                    198:                addquote(CO,s,r,&u);
                    199:                r = u;
                    200:        }
                    201:        *c = r;
                    202: }
                    203:
1.4       noro      204: void dptoquote(a,c)
                    205: DP a;
                    206: QUOTE *c;
                    207: {
                    208:        MP t;
                    209:        MP *m;
                    210:        int i,n,nv;
                    211:        QUOTE s,r,u;
                    212:
                    213:        if ( !a ) {
                    214:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                    215:                return;
                    216:        }
                    217:        for ( t = BDY(a), n = 0; t; t = NEXT(t), n++ );
                    218:        m = (MP *)ALLOCA(n*sizeof(MP));
                    219:        for ( t = BDY(a), i = 0; t; t = NEXT(t), i++ )
                    220:                m[i] = t;
                    221:        nv = NV(a);
                    222:        mptoquote(m[n-1],nv,&r);
                    223:        for ( i = n-2; i >= 0; i-- ) {
                    224:                mptoquote(m[i],nv,&s);
                    225:                addquote(CO,s,r,&u);
                    226:                r = u;
                    227:        }
                    228:        *c = r;
                    229: }
                    230:
1.2       noro      231: void dctoquote(dc,v,c)
                    232: DCP dc;
                    233: QUOTE v;
                    234: QUOTE *c;
                    235: {
                    236:        QUOTE r,d,s,u;
                    237:
1.4       noro      238:        if ( UNIQ(COEF(dc)) ) {
                    239:                if ( DEG(dc) ) {
                    240:                        if ( UNIQ(DEG(dc)) )
                    241:                                *c = v;
                    242:                        else {
                    243:                                objtoquote(DEG(dc),&d);
                    244:                                pwrquote(CO,v,d,c);
                    245:                        }
                    246:                } else
                    247:                        objtoquote(ONE,c);
                    248:        } else {
                    249:                objtoquote(COEF(dc),&u);
                    250:                if ( DEG(dc) ) {
                    251:                        if ( UNIQ(DEG(dc)) )
                    252:                                s = v;
                    253:                        else {
                    254:                                objtoquote(DEG(dc),&d);
                    255:                                pwrquote(CO,v,d,&s);
                    256:                        }
                    257:                        mulquote(CO,u,s,c);
                    258:                } else
                    259:                        *c = u;
                    260:        }
                    261: }
                    262:
                    263: void mptoquote(m,n,c)
                    264: MP m;
                    265: int n;
                    266: QUOTE *c;
                    267: {
                    268:        QUOTE s,u;
                    269:        NODE t,t1;
                    270:        FNODE f;
                    271:        Q q;
                    272:        DL dl;
                    273:        int i;
                    274:
                    275:        objtoquote(C(m),&s);
                    276:        dl = m->dl;
                    277:        for ( i = n-1; i >= 0; i-- ) {
                    278:                STOQ(dl->d[i],q);
                    279:                f = mkfnode(1,I_FORMULA,q);
                    280:                MKNODE(t1,f,t);
                    281:                t = t1;
1.2       noro      282:        }
1.4       noro      283:        MKQUOTE(u,mkfnode(1,I_EV,t));
                    284:        mulquote(CO,s,u,c);
1.2       noro      285: }
                    286:
                    287: void vartoquote(v,c)
                    288: V v;
                    289: QUOTE *c;
                    290: {
                    291:        P x;
                    292:        PF pf;
                    293:        PFAD ad;
                    294:        QUOTE a,b;
                    295:        int i;
                    296:        FUNC f;
                    297:        NODE t,t1;
                    298:
                    299:        if ( NAME(v) ) {
                    300:                MKV(v,x);
                    301:                MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));
                    302:        } else if ( (vid)v->attr == V_PF ) {
                    303:                /* pure function */
                    304:                pf = ((PFINS)v->priv)->pf;
                    305:                ad = ((PFINS)v->priv)->ad;
                    306:                if ( !strcmp(NAME(pf),"pow") ) {
                    307:                        /* pow(a,b) = a^b */
                    308:                        objtoquote(ad[0].arg,&a); objtoquote(ad[1].arg,&b);
                    309:                        pwrquote(CO,a,b,c);
                    310:                } else {
                    311:                        for ( i = 0; i < pf->argc; i++ )
                    312:                                if ( ad[i].d )
                    313:                                        break;
                    314:                        if ( i < pf->argc )
                    315:                                error("vartoquote : not implemented");
                    316:                        gen_searchf(NAME(pf),&f);
                    317:                        t = 0;
                    318:                        for ( i = pf->argc-1; i >= 0; i-- ) {
                    319:                                objtoquote(ad[i].arg,&a);
                    320:                                MKNODE(t1,BDY(a),t);
                    321:                                t = t1;
                    322:                        }
                    323:                        MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                    324:                }
                    325:        }
                    326: }

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