4coder/custom/lexer_generator/4coder_lex_gen_hand_written...

45 lines
1.3 KiB
C++

#if !defined(FCODER_LEX_GEN_HAND_WRITTEN)
#define FCODER_LEX_GEN_HAND_WRITTEN
internal u64
lexeme_hash(u64 seed, u8 *ptr, u64 size){
u64 result = 0;
for (u64 i = 0; i < size; i += 1, ptr += 1){
result ^= ((*ptr) ^ result*59) + seed;
}
return(result);
}
internal Lexeme_Table_Lookup
lexeme_table_lookup(u64 *hash_array, String_Const_u8 *key_array,
Lexeme_Table_Value *value_array, i32 slot_count, u64 seed,
u8 *ptr, u64 size){
Lexeme_Table_Lookup result = {};
u64 hash = lexeme_hash(seed, ptr, size);
u64 comparison_hash = hash | 1;
i32 first_index = (hash % slot_count);
i32 index = first_index;
for (;;){
if (hash_array[index] == comparison_hash){
if (string_match(SCu8(ptr, size), key_array[index])){
result.found_match = true;
result.base_kind = value_array[index].base_kind;
result.sub_kind = value_array[index].sub_kind;
break;
}
}
else if (hash_array[index] == 0){
break;
}
index += 1;
if (index == slot_count){
index = 0;
}
if (index == first_index){
break;
}
}
return(result);
}
#endif