#include <stdio.h>
#include <string.h>
#include "config.h"
#include "lint.h"
#include "interpret.h"
#include "object.h"
#include "exec.h"
struct program *simul_efunp = 0;
struct object *simul_efun_ob = 0;
/* Don't release this pointer ever. It is used elsewhere.
*/
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()
{
struct object *ob;
struct function *funp;
int i;
#define SIMULFILE "secure/simul_efun.c"
FILE *f;
extern struct program *prog;
extern char *current_file;
extern int total_lines;
extern int num_parse_error;
extern char *inherit_file;
extern char *current_loaded_file;
extern struct object *swap_ob;
extern void init_smart_log();
simul_efun_file_name = make_shared_string("/secure/simul_efun");
f = fopen(SIMULFILE, "r");
if (f == 0)
{
fprintf(stderr, "/secure/simul_efun.c not found.\n");
exit(1);
}
#if 1
init_smart_log();
start_new_file(f);
current_file = string_copy(SIMULFILE); /* This one is freed below */
current_loaded_file = SIMULFILE;
compile_file();
end_new_file();
current_loaded_file = 0;
total_lines = 0;
(void)fclose(f);
free(current_file);
current_file = 0;
init_smart_log();
if (inherit_file || num_parse_error > 0 || prog == 0)
{
fprintf(stderr, "Error in /secure/simul_efun.c.\n");
return;
}
fprintf(stderr,"%s loaded: %d functions\n", SIMULFILE,
prog->num_functions);
if (prog->num_functions == 0)
return;
simul_efunp = prog;
/*
We make an object so that it can be updated.
*/
ob = get_empty_object();
ob->name = string_copy("secure/simul_efun");
ob->prog = prog;
ob->prog->flags |= PRAGMA_RESIDENT;
if (obj_list)
{
ob->next_all = obj_list;
ob->prev_all = obj_list->prev_all;
obj_list->prev_all->next_all = ob;
obj_list->prev_all = ob;
obj_list = ob;
}
else
obj_list = swap_ob = ob->next_all = ob->prev_all = ob;
if (current_object)
access_object(current_object);
simul_efun_ob = ob;
add_ref(ob, "simul_efun");
enter_object_hash(ob); /* add name to fast object lookup table */
{
int num_var, i;
extern int tot_alloc_variable_size;
extern struct svalue const0;
num_var = ob->prog->num_variables +
ob->prog->inherit[ob->prog->num_inherited - 1]
.variable_index_offset + 1;
if (ob->variables)
fatal("Object allready initialized!\n");
ob->variables = (struct svalue *)
xalloc(num_var * sizeof(struct svalue));
tot_alloc_variable_size += num_var * sizeof(struct svalue);
for (i= 0; i<num_var; i++)
ob->variables[i] = const0;
ob->variables++;
}
current_object = 0;
#else
simul_efun_ob = load_object(simul_efun_file_name, 1, 0);
#endif
return;
}
/*
Used by destruct_object to find simul_efun
*/
struct object *
query_simul_efun_ob()
{
return simul_efun_ob;
}