splink/source/string_hash.c

102 lines
2.7 KiB
C

////////////////////////////////
// NOTE(allen): Implementation
internal STR_Hash
STR_InitHash(void){
STR_Hash hash = {0};
hash.arena_ptrs = M_ArenaInitialize();
hash.arena_strs = M_ArenaInitializeWithAlign(1);
hash.str_ptrs = PushArray(&hash.arena_ptrs, String8, 1);
hash.str_count = 1;
hash.str_ptrs[0] = S8Lit("");
return(hash);
}
internal STR_Index
STR_Save(STR_Hash *hash, String8 string){
u32 count = hash->str_count;
STR_Index result = count;
String8 *str_ptr = hash->str_ptrs;
for (u32 i = 0; i < count; i += 1, str_ptr += 1){
if (StringMatch(*str_ptr, string)){
result = i;
break;
}
}
if (result == count){
String8 *new_str = PushArray(&hash->arena_ptrs, String8, 1);
new_str->str = PushArray(&hash->arena_strs, u8, string.size);
new_str->size = string.size;
MemoryCopy(new_str->str, string.str, string.size);
hash->str_count += 1;
}
return(result);
}
internal String8
STR_Read(STR_Hash *hash, STR_Index index){
String8 result = {0};
if (index < hash->str_count){
result = hash->str_ptrs[index];
}
return(result);
}
internal String8
STR_NameFromPath(String8 path){
String8 result = path;
if (path.size > 0){
u8 *first = path.str;
u8 *last = path.str + path.size - 1;
u8 *ptr = last;
for (;ptr >= first; ptr -= 1){
if (*ptr == '/' || *ptr == '\\'){
break;
}
}
if (ptr < last){
result = S8Range(ptr + 1, last + 1);
}
}
return(result);
}
internal String8
STR_NameWithoutExtension(String8 path){
String8 result = path;
if (path.size > 0){
u8 *first = path.str;
u8 *ptr = path.str + path.size - 1;
for (;ptr >= first; ptr -= 1){
if (*ptr == '.'){
break;
}
}
if (ptr > first){
result = S8Range(first, ptr);
}
}
return(result);
}
////////////////////////////////
// NOTE(allen): Test
internal void
_STR_Test(void){
STR_Hash hash = STR_InitHash();
STR_Index a = STR_Save(&hash, S8Lit("Foo"));
STR_Index b = STR_Save(&hash, S8Lit("Bar"));
STR_Index c = STR_Save(&hash, S8Lit("Jim"));
STR_Index d = STR_Save(&hash, S8Lit("Jams"));
Assert(STR_Save(&hash, S8Lit("Foo")) == a);
Assert(STR_Save(&hash, S8Lit("Bar")) == b);
Assert(STR_Save(&hash, S8Lit("Jim")) == c);
Assert(STR_Save(&hash, S8Lit("Jams")) == d);
Assert(StringMatch(STR_Read(&hash, a), S8Lit("Foo")));
Assert(StringMatch(STR_Read(&hash, b), S8Lit("Bar")));
Assert(StringMatch(STR_Read(&hash, c), S8Lit("Jim")));
Assert(StringMatch(STR_Read(&hash, d), S8Lit("Jams")));
}