[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.102 and 1.103

version 1.102, 2005/11/27 00:07:05 version 1.103, 2005/11/30 04:51:46
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.101 2005/11/26 01:28:11 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.102 2005/11/27 00:07:05 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 685  void Pnquote_match(NODE arg,Q *rp)
Line 685  void Pnquote_match(NODE arg,Q *rp)
 {  {
         QUOTE fq,pq;          QUOTE fq,pq;
         FNODE f,p;          FNODE f,p;
           Q two;
         int ret;          int ret;
         NODE r;          NODE r;
   
         fq = (QUOTE)ARG0(arg); Pquote_normalize(mknode(2,fq,0),&fq); f = (FNODE)BDY(fq);          STOQ(2,two);
         pq = (QUOTE)ARG1(arg); Pquote_normalize(mknode(2,pq,0),&pq); p = (FNODE)BDY(pq);          fq = (QUOTE)ARG0(arg); Pquote_normalize(mknode(2,fq,two),&fq); f = (FNODE)BDY(fq);
           pq = (QUOTE)ARG1(arg); Pquote_normalize(mknode(2,pq,two),&pq); p = (FNODE)BDY(pq);
         ret = nfnode_match(f,p,&r);          ret = nfnode_match(f,p,&r);
         if ( ret ) {          if ( ret ) {
                 fnode_do_assign(r);                  fnode_do_assign(r);
Line 698  void Pnquote_match(NODE arg,Q *rp)
Line 700  void Pnquote_match(NODE arg,Q *rp)
                 *rp = 0;                  *rp = 0;
 }  }
   
   
 FNODE rewrite_fnode(FNODE,NODE);  FNODE rewrite_fnode(FNODE,NODE);
   
 extern Obj VOIDobj;  extern Obj VOIDobj;
Line 2057  void Pquote_normalize(NODE arg,QUOTE *rp)
Line 2060  void Pquote_normalize(NODE arg,QUOTE *rp)
         ac = argc(arg);          ac = argc(arg);
         if ( !ac ) error("quote_normalize : invalid argument");          if ( !ac ) error("quote_normalize : invalid argument");
         q = (QUOTE)ARG0(arg);          q = (QUOTE)ARG0(arg);
         expand = ac==2 && ARG1(arg);          if ( ac == 2 )
                   expand = QTOS((Q)ARG1(arg));
         if ( !q || OID(q) != O_QUOTE )          if ( !q || OID(q) != O_QUOTE )
                 *rp = q;                  *rp = q;
         else {          else {
Line 2460  FNODE nfnode_add(FNODE a1,FNODE a2,int expand);
Line 2464  FNODE nfnode_add(FNODE a1,FNODE a2,int expand);
 FNODE nfnode_mul(FNODE a1,FNODE a2,int expand);  FNODE nfnode_mul(FNODE a1,FNODE a2,int expand);
 FNODE nfnode_pwr(FNODE a1,FNODE a2,int expand);  FNODE nfnode_pwr(FNODE a1,FNODE a2,int expand);
 FNODE nfnode_mul_coef(Num c,FNODE f,int expand);  FNODE nfnode_mul_coef(Num c,FNODE f,int expand);
 FNODE fnode_expand_pwr(FNODE f,int n);  FNODE fnode_expand_pwr(FNODE f,int n,int expand);
 FNODE to_narymul(FNODE f);  FNODE to_narymul(FNODE f);
 FNODE to_naryadd(FNODE f);  FNODE to_naryadd(FNODE f);
 FNODE fnode_node_to_naryadd(NODE n);  FNODE fnode_node_to_naryadd(NODE n);
Line 2475  FNODE fnode_normalize(FNODE f,int expand)
Line 2479  FNODE fnode_normalize(FNODE f,int expand)
         NODE n;          NODE n;
         Q q;          Q q;
   
         if ( f->normalized && (f->expanded || !expand) ) return f;          if ( f->normalized && (f->expanded == expand) ) return f;
         STOQ(-1,q);          STOQ(-1,q);
         mone = mkfnode(1,I_FORMULA,q);          mone = mkfnode(1,I_FORMULA,q);
         switch ( f->id ) {          switch ( f->id ) {
Line 2673  FNODE nfnode_mul(FNODE f1,FNODE f2,int expand)
Line 2677  FNODE nfnode_mul(FNODE f1,FNODE f2,int expand)
         m = (FNODE *)ALLOCA(l*sizeof(FNODE));          m = (FNODE *)ALLOCA(l*sizeof(FNODE));
         for ( r = n1, i = 0; i < l1; r = NEXT(r), i++ ) m[i] = BDY(r);          for ( r = n1, i = 0; i < l1; r = NEXT(r), i++ ) m[i] = BDY(r);
         for ( r = n2; r; r = NEXT(r) ) {          for ( r = n2; r; r = NEXT(r) ) {
                 if ( i == 0 )                  if ( i == 0 || (expand == 2) )
                         m[i++] = BDY(r);                          m[i++] = BDY(r);
                 else {                  else {
                         fnode_base_exp(m[i-1],&b1,&e1); fnode_base_exp(BDY(r),&b2,&e2);                          fnode_base_exp(m[i-1],&b1,&e1); fnode_base_exp(BDY(r),&b2,&e2);
Line 2729  FNODE nfnode_pwr(FNODE f1,FNODE f2,int expand)
Line 2733  FNODE nfnode_pwr(FNODE f1,FNODE f2,int expand)
                 ee = QTOS((Q)nf2);                  ee = QTOS((Q)nf2);
                 cc = mkfnode(1,I_FORMULA,c);                  cc = mkfnode(1,I_FORMULA,c);
                 if ( fnode_is_nonnegative_integer(f2) )                  if ( fnode_is_nonnegative_integer(f2) )
                         b = fnode_expand_pwr(b1,ee);                          b = fnode_expand_pwr(b1,ee,expand);
                 else {                  else {
                         STOQ(-1,q);                          STOQ(-1,q);
                         mone = mkfnode(1,I_FORMULA,q);                          mone = mkfnode(1,I_FORMULA,q);
Line 2739  FNODE nfnode_pwr(FNODE f1,FNODE f2,int expand)
Line 2743  FNODE nfnode_pwr(FNODE f1,FNODE f2,int expand)
                                 MKNODE(t1,inv,t0); t0 = t1;                                  MKNODE(t1,inv,t0); t0 = t1;
                         }                          }
                         b1 = fnode_node_to_narymul(t0);                          b1 = fnode_node_to_narymul(t0);
                         b = fnode_expand_pwr(b1,-ee);                          b = fnode_expand_pwr(b1,-ee,expand);
                 }                  }
                 if ( fnode_is_one(cc) )                  if ( fnode_is_one(cc) )
                         return b;                          return b;
Line 2749  FNODE nfnode_pwr(FNODE f1,FNODE f2,int expand)
Line 2753  FNODE nfnode_pwr(FNODE f1,FNODE f2,int expand)
                         && fnode_is_nonnegative_integer(f2) ) {                          && fnode_is_nonnegative_integer(f2) ) {
                 q = (Q)eval(f2);                  q = (Q)eval(f2);
                 if ( PL(NM(q)) > 1 ) error("nfnode_pwr : exponent too large");                  if ( PL(NM(q)) > 1 ) error("nfnode_pwr : exponent too large");
                 return fnode_expand_pwr(f1,QTOS(q));                  return fnode_expand_pwr(f1,QTOS(q),expand);
         } else          } else
                 return mkfnode(3,I_BOP,pwrfs,f1,f2);                  return mkfnode(3,I_BOP,pwrfs,f1,f2);
 }  }
   
 FNODE fnode_expand_pwr(FNODE f,int n)  FNODE fnode_expand_pwr(FNODE f,int n,int expand)
 {  {
         int n1;          int n1,i;
         FNODE f1,f2;          FNODE f1,f2,fn;
           Q q;
   
         if ( !n ) return mkfnode(1,I_FORMULA,ONE);          if ( !n ) return mkfnode(1,I_FORMULA,ONE);
         else if ( IS_ZERO(f) ) return mkfnode(1,I_FORMULA,0);          else if ( IS_ZERO(f) ) return mkfnode(1,I_FORMULA,0);
         else if ( n == 1 ) return f;          else if ( n == 1 ) return f;
         else {          else {
                 n1 = n/2;                  switch ( expand ) {
                 f1 = fnode_expand_pwr(f,n1);                          case 1:
                 f2 = nfnode_mul(f1,f1,1);                                  n1 = n/2;
                 if ( n%2 ) f2 = nfnode_mul(f2,f,1);                                  f1 = fnode_expand_pwr(f,n1,expand);
                 return f2;                                  f2 = nfnode_mul(f1,f1,expand);
                                   if ( n%2 ) f2 = nfnode_mul(f2,f,1);
                                   return f2;
                           case 2:
                                   for ( i = 1, f1 = f; i < n; i++ )
                                           f1 = nfnode_mul(f1,f,expand);
                                   return f1;
                           case 0: default:
                                   STOQ(n,q);
                                   fn = mkfnode(1,I_FORMULA,q);
                                   return mkfnode(3,I_BOP,pwrfs,f,fn);
                   }
         }          }
 }  }
   
Line 3058  int nfnode_match(FNODE f,FNODE pat,NODE *rp)
Line 3074  int nfnode_match(FNODE f,FNODE pat,NODE *rp)
         switch ( pat->id ) {          switch ( pat->id ) {
                 case I_PVAR:                  case I_PVAR:
                         /* [[pat,f]] */                          /* [[pat,f]] */
                         *rp = mknode(1,mknode(2,(int)FA0(pat),f),0);                          *rp = mknode(1,mknode(2,(int)FA0(pat),f));
                         return 1;                          return 1;
   
                 case I_FORMULA:                  case I_FORMULA:

Legend:
Removed from v.1.102  
changed lines
  Added in v.1.103

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