mie: add strict-naming support to mie_name_map

in strict mode, the hint is taken as the required name. if a value already
exists with the given name, the operation fails.
This commit is contained in:
2025-04-22 15:21:30 +01:00
parent f8c322ef6c
commit 4ffe445572
4 changed files with 17 additions and 4 deletions

View File

@@ -84,7 +84,7 @@ struct mie_value *mie_func_generate_value_name(
struct mie_func *func, struct mie_value *val, const char *hint) struct mie_func *func, struct mie_value *val, const char *hint)
{ {
struct mie_name *name struct mie_name *name
= mie_name_map_put(func->f_names, &val->v_name, hint); = mie_name_map_put(func->f_names, &val->v_name, hint, 0);
return b_unbox(struct mie_value, name, v_name); return b_unbox(struct mie_value, name, v_name);
} }

View File

@@ -4,6 +4,10 @@
#include <blue/core/btree.h> #include <blue/core/btree.h>
#include <blue/core/queue.h> #include <blue/core/queue.h>
enum mie_name_map_flags {
MIE_NAME_MAP_STRICT = 0x01u,
};
enum mie_name_map_entry_type { enum mie_name_map_entry_type {
MIE_NAME_MAP_E_NONE = 0, MIE_NAME_MAP_E_NONE = 0,
MIE_NAME_MAP_E_NAME, MIE_NAME_MAP_E_NAME,
@@ -38,6 +42,7 @@ extern struct mie_name_map *mie_name_map_create(void);
extern void mie_name_map_destroy(struct mie_name_map *map); extern void mie_name_map_destroy(struct mie_name_map *map);
extern struct mie_name *mie_name_map_put( 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);
#endif #endif

View File

@@ -106,7 +106,8 @@ enum b_status mie_module_put_data(
struct mie_value *mie_module_generate_value_name( struct mie_value *mie_module_generate_value_name(
struct mie_module *mod, struct mie_value *val, const char *hint) struct mie_module *mod, struct mie_value *val, const char *hint)
{ {
struct mie_name *name = mie_name_map_put(mod->m_names, &val->v_name, hint); struct mie_name *name
= mie_name_map_put(mod->m_names, &val->v_name, hint, 0);
return b_unbox(struct mie_value, name, v_name); return b_unbox(struct mie_value, name, v_name);
} }

View File

@@ -123,7 +123,8 @@ static b_status put_name(struct mie_name_map *map, struct mie_name *name)
} }
struct mie_name *mie_name_map_put( 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)
{ {
memset(entry, 0x0, sizeof *entry); memset(entry, 0x0, sizeof *entry);
entry->n_base.e_type = MIE_NAME_MAP_E_NAME; entry->n_base.e_type = MIE_NAME_MAP_E_NAME;
@@ -149,6 +150,12 @@ struct mie_name *mie_name_map_put(
} }
} }
if (flags & MIE_NAME_MAP_STRICT) {
/* the caller insists that `hint` be used as the name.
* such a name already exists, so we can't help them */
return NULL;
}
/* that name already exists, use a suffix to make the name unique. /* that name already exists, use a suffix to make the name unique.
* alternately, no hint was specified, so it's up to us to generate the name */ * alternately, no hint was specified, so it's up to us to generate the name */
b_rope dot = B_ROPE_CHAR('.'); b_rope dot = B_ROPE_CHAR('.');