=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/eval.c,v retrieving revision 1.41 retrieving revision 1.43 diff -u -p -r1.41 -r1.43 --- OpenXM_contrib2/asir2000/parse/eval.c 2005/09/13 06:40:46 1.41 +++ OpenXM_contrib2/asir2000/parse/eval.c 2005/09/14 02:48:38 1.43 @@ -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/parse/eval.c,v 1.40 2005/07/27 04:35:11 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.42 2005/09/13 06:54:22 noro Exp $ */ #include #include "ca.h" @@ -64,6 +64,7 @@ int f_break,f_return,f_continue; int evalstatline; int recv_intr; int show_crossref; +void gen_searchf_searchonly(char *name,FUNC *r); pointer eval(FNODE f) { @@ -174,16 +175,6 @@ pointer eval(FNODE f) val = evalmapf((FUNC)FA0(f),(FNODE)FA1(f)); break; case I_RECMAP: val = eval_rec_mapf((FUNC)FA0(f),(FNODE)FA1(f)); break; - case I_UNIFY: - MKQUOTE(expr,(FNODE)FA0(f)); - MKQUOTE(pattern,(FNODE)FA1(f)); - ret = quote_unify(expr,pattern,&match); - if ( !ret ) val = 0; - else { - do_assign(match); - val = (pointer)ONE; - } - break; case I_IFUNC: val = evalif((FNODE)FA0(f),(FNODE)FA1(f)); break; #if !defined(VISUAL) @@ -343,14 +334,18 @@ pointer eval(FNODE f) return ( val ); } +V searchvar(char *name); + pointer evalstat(SNODE f) { pointer val = 0,t,s,s1; P u; NODE tn; int i,ac; + V v; V *a; char *buf; + FUNC func; if ( !f ) return ( 0 ); @@ -389,7 +384,13 @@ pointer evalstat(SNODE f) makevar(buf,&u); a[i] = VR(u); substr(CO,0,(Obj)s,VR((P)t),(Obj)u,(Obj *)&s1); s = s1; } - mkpf((char *)FA0(f),(Obj)s,ac,a,0,0,0,(PF *)&val); val = 0; break; + mkpf((char *)FA0(f),(Obj)s,ac,a,0,0,0,(PF *)&val); val = 0; + v = searchvar((char *)FA0(f)); + if ( v ) { + searchpf((char *)FA0(f),&func); + makesrvar(func,&u); + } + break; case S_SINGLE: val = eval((FNODE)FA0(f)); break; case S_CPLX: @@ -479,10 +480,15 @@ pointer evalf(FUNC f,FNODE a,FNODE opt) char errbuf[BUFSIZ]; static unsigned int stack_size; static void *stack_base; + FUNC f1; if ( f->id == A_UNDEF ) { - sprintf(errbuf,"evalf : %s undefined",NAME(f)); - error(errbuf); + gen_searchf_searchonly(f->fullname,&f1); + if ( f1->id == A_UNDEF ) { + sprintf(errbuf,"evalf : %s undefined",NAME(f)); + error(errbuf); + } else + *f = *f1; } if ( getsecuremode() && !PVSS && !f->secure ) { sprintf(errbuf,"evalf : %s not permitted",NAME(f));