4coder/4ed_search_list.cpp

59 lines
1.8 KiB
C++
Raw Normal View History

/*
* Mr. 4th Dimention - Allen Webster
*
* 01.10.2019
*
* Search list helper.
*
*/
// TOP
function void
search_list_add_path__inner(Arena *arena, Path_Search_List *list, String_Const_u8 path){
string_list_push(arena, &list->list, path);
list->max_member_length = max(list->max_member_length, path.size);
}
function void
search_list_add_path(Arena *arena, Path_Search_List *list, String_Const_u8 path){
search_list_add_path__inner(arena, list, push_string_copy(arena, path));
}
function void
search_list_add_system_path(System_Functions *system, Arena *arena, Path_Search_List *list, System_Path_Code path){
search_list_add_path__inner(arena, list, system->get_path(arena, path));
}
function String_Const_u8
get_full_path(System_Functions *system, Arena *arena, Path_Search_List *search_list, String_Const_u8 relative){
String_Const_u8 result = {};
Temp_Memory restore_point = begin_temp(arena);
umem buffer_cap = search_list->max_member_length + relative.size + 1;
u8 *buffer = push_array(arena, u8, buffer_cap);
u8 *opl = buffer + buffer_cap;
u8 *relative_base = opl - 1 - relative.size;
block_copy(relative_base, relative.str, relative.size);
relative_base[relative.size] = 0;
for (Node_String_Const_u8 *node = search_list->list.first;
node != 0;
node = node->next){
umem node_size = node->string.size;
u8 *path_base = relative_base - node_size;
block_copy(path_base, node->string.str, node_size);
String_Const_u8 name = SCu8(path_base, opl);
File_Attributes attribs = system->quick_file_attributes(arena, name);
if (attribs.size > 0){
result = name;
break;
}
}
if (result.size == 0){
end_temp(restore_point);
}
return(result);
}
// BOTTOM