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

Diff for /OpenXM_contrib2/asir2000/parse/quote.c between version 1.1 and 1.10

version 1.1, 2001/08/21 00:47:27 version 1.10, 2004/03/09 08:02:01
Line 1 
Line 1 
   /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.9 2004/03/04 03:31:28 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
   
 void addquote(vl,a,b,c)  void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;          FNODE fn;
   
Line 12  QUOTE *c;
Line 11  QUOTE *c;
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
   
 void subquote(vl,a,b,c)  void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;          FNODE fn;
   
Line 23  QUOTE *c;
Line 19  QUOTE *c;
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
   
 void mulquote(vl,a,b,c)  void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;          FNODE fn;
   
Line 34  QUOTE *c;
Line 27  QUOTE *c;
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
   
 void divquote(vl,a,b,c)  void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;          FNODE fn;
   
Line 45  QUOTE *c;
Line 35  QUOTE *c;
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
   
 void pwrquote(vl,a,b,c)  void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;          FNODE fn;
   
Line 58  QUOTE *c;
Line 45  QUOTE *c;
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
   
 void chsgnquote(a,c)  void chsgnquote(QUOTE a,QUOTE *c)
 QUOTE a;  
 QUOTE *c;  
 {  {
         FNODE fn;          FNODE fn;
   
         fn = mkfnode(3,I_BOP,subfs,0,BDY(a));          fn = mkfnode(3,I_BOP,subfs,0,BDY(a));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
   }
   
   void objtoquote(Obj a,QUOTE *c)
   {
           QUOTE nm,dn;
           NODE arg,t0,t,t1,t2,t3;
           FNODE fn;
           Obj obj;
           Obj *b;
           Obj **m;
           int i,j,len,row,col;
           Q q,qrow,qcol;
           FUNC f;
   
           if ( !a ) {
                   MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                   (*c)->attr = mknode(1,mknode(2,"RisaId",0));
                   return;
           }
           switch ( OID(a) ) {
                   case O_N:
                           if ( negative_number((Num)a) ) {
                                   arf_chsgn(a,&obj);
                                   MKQUOTE(*c,mkfnode(1,I_MINUS,
                                           mkfnode(1,I_FORMULA,(pointer)obj)));
                           } else {
                                   MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                           }
                           (*c)->attr = mknode(1,mknode(2,"RisaId",O_N));
                           break;
                   case O_STR:
                           MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                           (*c)->attr = mknode(1,mknode(2,"RisaId",O_STR));
                           break;
                   case O_P:
                           polytoquote((P)a,c);
                           break;
                   case O_R:
                           polytoquote(NM((R)a),&nm);
                           polytoquote(DN((R)a),&dn);
                           divquote(CO,nm,dn,c);
                           (*c)->attr = mknode(1,mknode(2,"RisaId",O_R));
                           break;
                   case O_LIST:
                           t0 = 0;
                           for ( arg = BDY((LIST)a); arg; arg = NEXT(arg) ) {
                                   NEXTNODE(t0,t);
                                   objtoquote(BDY(arg),&nm);
                                   BDY(t) = BDY(nm);
                           }
                           if ( t0 )
                                   NEXT(t) = 0;
                           MKQUOTE(*c,mkfnode(1,I_LIST,t0));
                           (*c)->attr = mknode(1,mknode(2,"RisaId",O_LIST));
                           break;
                   case O_VECT:
                           len = ((VECT)a)->len;
                           b = (Obj *)BDY(((VECT)a));
                           t = 0;
                           for ( i = len-1; i >= 0; i-- ) {
                                   objtoquote(b[i],&nm);
                                   MKNODE(t1,BDY(nm),t);
                                   t = t1;
                           }
                           STOQ(len,q);
                           t = mknode(2,mkfnode(1,I_FORMULA,q),mkfnode(1,I_LIST,t));
                           gen_searchf("vector",&f);
                           MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                           (*c)->attr = mknode(1,mknode(2,"RisaId",O_VECT));
                           break;
                   case O_MAT:
                           row = ((MAT)a)->row;
                           col = ((MAT)a)->row;
                           m = (Obj **)BDY(((MAT)a));
                           t2 = 0;
                           for ( i = row-1; i >= 0; i-- ) {
                                   t = 0;
                                   for ( j = col-1; j >= 0; j-- ) {
                                           objtoquote(m[i][j],&nm);
                                           MKNODE(t1,BDY(nm),t);
                                           t = t1;
                                   }
                                   fn = mkfnode(1,I_LIST,t);
                                   MKNODE(t3,fn,t2);
                                   t2 = t3;
                           }
                           fn = mkfnode(1,I_LIST,t2);
   
                           STOQ(row,qrow);
                           STOQ(col,qcol);
                           t = mknode(3,
                                   mkfnode(1,I_FORMULA,qrow),mkfnode(1,I_FORMULA,qcol),fn);
                           gen_searchf("matrix",&f);
                           MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                           (*c)->attr = mknode(1,mknode(2,"RisaId",O_MAT));
                           break;
                   case O_DP:
                           dptoquote((DP)a,c);
                           break;
                   case O_QUOTE:
                           *c = (QUOTE)a;
                           break;
                   default:
                           error("objtoquote : not implemented");
           }
   }
   
   void polytoquote(P a,QUOTE *c)
   {
           DCP dc,t;
           DCP *dca;
           int n,i,sgn;
           QUOTE v,r,s,u;
   
           if ( !a ) {
                   MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                   (*c)->attr = mknode(1,mknode(2,"RisaId",0));
                   return;
           } else if ( OID(a) == O_N ) {
                   MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                   (*c)->attr = mknode(1,mknode(2,"RisaId",O_N));
                   return;
           }
           vartoquote(VR((P)a),&v);
           dc = DC((P)a);
           dctoquote(dc,v,&r,&sgn);
           if ( sgn == -1 ) {
                   MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
                   r = u;
           }
           for (dc = NEXT(dc); dc; dc = NEXT(dc) ) {
                   dctoquote(dc,v,&s,&sgn);
                   if ( sgn == -1 )
                           subquote(CO,r,s,&u);
                   else
                           addquote(CO,r,s,&u);
                   r = u;
           }
           *c = r;
           (*c)->attr = mknode(1,mknode(2,"RisaId",O_P));
   }
   
   void dptoquote(DP a,QUOTE *c)
   {
           MP t;
           MP m;
           int i,n,nv,sgn;
           QUOTE s,r,u;
   
           if ( !a ) {
                   MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                   (*c)->attr = mknode(1,mknode(2,"RisaId",0));
                   return;
           }
           nv = NV(a);
           m = BDY(a);
           mptoquote(m,nv,&r,&sgn);
           if ( sgn == -1 ) {
                   MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
                   r = u;
           }
           for ( m = NEXT(m); m; m = NEXT(m) ) {
                   mptoquote(m,nv,&s,&sgn);
                   if ( sgn < 0 )
                           subquote(CO,r,s,&u);
                   else
                           addquote(CO,r,s,&u);
                   r = u;
           }
           *c = r;
           (*c)->attr = mknode(1,mknode(2,"RisaId",O_DP));
   }
   
   void dctoquote(DCP dc,QUOTE v,QUOTE *q,int *sgn)
   {
           QUOTE t,s,u,r;
           P c;
           Q d;
   
           if ( mmono(COEF(dc)) ) {
                   /* -xyz... */
                   chsgnp(COEF(dc),&c);
                   *sgn = -1;
           } else {
                   c = COEF(dc);
                   *sgn = 1;
           }
           d = DEG(dc);
           if ( UNIQ(c) ) {
                   if ( d ) {
                           if ( UNIQ(d) )
                                   r = v;
                           else {
                                   objtoquote((Obj)d,&t);
                                   pwrquote(CO,v,t,&r);
                           }
                   } else
                           objtoquote((Obj)ONE,&r);
           } else {
                   objtoquote((Obj)c,&u);
                   if ( !NUM(c) && NEXT(DC(c)) ) {
                           MKQUOTE(t,mkfnode(1,I_PAREN,BDY(u)));
                           u = t;
                   }
                   if ( d ) {
                           if ( UNIQ(d) )
                                   s = v;
                           else {
                                   objtoquote((Obj)d,&t);
                                   pwrquote(CO,v,t,&s);
                           }
                           mulquote(CO,u,s,&r);
                   } else
                           r = u;
           }
           *q = r;
   }
   
   void mptoquote(MP m,int n,QUOTE *r,int *sgn)
   {
           QUOTE s,u;
           P c;
           NODE t,t1;
           FNODE f;
           Q q;
           DL dl;
           int i;
   
           if ( mmono(C(m)) ) {
                   chsgnp(C(m),&c);
                   *sgn = -1;
           } else {
                   c = C(m);
                   *sgn = 1;
           }
           objtoquote((Obj)c,&s);
           if ( !NUM(c) && NEXT(DC(c)) ) {
                   MKQUOTE(u,mkfnode(1,I_PAREN,BDY(s)));
                   s = u;
           }
           dl = m->dl;
           for ( i = n-1, t = 0; i >= 0; i-- ) {
                   STOQ(dl->d[i],q);
                   f = mkfnode(1,I_FORMULA,q);
                   MKNODE(t1,f,t);
                   t = t1;
           }
           MKQUOTE(u,mkfnode(1,I_EV,t));
           if ( UNIQ(c) )
                   *r = u;
           else
                   mulquote(CO,s,u,r);
   }
   
   void vartoquote(V v,QUOTE *c)
   {
           P x;
           PF pf;
           PFAD ad;
           QUOTE a,b;
           int i;
           FUNC f;
           NODE t,t1;
   
           if ( NAME(v) ) {
                   MKV(v,x);
                   MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));
           } else if ( (vid)v->attr == V_PF ) {
                   /* pure function */
                   pf = ((PFINS)v->priv)->pf;
                   ad = ((PFINS)v->priv)->ad;
                   if ( !strcmp(NAME(pf),"pow") ) {
                           /* pow(a,b) = a^b */
                           objtoquote(ad[0].arg,&a); objtoquote(ad[1].arg,&b);
                           pwrquote(CO,a,b,c);
                   } else {
                           for ( i = 0; i < pf->argc; i++ )
                                   if ( ad[i].d )
                                           break;
                           if ( i < pf->argc )
                                   error("vartoquote : not implemented");
                           gen_searchf(NAME(pf),&f);
                           t = 0;
                           for ( i = pf->argc-1; i >= 0; i-- ) {
                                   objtoquote(ad[i].arg,&a);
                                   MKNODE(t1,BDY(a),t);
                                   t = t1;
                           }
                           MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                   }
           }
 }  }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.10

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