=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/eval.c,v retrieving revision 1.26 retrieving revision 1.33 diff -u -p -r1.26 -r1.33 --- OpenXM_contrib2/asir2000/parse/eval.c 2003/05/17 11:47:51 1.26 +++ OpenXM_contrib2/asir2000/parse/eval.c 2004/05/14 09:20:57 1.33 @@ -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.25 2003/05/16 09:34:49 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.32 2004/04/30 08:25:38 noro Exp $ */ #include #include "ca.h" @@ -84,6 +84,7 @@ pointer eval(FNODE f) GF2N gf2n; GFPN gfpn; GFSN gfsn; + RANGE range; #if defined(VISUAL) if ( recv_intr ) { @@ -455,8 +456,8 @@ pointer evalf(FUNC f,FNODE a,FNODE opt) LIST args; pointer val; int i,n,level; - NODE tn,sn,opts,opt1; - VS pvs,prev_mpvs; + NODE tn,sn,opts,opt1,dmy; + VS pvs,prev_mpvs; char errbuf[BUFSIZ]; static unsigned int stack_size; static void *stack_base; @@ -474,11 +475,26 @@ pointer evalf(FUNC f,FNODE a,FNODE opt) } switch ( f->id ) { case A_BIN: + if ( opt ) { + opts = BDY((LIST)eval(opt)); + /* 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; if ( !n ) { cur_binf = f; (*f->f.binf)(&val); } else { args = (LIST)eval(a); + current_option = opts; cur_binf = f; (*f->f.binf)(args?BDY(args):0,&val); } @@ -830,8 +846,12 @@ void searchuf(char *name,FUNC *r) void gen_searchf(char *name,FUNC *r) { FUNC val = 0; - - if ( CUR_MODULE ) + int global = 0; + if ( *name == ':' ) { + global = 1; + name += 2; + } + if ( CUR_MODULE && !global ) searchf(CUR_MODULE->usrf_list,name,&val); if ( !val ) searchf(sysf,name,&val); @@ -872,32 +892,22 @@ void appenduf(char *name,FUNC *r) f=(FUNC)MALLOC(sizeof(struct oFUNC)); f->id = A_UNDEF; f->argc = 0; f->f.binf = 0; if ( dot = strchr(name,'.') ) { - /* undefined function in undefined module */ + /* undefined function in a module */ len = dot-name; modname = (char *)MALLOC_ATOMIC(len+1); strncpy(modname,name,len); modname[len] = 0; - mod = mkmodule(modname); fname = (char *)MALLOC_ATOMIC(strlen(name)-len+1); strcpy(fname,dot+1); f->name = fname; f->fullname = name; - MKNODE(mod->usrf_list,f,0); + mod = searchmodule(modname); + if ( !mod ) + mod = mkmodule(modname); + MKNODE(tn,f,mod->usrf_list); mod->usrf_list = tn; } else { f->name = name; -#if 0 - if ( CUR_MODULE ) { - f->fullname = - (char *)MALLOC_ATOMIC(strlen(CUR_MODULE->name)+strlen(name)+1); - sprintf(f->fullname,"%s.%s",CUR_MODULE->name,name); - MKNODE(tn,f,CUR_MODULE->usrf_list); CUR_MODULE->usrf_list = tn; - } else { - f->fullname = name; - MKNODE(tn,f,usrf); usrf = tn; - } -#else f->fullname = name; MKNODE(tn,f,usrf); usrf = tn; -#endif } *r = f; } @@ -908,6 +918,12 @@ void appenduf_local(char *name,FUNC *r) FUNC f; MODULE mod; + for ( tn = CUR_MODULE->usrf_list; tn; tn = NEXT(tn) ) + if ( !strcmp(((FUNC)BDY(tn))->name,name) ) + break; + if ( tn ) + return; + f=(FUNC)MALLOC(sizeof(struct oFUNC)); f->id = A_UNDEF; f->argc = 0; f->f.binf = 0; f->name = name; @@ -933,6 +949,7 @@ void mkparif(char *name,FUNC *r) *r = f =(FUNC)MALLOC(sizeof(struct oFUNC)); f->name = name; f->id = A_PARI; f->argc = 0; f->f.binf = 0; + f->fullname = name; } void mkuf(char *name,char *fname,NODE args,SNODE body,int startl,int endl,char *desc,MODULE module) @@ -944,6 +961,8 @@ void mkuf(char *name,char *fname,NODE args,SNODE body, char *longname; int argc; + if ( *name == ':' ) + name += 2; if ( !module ) { searchf(sysf,name,&f); if ( f ) {