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

Diff for /OpenXM_contrib2/asir2000/builtin/strobj.c between version 1.72 and 1.73

version 1.72, 2005/10/14 06:00:03 version 1.73, 2005/10/14 07:39:38
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.71 2005/10/12 14:43:36 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.72 2005/10/14 06:00:03 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 1923  void Pfunargs_to_quote(NODE arg,QUOTE *rp)
Line 1923  void Pfunargs_to_quote(NODE arg,QUOTE *rp)
   
 FNODE fnode_apply(FNODE f,FNODE (*func)());  FNODE fnode_apply(FNODE f,FNODE (*func)());
 FNODE fnode_normalize(FNODE f);  FNODE fnode_normalize(FNODE f);
 FNODE fnode_normalize_nary(FNODE f);  
   
 void Pquote_normalize(NODE arg,QUOTE *rp)  void Pquote_normalize(NODE arg,QUOTE *rp)
 {  {
Line 2096  int fnode_is_dependent(FNODE f,V v)
Line 2095  int fnode_is_dependent(FNODE f,V v)
   
 FNODE fnode_normalize_add(FNODE a1,FNODE a2);  FNODE fnode_normalize_add(FNODE a1,FNODE a2);
 FNODE fnode_normalize_mul(FNODE a1,FNODE a2);  FNODE fnode_normalize_mul(FNODE a1,FNODE a2);
   FNODE fnode_normalize_pwr(FNODE a1,FNODE a2);
 FNODE to_narymul(FNODE f);  FNODE to_narymul(FNODE f);
 FNODE to_naryadd(FNODE f);  FNODE to_naryadd(FNODE f);
 FNODE fnode_normalize_mul_coef(Num c,FNODE f);  FNODE fnode_normalize_mul_coef(Num c,FNODE f);
Line 2105  void fnode_coef_body(FNODE f,Num *cp,FNODE *bp);
Line 2105  void fnode_coef_body(FNODE f,Num *cp,FNODE *bp);
   
 FNODE fnode_normalize(FNODE f)  FNODE fnode_normalize(FNODE f)
 {  {
         FNODE a1,a2,mone,r;          FNODE a1,a2,mone,r,b2;
         NODE n;          NODE n;
           Num invc2,c2;
         Q q;          Q q;
   
         STOQ(-1,q);          STOQ(-1,q);
Line 2131  FNODE fnode_normalize(FNODE f)
Line 2132  FNODE fnode_normalize(FNODE f)
                                 case '*':                                  case '*':
                                         return fnode_normalize_mul(a1,a2);                                          return fnode_normalize_mul(a1,a2);
                                 case '/':                                  case '/':
                                         a2 = mkfnode(3,I_BOP,pwrfs,a2,mone);                                          a2 = fnode_normalize_pwr(a2,mone);
                                         return fnode_normalize_mul(FA1(f),a2);                                          return fnode_normalize_mul(a1,a2);
                                   case '^':
                                           return fnode_normalize_pwr(a1,a2);
                                 default:                                  default:
                                         return mkfnode(3,I_BOP,FA0(f),a1,a2);                                          return mkfnode(3,I_BOP,FA0(f),a1,a2);
                         }                          }
Line 2141  FNODE fnode_normalize(FNODE f)
Line 2144  FNODE fnode_normalize(FNODE f)
                 case I_NARYOP:                  case I_NARYOP:
                         switch ( OPNAME(f) ) {                          switch ( OPNAME(f) ) {
                                 case '+':                                  case '+':
                                         n = BDY((NODE)FA1(f));                                          n = (NODE)FA1(f);
                                         r = fnode_normalize(BDY(n)); n = NEXT(n);                                          r = fnode_normalize(BDY(n)); n = NEXT(n);
                                         for ( ; n; n = NEXT(n) ) {                                          for ( ; n; n = NEXT(n) ) {
                                                 a1 = fnode_normalize(BDY(n));                                                  a1 = fnode_normalize(BDY(n));
Line 2149  FNODE fnode_normalize(FNODE f)
Line 2152  FNODE fnode_normalize(FNODE f)
                                         }                                          }
                                         return r;                                          return r;
                                 case '*':                                  case '*':
                                         n = BDY((NODE)FA1(f));                                          n = (NODE)FA1(f);
                                         r = fnode_normalize(BDY(n)); n = NEXT(n);                                          r = fnode_normalize(BDY(n)); n = NEXT(n);
                                         for ( ; n; n = NEXT(n) ) {                                          for ( ; n; n = NEXT(n) ) {
                                                 a1 = fnode_normalize(BDY(n));                                                  a1 = fnode_normalize(BDY(n));
Line 2216  FNODE fnode_normalize_add(FNODE f1,FNODE f2)
Line 2219  FNODE fnode_normalize_add(FNODE f1,FNODE f2)
                 fnode_coef_body(BDY(n2),&c2,&b2);                  fnode_coef_body(BDY(n2),&c2,&b2);
                 s = compfnode(b1,b2);                  s = compfnode(b1,b2);
                 if ( s > 0 ) {                  if ( s > 0 ) {
                         NEXTNODE(r0,r); BDY(r) = b1; n1 = NEXT(n1);                          NEXTNODE(r0,r); BDY(r) = BDY(n1); n1 = NEXT(n1);
                 } else if ( s < 0 ) {                  } else if ( s < 0 ) {
                         NEXTNODE(r0,r); BDY(r) = b2; n2 = NEXT(n2);                          NEXTNODE(r0,r); BDY(r) = BDY(n2); n2 = NEXT(n2);
                 } else {                  } else {
                         addnum(0,c1,c2,&c);                          addnum(0,c1,c2,&c);
                         if ( c ) {                          if ( c ) {
Line 2311  FNODE fnode_normalize_mul(FNODE f1,FNODE f2)
Line 2314  FNODE fnode_normalize_mul(FNODE f1,FNODE f2)
                 r = r1;                  r = r1;
                 return mkfnode(2,I_NARYOP,mulfs,r);                  return mkfnode(2,I_NARYOP,mulfs,r);
         }          }
   }
   
   FNODE fnode_normalize_pwr(FNODE f1,FNODE f2)
   {
           FNODE b,b1,e1,e,cc,r;
           Num c,c1;
           NODE arg,n;
   
           if ( fnode_is_zero(f2) ) return mkfnode(1,I_FORMULA,ONE);
           else if ( fnode_is_zero(f1) ) return mkfnode(1,I_FORMULA,0);
           else if ( fnode_is_one(f2) ) return f1;
           else if ( fnode_is_number(f1) )
                   if ( fnode_is_integer(f2) ) {
                           pwrnum(0,(Num)eval(f1),(Num)eval(f2),&c);
                           return mkfnode(1,I_FORMULA,c);
                   } else
                           return mkfnode(3,I_BOP,pwrfs,f1,f2);
           else if ( f1->id == I_BOP && OPNAME(f1) == '^' ) {
                   b1 = FA1(f1); e1 = FA2(f1);
                   e = fnode_normalize_mul(e1,f2);
                   if ( fnode_is_one(e) )
                           return b1;
                   else
                           return mkfnode(3,I_BOP,FA0(f1),b1,e);
           } else if ( f1->id == I_NARYOP && OPNAME(f1) == '*' ) {
                   fnode_coef_body(f1,&c1,&b1);
                   if ( fnode_is_integer(f2) ) {
                           pwrnum(0,(Num)c1,(Num)eval(f2),&c);
                           cc = mkfnode(1,I_FORMULA,c);
                           b = fnode_normalize_pwr(b1,f2);
                           if ( fnode_is_one(cc) )
                                   return b;
                           else {
                                   NEWFNODE(r,2);
                                   r->id = I_NARYOP; FA0(r) = mulfs; FA1(r) = mknode(2,cc,b);
                                   return r;
                           }
                   } else
                           return mkfnode(3,I_BOP,pwrfs,f1,f2);
           } else
                   return mkfnode(3,I_BOP,pwrfs,f1,f2);
 }  }
   
 /* f = b^e */  /* f = b^e */

Legend:
Removed from v.1.72  
changed lines
  Added in v.1.73

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