2024-09-11 10:16:57 +00:00
|
|
|
#include <voxula/internals/ecs/head.h>
|
2024-09-12 21:27:12 +00:00
|
|
|
#include <voxula/internals/ecs/tag.h>
|
2024-09-11 10:16:57 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2024-09-12 21:27:12 +00:00
|
|
|
vecs_tag_name_resolver_s vecs_create_tag_name_resolver(vx_uuid_table_s *uuid_table)
|
2024-09-11 10:16:57 +00:00
|
|
|
{
|
|
|
|
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);
|
2024-09-12 21:27:12 +00:00
|
|
|
resolver.uuid_table = uuid_table;
|
2024-09-11 10:16:57 +00:00
|
|
|
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);
|
2024-09-12 21:27:12 +00:00
|
|
|
tag_name->first_user = NULL;
|
2024-09-11 10:16:57 +00:00
|
|
|
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;
|
|
|
|
}
|