Kaltenberg/modules/ecs/src-c/name-resolver.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;
}