#include #include #include #include vecs_tag_name_resolver_s vecs_create_tag_name_resolver(vx_uuid_table_s *uuid_table) { vecs_tag_name_resolver_s resolver; resolver.names_capacity = 1024; resolver.num_names = 0; resolver.names = malloc(resolver.names_capacity * sizeof(vecs_tag_name_s)); resolver.string_arena = vx_new_arena(16384); resolver.uuid_table = uuid_table; return resolver; } void vecs_delete_tag_name_resolver(vecs_tag_name_resolver_s *resolver) { vx_free_arena(resolver->string_arena); free(resolver->names); } vecs_tag_name_s * vecs_force_create_tag_name(vecs_tag_name_resolver_s *resolver, const char *name) { uint32_t len_name = strlen(name); vecs_tag_name_s *tag_name = &resolver->names[resolver->num_names]; ++resolver->num_names; tag_name->length = len_name; tag_name->string = vx_arena_dupe_string(resolver->string_arena, name); tag_name->uuid = vx_new_uuid(resolver->uuid_table); tag_name->first_user = NULL; return tag_name; } vecs_tag_name_s * vecs_make_tag_name(vecs_tag_name_resolver_s *resolver, const char *name) { vecs_tag_name_s *tag_name = vecs_search_tag_name(resolver, name); if(tag_name) { return tag_name; } return vecs_force_create_tag_name(resolver, name); } vecs_tag_name_s * vecs_search_tag_name(vecs_tag_name_resolver_s *resolver, const char *string) { uint32_t len_string = strlen(string); uint32_t name_index = 0; while(name_index < resolver->num_names) { vecs_tag_name_s *name = &resolver->names[name_index]; if(name->length != len_string) { ++name_index; continue; } if( ! memcmp(name->string, string, name->length)) { return name; } ++name_index; } return NULL; }