From bef1a4b1936aafd4baf8103cabfd960fbfcbe5d3 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Wed, 12 Mar 2014 21:46:35 +0100 Subject: [PATCH] Use std::function to simplify code --- kernel/include/fs/fat32.hpp | 4 +-- kernel/src/fs/fat32.cpp | 65 +++++-------------------------------- 2 files changed, 11 insertions(+), 58 deletions(-) diff --git a/kernel/include/fs/fat32.hpp b/kernel/include/fs/fat32.hpp index 9723a6d0..47ca5048 100644 --- a/kernel/include/fs/fat32.hpp +++ b/kernel/include/fs/fat32.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "disks.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_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 set_cluster_number(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number); + size_t change_directory_entry(uint32_t parent_cluster_number, size_t position, const std::function& functor); cluster_entry* find_free_entry(std::unique_heap_array& directory_cluster, size_t entries, uint32_t& cluster_number); cluster_entry* extend_directory(std::unique_heap_array& directory_cluster, size_t entries, uint32_t& cluster_number); diff --git a/kernel/src/fs/fat32.cpp b/kernel/src/fs/fat32.cpp index ade2c474..30d9d92d 100644 --- a/kernel/src/fs/fat32.cpp +++ b/kernel/src/fs/fat32.cpp @@ -427,7 +427,11 @@ size_t fat32::fat32_file_system::truncate(const std::vector& file_p ++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 @@ -457,7 +461,8 @@ size_t fat32::fat32_file_system::truncate(const std::vector& file_p } //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; } @@ -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); } -size_t fat32::fat32_file_system::set_file_size(uint32_t parent_cluster_number, size_t position, uint32_t file_size){ - std::unique_heap_array 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){ +size_t fat32::fat32_file_system::change_directory_entry(uint32_t parent_cluster_number, size_t position, const std::function& functor){ std::unique_heap_array 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; @@ -780,8 +734,7 @@ size_t fat32::fat32_file_system::set_cluster_number(uint32_t parent_cluster_numb auto j = position % directory_cluster.size(); - directory_cluster[j].cluster_low = cluster_number; - directory_cluster[j].cluster_high = cluster_number >> 16; + functor(directory_cluster[j]); if(!write_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){ return std::ERROR_FAILED;