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

version 1.5, 2001/09/05 09:01:28 version 1.15, 2004/07/08 02:58:19
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.4 2001/09/04 05:14:04 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.14 2004/07/07 07:40:19 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 14  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 25  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 36  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 47  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 60  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;
   
Line 70  QUOTE *c;
Line 53  QUOTE *c;
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
   
 void polytoquote(), dctoquote(), vartoquote();  void objtoquote(Obj a,QUOTE *c)
 void dptoquote(), mptoquote();  
   
 void objtoquote(a,c)  
 Obj a;  
 QUOTE *c;  
 {  {
         QUOTE nm,dn;          QUOTE nm,dn;
         NODE arg,t0,t,t1,t2,t3;          NODE arg,t0,t,t1,t2,t3;
Line 173  QUOTE *c;
Line 151  QUOTE *c;
         }          }
 }  }
   
 void polytoquote(a,c)  void polytoquote(P a,QUOTE *c)
 P a;  
 QUOTE *c;  
 {  {
         DCP dc,t;          DCP dc,t;
         DCP *dca;          DCP *dca;
         int n,i;          int n,i,sgn;
         QUOTE v,r,s,u;          QUOTE v,r,s,u;
   
         if ( !a || (OID(a) == O_N) ) {          if ( !a ) {
                 MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));                  MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                 return;                  return;
           } else if ( OID(a) == O_N ) {
                   MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                   return;
         }          }
         dc = DC((P)a);  
         vartoquote(VR((P)a),&v);          vartoquote(VR((P)a),&v);
         for ( t = dc, n = 0; t; t = NEXT(t), n++ );          dc = DC((P)a);
         dca = (DCP *)ALLOCA(n*sizeof(DCP));          dctoquote(dc,v,&r,&sgn);
         for ( t = dc, i = 0; t; t = NEXT(t), i++ )          if ( sgn == -1 ) {
                 dca[i] = t;                  MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
         dctoquote(dca[n-1],v,&r);  
         for ( i = n-2; i >= 0; i-- ) {  
                 dctoquote(dca[i],v,&s);  
                 addquote(CO,s,r,&u);  
                 r = u;                  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 = r;
 }  }
   
 void dptoquote(a,c)  void dptoquote(DP a,QUOTE *c)
 DP a;  
 QUOTE *c;  
 {  {
         MP t;          MP t;
         MP *m;          MP m;
         int i,n,nv;          int i,n,nv,sgn;
         QUOTE s,r,u;          QUOTE s,r,u;
   
         if ( !a ) {          if ( !a ) {
                 MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));                  MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                 return;                  return;
         }          }
         for ( t = BDY(a), n = 0; t; t = NEXT(t), n++ );  
         m = (MP *)ALLOCA(n*sizeof(MP));  
         for ( t = BDY(a), i = 0; t; t = NEXT(t), i++ )  
                 m[i] = t;  
         nv = NV(a);          nv = NV(a);
         mptoquote(m[n-1],nv,&r);          m = BDY(a);
         for ( i = n-2; i >= 0; i-- ) {          mptoquote(m,nv,&r,&sgn);
                 mptoquote(m[i],nv,&s);          if ( sgn == -1 ) {
                 addquote(CO,s,r,&u);                  MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
                 r = u;                  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 = r;
 }  }
   
 void dctoquote(dc,v,c)  void dctoquote(DCP dc,QUOTE v,QUOTE *q,int *sgn)
 DCP dc;  
 QUOTE v;  
 QUOTE *c;  
 {  {
         QUOTE r,d,s,u;          QUOTE t,s,u,r;
           P c;
           Q d;
   
         if ( UNIQ(COEF(dc)) ) {          if ( mmono(COEF(dc)) ) {
                 if ( DEG(dc) ) {                  /* -xyz... */
                         if ( UNIQ(DEG(dc)) )                  chsgnp(COEF(dc),&c);
                                 *c = v;                  *sgn = -1;
           } else {
                   c = COEF(dc);
                   *sgn = 1;
           }
           d = DEG(dc);
           if ( UNIQ(c) ) {
                   if ( d ) {
                           if ( UNIQ(d) )
                                   r = v;
                         else {                          else {
                                 objtoquote(DEG(dc),&d);                                  objtoquote((Obj)d,&t);
                                 pwrquote(CO,v,d,c);                                  pwrquote(CO,v,t,&r);
                         }                          }
                 } else                  } else
                         objtoquote(ONE,c);                          objtoquote((Obj)ONE,&r);
         } else {          } else {
                 objtoquote(COEF(dc),&u);                  objtoquote((Obj)c,&u);
                 if ( DEG(dc) ) {                  if ( !NUM(c) && NEXT(DC(c)) && d ) {
                         if ( UNIQ(DEG(dc)) )                          MKQUOTE(t,mkfnode(1,I_PAREN,BDY(u)));
                           u = t;
                   }
                   if ( d ) {
                           if ( UNIQ(d) )
                                 s = v;                                  s = v;
                         else {                          else {
                                 objtoquote(DEG(dc),&d);                                  objtoquote((Obj)d,&t);
                                 pwrquote(CO,v,d,&s);                                  pwrquote(CO,v,t,&s);
                         }                          }
                         mulquote(CO,u,s,c);                          mulquote(CO,u,s,&r);
                 } else                  } else
                         *c = u;                          r = u;
         }          }
           *q = r;
 }  }
   
 void mptoquote(m,n,c)  void mptoquote(MP m,int n,QUOTE *r,int *sgn)
 MP m;  
 int n;  
 QUOTE *c;  
 {  {
         QUOTE s,u;          QUOTE s,u;
           P c;
         NODE t,t1;          NODE t,t1;
         FNODE f;          FNODE f;
         Q q;          Q q;
         DL dl;          DL dl;
         int i;          int i;
   
         objtoquote(C(m),&s);          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;          dl = m->dl;
         for ( i = n-1; i >= 0; i-- ) {          for ( i = n-1, t = 0; i >= 0; i-- ) {
                 STOQ(dl->d[i],q);                  STOQ(dl->d[i],q);
                 f = mkfnode(1,I_FORMULA,q);                  f = mkfnode(1,I_FORMULA,q);
                 MKNODE(t1,f,t);                  MKNODE(t1,f,t);
                 t = t1;                  t = t1;
         }          }
         MKQUOTE(u,mkfnode(1,I_EV,t));          MKQUOTE(u,mkfnode(1,I_EV,t));
         mulquote(CO,s,u,c);          if ( UNIQ(c) )
                   *r = u;
           else
                   mulquote(CO,s,u,r);
 }  }
   
 void vartoquote(v,c)  void vartoquote(V v,QUOTE *c)
 V v;  
 QUOTE *c;  
 {  {
         P x;          P x;
         PF pf;          PF pf;
         PFAD ad;          PFAD ad;
         QUOTE a,b;          QUOTE a,b,u;
         int i;          int i;
         FUNC f;          FUNC f;
         NODE t,t1;          NODE t,t1;
Line 305  QUOTE *c;
Line 312  QUOTE *c;
                 ad = ((PFINS)v->priv)->ad;                  ad = ((PFINS)v->priv)->ad;
                 if ( !strcmp(NAME(pf),"pow") ) {                  if ( !strcmp(NAME(pf),"pow") ) {
                         /* pow(a,b) = a^b */                          /* pow(a,b) = a^b */
                         objtoquote(ad[0].arg,&a); objtoquote(ad[1].arg,&b);                          objtoquote(ad[0].arg,&a);
                         pwrquote(CO,a,b,c);                          x = (P)ad[0].arg;
                           /* check whether x is a variable */
                           if ( x && OID(x)==O_P && !NEXT(DC(x))
                                   && UNIQ(DEG(DC(x))) && UNIQ(COEF(DC(x))) ) {
                                   /* use a as is */
                                   u = a;
                           } else {
                                   /* a => (a) */
                                   MKQUOTE(u,mkfnode(1,I_PAREN,BDY(a)));
                           }
                           objtoquote(ad[1].arg,&b);
                           pwrquote(CO,u,b,c);
                 } else {                  } else {
                         for ( i = 0; i < pf->argc; i++ )                          for ( i = 0; i < pf->argc; i++ )
                                 if ( ad[i].d )                                  if ( ad[i].d )
Line 322  QUOTE *c;
Line 340  QUOTE *c;
                         }                          }
                         MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));                          MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                 }                  }
           }
   }
   
   typedef enum {
           A_arg,A_arf,A_int,A_str,A_internal,A_node,A_notimpl,A_func,A_end
   } farg_type;
   
   typedef struct fid_spec {
           fid id;
           farg_type type[10];
   } *fid_spec_p;
   
   struct fid_spec fid_spec_tab[] = {
           {I_BOP,A_arf,A_arg,A_arg,A_end},
           {I_COP,A_int,A_arg,A_arg,A_end},
           {I_AND,A_arg,A_arg,A_end},
           {I_OR,A_arg,A_arg,A_end},
           {I_NOT,A_arg,A_end},
           {I_CE,A_arg,A_arg,A_end},
           {I_PRESELF,A_arf,A_arg,A_end},
           {I_POSTSELF,A_arf,A_arg,A_end},
           {I_FUNC,A_func,A_arg,A_end},
           {I_FUNC_OPT,A_func,A_arg,A_arg,A_end},
           {I_IFUNC,A_arg,A_arg,A_end},
           {I_MAP,A_func,A_arg,A_end},
           {I_RECMAP,A_func,A_arg,A_end},
           {I_PFDERIV,A_notimpl,A_end},
           {I_ANS,A_int,A_end},
           {I_PVAR,A_int,A_node,A_end},
           {I_ASSPVAR,A_arg,A_arg,A_end},
           {I_FORMULA,A_internal,A_end},
           {I_LIST,A_node,A_end},
           {I_STR,A_str,A_end},
           {I_NEWCOMP,A_int,A_end},
           {I_CAR,A_arg,A_end},
           {I_CDR,A_arg,A_end},
           {I_CAST,A_notimpl,A_end},
           {I_INDEX,A_arg,A_node,A_end},
           {I_EV,A_node,A_end},
           {I_TIMER,A_arg,A_arg,A_arg,A_end},
           {I_GF2NGEN,A_end},
           {I_GFPNGEN,A_end},
           {I_GFSNGEN,A_end},
           {I_LOP,A_int,A_arg,A_arg,A_end},
           {I_OPT,A_str,A_arg,A_end},
           {I_GETOPT,A_str,A_end},
           {I_POINT,A_arg,A_str,A_end},
           {I_PAREN,A_arg,A_end},
           {I_MINUS,A_arg,A_end},
           {I_NARYOP,A_notimpl,A_end}
   };
   
   #define N_FID_SPEC (sizeof(fid_spec_tab)/sizeof(struct fid_spec))
   
   void get_fid_spec(fid id,fid_spec_p *spec)
   {
           int i;
   
           for ( i = 0; i < N_FID_SPEC; i++ )
                   if ( fid_spec_tab[i].id == id ) {
                           *spec = &fid_spec_tab[i];
                           return;
                   }
           *spec = 0;
   }
   
   FNODE strip_paren(FNODE f)
   {
           if ( !f || f->id != I_PAREN ) return f;
           else {
                   return strip_paren((FNODE)FA0(f));
           }
   }
   
   FNODE flatten_fnode(FNODE f,char *opname)
   {
           fid_spec_p spec;
           farg_type *type;
           fid id;
           FNODE f1,f2,r;
           int i;
   
           if ( !f ) return f;
           id = f->id;
           get_fid_spec(id,&spec);
           /* unknown fid */
           if ( !spec ) return f;
           if ( id == I_BOP && !strcmp(((ARF)FA0(f))->name,opname) ) {
                   f1 = (pointer)flatten_fnode(FA1(f),opname);
                   f1 = strip_paren(f1);
                   f2 = (pointer)flatten_fnode(FA2(f),opname);
                   f2 = strip_paren(f2);
                   if ( f1->id == I_BOP && !strcmp(((ARF)FA0(f1))->name,opname) ) {
                           /* [+ [+ A B] C] => [+ A [+ B C]] */
                           return mkfnode(3,I_BOP,(ARF)FA0(f),FA1(f1),
                                   mkfnode(3,I_BOP,(ARF)FA0(f),FA2(f1),f2));
                   } else
                           return mkfnode(3,I_BOP,(ARF)FA0(f),f1,f2);
           } else {
                   type = spec->type;
                   for ( i = 0; type[i] != A_end; i++ );
                   NEWFNODE(r,i); ID(r) = f->id;
                   for ( i = 0; type[i] != A_end; i++ ) {
                           if ( type[i] == A_arg )
                                   r->arg[i] = (pointer)flatten_fnode(f->arg[i],opname);
                           else
                                   r->arg[i] = f->arg[i];
                   }
                   return r;
         }          }
 }  }

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.15

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