#include "efuns.h" #include "main.h" #include "simulate.h" #include "simul_efun.h" #include "stralloc.h" /* void add_simul_efun(string,function|void); */ /* name, function */ struct simul_efun_entry *simul_efuns=0; int num_simul_efuns=0; static int simul_efun_space=0; void f_add_simul_efun(int num_arg,struct svalue *argp) { int e; struct svalue *ret; push_object(current_object); push_svalue(argp); if(num_arg==2) push_svalue(argp+1); APPLY_MASTER_OB(ret=,"valid_add_simul_efun",num_arg+1); if(IS_ZERO(ret)) { error("Invalid add_simul_efun.\n"); }else{ for(e=0;e<num_simul_efuns;e++) { if(simul_efuns[e].name==strptr(argp+0)) { if(num_arg==2) { free_svalue(&(simul_efuns[e].fun)); simul_efuns[e].fun=argp[1]; simul_efuns[e].flags|=SIMUL_EFUN_ON; sp--; }else{ simul_efuns[e].flags&=~SIMUL_EFUN_ON; } pop_stack(); return; } } if(num_arg==2) { if(simul_efun_space<=num_simul_efuns) { if(!simul_efuns) { simul_efun_space=42; simul_efuns=(struct simul_efun_entry *) xalloc(sizeof(struct simul_efun_entry)*simul_efun_space); }else{ simul_efun_space*=2; simul_efuns=(struct simul_efun_entry *) realloc((char *)simul_efuns, sizeof(struct simul_efun_entry)*simul_efun_space); if(!simul_efuns) fatal("OUT OF MEMORY.\n"); } } simul_efuns[num_simul_efuns].fun=argp[1]; simul_efuns[num_simul_efuns].name=strptr(argp+0); simul_efuns[num_simul_efuns].flags=SIMUL_EFUN_ON; num_simul_efuns++; sp-=2; }else{ pop_stack(); } } } /* requires shared string argument */ int find_simul_efun(char *s) { int e; for(e=0;e<num_simul_efuns;e++) { if(simul_efuns[e].name==s) { if(simul_efuns[e].flags & SIMUL_EFUN_ON) return e; return -1; } } return -1; } void free_simul_efun() { int e; for(e=0;e<num_simul_efuns;e++) { free_svalue(&(simul_efuns[e].fun)); free_string(simul_efuns[e].name); } if(simul_efuns) free((char *)simul_efuns); simul_efun_space=0; num_simul_efuns=0; }