mie: name_map can now generate unique names when given no hints
This commit is contained in:
@@ -31,6 +31,7 @@ struct mie_name_bucket {
|
|||||||
|
|
||||||
struct mie_name_map {
|
struct mie_name_map {
|
||||||
b_btree m_entries;
|
b_btree m_entries;
|
||||||
|
size_t m_next_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct mie_name_map *mie_name_map_create(void);
|
extern struct mie_name_map *mie_name_map_create(void);
|
||||||
|
|||||||
34
mie/name.c
34
mie/name.c
@@ -128,27 +128,39 @@ struct mie_name *mie_name_map_put(
|
|||||||
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;
|
||||||
|
|
||||||
b_rope base = B_ROPE_CSTR(hint);
|
b_rope base = {};
|
||||||
|
|
||||||
|
if (hint) {
|
||||||
|
b_rope_init_cstr_borrowed(&base, hint);
|
||||||
|
}
|
||||||
|
|
||||||
char str[256];
|
char str[256];
|
||||||
|
|
||||||
/* first try just the hint on its own */
|
if (hint) {
|
||||||
b_rope_to_cstr(&base, str, sizeof str);
|
/* first try just the hint on its own */
|
||||||
entry->n_str = str;
|
b_rope_to_cstr(&base, str, sizeof str);
|
||||||
entry->n_base.e_hash = base.r_v.v_cstr.hash;
|
entry->n_str = str;
|
||||||
b_status status = put_name(map, entry);
|
entry->n_base.e_hash = base.r_v.v_cstr.hash;
|
||||||
|
b_status status = put_name(map, entry);
|
||||||
|
|
||||||
if (B_OK(status)) {
|
if (B_OK(status)) {
|
||||||
entry->n_str = b_strdup(str);
|
entry->n_str = b_strdup(str);
|
||||||
return entry;
|
return entry;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 */
|
||||||
b_rope suffix = B_ROPE_UINT(0);
|
b_rope suffix = B_ROPE_UINT(0);
|
||||||
b_rope unique_name;
|
b_rope unique_name;
|
||||||
b_rope_concat(&unique_name, &base, &suffix);
|
b_rope_concat(&unique_name, &base, &suffix);
|
||||||
|
|
||||||
for (unsigned int i = 0;; i++) {
|
size_t i = 0;
|
||||||
|
if (!hint || hint[0] == '\0') {
|
||||||
|
i = map->m_next_id++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;; i++) {
|
||||||
suffix.r_v.v_uint = i;
|
suffix.r_v.v_uint = i;
|
||||||
|
|
||||||
b_rope_to_cstr(&unique_name, str, sizeof str);
|
b_rope_to_cstr(&unique_name, str, sizeof str);
|
||||||
|
|||||||
@@ -1,20 +1,23 @@
|
|||||||
#include <mie/name.h>
|
#include <mie/name.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define NR_NAMES 6
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
struct mie_name_map *map = mie_name_map_create();
|
struct mie_name_map *map = mie_name_map_create();
|
||||||
struct mie_name n1;
|
struct mie_name n[NR_NAMES] = {};
|
||||||
struct mie_name n2;
|
|
||||||
struct mie_name n3;
|
|
||||||
|
|
||||||
mie_name_map_put(map, &n1, "tmp");
|
mie_name_map_put(map, &n[0], "tmp");
|
||||||
mie_name_map_put(map, &n2, "tmp");
|
mie_name_map_put(map, &n[1], "tmp");
|
||||||
mie_name_map_put(map, &n3, "tmp");
|
mie_name_map_put(map, &n[2], "tmp");
|
||||||
|
mie_name_map_put(map, &n[3], NULL);
|
||||||
|
mie_name_map_put(map, &n[4], NULL);
|
||||||
|
mie_name_map_put(map, &n[5], NULL);
|
||||||
|
|
||||||
printf("%s\n", n1.n_str);
|
for (int i = 0; i < NR_NAMES; i++) {
|
||||||
printf("%s\n", n2.n_str);
|
printf("%s\n", n[i].n_str);
|
||||||
printf("%s\n", n3.n_str);
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user