feat(utilities,basefiles): added remove function to List and BaseFileBuffer
This commit is contained in:
parent
967b79d9ba
commit
e3a2f43871
4 changed files with 38 additions and 0 deletions
|
|
@ -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*);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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*));
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue