62 lines
1.7 KiB
C
62 lines
1.7 KiB
C
|
#include <voxula/internals/ecs/head.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
vecs_tag_name_resolver_s vecs_create_tag_name_resolver()
|
||
|
{
|
||
|
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);
|
||
|
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);
|
||
|
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;
|
||
|
}
|