feat(utilities,basefiles): added remove function to List and BaseFileBuffer

This commit is contained in:
lisk77 2025-08-28 19:18:03 +02:00
parent 967b79d9ba
commit e3a2f43871
4 changed files with 38 additions and 0 deletions

View file

@ -18,6 +18,7 @@ int base_file_buffer_push(BaseFileBuffer*, BaseFileInfo);
void base_file_buffer_free(BaseFileBuffer*); void base_file_buffer_free(BaseFileBuffer*);
void base_file_buffer_sort(BaseFileBuffer*); void base_file_buffer_sort(BaseFileBuffer*);
BaseFileInfo* base_file_buffer_search(BaseFileBuffer*, char*); BaseFileInfo* base_file_buffer_search(BaseFileBuffer*, char*);
int base_file_buffer_remove(BaseFileBuffer*, char*);
int read_base_file_list(BaseFileBuffer*, char*); int read_base_file_list(BaseFileBuffer*, char*);
int write_base_file_list(BaseFileBuffer*, char*); int write_base_file_list(BaseFileBuffer*, char*);

View file

@ -41,6 +41,7 @@ typedef List FileInfoBuffer;
List* list_new(size_t); List* list_new(size_t);
int list_push(List*, void*); int list_push(List*, void*);
int list_remove(List*, const void*, int (*compare)(const void*, const void*));
void list_free(List*); void list_free(List*);
void* binary_search(const void*, const void*, size_t, size_t, int (*compare)(const void*, const void*)); 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*)); void* list_binary_search(List*, const void*, int (*compare)(const void*, const void*));

View file

@ -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); 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) { int read_base_file_list(BaseFileBuffer* buffer, char* base_file_list_path) {
size_t compressed_size; size_t compressed_size;
unsigned char* compressed_data = (unsigned char*)get_file_content_with_size(base_file_list_path, &compressed_size); unsigned char* compressed_data = (unsigned char*)get_file_content_with_size(base_file_list_path, &compressed_size);

View file

@ -32,6 +32,29 @@ int list_push(List* list, void* item) {
return 1; 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) { void list_free(List* buffer) {
if (buffer) { if (buffer) {
for (size_t i = 0; i < buffer->len; i++) { 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* get_repo_path(char* repo_root_path, char* path) {
char* real_path = realpath(path, NULL); char* real_path = realpath(path, NULL);
cut_path(repo_root_path, real_path); 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; return real_path;
} }