diff --git a/include/base_file_buffer.h b/include/base_file_buffer.h index 5d648e7..d6e9cc5 100644 --- a/include/base_file_buffer.h +++ b/include/base_file_buffer.h @@ -18,6 +18,7 @@ int base_file_buffer_push(BaseFileBuffer*, BaseFileInfo); void base_file_buffer_free(BaseFileBuffer*); void base_file_buffer_sort(BaseFileBuffer*); BaseFileInfo* base_file_buffer_search(BaseFileBuffer*, char*); +int base_file_buffer_remove(BaseFileBuffer*, char*); int read_base_file_list(BaseFileBuffer*, char*); int write_base_file_list(BaseFileBuffer*, char*); diff --git a/include/utilities.h b/include/utilities.h index 0ff3a88..c1b959e 100644 --- a/include/utilities.h +++ b/include/utilities.h @@ -41,6 +41,7 @@ typedef List FileInfoBuffer; List* list_new(size_t); int list_push(List*, void*); +int list_remove(List*, const void*, int (*compare)(const void*, const void*)); void list_free(List*); void* binary_search(const void*, const void*, size_t, size_t, int (*compare)(const void*, const void*)); void* list_binary_search(List*, const void*, int (*compare)(const void*, const void*)); diff --git a/src/base_file_buffer.c b/src/base_file_buffer.c index 93bcde8..2052af0 100644 --- a/src/base_file_buffer.c +++ b/src/base_file_buffer.c @@ -41,6 +41,13 @@ BaseFileInfo* base_file_buffer_search(BaseFileBuffer* buffer, char* filename) { return (BaseFileInfo*)list_binary_search(buffer, &search_key, compare_base_file_info); } +int base_file_buffer_remove(BaseFileBuffer* buffer, char* filename) { + if (!buffer || !filename) return 0; + + BaseFileInfo search_key = {.base_num = 0, .diff_num = 0, .name = filename}; + return list_remove(buffer, &search_key, compare_base_file_info); +} + int read_base_file_list(BaseFileBuffer* buffer, char* base_file_list_path) { size_t compressed_size; unsigned char* compressed_data = (unsigned char*)get_file_content_with_size(base_file_list_path, &compressed_size); diff --git a/src/utilities.c b/src/utilities.c index 929f837..7717aea 100644 --- a/src/utilities.c +++ b/src/utilities.c @@ -32,6 +32,29 @@ int list_push(List* list, void* item) { return 1; } +int list_remove(List* list, const void* key, int (*compare)(const void*, const void*)) { + if (!list || !key || !compare || list->len == 0) { + return 0; + } + + for (size_t i = 0; i < list->len; i++) { + char* current_item = (char*)list->items + (i * list->item_size); + + if (compare(key, current_item) == 0) { + for (size_t j = i; j < list->len - 1; j++) { + char* dest = (char*)list->items + (j * list->item_size); + char* src = (char*)list->items + ((j + 1) * list->item_size); + memcpy(dest, src, list->item_size); + } + + list->len--; + return 1; + } + } + + return 0; +} + void list_free(List* buffer) { if (buffer) { for (size_t i = 0; i < buffer->len; i++) { @@ -347,6 +370,12 @@ void walk(char* base, char* base_rel, char* rel, FileInfoBuffer* file_infos, int char* get_repo_path(char* repo_root_path, char* path) { char* real_path = realpath(path, NULL); cut_path(repo_root_path, real_path); + + size_t len = strlen(real_path); + if (len > 1 && real_path[len - 1] == '/') { + real_path[len - 1] = '\0'; + } + return real_path; }