=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/strobj.c,v retrieving revision 1.90 retrieving revision 1.94 diff -u -p -r1.90 -r1.94 --- OpenXM_contrib2/asir2000/builtin/strobj.c 2005/11/02 05:39:23 1.90 +++ OpenXM_contrib2/asir2000/builtin/strobj.c 2005/11/02 10:02:32 1.94 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * 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.93 2005/11/02 09:39:10 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -1314,14 +1314,14 @@ FNODE strip_paren(FNODE); void fnodetotex_tb(FNODE f,TB tb) { - NODE n,t,t0; + NODE n,t,t0,args; char vname[BUFSIZ],prefix[BUFSIZ]; char *opname,*vname_conv,*prefix_conv; Obj obj; int i,len,allzero,elen,elen2,si; C cplx; char *r; - FNODE fi,f2; + FNODE fi,f2,f1; write_tb(" ",tb); if ( !f ) { @@ -1402,6 +1402,46 @@ void fnodetotex_tb(FNODE f,TB tb) 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: switch( (cid)FA0(f) ) { @@ -1794,6 +1834,9 @@ int top_is_minus(FNODE f) return opname[0]=='-'; } } + case I_NARYOP: + return top_is_minus((FNODE)BDY((NODE)FA1(f))); + default: return 0; } @@ -2406,21 +2449,24 @@ FNODE fnode_normalize_pwr(FNODE f1,FNODE f2,int expand if ( IS_ZERO(f2) ) return mkfnode(1,I_FORMULA,ONE); 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) ) { - pwrnum(0,(Num)eval(f1),(Num)eval(f2),&c); - return mkfnode(1,I_FORMULA,c); + if ( fnode_is_one(f2) ) return f1; + else { + pwrnum(0,(Num)eval(f1),(Num)eval(f2),&c); + return mkfnode(1,I_FORMULA,c); + } } else return mkfnode(3,I_BOP,pwrfs,f1,f2); - else if ( IS_BINARYPWR(f1) ) { + } else if ( IS_BINARYPWR(f1) ) { b1 = FA1(f1); e1 = FA2(f1); e = fnode_normalize_mul(e1,f2,expand); if ( fnode_is_one(e) ) return b1; else 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); nf2 = (Num)eval(f2); pwrnum(0,(Num)c1,nf2,&c); @@ -2431,11 +2477,12 @@ FNODE fnode_normalize_pwr(FNODE f1,FNODE f2,int expand else { STOQ(-1,q); mone = mkfnode(1,I_FORMULA,q); + b1 = to_narymul(b1); for ( t0 = 0, n = (NODE)FA1(b1); n; n = NEXT(n) ) { inv = mkfnode(3,I_BOP,pwrfs,BDY(n),mone); 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); } if ( fnode_is_one(cc) ) @@ -2723,7 +2770,7 @@ int fnode_normalize_match(FNODE f,FNODE pat,NODE *rp) return 1; case I_FORMULA: - if ( !arf_comp(CO,(Obj)FA0(f),(Obj)FA0(pat)) ) { + if ( f->id == I_FORMULA && !arf_comp(CO,(Obj)FA0(f),(Obj)FA0(pat)) ) { *rp = 0; return 1; } else return 0; @@ -2797,8 +2844,7 @@ FNODE fnode_removeith_naryadd(FNODE p,int i) NEXTNODE(r0,r); BDY(r) = BDY(t); } - t = NEXT(t); - NEXT(r) = 0; + NEXT(r) = NEXT(t); return fnode_node_to_naryadd(r0); }