mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-15 23:47:25 -04:00
Use std::function to simplify code
This commit is contained in:
parent
f5b1165e28
commit
bef1a4b193
@ -11,6 +11,7 @@
|
|||||||
#include <vector.hpp>
|
#include <vector.hpp>
|
||||||
#include <string.hpp>
|
#include <string.hpp>
|
||||||
#include <pair.hpp>
|
#include <pair.hpp>
|
||||||
|
#include <function.hpp>
|
||||||
|
|
||||||
#include "disks.hpp"
|
#include "disks.hpp"
|
||||||
#include "vfs/file_system.hpp"
|
#include "vfs/file_system.hpp"
|
||||||
@ -48,8 +49,7 @@ private:
|
|||||||
size_t rm_dir(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number);
|
size_t rm_dir(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number);
|
||||||
size_t rm_file(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number);
|
size_t rm_file(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number);
|
||||||
|
|
||||||
size_t set_file_size(uint32_t parent_cluster_number, size_t position, uint32_t file_size);
|
size_t change_directory_entry(uint32_t parent_cluster_number, size_t position, const std::function<void(cluster_entry&)>& functor);
|
||||||
size_t set_cluster_number(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number);
|
|
||||||
|
|
||||||
cluster_entry* find_free_entry(std::unique_heap_array<cluster_entry>& directory_cluster, size_t entries, uint32_t& cluster_number);
|
cluster_entry* find_free_entry(std::unique_heap_array<cluster_entry>& directory_cluster, size_t entries, uint32_t& cluster_number);
|
||||||
cluster_entry* extend_directory(std::unique_heap_array<cluster_entry>& directory_cluster, size_t entries, uint32_t& cluster_number);
|
cluster_entry* extend_directory(std::unique_heap_array<cluster_entry>& directory_cluster, size_t entries, uint32_t& cluster_number);
|
||||||
|
@ -427,7 +427,11 @@ size_t fat32::fat32_file_system::truncate(const std::vector<std::string>& file_p
|
|||||||
|
|
||||||
++capacity;
|
++capacity;
|
||||||
|
|
||||||
set_cluster_number(parent_cluster_number_search.second, position, cluster);
|
change_directory_entry(parent_cluster_number_search.second, position,
|
||||||
|
[cluster](cluster_entry& entry){
|
||||||
|
entry.cluster_low = cluster;
|
||||||
|
entry.cluster_high = cluster >> 16;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//Extend the clusters if necessary
|
//Extend the clusters if necessary
|
||||||
@ -457,7 +461,8 @@ size_t fat32::fat32_file_system::truncate(const std::vector<std::string>& file_p
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Set the new file size in the directory entry
|
//Set the new file size in the directory entry
|
||||||
set_file_size(parent_cluster_number_search.second, position, file_size);
|
change_directory_entry(parent_cluster_number_search.second, position,
|
||||||
|
[file_size](cluster_entry& entry){ entry.file_size = file_size; });
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -710,58 +715,7 @@ size_t fat32::fat32_file_system::rm_dir(uint32_t parent_cluster_number, size_t p
|
|||||||
return rm_file(parent_cluster_number, position, cluster_number);
|
return rm_file(parent_cluster_number, position, cluster_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t fat32::fat32_file_system::set_file_size(uint32_t parent_cluster_number, size_t position, uint32_t file_size){
|
size_t fat32::fat32_file_system::change_directory_entry(uint32_t parent_cluster_number, size_t position, const std::function<void(cluster_entry&)>& functor){
|
||||||
std::unique_heap_array<cluster_entry> directory_cluster(16 * fat_bs->sectors_per_cluster);
|
|
||||||
if(!read_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
|
|
||||||
return std::ERROR_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
//1. Mark the entries in directory as unused
|
|
||||||
|
|
||||||
bool found = false;
|
|
||||||
size_t cluster_position = 0;
|
|
||||||
while(!found){
|
|
||||||
bool end_reached = false;
|
|
||||||
|
|
||||||
//Verify if is the correct cluster
|
|
||||||
if(position >= cluster_position * directory_cluster.size() && position < (cluster_position + 1) * directory_cluster.size()){
|
|
||||||
found = true;
|
|
||||||
|
|
||||||
auto j = position % directory_cluster.size();
|
|
||||||
directory_cluster[j].file_size = file_size;
|
|
||||||
|
|
||||||
if(!write_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
|
|
||||||
return std::ERROR_FAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Jump to next cluser
|
|
||||||
if(!found && !end_reached){
|
|
||||||
parent_cluster_number = next_cluster(parent_cluster_number);
|
|
||||||
|
|
||||||
if(!parent_cluster_number){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//The block is corrupted
|
|
||||||
if(parent_cluster_number == CLUSTER_CORRUPTED){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!read_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!found){
|
|
||||||
return std::ERROR_NOT_EXISTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t fat32::fat32_file_system::set_cluster_number(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number){
|
|
||||||
std::unique_heap_array<cluster_entry> directory_cluster(16 * fat_bs->sectors_per_cluster);
|
std::unique_heap_array<cluster_entry> directory_cluster(16 * fat_bs->sectors_per_cluster);
|
||||||
if(!read_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
|
if(!read_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
|
||||||
return std::ERROR_FAILED;
|
return std::ERROR_FAILED;
|
||||||
@ -780,8 +734,7 @@ size_t fat32::fat32_file_system::set_cluster_number(uint32_t parent_cluster_numb
|
|||||||
|
|
||||||
auto j = position % directory_cluster.size();
|
auto j = position % directory_cluster.size();
|
||||||
|
|
||||||
directory_cluster[j].cluster_low = cluster_number;
|
functor(directory_cluster[j]);
|
||||||
directory_cluster[j].cluster_high = cluster_number >> 16;
|
|
||||||
|
|
||||||
if(!write_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
|
if(!write_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
|
||||||
return std::ERROR_FAILED;
|
return std::ERROR_FAILED;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user