#if !defined(FCODER_LEX_GEN_HAND_WRITTEN) #define FCODER_LEX_GEN_HAND_WRITTEN internal u64 lexeme_hash(u64 seed, u8 *ptr, umem size){ u64 result = 0; for (umem 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, umem 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