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

version 1.8, 2004/03/04 01:41:32 version 1.26, 2005/12/10 14:14:16
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.7 2004/03/03 09:25:30 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.25 2005/09/30 02:20:06 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 6 
Line 6 
 void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
           objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 14  void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 16  void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
           objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 22  void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 26  void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
           objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 30  void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 36  void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
           objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 38  void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 46  void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
         if ( !b || OID(b) != O_QUOTE )          objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
                 error("pwrquote : invalid argument");  
         fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 48  void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 56  void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void chsgnquote(QUOTE a,QUOTE *c)  void chsgnquote(QUOTE a,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
         fn = mkfnode(3,I_BOP,subfs,0,BDY(a));          objtoquote((Obj)a,&t); a = t;
           fn = mkfnode(1,I_MINUS,BDY(a));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
   
Line 158  void polytoquote(P a,QUOTE *c)
Line 168  void polytoquote(P a,QUOTE *c)
         int n,i,sgn;          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;
         }          }
         vartoquote(VR((P)a),&v);          vartoquote(VR((P)a),&v);
         dc = DC((P)a);          dc = DC((P)a);
Line 236  void dctoquote(DCP dc,QUOTE v,QUOTE *q,int *sgn)
Line 249  void dctoquote(DCP dc,QUOTE v,QUOTE *q,int *sgn)
                         objtoquote((Obj)ONE,&r);                          objtoquote((Obj)ONE,&r);
         } else {          } else {
                 objtoquote((Obj)c,&u);                  objtoquote((Obj)c,&u);
                 if ( !NUM(c) && NEXT(DC(c)) ) {                  if ( !NUM(c) && NEXT(DC(c)) && d ) {
                         MKQUOTE(t,mkfnode(1,I_PAREN,BDY(u)));                          MKQUOTE(t,mkfnode(1,I_PAREN,BDY(u)));
                         u = t;                          u = t;
                 }                  }
Line 277  void mptoquote(MP m,int n,QUOTE *r,int *sgn)
Line 290  void mptoquote(MP m,int n,QUOTE *r,int *sgn)
                 s = u;                  s = u;
         }          }
         dl = m->dl;          dl = m->dl;
         if ( !dl->td )          for ( i = n-1, t = 0; i >= 0; i-- ) {
                 *r = s;                  STOQ(dl->d[i],q);
         else {                  f = mkfnode(1,I_FORMULA,q);
                 for ( i = n-1, t = 0; i >= 0; i-- ) {                  MKNODE(t1,f,t);
                         STOQ(dl->d[i],q);                  t = t1;
                         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);  
         }          }
           MKQUOTE(u,mkfnode(1,I_EV,t));
           if ( UNIQ(c) )
                   *r = u;
           else
                   mulquote(CO,s,u,r);
 }  }
   
 void vartoquote(V v,QUOTE *c)  void vartoquote(V v,QUOTE *c)
Line 299  void vartoquote(V v,QUOTE *c)
Line 308  void vartoquote(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 313  void vartoquote(V v,QUOTE *c)
Line 322  void vartoquote(V v,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);
                           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 */
                           } else {
                                   /* a => (a) */
                                   MKQUOTE(u,mkfnode(1,I_PAREN,BDY(a))); a = u;
                           }
                           objtoquote(ad[1].arg,&b);
                         pwrquote(CO,a,b,c);                          pwrquote(CO,a,b,c);
                 } else {                  } else {
                         for ( i = 0; i < pf->argc; i++ )                          for ( i = 0; i < pf->argc; i++ )
Line 331  void vartoquote(V v,QUOTE *c)
Line 350  void vartoquote(V v,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)));
                 }                  }
         }          }
   }
   
   /*
    * A_arf : arithmetic function
    * A_int : machine integer
    * A_fnode : FNODE
    * A_node : NODE with FNODE bodies
    * A_internal : internal object
    * A_str : string
    * A_end : terminal
    * A_func : FUNC
    * A_notimpl : not implemented
    */
   
   struct fid_spec fid_spec_tab[] = {
           {I_BOP,A_arf,A_fnode,A_fnode,A_end},
           {I_COP,A_int,A_fnode,A_fnode,A_end},
           {I_AND,A_fnode,A_fnode,A_end},
           {I_OR,A_fnode,A_fnode,A_end},
           {I_NOT,A_fnode,A_end},
           {I_CE,A_fnode,A_fnode,A_end},
           {I_PRESELF,A_arf,A_fnode,A_end},
           {I_POSTSELF,A_arf,A_fnode,A_end},
           {I_FUNC,A_func,A_fnode,A_end},
           {I_FUNC_OPT,A_func,A_fnode,A_fnode,A_end},
           {I_IFUNC,A_fnode,A_fnode,A_end},
           {I_MAP,A_func,A_fnode,A_end},
           {I_RECMAP,A_func,A_fnode,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_fnode,A_fnode,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_fnode,A_end},
           {I_CDR,A_fnode,A_end},
           {I_CAST,A_notimpl,A_end},
           {I_INDEX,A_fnode,A_node,A_end},
           {I_EV,A_node,A_end},
           {I_TIMER,A_fnode,A_fnode,A_fnode,A_end},
           {I_GF2NGEN,A_end},
           {I_GFPNGEN,A_end},
           {I_GFSNGEN,A_end},
           {I_LOP,A_int,A_fnode,A_fnode,A_end},
           {I_OPT,A_str,A_fnode,A_end},
           {I_GETOPT,A_str,A_end},
           {I_POINT,A_fnode,A_str,A_end},
           {I_PAREN,A_fnode,A_end},
           {I_MINUS,A_fnode,A_end},
           {I_NARYOP,A_arf,A_node,A_end},
           {I_CONS,A_node,A_fnode,A_end},
           {I_FUNC_QARG,A_func,A_fnode,A_end},
           {I_FUNC_HEAD,A_func,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));
           }
   }
   
   NODE flatten_fnodenode(NODE n,char *opname);
   FNODE flatten_fnode(FNODE f,char *opname);
   
   NODE flatten_fnodenode(NODE n,char *opname)
   {
           NODE r0,r,t;
   
           r0 = 0;
           for ( t = n; t; t = NEXT(t) ) {
                   NEXTNODE(r0,r);
                   BDY(r) = (pointer)flatten_fnode((FNODE)BDY(t),opname);
           }
           if ( r0 ) NEXT(r) = 0;
           return r0;
   }
   
   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) ) {
                           /* [op [op A B] C] => [op A [op B C]] */
                           f2 = flatten_fnode(mkfnode(3,I_BOP,(ARF)FA0(f),FA2(f1),f2),opname);
                           return mkfnode(3,I_BOP,(ARF)FA0(f),FA1(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_fnode )
                                   r->arg[i] = (pointer)flatten_fnode(f->arg[i],opname);
                           else if ( type[i] == A_node )
                                   r->arg[i] = (pointer)flatten_fnodenode(f->arg[i],opname);
                           else
                                   r->arg[i] = f->arg[i];
                   }
                   return r;
           }
   }
   
   /* comparison of QUOTE */
   
   int compquote(VL vl,QUOTE q1,QUOTE q2)
   {
           return compfnode(BDY(q1),BDY(q2));
   }
   
   /* comparison of QUOTEARG */
   /* XXX : executes a non-sense comparison for bodies */
   
   int compqa(VL vl,QUOTEARG q1,QUOTEARG q2)
   {
           if ( !q1 ) return q2?-1:0;
           else if ( !q2 ) return 1;
           else if ( OID(q1) > OID(q2) ) return 1;
           else if ( OID(q1) < OID(q2) ) return -1;
           else if ( q1->type > q2->type ) return 1;
           else if ( q1->type < q2->type ) return -1;
           else switch ( q1->type ) {
                   case A_func:
                           return strcmp(((FUNC)q1->body)->name,((FUNC)q2->body)->name);
                   case A_arf:
                           return strcmp(((ARF)q1->body)->name,((ARF)q2->body)->name);
                   default:
                           if ( (unsigned)q1->body  > (unsigned)q2->body ) return 1;
                           else if ( (unsigned)q1->body  < (unsigned)q2->body ) return -1;
                           else return 0;
           }
   }
   
   int compfnode(FNODE f1,FNODE f2)
   {
           fid_spec_p spec;
           int t,s1,s2,i;
           NODE n1,n2;
   
           if ( !f1 ) return f2 ? -1 : 1;
           else if ( !f2 ) return 1;
       else if ( f1->id > f2->id ) return 1;
           else if ( f1->id < f2->id ) return -1;
           spec = fid_spec_tab+f1->id;
           for ( i = 0; spec->type[i] != A_end; i++ ) {
                   switch ( spec->type[i] ) {
                           case A_fnode:
                                   t = compfnode((FNODE)f1->arg[i],(FNODE)f2->arg[i]);
                                   if ( t ) return t;
                                   break;
                           case A_int:
                                   s1 = (int)f1->arg[i];
                                   s2 = (int)f2->arg[i];
                                   if ( s1 > s2 ) return 1;
                                   else if ( s1 < s2 ) return -1;
                                   break;
                           case A_str:
                                   t = strcmp((char *)f1->arg[i],(char *)f2->arg[i]);
                                   if ( t ) return t;
                                   break;
                           case A_internal:
                                   t = arf_comp(CO,(Obj)f1->arg[i],(Obj)f2->arg[i]);
                                   if ( t ) return t;
                                   break;
                           case A_node:
                                   n1 = (NODE)f1->arg[i];
                                   n2 = (NODE)f2->arg[i];
                                   for ( ; n1 && n2; n1 = NEXT(n1), n2 = NEXT(n2) ) {
                                           t = compfnode(BDY(n1),BDY(n2));
                                           if ( t ) return t;
                                   }
                                   if ( n1 ) return 1;
                                   else if ( n2 ) return -1;
                                   break;
                           case A_arf:
                                    t = strcmp(((ARF)f1->arg[i])->name,((ARF)f2->arg[i])->name);
                                   if ( t ) return t;
                                   break;
                           case A_func:
                                    t = strcmp(((FUNC)f1->arg[i])->name,((FUNC)f2->arg[i])->name);
                                   if ( t ) return t;
                                   break;
                           case A_notimpl:
                           default:
                                   error("compfnode : not implemented");
                                   break;
                   }
           }
           return 0;
 }  }

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.26

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