/* * Mr. 4th Dimention - Allen Webster * * 03.01.2017 * * Hot_Directory data structure for 4coder * */ // TOP internal void hot_directory_clean_end(Hot_Directory *hot_directory){ String_Const_u8 str = SCu8(hot_directory->string_space, hot_directory->string_size); if (!character_is_slash(string_get_character(str, str.size - 1))){ str = string_remove_last_folder(str); str.str[str.size] = 0; } } internal i32 hot_directory_quick_partition(File_Info *infos, i32 start, i32 pivot){ File_Info *p = infos + pivot; File_Info *a = infos + start; for (i32 i = start; i < pivot; ++i, ++a){ i32 comp = p->folder - a->folder; if (comp == 0){ comp = string_compare(SCu8(a->filename, a->filename_len), SCu8(p->filename, p->filename_len)); } if (comp < 0){ Swap(File_Info, *a, infos[start]); ++start; } } Swap(File_Info, *p, infos[start]); return start; } internal void hot_directory_quick_sort(File_Info *infos, i32 start, i32 pivot){ i32 mid = hot_directory_quick_partition(infos, start, pivot); if (start < mid-1) hot_directory_quick_sort(infos, start, mid-1); if (mid+1 < pivot) hot_directory_quick_sort(infos, mid+1, pivot); } internal void hot_directory_fixup(Hot_Directory *hot_directory){ File_List *files = &hot_directory->file_list; if (files->count >= 2){ hot_directory_quick_sort(files->infos, 0, files->count - 1); } } internal void hot_directory_set(System_Functions *system, Hot_Directory *hot_directory, String_Const_u8 str){ b32 success = (str.size < sizeof(hot_directory->string_space)); if (success){ block_copy(hot_directory->string_space, str.str, str.size); hot_directory->string_space[str.size] = 0; hot_directory->string_size = str.size; if (str.size > 0){ u32 canon_max = sizeof(hot_directory->canon_dir_space); u8 *canon_str = hot_directory->canon_dir_space; u32 canon_length = 0; system->set_file_list(&hot_directory->file_list, (char*)hot_directory->string_space, (char*)canon_str, &canon_length, canon_max); if (canon_length > 0){ hot_directory->canon_dir_size = canon_length; if (!character_is_slash(hot_directory->canon_dir_space[canon_length - 1])){ hot_directory->canon_dir_space[hot_directory->canon_dir_size] = '/'; hot_directory->canon_dir_size += 1; hot_directory->canon_dir_space[hot_directory->canon_dir_size] = 0; } } else{ hot_directory->canon_dir_size = 0; } } else{ system->set_file_list(&hot_directory->file_list, 0, 0, 0, 0); hot_directory->canon_dir_size = 0; } } hot_directory_fixup(hot_directory); } internal void hot_directory_reload(System_Functions *system, Hot_Directory *hot_directory){ String_Const_u8 string = SCu8(hot_directory->string_space, hot_directory->string_size); hot_directory_set(system, hot_directory, string); } internal void hot_directory_init(Hot_Directory *hot_directory, String_Const_u8 dir){ hot_directory->string_size = 0; umem size = clamp_top(dir.size, sizeof(hot_directory->string_space)); block_copy(hot_directory->string_space, dir.str, size); if (dir.size < sizeof(hot_directory->string_space)){ if (hot_directory->string_space[size - 1] != '/'){ hot_directory->string_space[size] = '/'; size = clamp_top(size + 1, sizeof(hot_directory->string_space)); hot_directory->string_space[size] = 0; hot_directory->string_size = size; } } } // BOTTOM