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

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

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