Kaltenberg/modules/utility/src-c/uuid/uuid.c

102 lines
2.4 KiB
C
Raw Permalink Normal View History

#include <voxula/internals/utility/uuid.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
vx_uuid_table_s * vx_new_uuid_table()
{
vx_uuid_table_s *table = malloc(sizeof(vx_uuid_table_s));
table->num_blocks = 0;
table->block_capacity = 32;
table->blocks = malloc(table->block_capacity * sizeof(vx_uuid_block_s *));
return table;
}
bool vx_uuid_block_exists(vx_uuid_table_s *table, uint32_t offset)
{
uint32_t block_index = 0;
while(block_index < table->num_blocks)
{
if(table->blocks[block_index]->offset == offset)
{
return true;
}
++block_index;
}
return false;
}
bool vx_uuid_exists_in_block(vx_uuid_block_s *block, vx_uuid_d uuid)
{
uint32_t entry_index = 0;
while(entry_index < block->num_ids)
{
if(block->entries[entry_index].uuid == uuid)
{
return true;
}
++entry_index;
}
return false;
}
vx_uuid_d vx_allocate_uuid_in_block(vx_uuid_block_s *block)
{
vx_uuid_d last_id = 0;
if(block->num_ids)
{
last_id = block->entries[block->num_ids - 1].uuid;
}
vx_uuid_d uuid =
block->offset * 4096
+ last_id * 53;
block->entries[block->num_ids].uuid = uuid;
++block->num_ids;
while(vx_uuid_exists_in_block(block, uuid))
{
++uuid;
}
return uuid;
}
vx_uuid_block_s * vx_allocate_new_id_block(vx_uuid_table_s *table)
{
vx_uuid_block_s *block = NULL;
if(table->num_blocks >= table->block_capacity)
{
table->block_capacity *= 2;
if( ! table->block_capacity)
{
table->block_capacity = 32;
}
table->blocks = realloc(table->blocks, table->block_capacity * sizeof(vx_uuid_block_s *));
}
table->blocks[table->num_blocks] = malloc(sizeof(vx_uuid_block_s));
block = table->blocks[table->num_blocks];
block->num_ids = 0;
block->offset = (table->num_blocks * 7) * 4096;
++table->num_blocks;
return block;
}
vx_uuid_d vx_new_uuid(vx_uuid_table_s *table)
{
vx_uuid_block_s *block = NULL;
uint32_t block_index = 0;
while(block_index < table->num_blocks)
{
if(table->blocks[block_index]->num_ids != 255)
{
block = table->blocks[block_index];
break;
}
++block_index;
}
if( ! block)
{
block = vx_allocate_new_id_block(table);
}
return vx_allocate_uuid_in_block(block);
}