mie: name: add a mie_name destructor that removes it from its parent name map
This commit is contained in:
@@ -4,6 +4,10 @@
|
||||
#include <blue/core/btree.h>
|
||||
#include <blue/core/queue.h>
|
||||
|
||||
#define MIE_NAME_VALID(p) (((p)->n_str) != NULL)
|
||||
|
||||
struct mie_name_map;
|
||||
|
||||
enum mie_name_map_flags {
|
||||
MIE_NAME_MAP_STRICT = 0x01u,
|
||||
};
|
||||
@@ -25,6 +29,7 @@ struct mie_name_map_entry {
|
||||
|
||||
struct mie_name {
|
||||
struct mie_name_map_entry n_base;
|
||||
struct mie_name_map *n_parent;
|
||||
char *n_str;
|
||||
};
|
||||
|
||||
@@ -45,4 +50,6 @@ extern struct mie_name *mie_name_map_put(
|
||||
struct mie_name_map *map, struct mie_name *entry, const char *hint,
|
||||
enum mie_name_map_flags flags);
|
||||
|
||||
extern void mie_name_destroy(struct mie_name *name);
|
||||
|
||||
#endif
|
||||
|
||||
33
mie/name.c
33
mie/name.c
@@ -145,6 +145,7 @@ struct mie_name *mie_name_map_put(
|
||||
b_status status = put_name(map, entry);
|
||||
|
||||
if (B_OK(status)) {
|
||||
entry->n_parent = map;
|
||||
entry->n_str = b_strdup(str);
|
||||
return entry;
|
||||
}
|
||||
@@ -184,6 +185,7 @@ struct mie_name *mie_name_map_put(
|
||||
b_status status = put_name(map, entry);
|
||||
|
||||
if (B_OK(status)) {
|
||||
entry->n_parent = map;
|
||||
entry->n_str = b_strdup(str);
|
||||
b_rope_destroy(&unique_name);
|
||||
return entry;
|
||||
@@ -194,3 +196,34 @@ struct mie_name *mie_name_map_put(
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void mie_name_destroy(struct mie_name *name)
|
||||
{
|
||||
struct mie_name_map *parent = name->n_parent;
|
||||
struct mie_name_map_entry *entry
|
||||
= get_entry(&parent->m_entries, name->n_base.e_hash);
|
||||
struct mie_name_bucket *bucket = NULL;
|
||||
if (!entry) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (entry->e_type) {
|
||||
case MIE_NAME_MAP_E_NAME:
|
||||
b_btree_delete(&parent->m_entries, &entry->e_node);
|
||||
break;
|
||||
case MIE_NAME_MAP_E_BUCKET:
|
||||
bucket = b_unbox(struct mie_name_bucket, entry, b_base);
|
||||
b_queue_delete(&bucket->b_names, &name->n_base.e_entry);
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
return;
|
||||
}
|
||||
|
||||
name->n_parent = NULL;
|
||||
|
||||
if (name->n_str) {
|
||||
free(name->n_str);
|
||||
name->n_str = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user