=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/eval.c,v retrieving revision 1.9 retrieving revision 1.11 diff -u -p -r1.9 -r1.11 --- OpenXM_contrib2/asir2000/parse/eval.c 2001/08/20 09:50:34 1.9 +++ OpenXM_contrib2/asir2000/parse/eval.c 2001/08/31 02:47:19 1.11 @@ -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.8 2000/12/05 01:24:56 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.10 2001/08/21 01:39:39 noro Exp $ */ #include #include "ca.h" @@ -100,10 +100,13 @@ FNODE f; if ( !f ) return ( 0 ); switch ( f->id ) { + case I_PAREN: + val = eval((FNODE)(FA0(f))); + break; case I_BOP: a1 = eval((FNODE)FA1(f)); a2 = eval((FNODE)FA2(f)); (*((ARF)FA0(f))->fp)(CO,a1,a2,&val); - break; + break; case I_COP: a1 = eval((FNODE)FA1(f)); a2 = eval((FNODE)FA2(f)); c = arf_comp(CO,a1,a2); @@ -442,7 +445,7 @@ FNODE opt; LIST args; pointer val; int i,n,level; - NODE tn,sn,opts; + NODE tn,sn,opts,opt1; VS pvs; char errbuf[BUFSIZ]; @@ -477,9 +480,19 @@ FNODE opt; break; case A_USR: args = (LIST)eval(a); - if ( opt ) + if ( opt ) { opts = BDY((LIST)eval(opt)); - else + /* opts = ["opt1",arg1],... */ + opt1 = BDY((LIST)BDY(opts)); + if ( !strcmp(BDY((STRING)BDY(opt1)),"option_list") ) { + /* + * the special option specification: + * option_list=[["o1","a1"],...] + */ + asir_assert(BDY(NEXT(opt1)),O_LIST,"evalf"); + opts = BDY((LIST)BDY(NEXT(opt1))); + } + } else opts = 0; pvs = f->f.usrf->pvs; if ( PVSS ) { @@ -864,6 +877,7 @@ char *key; opts = CPVS->opt; for ( ; opts; opts = NEXT(opts) ) { + asir_assert(BDY(opts),O_LIST,"getopt_from_cvps"); opt = BDY((LIST)BDY(opts)); if ( !strcmp(key,BDY((STRING)BDY(opt))) ) return (Obj)BDY(NEXT(opt));