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/btree.h>
|
||||||
#include <blue/core/queue.h>
|
#include <blue/core/queue.h>
|
||||||
|
|
||||||
|
#define MIE_NAME_VALID(p) (((p)->n_str) != NULL)
|
||||||
|
|
||||||
|
struct mie_name_map;
|
||||||
|
|
||||||
enum mie_name_map_flags {
|
enum mie_name_map_flags {
|
||||||
MIE_NAME_MAP_STRICT = 0x01u,
|
MIE_NAME_MAP_STRICT = 0x01u,
|
||||||
};
|
};
|
||||||
@@ -25,6 +29,7 @@ struct mie_name_map_entry {
|
|||||||
|
|
||||||
struct mie_name {
|
struct mie_name {
|
||||||
struct mie_name_map_entry n_base;
|
struct mie_name_map_entry n_base;
|
||||||
|
struct mie_name_map *n_parent;
|
||||||
char *n_str;
|
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,
|
struct mie_name_map *map, struct mie_name *entry, const char *hint,
|
||||||
enum mie_name_map_flags flags);
|
enum mie_name_map_flags flags);
|
||||||
|
|
||||||
|
extern void mie_name_destroy(struct mie_name *name);
|
||||||
|
|
||||||
#endif
|
#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);
|
b_status status = put_name(map, entry);
|
||||||
|
|
||||||
if (B_OK(status)) {
|
if (B_OK(status)) {
|
||||||
|
entry->n_parent = map;
|
||||||
entry->n_str = b_strdup(str);
|
entry->n_str = b_strdup(str);
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
@@ -184,6 +185,7 @@ struct mie_name *mie_name_map_put(
|
|||||||
b_status status = put_name(map, entry);
|
b_status status = put_name(map, entry);
|
||||||
|
|
||||||
if (B_OK(status)) {
|
if (B_OK(status)) {
|
||||||
|
entry->n_parent = map;
|
||||||
entry->n_str = b_strdup(str);
|
entry->n_str = b_strdup(str);
|
||||||
b_rope_destroy(&unique_name);
|
b_rope_destroy(&unique_name);
|
||||||
return entry;
|
return entry;
|
||||||
@@ -194,3 +196,34 @@ struct mie_name *mie_name_map_put(
|
|||||||
|
|
||||||
return NULL;
|
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