version 1.76, 2005/10/15 02:34:13 |
version 1.78, 2005/10/17 00:38:11 |
|
|
* 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.75 2005/10/15 01:10:15 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.77 2005/10/15 07:40:59 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
Line 64 struct TeXSymbol { |
|
Line 64 struct TeXSymbol { |
|
}; |
}; |
|
|
#define OPNAME(f) (((ARF)FA0(f))->name[0]) |
#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_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)=='*')) |
Line 2031 int fnode_is_integer(FNODE f) |
|
Line 2032 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) |
int fnode_is_nonnegative_integer(FNODE f) |
{ |
{ |
Q n; |
Q n; |
Line 2190 FNODE fnode_apply(FNODE f,FNODE (*func)(),int expand) |
|
Line 2182 FNODE fnode_apply(FNODE f,FNODE (*func)(),int expand) |
|
for ( i = 0; i < n; i++ ) { |
for ( i = 0; i < n; i++ ) { |
switch ( spec->type[i] ) { |
switch ( spec->type[i] ) { |
case A_fnode: |
case A_fnode: |
r->arg[i] = func(f->arg[i]); |
r->arg[i] = func(f->arg[i],expand); |
break; |
break; |
case A_node: |
case A_node: |
s = (NODE)f->arg[i]; |
s = (NODE)f->arg[i]; |
Line 2216 FNODE fnode_normalize_add(FNODE f1,FNODE f2,int expand |
|
Line 2208 FNODE fnode_normalize_add(FNODE f1,FNODE f2,int expand |
|
int s; |
int s; |
Num c1,c2,c; |
Num c1,c2,c; |
|
|
if ( fnode_is_zero(f1) ) return f2; |
if ( IS_ZERO(f1) ) return f2; |
else if ( fnode_is_zero(f2) ) return f1; |
else if ( IS_ZERO(f2) ) return f1; |
f1 = to_naryadd(f1); f2 = to_naryadd(f2); |
f1 = to_naryadd(f1); f2 = to_naryadd(f2); |
n1 = (NODE)FA1(f1); n2 = (NODE)FA1(f2); |
n1 = (NODE)FA1(f1); n2 = (NODE)FA1(f2); |
r0 = 0; |
r0 = 0; |
Line 2270 FNODE fnode_normalize_mul(FNODE f1,FNODE f2,int expand |
|
Line 2262 FNODE fnode_normalize_mul(FNODE f1,FNODE f2,int expand |
|
Num c1,c2,c,e; |
Num c1,c2,c,e; |
int l1,l,i,j; |
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) ) |
else if ( fnode_is_number(f1) ) |
return fnode_normalize_mul_coef((Num)eval(f1),f2,expand); |
return fnode_normalize_mul_coef((Num)eval(f1),f2,expand); |
else if ( fnode_is_number(f2) ) |
else if ( fnode_is_number(f2) ) |
Line 2332 FNODE fnode_normalize_pwr(FNODE f1,FNODE f2,int expand |
|
Line 2324 FNODE fnode_normalize_pwr(FNODE f1,FNODE f2,int expand |
|
NODE arg,n; |
NODE arg,n; |
Q q; |
Q q; |
|
|
if ( fnode_is_zero(f2) ) return mkfnode(1,I_FORMULA,ONE); |
if ( IS_ZERO(f2) ) return mkfnode(1,I_FORMULA,ONE); |
else if ( fnode_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_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) ) { |
Line 2371 FNODE fnode_expand_pwr(FNODE f,int n) |
|
Line 2363 FNODE fnode_expand_pwr(FNODE f,int n) |
|
FNODE f1,f2; |
FNODE f1,f2; |
|
|
if ( !n ) return mkfnode(1,I_FORMULA,ONE); |
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 if ( n == 1 ) return f; |
else { |
else { |
n1 = n/2; |
n1 = n/2; |