/*
 * 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(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(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