[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.90 and 1.92

version 1.90, 2005/11/02 05:39:23 version 1.92, 2005/11/02 08:22:39
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.89 2005/11/02 05:18:41 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.91 2005/11/02 06:32:44 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 1314  FNODE strip_paren(FNODE);
Line 1314  FNODE strip_paren(FNODE);
   
 void fnodetotex_tb(FNODE f,TB tb)  void fnodetotex_tb(FNODE f,TB tb)
 {  {
         NODE n,t,t0;          NODE n,t,t0,args;
         char vname[BUFSIZ],prefix[BUFSIZ];          char vname[BUFSIZ],prefix[BUFSIZ];
         char *opname,*vname_conv,*prefix_conv;          char *opname,*vname_conv,*prefix_conv;
         Obj obj;          Obj obj;
         int i,len,allzero,elen,elen2,si;          int i,len,allzero,elen,elen2,si;
         C cplx;          C cplx;
         char *r;          char *r;
         FNODE fi,f2;          FNODE fi,f2,f1;
   
         write_tb(" ",tb);          write_tb(" ",tb);
         if ( !f ) {          if ( !f ) {
Line 1402  void fnodetotex_tb(FNODE f,TB tb)
Line 1402  void fnodetotex_tb(FNODE f,TB tb)
                                         break;                                          break;
                         }                          }
                         break;                          break;
                   case I_NARYOP:
                           args = (NODE)FA1(f);
                           write_tb("(",tb);
                           switch ( OPNAME(f) ) {
                                   case '+':
                                           fnodetotex_tb((FNODE)BDY(args),tb);
                                           for ( args = NEXT(args); args; args = NEXT(args) ) {
                                                   write_tb("+",tb);
                                                   fnodetotex_tb((FNODE)BDY(args),tb);
                                           }
                                           break;
                                   case '*':
                                           f1 = (FNODE)BDY(args);
                                           if ( f1->id == I_FORMULA && MUNIQ(FA0(f1)) )
                                                   write_tb("-",tb);
                                           else
                                                   fnodetotex_tb(f1,tb);
                                           write_tb(" ",tb);
                                           for ( args = NEXT(args); args; args = NEXT(args) ) {
                                                   /* XXX special care for DP */
                                                   f2 = (FNODE)BDY(args);
                                                   if ( f2->id == I_EV ) {
                                                           n = (NODE)FA0(f2);
                                                           for ( i = 0; n; n = NEXT(n), i++ ) {
                                                                   fi = (FNODE)BDY(n);
                                                                   if ( fi->id != I_FORMULA || FA0(fi) )
                                                                           break;
                                                           }
                                                           if ( n )
                                                                   fnodetotex_tb(f2,tb);
                                                   } else
                                                           fnodetotex_tb(f2,tb);
                                           }
                                           break;
                                   default:
                                           error("invalid nary op");
                                           break;
                           }
                           write_tb(")",tb);
                           break;
   
                 case I_COP:                  case I_COP:
                         switch( (cid)FA0(f) ) {                          switch( (cid)FA0(f) ) {
Line 1794  int top_is_minus(FNODE f)
Line 1834  int top_is_minus(FNODE f)
                                                 return opname[0]=='-';                                                  return opname[0]=='-';
                                 }                                  }
                         }                          }
                   case I_NARYOP:
                           return top_is_minus((FNODE)BDY((NODE)FA1(f)));
   
                 default:                  default:
                         return 0;                          return 0;
         }          }
Line 2406  FNODE fnode_normalize_pwr(FNODE f1,FNODE f2,int expand
Line 2449  FNODE fnode_normalize_pwr(FNODE f1,FNODE f2,int expand
   
         if ( IS_ZERO(f2) ) return mkfnode(1,I_FORMULA,ONE);          if ( IS_ZERO(f2) ) return mkfnode(1,I_FORMULA,ONE);
         else if ( IS_ZERO(f1) ) return mkfnode(1,I_FORMULA,0);          else if ( IS_ZERO(f1) ) return mkfnode(1,I_FORMULA,0);
         else if ( fnode_is_one(f2) ) return f1;          else if ( fnode_is_number(f1) ) {
         else if ( fnode_is_number(f1) )  
                 if ( fnode_is_integer(f2) ) {                  if ( fnode_is_integer(f2) ) {
                         pwrnum(0,(Num)eval(f1),(Num)eval(f2),&c);                          if ( fnode_is_one(f2) ) return f1;
                         return mkfnode(1,I_FORMULA,c);                          else {
                                   pwrnum(0,(Num)eval(f1),(Num)eval(f2),&c);
                                   return mkfnode(1,I_FORMULA,c);
                           }
                 } else                  } else
                         return mkfnode(3,I_BOP,pwrfs,f1,f2);                          return mkfnode(3,I_BOP,pwrfs,f1,f2);
         else if ( IS_BINARYPWR(f1) ) {          } else if ( IS_BINARYPWR(f1) ) {
                 b1 = FA1(f1); e1 = FA2(f1);                  b1 = FA1(f1); e1 = FA2(f1);
                 e = fnode_normalize_mul(e1,f2,expand);                  e = fnode_normalize_mul(e1,f2,expand);
                 if ( fnode_is_one(e) )                  if ( fnode_is_one(e) )
                         return b1;                          return b1;
                 else                  else
                         return mkfnode(3,I_BOP,FA0(f1),b1,e);                          return mkfnode(3,I_BOP,FA0(f1),b1,e);
         } else if ( expand && IS_NARYMUL(f1) && fnode_is_integer(f2) ) {          } else if ( expand && IS_NARYMUL(f1) && fnode_is_number(f2)
                   && fnode_is_integer(f2) ) {
                 fnode_coef_body(f1,&c1,&b1);                  fnode_coef_body(f1,&c1,&b1);
                 nf2 = (Num)eval(f2);                  nf2 = (Num)eval(f2);
                 pwrnum(0,(Num)c1,nf2,&c);                  pwrnum(0,(Num)c1,nf2,&c);
Line 2431  FNODE fnode_normalize_pwr(FNODE f1,FNODE f2,int expand
Line 2477  FNODE fnode_normalize_pwr(FNODE f1,FNODE f2,int expand
                 else {                  else {
                         STOQ(-1,q);                          STOQ(-1,q);
                         mone = mkfnode(1,I_FORMULA,q);                          mone = mkfnode(1,I_FORMULA,q);
                           b1 = to_narymul(b1);
                         for ( t0 = 0, n = (NODE)FA1(b1); n; n = NEXT(n) ) {                          for ( t0 = 0, n = (NODE)FA1(b1); n; n = NEXT(n) ) {
                                 inv = mkfnode(3,I_BOP,pwrfs,BDY(n),mone);                                  inv = mkfnode(3,I_BOP,pwrfs,BDY(n),mone);
                                 MKNODE(t1,inv,t0); t0 = t1;                                  MKNODE(t1,inv,t0); t0 = t1;
                         }                          }
                         b1 = mkfnode(2,I_NARYOP,FA0(f1),t0);                          b1 = fnode_node_to_narymul(t0);
                         b = fnode_expand_pwr(b1,-ee);                          b = fnode_expand_pwr(b1,-ee);
                 }                  }
                 if ( fnode_is_one(cc) )                  if ( fnode_is_one(cc) )

Legend:
Removed from v.1.90  
changed lines
  Added in v.1.92

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