version 1.90, 2005/11/02 05:39:23 |
version 1.92, 2005/11/02 08:22:39 |
|
|
* 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) ) |