pike.git
/
src
/
constants.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/constants.c:1:
+
/*\
+
||| This file a part of Pike, and is copyright by Fredrik Hubinette
+
||| Pike is distributed as GPL (General Public License)
+
||| See the files COPYING and DISCLAIMER for more information.
+
\*/
+
#include "constants.h"
+
#include "macros.h"
+
#include "program.h"
+
#include "pike_types.h"
+
#include "stralloc.h"
+
#include "memory.h"
+
#include "interpret.h"
-
+
static struct hash_table *efun_hash = 0;
+
+
struct efun *lookup_efun(struct pike_string *name)
+
{
+
struct hash_entry *h;
+
+
if(!efun_hash) return 0;
+
h=hash_lookup(efun_hash, name);
+
if(!h) return 0;
+
return BASEOF(h, efun, link);
+
}
+
+
void low_add_efun(struct pike_string *name, struct svalue *fun)
+
{
+
struct efun *parent;
+
+
parent=lookup_efun(name);
+
+
if(!parent)
+
{
+
if(!fun) return;
+
+
parent=ALLOC_STRUCT(efun);
+
copy_shared_string(parent->link.s,name);
+
efun_hash=hash_insert(efun_hash, &parent->link);
+
}else{
+
free_svalue(& parent->function);
+
+
/* Disable efun */
+
if(!fun)
+
{
+
efun_hash=hash_unlink(efun_hash, &parent->link);
+
free_string(parent->link.s);
+
free((char *)parent);
+
return;
+
}
+
}
+
+
assign_svalue_no_free(& parent->function, fun);
+
}
+
+
+
struct callable *make_callable(c_fun fun,
+
char *name,
+
char *type,
+
INT16 flags,
+
optimize_fun optimize,
+
docode_fun docode)
+
{
+
struct callable *f;
+
f=ALLOC_STRUCT(callable);
+
f->refs=1;
+
f->function=fun;
+
f->name=make_shared_string(name);
+
f->type=parse_type(type);
+
f->flags=flags;
+
f->docode=docode;
+
f->optimize=optimize;
+
return f;
+
}
+
+
void really_free_callable(struct callable *fun)
+
{
+
free_string(fun->type);
+
free_string(fun->name);
+
free((char *)fun);
+
}
+
+
void add_efun2(char *name,
+
c_fun fun,
+
char *type,
+
INT16 flags,
+
optimize_fun optimize,
+
docode_fun docode)
+
{
+
struct svalue s;
+
struct pike_string *n;
+
+
n=make_shared_string(name);
+
s.type=T_FUNCTION;
+
s.subtype=-1;
+
s.u.efun=make_callable(fun, name, type, flags, optimize, docode);
+
low_add_efun(n, &s);
+
free_svalue(&s);
+
free_string(n);
+
}
+
+
void add_efun(char *name, c_fun fun, char *type, INT16 flags)
+
{
+
add_efun2(name,fun,type,flags,0,0);
+
}
+
+
static void push_efun_entry(struct hash_entry *h)
+
{
+
struct efun *f;
+
check_stack(1);
+
f=BASEOF(h, efun, link);
+
push_string(f->link.s);
+
f->link.s->refs++;
+
copy_svalues_recursively_no_free(sp,& f->function,1,0);
+
sp++;
+
}
+
+
void push_all_efuns_on_stack()
+
{
+
if(efun_hash)
+
map_hashtable(efun_hash,push_efun_entry);
+
}
+
+
static void free_one_hashtable_entry(struct hash_entry *h)
+
{
+
struct efun *f;
+
f=BASEOF(h, efun, link);
+
free_svalue(& f->function);
+
free((char *)f);
+
}
+
+
void cleanup_added_efuns()
+
{
+
if(efun_hash)
+
{
+
free_hashtable(efun_hash,free_one_hashtable_entry);
+
efun_hash=0;
+
}
+
+
}
Newline at end of file added.