From d8f4f319e9120f13965eb0bf967112974f27fcf9 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sat, 16 Aug 2025 20:54:05 +0100 Subject: [PATCH] mie: name: add a mie_name destructor that removes it from its parent name map --- mie/include/mie/name.h | 7 +++++++ mie/name.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/mie/include/mie/name.h b/mie/include/mie/name.h index 0e81084..e40883a 100644 --- a/mie/include/mie/name.h +++ b/mie/include/mie/name.h @@ -4,6 +4,10 @@ #include #include +#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 diff --git a/mie/name.c b/mie/name.c index 7e9199b..7811767 100644 --- a/mie/name.c +++ b/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; + } +}