102 lines
2.4 KiB
C
102 lines
2.4 KiB
C
#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);
|
|
}
|