#include "globals.h"
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif /* HAVE_STDINT_H */
#include "dwarf_tsearch.h"
#include "helpertree.h"
#define TRUE 1
#define FALSE 0
struct
Helpertree_Base_s helpertree_offsets_base_info;
struct
Helpertree_Base_s helpertree_offsets_base_types;
static
struct
Helpertree_Map_Entry_s *
helpertree_map_create_entry(Dwarf_Unsigned offset,
int
val)
{
struct
Helpertree_Map_Entry_s *mp =
(
struct
Helpertree_Map_Entry_s *)
calloc
(1,
sizeof
(
struct
Helpertree_Map_Entry_s));
if
(!mp) {
return
0;
}
mp->hm_key = offset;
mp->hm_val = val;
return
mp;
}
static
void
helpertree_map_free_func(
void
*mx)
{
struct
Helpertree_Map_Entry_s *m = mx;
free
(m);
}
static
int
helpertree_map_compare_func(
const
void
*l,
const
void
*r)
{
const
struct
Helpertree_Map_Entry_s *ml = l;
const
struct
Helpertree_Map_Entry_s *mr = r;
if
(ml->hm_key < mr->hm_key) {
return
-1;
}
if
(ml->hm_key > mr->hm_key) {
return
1;
}
return
0;
}
static
void
helpertree_map_destroy(
void
*map)
{
dwarf_tdestroy(map,helpertree_map_free_func);
}
struct
Helpertree_Map_Entry_s *
helpertree_add_entry(Dwarf_Unsigned offset,
int
val,
struct
Helpertree_Base_s *base)
{
void
*retval = 0;
struct
Helpertree_Map_Entry_s *re = 0;
struct
Helpertree_Map_Entry_s *e;
void
**tree1 = 0;
tree1 = &base->hb_base;
e = helpertree_map_create_entry(offset,val);
retval = dwarf_tsearch(e,tree1, helpertree_map_compare_func);
if
(retval) {
re = *(
struct
Helpertree_Map_Entry_s **)retval;
if
(re != e) {
re->hm_val = val;
helpertree_map_free_func(e);
}
else
{
}
return
retval;
}
return
NULL;
}
struct
Helpertree_Map_Entry_s *
helpertree_find(Dwarf_Unsigned offset,
struct
Helpertree_Base_s *base)
{
void
*retval = 0;
struct
Helpertree_Map_Entry_s *re = 0;
struct
Helpertree_Map_Entry_s *e = 0;
e = helpertree_map_create_entry(offset,0);
retval = dwarf_tfind(e,&base->hb_base, helpertree_map_compare_func);
if
(retval) {
re = *(
struct
Helpertree_Map_Entry_s **)retval;
}
helpertree_map_free_func(e);
return
re;
}
void
helpertree_clear_statistics(
struct
Helpertree_Base_s *base)
{
if
(!base) {
return
;
}
if
(!base->hb_base) {
return
;
}
helpertree_map_destroy(base->hb_base);
base->hb_base = 0;
}