[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.110 and 1.112

version 1.110, 2005/12/14 09:06:54 version 1.112, 2005/12/18 01:57:21
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.109 2005/12/14 06:07:30 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.111 2005/12/18 01:44:16 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 3134  int nfnode_weight(struct wtab *tab,FNODE f)
Line 3230  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 1;
                                 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 1;
                         } else return 0;                          } else return 0;
   
                 /* XXX */                  /* XXX */

Legend:
Removed from v.1.110  
changed lines
  Added in v.1.112

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