=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/strobj.c,v retrieving revision 1.76 retrieving revision 1.79 diff -u -p -r1.76 -r1.79 --- OpenXM_contrib2/asir2000/builtin/strobj.c 2005/10/15 02:34:13 1.76 +++ OpenXM_contrib2/asir2000/builtin/strobj.c 2005/10/19 10:31:18 1.79 @@ -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.75 2005/10/15 01:10:15 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.78 2005/10/17 00:38:11 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -64,6 +64,7 @@ struct TeXSymbol { }; #define OPNAME(f) (((ARF)FA0(f))->name[0]) +#define IS_ZERO(f) (((f)->id==I_FORMULA) && FA0(f)==0 ) #define IS_BINARYPWR(f) (((f)->id==I_BOP) &&(OPNAME(f)=='^')) #define IS_NARYADD(f) (((f)->id==I_NARYOP) &&(OPNAME(f)=='+')) #define IS_NARYMUL(f) (((f)->id==I_NARYOP) &&(OPNAME(f)=='*')) @@ -662,20 +663,20 @@ void Pquote_match_rewrite(NODE arg,Obj *rp) NEXTNODE(s0,s); pair = BDY((LIST)BDY(t)); ind = (int)FA0((FNODE)BDY((QUOTE)BDY(pair))); - value = mkfnode(1,I_FORMULA,BDY(NEXT(pair))); + value = BDY((QUOTE)(BDY(NEXT(pair)))); BDY(s) = mknode(2,ind,value); } if ( s0 ) NEXT(s) = 0; switch ( ac = argc(arg) ) { case 3: h = rewrite_fnode(BDY((QUOTE)ARG2(arg)),s0); - *rp = eval(h); + MKQUOTE(q,h); *rp = (Obj)q; break; case 4: c = rewrite_fnode(BDY((QUOTE)ARG2(arg)),s0); if ( eval(c) ) { h = rewrite_fnode(BDY((QUOTE)ARG3(arg)),s0); - *rp = eval(h); + MKQUOTE(q,h); *rp = (Obj)q; } else *rp = VOIDobj; break; @@ -2031,15 +2032,6 @@ int fnode_is_integer(FNODE f) } } -int fnode_is_zero(FNODE f) -{ - Q n; - - n = eval(f); - if ( !n ) return 1; - else return 0; -} - int fnode_is_nonnegative_integer(FNODE f) { Q n; @@ -2190,7 +2182,7 @@ FNODE fnode_apply(FNODE f,FNODE (*func)(),int expand) for ( i = 0; i < n; i++ ) { switch ( spec->type[i] ) { case A_fnode: - r->arg[i] = func(f->arg[i]); + r->arg[i] = func(f->arg[i],expand); break; case A_node: s = (NODE)f->arg[i]; @@ -2216,8 +2208,8 @@ FNODE fnode_normalize_add(FNODE f1,FNODE f2,int expand int s; Num c1,c2,c; - if ( fnode_is_zero(f1) ) return f2; - else if ( fnode_is_zero(f2) ) return f1; + if ( IS_ZERO(f1) ) return f2; + else if ( IS_ZERO(f2) ) return f1; f1 = to_naryadd(f1); f2 = to_naryadd(f2); n1 = (NODE)FA1(f1); n2 = (NODE)FA1(f2); r0 = 0; @@ -2270,7 +2262,7 @@ FNODE fnode_normalize_mul(FNODE f1,FNODE f2,int expand Num c1,c2,c,e; int l1,l,i,j; - if ( fnode_is_zero(f1) || fnode_is_zero(f2) ) return 0; + if ( IS_ZERO(f1) || IS_ZERO(f2) ) return mkfnode(1,I_FORMULA,0); else if ( fnode_is_number(f1) ) return fnode_normalize_mul_coef((Num)eval(f1),f2,expand); else if ( fnode_is_number(f2) ) @@ -2332,8 +2324,8 @@ FNODE fnode_normalize_pwr(FNODE f1,FNODE f2,int expand NODE arg,n; Q q; - if ( fnode_is_zero(f2) ) return mkfnode(1,I_FORMULA,ONE); - else if ( fnode_is_zero(f1) ) return mkfnode(1,I_FORMULA,0); + 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) ) if ( fnode_is_integer(f2) ) { @@ -2371,7 +2363,7 @@ FNODE fnode_expand_pwr(FNODE f,int n) FNODE f1,f2; if ( !n ) return mkfnode(1,I_FORMULA,ONE); - else if ( fnode_is_zero(f) ) return mkfnode(1,I_FORMULA,0); + else if ( IS_ZERO(f) ) return mkfnode(1,I_FORMULA,0); else if ( n == 1 ) return f; else { n1 = n/2;