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

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

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