#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;
}