#include <stdio.h> #include <string.h> #include "lint.h" #include "interpret.h" #include "object.h" #include "exec.h" static struct function *simul_efunp = 0; static int num_simul_efun; /* Don't release this pointer ever. It is used elsewhere. */ static char *simul_efun_file_name; /* * If there is a simul_efun file, then take care of it and extract all * information we need. */ void get_simul_efun(svp) struct svalue *svp; { struct object *ob; struct function *funp; int i; if (svp == 0 || (svp->type == T_NUMBER && svp->u.number == 0)) { fprintf(stderr, "No simul_efun\n"); return; } simul_efun_file_name = make_shared_string(svp->u.string); ob = find_object2(simul_efun_file_name); if (ob == 0) { fprintf(stderr, "The simul_efun file %s was not loaded.\n", simul_efun_file_name); fprintf(stderr, "The function get_simul_efun in master.c must load it.\n"); exit(1); } num_simul_efun = ob->prog->num_functions; if (num_simul_efun == 0) return; funp = ob->prog->functions; simul_efunp = (struct function *) malloc(sizeof (struct function) * num_simul_efun); for (i=0; i < ob->prog->num_functions; i++) { simul_efunp[i].name = make_shared_string(funp[i].name); simul_efunp[i].flags = funp[i].flags; simul_efunp[i].num_arg = funp[i].num_arg; simul_efunp[i].type = funp[i].type & TYPE_MOD_MASK; } } /* * Test if 'name' is a simul_efun. The string pointer MUST be a pointer to * a shared string. */ struct function *find_simul_efun(name) char *name; { int i; for (i=0; i < num_simul_efun; i++) { if (name == simul_efunp[i].name) return &simul_efunp[i]; } return 0; } char *query_simul_efun_file_name() { #ifdef DEBUG if (simul_efunp == 0) fatal("query_simlu_efun_file_name called when non exists!\n"); #endif return simul_efun_file_name; }