[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.109 and 1.113

version 1.109, 2005/12/14 06:07:30 version 1.113, 2005/12/18 06:54:28
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.108 2005/12/11 07:21:43 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.112 2005/12/18 01:57:21 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 76  struct TeXSymbol {
Line 76  struct TeXSymbol {
 #define IS_BINARYPWR(f) (((f)->id==I_BOP) &&(OPNAME(f)=='^'))  #define IS_BINARYPWR(f) (((f)->id==I_BOP) &&(OPNAME(f)=='^'))
 #define IS_NARYADD(f) (((f)->id==I_NARYOP) &&(OPNAME(f)=='+'))  #define IS_NARYADD(f) (((f)->id==I_NARYOP) &&(OPNAME(f)=='+'))
 #define IS_NARYMUL(f) (((f)->id==I_NARYOP) &&(OPNAME(f)=='*'))  #define IS_NARYMUL(f) (((f)->id==I_NARYOP) &&(OPNAME(f)=='*'))
   #define IS_MUL(f) (((f)->id==I_NARYOP||(f)->id==I_BOP) &&(OPNAME(f)=='*'))
   
 extern char *parse_strp;  extern char *parse_strp;
   
Line 96  void Pqt_is_integer(),Pqt_is_rational(),Pqt_is_number(
Line 97  void Pqt_is_integer(),Pqt_is_rational(),Pqt_is_number(
 void Pqt_is_dependent(),Pqt_is_function(),Pqt_is_var();  void Pqt_is_dependent(),Pqt_is_function(),Pqt_is_var();
 void Pqt_set_ord(),Pqt_set_coef(),Pqt_set_weight();  void Pqt_set_ord(),Pqt_set_coef(),Pqt_set_weight();
 void Pqt_normalize();  void Pqt_normalize();
 void Pnqt_comp();  void Pnqt_comp(),Pnqt_weight();
 void Pnqt_match();  void Pnqt_match();
 void Pnqt_match_rewrite();  void Pnqt_match_rewrite();
   
Line 170  struct ftab str_tab[] = {
Line 171  struct ftab str_tab[] = {
         {"qt_match",Pqt_match,2},          {"qt_match",Pqt_match,2},
         {"nqt_match_rewrite",Pnqt_match_rewrite,3},          {"nqt_match_rewrite",Pnqt_match_rewrite,3},
   
           {"nqt_weight",Pnqt_weight,1},
         {"nqt_comp",Pnqt_comp,2},          {"nqt_comp",Pnqt_comp,2},
         {"nqt_match",Pnqt_match,-3},          {"nqt_match",Pnqt_match,-3},
         {"qt_to_nbp",Pqt_to_nbp,1},          {"qt_to_nbp",Pqt_to_nbp,1},
Line 1430  void Pget_function_name(NODE arg,STRING *rp)
Line 1432  void Pget_function_name(NODE arg,STRING *rp)
 }  }
   
 FNODE strip_paren(FNODE);  FNODE strip_paren(FNODE);
   void objtotex_tb(Obj obj,TB tb);
   
 void fnodetotex_tb(FNODE f,TB tb)  void fnodetotex_tb(FNODE f,TB tb)
 {  {
Line 1438  void fnodetotex_tb(FNODE f,TB tb)
Line 1441  void fnodetotex_tb(FNODE f,TB tb)
         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;  
         char *r;          char *r;
         FNODE fi,f2,f1;          FNODE fi,f2,f1;
   
Line 1506  void fnodetotex_tb(FNODE f,TB tb)
Line 1508  void fnodetotex_tb(FNODE f,TB tb)
                                         write_tb("}",tb);                                          write_tb("}",tb);
                                         break;                                          break;
                                 case '^':                                  case '^':
                                         fnodetotex_tb((FNODE)FA1(f),tb);                                          f1 = (FNODE)FA1(f);
                                           if ( fnode_is_var(f1) )
                                                   fnodetotex_tb(f1,tb);
                                           else {
                                                   write_tb("(",tb);
                                                   fnodetotex_tb(f1,tb);
                                                   write_tb(")",tb);
                                           }
                                         write_tb("^{",tb);                                          write_tb("^{",tb);
                                         fnodetotex_tb(strip_paren((FNODE)FA2(f)),tb);                                          fnodetotex_tb(strip_paren((FNODE)FA2(f)),tb);
                                         write_tb("} ",tb);                                          write_tb("} ",tb);
Line 1523  void fnodetotex_tb(FNODE f,TB tb)
Line 1532  void fnodetotex_tb(FNODE f,TB tb)
                         break;                          break;
                 case I_NARYOP:                  case I_NARYOP:
                         args = (NODE)FA1(f);                          args = (NODE)FA1(f);
                         write_tb("(",tb);  
                         switch ( OPNAME(f) ) {                          switch ( OPNAME(f) ) {
                                 case '+':                                  case '+':
                                         fnodetotex_tb((FNODE)BDY(args),tb);                                          fnodetotex_tb((FNODE)BDY(args),tb);
                                         for ( args = NEXT(args); args; args = NEXT(args) ) {                                          for ( args = NEXT(args); args; args = NEXT(args) ) {
                                                 write_tb("+",tb);                                                  write_tb("+",tb);
                                                 fnodetotex_tb((FNODE)BDY(args),tb);                                                  f1 = (FNODE)BDY(args);
                                                   if ( fnode_is_var(f1) || IS_MUL(f1) )
                                                           fnodetotex_tb(f1,tb);
                                                   else {
                                                           write_tb("(",tb);
                                                           fnodetotex_tb(f1,tb);
                                                           write_tb(")",tb);
                                                   }
                                         }                                          }
                                         break;                                          break;
                                 case '*':                                  case '*':
                                         f1 = (FNODE)BDY(args);                                          f1 = (FNODE)BDY(args);
                                         if ( f1->id == I_FORMULA && MUNIQ(FA0(f1)) )                                          if ( f1->id == I_FORMULA && MUNIQ(FA0(f1)) ) {
                                                 write_tb("-",tb);                                                  write_tb("- ",tb); args = NEXT(args);
                                         else                                          }
                                                 fnodetotex_tb(f1,tb);                                          for ( ; args; args = NEXT(args) ) {
                                         write_tb(" ",tb);  
                                         for ( args = NEXT(args); args; args = NEXT(args) ) {  
                                                 /* XXX special care for DP */  
                                                 f2 = (FNODE)BDY(args);                                                  f2 = (FNODE)BDY(args);
                                                 if ( f2->id == I_EV ) {                                                  if ( fnode_is_var(f2) || IS_BINARYPWR(f2) )
                                                         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);                                                          fnodetotex_tb(f2,tb);
                                                   else {
                                                           write_tb("(",tb);
                                                           fnodetotex_tb(f2,tb);
                                                           write_tb(")",tb);
                                                   }
                                         }                                          }
                                         break;                                          break;
                                 default:                                  default:
                                         error("invalid nary op");                                          error("invalid nary op");
                                         break;                                          break;
                         }                          }
                         write_tb(")",tb);  
                         break;                          break;
   
                 case I_COP:                  case I_COP:
Line 1784  void fnodetotex_tb(FNODE f,TB tb)
Line 1791  void fnodetotex_tb(FNODE f,TB tb)
   
                 /* internal object */                  /* internal object */
                 case I_FORMULA:                  case I_FORMULA:
                         obj = (Obj)FA0(f);                          objtotex_tb((Obj)FA0(f),tb);
                         if ( !obj )  
                                 write_tb("0",tb);  
                         else if ( OID(obj) == O_N && NID(obj) == N_C ) {  
                                 cplx = (C)obj;  
                                 write_tb("(",tb);  
                                 if ( cplx->r ) {  
                                         r = objtostr((Obj)cplx->r); write_tb(r,tb);  
                                 }  
                                 if ( cplx->i ) {  
                                         if ( cplx->r && compnum(0,cplx->i,0) > 0 ) {  
                                                 write_tb("+",tb);  
                                                 if ( !UNIQ(cplx->i) ) {  
                                                         r = objtostr((Obj)cplx->i); write_tb(r,tb);  
                                                 }  
                                         } else if ( MUNIQ(cplx->i) )  
                                                 write_tb("-",tb);  
                                         else if ( !UNIQ(cplx->i) ) {  
                                                 r = objtostr((Obj)cplx->i); write_tb(r,tb);  
                                         }  
                                         write_tb("\\sqrt{-1}",tb);  
                                 }  
                                 write_tb(")",tb);  
                         } else if ( OID(obj) == O_P )  
                                 write_tb(conv_rule(VR((P)obj)->name),tb);  
                         else  
                                 write_tb(objtostr(obj),tb);  
                         break;                          break;
   
                 /* program variable */                  /* program variable */
Line 1826  void fnodetotex_tb(FNODE f,TB tb)
Line 1807  void fnodetotex_tb(FNODE f,TB tb)
         }          }
 }  }
   
   void objtotex_tb(Obj obj,TB tb)
   {
           C cplx;
           char *r;
           P t;
           DCP dc;
           char *v;
   
           if ( !obj ) {
                   write_tb("0",tb);
                   return;
           }
           switch ( OID(obj) ) {
                   case O_N:
                           switch ( NID(obj) ) {
                                   case N_C:
                                           cplx = (C)obj;
                                           write_tb("(",tb);
                                           if ( cplx->r ) {
                                                   r = objtostr((Obj)cplx->r); write_tb(r,tb);
                                           }
                                           if ( cplx->i ) {
                                                   if ( cplx->r && compnum(0,cplx->i,0) > 0 ) {
                                                           write_tb("+",tb);
                                                           if ( !UNIQ(cplx->i) ) {
                                                                   r = objtostr((Obj)cplx->i); write_tb(r,tb);
                                                           }
                                                   } else if ( MUNIQ(cplx->i) )
                                                           write_tb("-",tb);
                                                   else if ( !UNIQ(cplx->i) ) {
                                                           r = objtostr((Obj)cplx->i); write_tb(r,tb);
                                                   }
                                                   write_tb("\\sqrt{-1}",tb);
                                           }
                                           write_tb(")",tb);
                                           break;
                                   default:
                                           write_tb(objtostr(obj),tb);
                                           break;
                           }
                           break;
                   case O_P:
                           v = conv_rule(VR((P)obj)->name);
                           for ( dc = DC((P)obj); dc; dc = NEXT(dc) ) {
                                   if ( !DEG(dc) )
                                           objtotex_tb((Obj)COEF(dc),tb);
                                   else {
                                           if ( NUM(COEF(dc)) && UNIQ((Q)COEF(dc)) )
                                                   ;
                                           else if ( NUM(COEF(dc)) && MUNIQ((Q)COEF(dc)) )
                                                   write_tb("-",tb);
                                           else if ( NUM(COEF(dc)) || !NEXT(DC(COEF(dc))))
                                                   objtotex_tb((Obj)COEF(dc),tb);
                                           else {
                                                   write_tb("(",tb); objtotex_tb((Obj)COEF(dc),tb);
                                                   write_tb(")",tb);
                                           }
                                           write_tb(v,tb);
                                           if ( cmpq(DEG(dc),ONE) ) {
                                                   write_tb("^",tb);
                                                   if ( INT(DEG(dc)) && SGN(DEG(dc))>0 ) {
                                                           write_tb("{",tb);
                                                           objtotex_tb((Obj)DEG(dc),tb);
                                                           write_tb("}",tb);
                                                   } else {
                                                           write_tb("{",tb); objtotex_tb((Obj)DEG(dc),tb);
                                                           write_tb("}",tb);
                                                   }
                                           }
                                   }
                                   if ( NEXT(dc) ) {
                                           t = COEF(NEXT(dc));
                                           if ( !DEG(NEXT(dc)) ) {
                                                   if ( NUM(t) ) {
                                                           if ( !mmono(t) ) write_tb("+",tb);
                                                   } else {
                                                           if ( !mmono(COEF(DC(t))) ) write_tb("+",tb);
                                                   }
                                           } else {
                                                   if ( !mmono(t) ) write_tb("+",tb);
                                           }
                                   }
                           }
                           break;
                   case O_R:
                           write_tb("\\frac{",tb);
                           objtotex_tb((Obj)NM((R)obj),tb);
                           write_tb("}{",tb);
                           objtotex_tb((Obj)DN((R)obj),tb);
                           write_tb("}",tb);
                           break;
                   default:
                           write_tb(objtostr(obj),tb);
                           break;
           }
   }
   
 char *objtostr(Obj obj)  char *objtostr(Obj obj)
 {  {
         int len;          int len;
Line 1941  int top_is_minus(FNODE f)
Line 2019  int top_is_minus(FNODE f)
                                         case O_N:                                          case O_N:
                                                 return mmono((P)obj);                                                  return mmono((P)obj);
                                         case O_P:                                          case O_P:
   #if 0
                                                 /* must be a variable */                                                  /* must be a variable */
                                                 opname = conv_rule(VR((P)obj)->name);                                                  opname = conv_rule(VR((P)obj)->name);
                                                 return opname[0]=='-';                                                  return opname[0]=='-';
   #else
                                                   return mmono((P)obj);
   #endif
                                         default:                                          default:
                                                 /* ??? */                                                  /* ??? */
                                                 len = estimate_length(CO,obj);                                                  len = estimate_length(CO,obj);
Line 2503  NBP fnode_to_nbp(FNODE f)
Line 2585  NBP fnode_to_nbp(FNODE f)
         }          }
 }  }
   
   void Pnqt_weight(NODE arg,Q *rp)
   {
           QUOTE q;
           FNODE f;
           int w;
   
           q = (QUOTE)ARG0(arg); f = (FNODE)BDY(q);
           f = fnode_normalize(f,0);
           w = nfnode_weight(qt_weight_tab,f);
           STOQ(w,*rp);
   }
   
 void Pnqt_comp(NODE arg,Q *rp)  void Pnqt_comp(NODE arg,Q *rp)
 {  {
         QUOTE q1,q2;          QUOTE q1,q2;
Line 2560  int fnode_is_coef(FNODE f)
Line 2654  int fnode_is_coef(FNODE f)
                         else if ( OID(obj) == O_P || OID(obj) == O_R) {                          else if ( OID(obj) == O_P || OID(obj) == O_R) {
                                 get_vars_recursive(obj,&vl);                                  get_vars_recursive(obj,&vl);
                                 for ( t = vl; t; t = NEXT(t) ) {                                  for ( t = vl; t; t = NEXT(t) ) {
                                           if ( t->v->attr == (pointer)V_PF ) continue;
                                         for ( s = qt_current_coef; s; s = NEXT(s) )                                          for ( s = qt_current_coef; s; s = NEXT(s) )
                                                 if ( t->v == s->v ) break;                                                  if ( t->v == s->v ) break;
                                         if ( !s ) return 0;                                          if ( !s )
                                                   return 0;
                                 }                                  }
                                 return 1;                                  return 1;
                         } else return 0;                          } else return 0;
Line 2921  FNODE nfnode_mul(FNODE f1,FNODE f2,int expand)
Line 3017  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 || (expand == 2) )                  if ( i == 0 )
                         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);
                         if ( compfnode(b1,b2) ) break;                          if ( compfnode(b1,b2) ) break;
                         arf_add(CO,eval(e1),eval(e2),&e);                          arf_add(CO,eval(e1),eval(e2),&e);
                         if ( !e ) i--;                          if ( !e ) i--;
                         else if ( UNIQ(e) )                          else if ( expand == 2 ) {
                                   if ( INT(e) && SGN((Q)e) < 0 ) {
                                           t1 = mkfnode(3,I_BOP,pwrfs,b1,mkfnode(1,I_FORMULA,e));
                                           /* r=(r0|rest)->(r0,t1|rest) */
                                           t = BDY(r);
                                           MKNODE(r1,t1,NEXT(r));
                                           MKNODE(r,t,r1);
                                           i--;
                                   } else
                                           m[i++] = BDY(r);
                           } else if ( UNIQ(e) )
                                 m[i-1] = b1;                                  m[i-1] = b1;
                         else                          else
                                 m[i-1] = mkfnode(3,I_BOP,pwrfs,b1,mkfnode(1,I_FORMULA,e));                                  m[i-1] = mkfnode(3,I_BOP,pwrfs,b1,mkfnode(1,I_FORMULA,e));
Line 3122  void fnode_coef_body(FNODE f,Obj *cp,FNODE *bp)
Line 3228  void fnode_coef_body(FNODE f,Obj *cp,FNODE *bp)
         }          }
 }  }
   
 int nfnode_comp_pwr(FNODE f1,FNODE f2);  
   
 int nfnode_weight(struct wtab *tab,FNODE f)  int nfnode_weight(struct wtab *tab,FNODE f)
 {  {
         NODE n;          NODE n;
Line 3136  int nfnode_weight(struct wtab *tab,FNODE f)
Line 3240  int nfnode_weight(struct wtab *tab,FNODE f)
                 case I_FORMULA:                  case I_FORMULA:
                         if ( fnode_is_coef(f) ) return 0;                          if ( fnode_is_coef(f) ) return 0;
                         else if ( fnode_is_var(f) ) {                          else if ( fnode_is_var(f) ) {
                                   if ( !tab ) return 0;
                                 v = VR((P)FA0(f));                                  v = VR((P)FA0(f));
                                 for ( i = 0; tab[i].v; i++ )                                  for ( i = 0; tab[i].v; i++ )
                                         if ( v == tab[i].v ) return tab[i].w;                                          if ( v == tab[i].v ) return tab[i].w;
                                 return w;                                  return 0;
                         } else return 0;                          } else return 0;
   
                 /* XXX */                  /* XXX */
Line 3180  int nfnode_weight(struct wtab *tab,FNODE f)
Line 3285  int nfnode_weight(struct wtab *tab,FNODE f)
   
 int nfnode_comp(FNODE f1,FNODE f2)  int nfnode_comp(FNODE f1,FNODE f2)
 {  {
         NODE n1,n2;  
         int r,i1,i2,ret;  
         char *nm1,*nm2;  
         FNODE b1,b2,e1,e2,g,a1,a2,fn1,fn2;  
         Num ee,ee1;  
         Obj c1,c2;  
         int w1,w2;          int w1,w2;
   
         if ( qt_weight_tab ) {          if ( qt_weight_tab ) {
Line 3194  int nfnode_comp(FNODE f1,FNODE f2)
Line 3293  int nfnode_comp(FNODE f1,FNODE f2)
                 if ( w1 > w2 ) return 1;                  if ( w1 > w2 ) return 1;
                 if ( w1 < w2 ) return -1;                  if ( w1 < w2 ) return -1;
         }          }
           return nfnode_comp_lex(f1,f2);
   }
   
   int nfnode_comp_lex(FNODE f1,FNODE f2)
   {
           NODE n1,n2;
           int r,i1,i2,ret;
           char *nm1,*nm2;
           FNODE b1,b2,e1,e2,g,a1,a2,fn1,fn2;
           Num ee,ee1;
           Obj c1,c2;
           int w1,w2;
   
         if ( IS_NARYADD(f1) || IS_NARYADD(f2) ) {          if ( IS_NARYADD(f1) || IS_NARYADD(f2) ) {
                 f1 = to_naryadd(f1); f2 = to_naryadd(f2);                  f1 = to_naryadd(f1); f2 = to_naryadd(f2);
                 n1 = (NODE)FA1(f1); n2 = (NODE)FA1(f2);                  n1 = (NODE)FA1(f1); n2 = (NODE)FA1(f2);
                 while ( n1 && n2 )                  while ( n1 && n2 )
                         if ( r = nfnode_comp(BDY(n1),BDY(n2)) ) return r;                          if ( r = nfnode_comp_lex(BDY(n1),BDY(n2)) ) return r;
                         else {                          else {
                                 n1 = NEXT(n1); n2 = NEXT(n2);                                  n1 = NEXT(n1); n2 = NEXT(n2);
                         }                          }
Line 3221  int nfnode_comp(FNODE f1,FNODE f2)
Line 3332  int nfnode_comp(FNODE f1,FNODE f2)
                         fnode_base_exp(BDY(n1),&b1,&e1);                          fnode_base_exp(BDY(n1),&b1,&e1);
                         fnode_base_exp(BDY(n2),&b2,&e2);                          fnode_base_exp(BDY(n2),&b2,&e2);
   
                         if ( r = nfnode_comp(b1,b2) ) {                          if ( r = nfnode_comp_lex(b1,b2) ) {
                                 if ( r > 0 )                                  if ( r > 0 )
                                         return nfnode_comp(e1,mkfnode(1,I_FORMULA,0));                                          return nfnode_comp_lex(e1,mkfnode(1,I_FORMULA,0));
                                 else if ( r < 0 )                                  else if ( r < 0 )
                                         return nfnode_comp(mkfnode(1,I_FORMULA,0),e2);                                          return nfnode_comp_lex(mkfnode(1,I_FORMULA,0),e2);
                         } else {                          } else {
                                 n1 = NEXT(n1); n2 = NEXT(n2);                                  n1 = NEXT(n1); n2 = NEXT(n2);
                                 if ( fnode_is_number(e1) && fnode_is_number(e2) ) {                                  if ( fnode_is_number(e1) && fnode_is_number(e2) ) {
Line 3241  int nfnode_comp(FNODE f1,FNODE f2)
Line 3352  int nfnode_comp(FNODE f1,FNODE f2)
                                                 MKNODE(n2,g,n2);                                                  MKNODE(n2,g,n2);
                                         }                                          }
                                 } else {                                  } else {
                                         r = nfnode_comp(e1,e2);                                          r = nfnode_comp_lex(e1,e2);
                                         if ( r > 0 ) return 1;                                          if ( r > 0 ) return 1;
                                         else if ( r < 0 ) return -1;                                          else if ( r < 0 ) return -1;
                                 }                                  }
                         }                          }
                 }                  }
         }          }
         if ( IS_BINARYPWR(f1) || IS_BINARYPWR(f2) )          if ( IS_BINARYPWR(f1) || IS_BINARYPWR(f2) ) {
                 return nfnode_comp_pwr(f1,f2);                  fnode_base_exp(f1,&b1,&e1);
                   fnode_base_exp(f2,&b2,&e2);
                   if ( r = nfnode_comp_lex(b1,b2) ) {
                           if ( r > 0 )
                                   return nfnode_comp_lex(e1,mkfnode(1,I_FORMULA,0));
                           else if ( r < 0 )
                                   return nfnode_comp_lex(mkfnode(1,I_FORMULA,0),e2);
                   } else return nfnode_comp_lex(e1,e2);
           }
   
         /* now, IDs of f1 and f2 must be I_FORMULA, I_FUNC, I_IFUNC or I_PVAR */          /* now, IDs of f1 and f2 must be I_FORMULA, I_FUNC, I_IFUNC or I_PVAR */
         /* I_IFUNC > I_PVAR > I_FUNC=I_FUNC_QARG > I_FORMULA */          /* I_IFUNC > I_PVAR > I_FUNC=I_FUNC_QARG > I_FORMULA */
Line 3261  int nfnode_comp(FNODE f1,FNODE f2)
Line 3380  int nfnode_comp(FNODE f1,FNODE f2)
                                 case I_FUNC: case I_IFUNC: case I_PVAR:                                  case I_FUNC: case I_IFUNC: case I_PVAR:
                                         return -1;                                          return -1;
                                 default:                                  default:
                                         error("nfnode_comp : undefined");                                          error("nfnode_comp_lex : undefined");
                         }                          }
                         break;                          break;
                 case I_FUNC: case I_FUNC_QARG:                  case I_FUNC: case I_FUNC_QARG:
Line 3279  int nfnode_comp(FNODE f1,FNODE f2)
Line 3398  int nfnode_comp(FNODE f1,FNODE f2)
                                                 /* compare args */                                                  /* compare args */
                                                 n1 = FA0((FNODE)FA1(f1)); n2 = FA0((FNODE)FA1(f2));                                                  n1 = FA0((FNODE)FA1(f1)); n2 = FA0((FNODE)FA1(f2));
                                                 while ( n1 && n2 )                                                  while ( n1 && n2 )
                                                         if ( r = nfnode_comp(BDY(n1),BDY(n2)) ) return r;                                                          if ( r = nfnode_comp_lex(BDY(n1),BDY(n2)) ) return r;
                                                         else {                                                          else {
                                                                 n1 = NEXT(n1); n2 = NEXT(n2);                                                                  n1 = NEXT(n1); n2 = NEXT(n2);
                                                         }                                                          }
Line 3287  int nfnode_comp(FNODE f1,FNODE f2)
Line 3406  int nfnode_comp(FNODE f1,FNODE f2)
                                         }                                          }
                                         break;                                          break;
                                 default:                                  default:
                                         error("nfnode_comp : undefined");                                          error("nfnode_comp_lex : undefined");
                         }                          }
                 case I_PVAR:                  case I_PVAR:
                         switch ( f2->id ) {                          switch ( f2->id ) {
Line 3301  int nfnode_comp(FNODE f1,FNODE f2)
Line 3420  int nfnode_comp(FNODE f1,FNODE f2)
                                         else if ( i1 < i2 ) return -1;                                          else if ( i1 < i2 ) return -1;
                                         else return 0;                                          else return 0;
                                 default:                                  default:
                                         error("nfnode_comp : undefined");                                          error("nfnode_comp_lex : undefined");
                         }                          }
                         break;                          break;
                 case I_IFUNC:                  case I_IFUNC:
Line 3317  int nfnode_comp(FNODE f1,FNODE f2)
Line 3436  int nfnode_comp(FNODE f1,FNODE f2)
                                                 /* compare args */                                                  /* compare args */
                                                 n1 = FA0((FNODE)FA1(f1)); n2 = FA0((FNODE)FA1(f2));                                                  n1 = FA0((FNODE)FA1(f1)); n2 = FA0((FNODE)FA1(f2));
                                                 while ( n1 && n2 )                                                  while ( n1 && n2 )
                                                         if ( r = nfnode_comp(BDY(n1),BDY(n2)) ) return r;                                                          if ( r = nfnode_comp_lex(BDY(n1),BDY(n2)) ) return r;
                                                         else {                                                          else {
                                                                 n1 = NEXT(n1); n2 = NEXT(n2);                                                                  n1 = NEXT(n1); n2 = NEXT(n2);
                                                         }                                                          }
Line 3326  int nfnode_comp(FNODE f1,FNODE f2)
Line 3445  int nfnode_comp(FNODE f1,FNODE f2)
                                         break;                                          break;
   
                                 default:                                  default:
                                         error("nfnode_comp : undefined");                                          error("nfnode_comp_lex : undefined");
                         }                          }
                         break;                          break;
                 default:                  default:
                         error("nfnode_comp : undefined");                          error("nfnode_comp_lex : undefined");
         }          }
 }  
   
 int nfnode_comp_pwr(FNODE f1,FNODE f2)  
 {  
         FNODE b1,b2,e1,e2;  
         int r;  
   
         fnode_base_exp(f1,&b1,&e1);  
         fnode_base_exp(f2,&b2,&e2);  
         if ( r = nfnode_comp(b1,b2) ) {  
                 if ( r > 0 )  
                         return nfnode_comp(e1,mkfnode(1,I_FORMULA,0));  
                 else if ( r < 0 )  
                         return nfnode_comp(mkfnode(1,I_FORMULA,0),e2);  
         } else return nfnode_comp(e1,e2);  
 }  }
   
 NODE append_node(NODE a1,NODE a2)  NODE append_node(NODE a1,NODE a2)

Legend:
Removed from v.1.109  
changed lines
  Added in v.1.113

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