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

Diff for /OpenXM_contrib2/asir2000/io/cpexpr.c between version 1.5 and 1.20

version 1.5, 2000/11/08 08:02:51 version 1.20, 2004/03/17 02:23:45
Line 44 
Line 44 
  * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY   * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
  * 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/io/cpexpr.c,v 1.4 2000/08/22 05:04:17 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/io/cpexpr.c,v 1.19 2004/03/17 02:10:31 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
 #include "al.h"  #include "al.h"
 #include "base.h"  #include "base.h"
   #if PARI
   #include "genpari.h"
   #endif
   
 extern int hex_output,fortran_output;  extern int hex_output,fortran_output,double_output,real_digit;
   
 #define PRINTHAT (fortran_output?PUTS("**"):PUTS("^"))  #define PRINTHAT (fortran_output?PUTS("**"):PUTS("^"))
   
Line 77  extern int hex_output,fortran_output;
Line 80  extern int hex_output,fortran_output;
 #define PRINTGF2MAT length_gf2mat  #define PRINTGF2MAT length_gf2mat
 #define PRINTGFMMAT length_gfmmat  #define PRINTGFMMAT length_gfmmat
 #define PRINTBYTEARRAY length_bytearray  #define PRINTBYTEARRAY length_bytearray
   #define PRINTQUOTE length_QUOTE
   #define PRINTSYMBOL length_SYMBOL
   #define PRINTRANGE length_RANGE
   #define PRINTTB length_TB
 #define PRINTERR length_err  #define PRINTERR length_err
 #define PRINTLF length_lf  #define PRINTLF length_lf
 #define PRINTLOP length_lop  #define PRINTLOP length_lop
Line 84  extern int hex_output,fortran_output;
Line 91  extern int hex_output,fortran_output;
 #define PRINTEOP length_eop  #define PRINTEOP length_eop
 #define PRINTQOP length_qop  #define PRINTQOP length_qop
 #define PRINTUP length_up  #define PRINTUP length_up
   #define PRINTUM length_um
   #define PRINTSF length_sf
   #define PRINTFARGS length_fargs
   #define PRINTFNODENODE length_fnodenode
   #define PRINTFNODE length_fnode
   
 void PRINTEXPR();  void PRINTEXPR();
 void PRINTNUM();  void PRINTNUM();
Line 101  void PRINTUI();
Line 113  void PRINTUI();
 void PRINTGF2MAT();  void PRINTGF2MAT();
 void PRINTGFMMAT();  void PRINTGFMMAT();
 void PRINTBYTEARRAY();  void PRINTBYTEARRAY();
   void PRINTQUOTE();
   void PRINTSYMBOL();
   void PRINTRANGE();
   void PRINTTB();
 void PRINTERR();  void PRINTERR();
 void PRINTCPLX();  void PRINTCPLX();
 void PRINTLM();  void PRINTLM();
 void PRINTLF();  void PRINTLF();
   void PRINTUP();
   void PRINTUM();
 void PRINTUP2();  void PRINTUP2();
   void PRINTFOP();
   void PRINTEOP();
   void PRINTLOP();
   void PRINTQOP();
   void PRINTSF();
   void PRINTFNODE();
   
 static int total_length;  static int total_length;
   
 int estimate_length(vl,p)  int estimate_length(VL vl,pointer p)
 VL vl;  
 pointer p;  
 {  {
         total_length = 0;          total_length = 0;
         PRINTEXPR(vl,p);          PRINTEXPR(vl,p);
         return total_length;          return total_length;
 }  }
   
 #if PARI  #if defined(PARI)
 void PRINTBF(a)  void PRINTBF(BF a)
 BF a;  
 {  {
         char *str;          char *str;
         char *GENtostr();          char *GENtostr0();
           void myoutbrute();
   
         str = GENtostr(a->body);          if ( double_output ) {
                   str = GENtostr0(a->body,myoutbrute);
           } else {
                   str = GENtostr(a->body);
           }
         total_length += strlen(str);          total_length += strlen(str);
         free(str);          free(str);
 }  }
 #endif  #endif
   
 void PRINTEXPR(vl,p)  void PRINTEXPR(VL vl,pointer p)
 VL vl;  
 pointer p;  
 {  {
         if ( !p ) {          if ( !p ) {
                 total_length++;                  total_length++;
Line 173  pointer p;
Line 197  pointer p;
                         PRINTGFMMAT(vl,(GFMMAT)p); break;                          PRINTGFMMAT(vl,(GFMMAT)p); break;
                 case O_BYTEARRAY:                  case O_BYTEARRAY:
                         PRINTBYTEARRAY(vl,(BYTEARRAY)p); break;                          PRINTBYTEARRAY(vl,(BYTEARRAY)p); break;
                   case O_QUOTE:
                           PRINTQUOTE(vl,(QUOTE)p); break;
                   case O_SYMBOL:
                           PRINTSYMBOL((SYMBOL)p); break;
                   case O_RANGE:
                           PRINTRANGE(vl,(RANGE)p); break;
                   case O_TB:
                           PRINTTB(vl,(TB)p); break;
                 default:                  default:
                         break;                          break;
         }          }
 }  }
   
 void PRINTN(n)  void PRINTN(N n)
 N n;  
 {  {
         double ceil();          double ceil();
   
Line 191  N n;
Line 222  N n;
                 total_length += (int)(ceil(0.31*((double)(BSH*PL(n))))+1);                  total_length += (int)(ceil(0.31*((double)(BSH*PL(n))))+1);
 }  }
   
 void PRINTNUM(q)  void PRINTNUM(Num q)
 Num q;  
 {  {
         if ( !q ) {          if ( !q ) {
                 PUTS("0");                  PUTS("0");
Line 208  Num q;
Line 238  Num q;
                         }                          }
                         break;                          break;
                 case N_R:                  case N_R:
                         total_length += 20; /* XXX */                          if ( double_output )
                                   total_length += 400+real_digit; /* XXX */
                           else
                                   total_length += 20+real_digit; /* XXX */
                         break;                          break;
                 case N_A:                  case N_A:
                         PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");                          PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");
                         break;                          break;
 #if PARI  #if defined(PARI)
                 case N_B:                  case N_B:
                         PRINTBF((BF)q); break;                          PRINTBF((BF)q); break;
 #endif  #endif
Line 233  Num q;
Line 266  Num q;
                 case N_GFPN:                  case N_GFPN:
                         PRINTUP((UP)(((GFPN)q)->body));                          PRINTUP((UP)(((GFPN)q)->body));
                         break;                          break;
                   case N_GFS:
                           total_length += 13; /* XXX */
                           break;
                   case N_GFSN:
                           PRINTUM(BDY((GFSN)q));
                           break;
                 default:                  default:
                         break;                          break;
         }          }
 }  }
   
 void PRINTCPLX(a)  void PRINTCPLX(C a)
 C a;  
 {  {
         PUTS("(");          PUTS("(");
         if ( a->r )          if ( a->r )
Line 252  C a;
Line 290  C a;
         PUTS(")");          PUTS(")");
 }  }
   
 void PRINTP(vl,p)  void PRINTP(VL vl,P p)
 VL vl;  
 P p;  
 {  {
         V v;          V v;
         DCP dc;          DCP dc;
         int t;  
   
         if ( !p )          if ( !p )
                 PUTS("0");                  PUTS("0");
Line 310  P p;
Line 345  P p;
   
 extern int hideargs;  extern int hideargs;
   
 void PRINTV(vl,v)  void PRINTV(VL vl,V v)
 VL vl;  
 V v;  
 {  {
         PF pf;          PF pf;
         PFAD ad;          PFAD ad;
Line 323  V v;
Line 356  V v;
         else if ( (vid)v->attr == V_PF ) {          else if ( (vid)v->attr == V_PF ) {
                 pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;                  pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;
                 if ( !strcmp(NAME(pf),"pow") ) {                  if ( !strcmp(NAME(pf),"pow") ) {
                         PUTS("("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("(");                          PUTS("(("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("(");
                         PRINTR(vl,(R)ad[1].arg); PUTS(")");                          PRINTR(vl,(R)ad[1].arg); PUTS("))");
                 } else if ( !pf->argc )                  } else if ( !pf->argc )
                         PUTS(NAME(pf));                          PUTS(NAME(pf));
                 else {                  else {
Line 368  V v;
Line 401  V v;
         }          }
 }  }
   
 void PRINTR(vl,a)  void PRINTR(VL vl,R a)
 VL vl;  
 R a;  
 {  {
         if ( !a )          if ( !a )
                 PUTS("0");                  PUTS("0");
Line 384  R a;
Line 415  R a;
                 }                  }
 }  }
   
 void PRINTVECT(vl,vect)  void PRINTVECT(VL vl,VECT vect)
 VL vl;  
 VECT vect;  
 {  {
         int i;          int i;
         pointer *ptr;          pointer *ptr;
Line 398  VECT vect;
Line 427  VECT vect;
         PUTS("]");          PUTS("]");
 }  }
   
 void PRINTMAT(vl,mat)  void PRINTMAT(VL vl,MAT mat)
 VL vl;  
 MAT mat;  
 {  {
         int i,j,r,c;          int i,j,r,c;
         pointer *ptr;          pointer *ptr;
Line 416  MAT mat;
Line 443  MAT mat;
         }          }
 }  }
   
 void PRINTLIST(vl,list)  void PRINTLIST(VL vl,LIST list)
 VL vl;  
 LIST list;  
 {  {
         NODE tnode;          NODE tnode;
   
Line 431  LIST list;
Line 456  LIST list;
         PUTS("]");          PUTS("]");
 }  }
   
 void PRINTSTR(str)  void PRINTSTR(STRING str)
 STRING str;  
 {  {
         char *p;          char *p;
   
Line 444  STRING str;
Line 468  STRING str;
                 }                  }
 }  }
   
 void PRINTCOMP(vl,c)  void PRINTCOMP(VL vl,COMP c)
 VL vl;  
 COMP c;  
 {  {
         int n,i;          int n,i;
   
Line 460  COMP c;
Line 482  COMP c;
         PUTS("}");          PUTS("}");
 }  }
   
 void PRINTDP(vl,d)  void PRINTDP(VL vl,DP d)
 VL vl;  
 DP d;  
 {  {
         int n,i;          int n,i;
         MP m;          MP m;
Line 480  DP d;
Line 500  DP d;
         }          }
 }  }
   
 void PRINTUI(vl,u)  void PRINTUI(VL vl,USINT u)
 VL vl;  
 USINT u;  
 {  {
         total_length += 10;          total_length += 10;
 }  }
   
 void PRINTGF2MAT(vl,mat)  void PRINTGF2MAT(VL vl,GF2MAT mat)
 VL vl;  
 GF2MAT mat;  
 {  {
         int row,col,w,i,j,k,m;          int row,col,w,i,j,k,m;
         unsigned int t;          unsigned int t;
Line 512  GF2MAT mat;
Line 528  GF2MAT mat;
         }          }
 }  }
   
 void PRINTGFMMAT(vl,mat)  void PRINTGFMMAT(VL vl,GFMMAT mat)
 VL vl;  
 GFMMAT mat;  
 {  {
         int row,col,i,j;          int row,col,i,j;
         unsigned int t;  
         unsigned int **b;          unsigned int **b;
   
         row = mat->row;          row = mat->row;
Line 532  GFMMAT mat;
Line 545  GFMMAT mat;
         }          }
 }  }
   
 void PRINTBYTEARRAY(vl,array)  void PRINTBYTEARRAY(VL vl,BYTEARRAY array)
 VL vl;  
 BYTEARRAY array;  
 {  {
         /* |xx xx ... xx| */          /* |xx xx ... xx| */
         return 1+3*array->len;          total_length += 1+3*array->len;
 }  }
   
 void PRINTERR(vl,e)  extern int print_quote;
 VL vl;  
 ERR e;  void PRINTQUOTE(VL vl,QUOTE quote)
 {  {
           LIST list;
   
           if ( print_quote == 2 ) {
                   PRINTFNODE(BDY(quote));
           } else if ( print_quote == 1 ) {
                   /* XXX */
                   fnodetotree(BDY(quote),&list);
                   PRINTEXPR(vl,(Obj)list);
           } else {
                   /* <...quoted...> */
                   total_length += 20;
           }
   }
   
   void PRINTSYMBOL(SYMBOL sym)
   {
           total_length += strlen(sym->name);
   }
   
   void PRINTRANGE(VL vl,RANGE r)
   {
           PUTS("range("); PRINTEXPR(vl,r->start);
           PUTS(","); PRINTEXPR(vl,r->end); PUTS(")");
   }
   
   void PRINTTB(VL vl,TB p)
   {
           int i;
   
           for ( i = 0; i < p->next; i++ ) {
                   total_length += strlen(p->body[i]);
           }
   }
   
   void PRINTERR(VL vl,ERR e)
   {
         PUTS("error("); PRINTEXPR(vl,e->body); PUTS(")");          PUTS("error("); PRINTEXPR(vl,e->body); PUTS(")");
 }  }
   
 void PRINTUP2(p)  void PRINTUP2(UP2 p)
 UP2 p;  
 {  {
         int d,i;          int d,i;
   
Line 580  UP2 p;
Line 626  UP2 p;
         }          }
 }  }
   
 void PRINTLF(vl,f)  void PRINTLF(VL vl,F f)
 VL vl;  
 F f;  
 {  {
         switch ( FOP(f) ) {          switch ( FOP(f) ) {
                 case AL_TRUE:                  case AL_TRUE:
Line 608  F f;
Line 652  F f;
         }          }
 }  }
   
 PRINTFOP(vl,f)  void PRINTFOP(VL vl,F f)
 VL vl;  
 F f;  
 {  {
         char *op;          char *op;
         NODE n;          NODE n;
Line 623  F f;
Line 665  F f;
         }          }
 }  }
   
 PRINTEOP(vl,f)  void PRINTEOP(VL vl,F f)
 VL vl;  
 F f;  
 {  {
         oFOP op;          oFOP op;
         char *sop;          char *sop;
Line 650  F f;
Line 690  F f;
         PUTS(")");          PUTS(")");
 }  }
   
 PRINTLOP(vl,f)  void PRINTLOP(VL vl,F f)
 VL vl;  
 F f;  
 {  {
         char *op;          char *op;
   
Line 676  F f;
Line 714  F f;
         PRINTEXPR(vl,(Obj)FPL(f)); PUTS(op); PUTS("0");          PRINTEXPR(vl,(Obj)FPL(f)); PUTS(op); PUTS("0");
 }  }
   
 PRINTQOP(vl,f)  void PRINTQOP(VL vl,F f)
 VL vl;  
 F f;  
 {  {
         char *op;          char *op;
   
Line 688  F f;
Line 724  F f;
         PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")");          PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")");
 }  }
   
 PRINTUP(n)  void PRINTUP(UP n)
 UP n;  
 {  {
         int i,d;          int i,d;
   
Line 722  UP n;
Line 757  UP n;
                 }                  }
                 PUTS(")");                  PUTS(")");
         }          }
   }
   
   void PRINTUM(UM n)
   {
           int i,d;
   
           if ( !n )
                   PUTS("0");
           else if ( !n->d )
                   PRINTSF(n->c[0]);
           else {
                   d = n->d;
                   PUTS("(");
                   if ( !d ) {
                           PRINTSF(n->c[d]);
                   } else if ( d == 1 ) {
                           PRINTSF(n->c[d]);
                           PUTS("*@s");
                   } else {
                           PRINTSF(n->c[d]);
                           PUTS("*@s"); PRINTHAT; total_length += 13;
                   }
                   for ( i = d-1; i >= 0; i-- ) {
                           if ( n->c[i] ) {
                                   PUTS("+("); PRINTSF(n->c[i]); PUTS(")");
                                   if ( i >= 2 ) {
                                           PUTS("*@s"); PRINTHAT; total_length += 13;
                                   } else if ( i == 1 )
                                           PUTS("*@s");
                           }
                   }
                   PUTS(")");
           }
   }
   
   void PRINTSF(unsigned int i)
   {
           if ( !i ) {
                   PUTS("0");
           } else
                   total_length += 15;
   }
   
   
   void PRINTFNODENODE(NODE n)
   {
           for ( ; n; n = NEXT(n) ) {
                   PRINTFNODE((FNODE)BDY(n),0);
                   if ( NEXT(n) ) PUTS(",");
           }
   }
   
   void PRINTFARGS(FNODE f)
   {
           NODE n;
   
           if ( f->id == I_LIST ) {
                   n = (NODE)FA0(f);
                   PRINTFNODENODE(n);
           } else
                   PRINTFNODE(f,0);
   }
   
   void PRINTFNODE(FNODE f,int paren)
   {
           NODE n,t,t0;
           char vname[BUFSIZ],prefix[BUFSIZ];
           char *opname,*vname_conv,*prefix_conv;
           Obj obj;
           int i,len,allzero,elen,elen2;
           C cplx;
           char *r;
           FNODE fi,f2;
   
           if ( !f ) {
                   PUTS("(0)");
                   return;
           }
           if ( paren ) PUTS("(");
           switch ( f->id ) {
                   /* unary operators */
                   case I_NOT: PUTS("!"); PRINTFNODE((FNODE)FA0(f),1); break;
                   case I_PAREN: PRINTFNODE((FNODE)FA0(f),0); break;
                   case I_MINUS: PUTS("-"); PRINTFNODE((FNODE)FA0(f),1); break;
                   /* binary operators */
                   /* arg list */
                   /* I_AND, I_OR => FA0(f), FA1(f) */
                   /* otherwise   => FA1(f), FA2(f) */
                   case I_BOP:
                           PRINTFNODE((FNODE)FA1(f),1);
                           PUTS(((ARF)FA0(f))->name);
                           PRINTFNODE((FNODE)FA2(f),1);
                           break;
                   case I_COP:
                           switch( (cid)FA0(f) ) {
                                   case C_EQ: opname = ("=="); break;
                                   case C_NE: opname = ("!="); break;
                                   case C_GT: opname = (">"); break;
                                   case C_LT: opname = ("<"); break;
                                   case C_GE: opname = (">="); break;
                                   case C_LE: opname = ("<="); break;
                           }
                           PRINTFNODE((FNODE)FA1(f),1);
                           PUTS(opname);
                           PRINTFNODE((FNODE)FA2(f),1);
                           break;
                   case I_LOP:
                           switch( (lid)FA0(f) ) {
                                   case L_EQ: opname = ("@=="); break;
                                   case L_NE: opname = ("@!="); break;
                                   case L_GT: opname = ("@>"); break;
                                   case L_LT: opname = ("@<"); break;
                                   case L_GE: opname = ("@>="); break;
                                   case L_LE: opname = ("@<="); break;
                                   case L_AND: opname = ("@&&"); break;
                                   case L_OR: opname = ("@||"); break;
                                   case L_NOT: opname = ("@!"); break;
                           }
                           if ( (lid)FA0(f)==L_NOT ) {
                                   PUTS(opname); PRINTFNODE((FNODE)FA1(f),1);
                           } else {
                                   PRINTFNODE((FNODE)FA1(f),1);
                                   PUTS(opname);
                                   PRINTFNODE((FNODE)FA2(f),1);
                           }
                           break;
                   case I_AND:
                           PRINTFNODE((FNODE)FA0(f),1);
                           PUTS("&&");
                           PRINTFNODE((FNODE)FA1(f),1);
                           break;
                   case I_OR:
                           PRINTFNODE((FNODE)FA0(f),1);
                           PUTS("!!");
                           PRINTFNODE((FNODE)FA1(f),1);
                           break;
                   /* ternary operators */
                   case I_CE:
                           PRINTFNODE((FNODE)FA0(f),1); PUTS("?"); PRINTFNODE((FNODE)FA1(f),1);
                           PUTS(":"); PRINTFNODE((FNODE)FA2(f),1);
                           break;
                   /* lists */
                   case I_LIST: PUTS("["); PRINTFNODENODE((NODE)FA0(f)); PUTS("]"); break;
                   /* function */
                   case I_FUNC:
                           if ( !strcmp(((FUNC)FA0(f))->name,"@pi") ) PUTS("@pi");
                           else if ( !strcmp(((FUNC)FA0(f))->name,"@e") ) PUTS("@e");
                           else {
                                   PUTS(((FUNC)FA0(f))->name);
                                   PUTS("("); PRINTFARGS(FA1(f)); PUTS(")");
                           }
                           break;
                   /* XXX */
                   case I_CAR: PUTS("car("); PRINTFNODE(FA0(f),0); PUTS(")"); break;
                   case I_CDR: PUTS("cdr("); PRINTFNODE(FA0(f),0); PUTS(")"); break;
                   /* exponent vector */
                   case I_EV: PUTS("<<"); PRINTFNODENODE((NODE)FA0(f)); PUTS(">>"); break;
                   /* string */
                   case I_STR: PUTS((char *)FA0(f)); break;
                   /* internal object */
                   case I_FORMULA: obj = (Obj)FA0(f); PRINTEXPR(CO,obj); break;
                   /* program variable */
                   case I_PVAR:
                           if ( FA1(f) )
                                   error("length_fnode : not implemented yet");
                           GETPVNAME(FA0(f),opname);
                           PUTS(opname);
                           break;
                   default: error("length_fnode : not implemented yet");
           }
           if ( paren ) PUTS(")");
 }  }

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.20

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