=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/eval.c,v retrieving revision 1.24 retrieving revision 1.42 diff -u -p -r1.24 -r1.42 --- OpenXM_contrib2/asir2000/parse/eval.c 2003/05/16 07:56:16 1.24 +++ OpenXM_contrib2/asir2000/parse/eval.c 2005/09/13 06:54:22 1.42 @@ -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.23 2003/05/14 09:18:38 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.41 2005/09/13 06:40:46 noro Exp $ */ #include #include "ca.h" @@ -71,11 +71,11 @@ pointer eval(FNODE f) STRING str; pointer val = 0; pointer a,a1,a2; - NODE tn,ind; + NODE tn,ind,match; R u; DP dp; unsigned int pv; - int c; + int c,ret; FNODE f1; UP2 up2; UP up; @@ -84,6 +84,8 @@ pointer eval(FNODE f) GF2N gf2n; GFPN gfpn; GFSN gfsn; + RANGE range; + QUOTE expr,pattern; #if defined(VISUAL) if ( recv_intr ) { @@ -222,7 +224,9 @@ pointer eval(FNODE f) error("-- : not implemented yet"); break; case I_PVAR: - pv = (unsigned int)FA0(f); ind = (NODE)FA1(f); GETPV(pv,a); + pv = (unsigned int)FA0(f); + ind = (NODE)FA1(f); + GETPV(pv,a); if ( !ind ) val = a; else { @@ -305,8 +309,6 @@ pointer eval(FNODE f) MKLIST(t,NEXT(BDY((LIST)a))); val = (pointer)t; } break; - case I_PROC: - val = (pointer)FA0(f); break; case I_INDEX: a = eval((FNODE)FA0(f)); ind = (NODE)FA1(f); evalnodebody(ind,&tn); getarray(a,tn,&val); @@ -429,6 +431,13 @@ pointer evalstat(SNODE f) break; } f_break = 0; break; + case S_MODULE: + CUR_MODULE = (MODULE)FA0(f); + if ( CUR_MODULE ) + MPVS = CUR_MODULE->pvs; + else + MPVS = 0; + break; default: error("evalstat : unknown id"); break; @@ -455,8 +464,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; @@ -465,6 +474,10 @@ pointer evalf(FUNC f,FNODE a,FNODE opt) sprintf(errbuf,"evalf : %s undefined",NAME(f)); error(errbuf); } + if ( getsecuremode() && !PVSS && !f->secure ) { + sprintf(errbuf,"evalf : %s not permitted",NAME(f)); + error(errbuf); + } if ( f->id != A_PARI ) { for ( i = 0, tn = a?(NODE)FA0(a):0; tn; i++, tn = NEXT(tn) ); if ( ((n = f->argc)>= 0 && i != n) || (n < 0 && i > -n) ) { @@ -474,11 +487,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); } @@ -673,13 +701,17 @@ pointer bevalf(FUNC f,NODE a) pointer val; int i,n; NODE tn,sn; - VS pvs; + VS pvs,prev_mpvs; char errbuf[BUFSIZ]; if ( f->id == A_UNDEF ) { sprintf(errbuf,"bevalf : %s undefined",NAME(f)); error(errbuf); } + if ( getsecuremode() && !PVSS && !f->secure ) { + sprintf(errbuf,"bevalf : %s not permitted",NAME(f)); + error(errbuf); + } if ( f->id != A_PARI ) { for ( i = 0, tn = a; tn; i++, tn = NEXT(tn) ); if ( ((n = f->argc)>= 0 && i != n) || (n < 0 && i > -n) ) { @@ -721,7 +753,13 @@ pointer bevalf(FUNC f,NODE a) for ( tn = f->f.usrf->args, sn = a; sn; tn = NEXT(tn), sn = NEXT(sn) ) ASSPV((int)FA0((FNODE)BDY(tn)),BDY(sn)); - val = evalstat((SNODE)BDY(f->f.usrf)); + if ( f->f.usrf->module ) { + prev_mpvs = MPVS; + MPVS = f->f.usrf->module->pvs; + val = evalstat((SNODE)BDY(f->f.usrf)); + MPVS = prev_mpvs; + } else + val = evalstat((SNODE)BDY(f->f.usrf)); f_return = f_break = f_continue = 0; poppvs(); break; case A_PURE: @@ -738,11 +776,15 @@ pointer bevalf(FUNC f,NODE a) pointer evalif(FNODE f,FNODE a) { Obj g; + FNODE t; g = (Obj)eval(f); if ( g && (OID(g) == O_P) && (VR((P)g)->attr == (pointer)V_SR) ) return evalf((FUNC)VR((P)g)->priv,a,0); - else { + else if ( g && OID(g) == O_QUOTEARG && ((QUOTEARG)g)->type == A_func ) { + t = mkfnode(2,I_FUNC,((QUOTEARG)g)->body,a); + return eval(t); + } else { error("invalid function pointer"); /* NOTREACHED */ return (pointer)-1; @@ -827,58 +869,47 @@ void searchuf(char *name,FUNC *r) searchf(usrf,name,r); } -/* - * xxx.yyy() is searched in the flist - * of the module xxx. - * yyy() is searched in the current flist - * and proto list. - */ - -void searchuf_proto(char *name,FUNC *r) +void gen_searchf(char *name,FUNC *r) { - MODULE mod; - char *name0,*dot; - - if ( dot = strchr(name,'.') ) { - name0 = (char *)ALLOCA(strlen(name)+1); - strcpy(name0,name); - dot = strchr(name0,'.'); - *dot = 0; - mod = searchmodule(name0); - if ( mod ) - searchf(mod->usrf_list,dot+1,r); - } else if ( CUR_MODULE ) - searchf(CUR_MODULE->proto_list,name,r); + FUNC val = 0; + 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); + if ( !val ) + searchf(ubinf,name,&val); + if ( !val ) + searchpf(name,&val); + if ( !val ) + searchuf(name,&val); + if ( !val ) + appenduf(name,&val); + *r = val; } -void gen_searchf(char *name,FUNC *r) +void gen_searchf_searchonly(char *name,FUNC *r) { FUNC val = 0; - - if ( CUR_MODULE ) { - searchf(CUR_MODULE->usrf_list,name,&val); - if ( !val ) - searchf(sysf,name,&val); - if ( !val ) - searchf(ubinf,name,&val); - if ( !val ) - searchpf(name,&val); - if ( !val ) - searchuf_proto(name,&val); - if ( !val ) - appenduf(name,&val); - } else { - if ( !val ) - searchf(sysf,name,&val); - if ( !val ) - searchf(ubinf,name,&val); - if ( !val ) - searchpf(name,&val); - if ( !val ) - searchuf(name,&val); - if ( !val ) - appenduf(name,&val); + 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); + if ( !val ) + searchf(ubinf,name,&val); + if ( !val ) + searchpf(name,&val); + if ( !val ) + searchuf(name,&val); *r = val; } @@ -908,44 +939,64 @@ 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; - MKNODE(mod->usrf_list,f,0); + f->fullname = name; + mod = searchmodule(modname); + if ( !mod ) + mod = mkmodule(modname); + MKNODE(tn,f,mod->usrf_list); mod->usrf_list = tn; } else { f->name = name; - if ( CUR_MODULE ) { - MKNODE(tn,f,CUR_MODULE->usrf_list); CUR_MODULE->usrf_list = tn; - } else { - MKNODE(tn,f,usrf); usrf = tn; - } + f->fullname = name; + MKNODE(tn,f,usrf); usrf = tn; } *r = f; } -void appenduf_global(char *name,FUNC *r) +void appenduf_local(char *name,FUNC *r) { NODE tn; 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; - MKNODE(tn,f,usrf); usrf = tn; + f->name = name; + 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; *r = f; } +void appenduflist(NODE n) +{ + NODE tn; + FUNC f; + + for ( tn = n; tn; tn = NEXT(tn) ) + appenduf_local((char *)BDY(tn),&f); +} + void mkparif(char *name,FUNC *r) { FUNC f; *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) @@ -957,6 +1008,11 @@ void mkuf(char *name,char *fname,NODE args,SNODE body, char *longname; int argc; + if ( getsecuremode() ) { + error("defining function is not permitted in the secure mode"); + } + if ( *name == ':' ) + name += 2; if ( !module ) { searchf(sysf,name,&f); if ( f ) { @@ -979,10 +1035,15 @@ void mkuf(char *name,char *fname,NODE args,SNODE body, f=(FUNC)MALLOC(sizeof(struct oFUNC)); f->name = name; MKNODE(tn,f,usrf_list); usrf_list = tn; - if ( module ) + if ( module ) { + f->fullname = + (char *)MALLOC_ATOMIC(strlen(f->name)+strlen(module->name)+1); + sprintf(f->fullname,"%s.%s",module->name,f->name); module->usrf_list = usrf_list; - else + } else { + f->fullname = f->name; usrf = usrf_list; + } } if ( Verbose && f->id != A_UNDEF ) { if ( module ) @@ -1057,45 +1118,14 @@ MODULE mkmodule(char *name) } } -/* register function names to the proto list of a module */ - -void register_proto(NODE n) -{ - NODE tn,flist; - char *name; - FUNC val; - - if ( !CUR_MODULE ) - error("globalf : must be declared in a module."); - for ( tn = n; tn; tn = NEXT(tn) ) { - name = (char *)BDY(tn); - searchf(sysf,name,&val); - if ( val ) { - fprintf(stderr,"globalf : `%s' is a builtin function.",name); - error(""); - } - searchf(ubinf,name,&val); - if ( val ) { - fprintf(stderr, - "globalf : `%s' is a user-defined builtin function.",name); - error(""); - } - searchpf(name,&val); - if ( val ) { - fprintf(stderr,"globalf : `%s' is a pure function.",name); - error(""); - } - searchf(usrf,name,&val); - if ( !val ) - appenduf_global(name,&val); - MKNODE(flist,val,CUR_MODULE->proto_list); - CUR_MODULE->proto_list = flist; - } -} - void print_crossref(FUNC f) { - if ( show_crossref && CUR_FUNC ) - fprintf(asir_out,"%s() at line %d in %s()\n", - f->name, asir_infile->ln, CUR_FUNC); + FUNC r; + if ( show_crossref && CUR_FUNC ) { + searchuf(f->fullname,&r); + if (r != NULL) { + fprintf(asir_out,"%s() at line %d in %s()\n", + f->fullname, asir_infile->ln, CUR_FUNC); + } + } }