version 1.95, 2005/11/03 07:41:22 |
version 1.97, 2005/11/06 01:27:28 |
|
|
* 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.94 2005/11/02 10:02:32 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.96 2005/11/04 07:03:38 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
Line 747 void fnode_do_assign(NODE arg) |
|
Line 747 void fnode_do_assign(NODE arg) |
|
pair = (NODE)BDY(t); |
pair = (NODE)BDY(t); |
pv = (int)BDY(pair); |
pv = (int)BDY(pair); |
f = (FNODE)(BDY(NEXT(pair))); |
f = (FNODE)(BDY(NEXT(pair))); |
if ( f->id == I_FUNC ) { |
if ( f->id == I_FUNC_HEAD ) { |
/* XXX : used for wrapping A_func */ |
/* XXX : I_FUNC_HEAD is a dummy id to pass FUNC */ |
MKQUOTEARG(qa,A_func,FA0(f)); |
MKQUOTEARG(qa,A_func,FA0(f)); |
value = (QUOTE)qa; |
value = (QUOTE)qa; |
} else |
} else |
Line 2035 void Pquote_normalize(NODE arg,QUOTE *rp) |
|
Line 2035 void Pquote_normalize(NODE arg,QUOTE *rp) |
|
if ( !ac ) error("quote_normalize : invalid argument"); |
if ( !ac ) error("quote_normalize : invalid argument"); |
q = (QUOTE)ARG0(arg); |
q = (QUOTE)ARG0(arg); |
expand = ac==2 && ARG1(arg); |
expand = ac==2 && ARG1(arg); |
if ( !q || OID(q) != O_QUOTE ) { |
if ( !q || OID(q) != O_QUOTE ) |
*rp = q; |
*rp = q; |
return; |
|
} else if ( q->normalized && (q->expanded || !expand) ) |
|
*rp = q; |
|
else { |
else { |
f = fnode_normalize(BDY(q),expand); |
f = fnode_normalize(BDY(q),expand); |
MKQUOTE(r,f); |
MKQUOTE(r,f); |
r->normalized = 1; |
|
if ( expand ) r->expanded = 1; |
|
*rp = r; |
*rp = r; |
} |
} |
} |
} |
Line 2057 void Pnquote_comp(NODE arg,Q *rp) |
|
Line 2052 void Pnquote_comp(NODE arg,Q *rp) |
|
|
|
q1 = (QUOTE)ARG0(arg); f1 = (FNODE)BDY(q1); |
q1 = (QUOTE)ARG0(arg); f1 = (FNODE)BDY(q1); |
q2 = (QUOTE)ARG1(arg); f2 = (FNODE)BDY(q2); |
q2 = (QUOTE)ARG1(arg); f2 = (FNODE)BDY(q2); |
if ( !q1->normalized ) f1 = fnode_normalize(f1,0); |
f1 = fnode_normalize(f1,0); |
if ( !q2->normalized ) f2 = fnode_normalize(f2,0); |
f2 = fnode_normalize(f2,0); |
r = nfnode_comp(f1,f2); |
r = nfnode_comp(f1,f2); |
STOQ(r,*rp); |
STOQ(r,*rp); |
} |
} |
Line 2794 int nfnode_match(FNODE f,FNODE pat,NODE *rp) |
|
Line 2789 int nfnode_match(FNODE f,FNODE pat,NODE *rp) |
|
NODE m,m1,m2,base,exp,fa,pa,n; |
NODE m,m1,m2,base,exp,fa,pa,n; |
LIST l; |
LIST l; |
QUOTE qp,qf; |
QUOTE qp,qf; |
FNODE fbase,fexp,a; |
FNODE fbase,fexp,a,fh; |
FUNC ff,pf; |
FUNC ff,pf; |
int r; |
int r; |
|
|
|
if ( !pat ) |
|
if ( !f ) { |
|
*rp = 0; |
|
return 1; |
|
} else |
|
return 0; |
|
else if ( !f ) |
|
return 0; |
switch ( pat->id ) { |
switch ( pat->id ) { |
case I_PVAR: |
case I_PVAR: |
/* [[pat,f]] */ |
/* [[pat,f]] */ |
Line 2836 int nfnode_match(FNODE f,FNODE pat,NODE *rp) |
|
Line 2839 int nfnode_match(FNODE f,FNODE pat,NODE *rp) |
|
if ( strcmp(ff->fullname,pf->fullname) ) return 0; |
if ( strcmp(ff->fullname,pf->fullname) ) return 0; |
m = 0; |
m = 0; |
} else { |
} else { |
/* XXX only FA0(f) is used */ |
/* XXX : I_FUNC_HEAD is a dummy id to pass FUNC */ |
m = mknode(1,mknode(2,FA0((FNODE)FA0(pat)),f),0); |
fh = mkfnode(1,I_FUNC_HEAD,FA0(f)); |
|
m = mknode(1,mknode(2,FA0((FNODE)FA0(pat)),fh),0); |
} |
} |
/* FA1(f) and FA1(pat) are I_LIST */ |
/* FA1(f) and FA1(pat) are I_LIST */ |
fa = (NODE)FA0((FNODE)FA1(f)); |
fa = (NODE)FA0((FNODE)FA1(f)); |
Line 2900 FNODE fnode_left_narymul(FNODE p,int i) |
|
Line 2904 FNODE fnode_left_narymul(FNODE p,int i) |
|
a = (NODE)FA1(p); |
a = (NODE)FA1(p); |
l = length(a); |
l = length(a); |
if ( i < 0 || i >= l ) error("fnode_left_narymul : invalid index"); |
if ( i < 0 || i >= l ) error("fnode_left_narymul : invalid index"); |
if ( i == 0 ) return mkfnode(1,I_FORMULA,ONE); |
if ( i == 0 ) return 0; |
else if ( i == 1 ) return (FNODE)BDY(a); |
else if ( i == 1 ) return (FNODE)BDY(a); |
else { |
else { |
for ( r0 = 0, k = 0, t = a; k < i; k++, t = NEXT(t) ) { |
for ( r0 = 0, k = 0, t = a; k < i; k++, t = NEXT(t) ) { |
Line 2921 FNODE fnode_right_narymul(FNODE p,int i) |
|
Line 2925 FNODE fnode_right_narymul(FNODE p,int i) |
|
a = (NODE)FA1(p); |
a = (NODE)FA1(p); |
l = length(a); |
l = length(a); |
if ( i < 0 || i >= l ) error("fnode_right_narymul : invalid index"); |
if ( i < 0 || i >= l ) error("fnode_right_narymul : invalid index"); |
if ( i == l-1 ) return mkfnode(1,I_FORMULA,ONE); |
if ( i == l-1 ) return 0; |
else { |
else { |
for ( k = 0, t = a; k <= i; k++, t = NEXT(t) ); |
for ( k = 0, t = a; k <= i; k++, t = NEXT(t) ); |
return fnode_node_to_narymul(t); |
return fnode_node_to_narymul(t); |
Line 3018 int nfnode_match_narymul(FNODE f,FNODE p,NODE *rp) |
|
Line 3022 int nfnode_match_narymul(FNODE f,FNODE p,NODE *rp) |
|
pright = fnode_right_narymul(p,pi); |
pright = fnode_right_narymul(p,pi); |
/* XXX : incomplete */ |
/* XXX : incomplete */ |
for ( s = fa, fi = 0; s; s = NEXT(s), fi++ ) { |
for ( s = fa, fi = 0; s; s = NEXT(s), fi++ ) { |
|
if ( fi < pi ) continue; |
if ( nfnode_match(BDY(s),pivot,&m) ) { |
if ( nfnode_match(BDY(s),pivot,&m) ) { |
fleft = fnode_left_narymul(f,fi); |
fleft = fnode_left_narymul(f,fi); |
pleft1 = rewrite_fnode(pleft,m); |
pleft1 = rewrite_fnode(pleft,m); |