diff options
| -rw-r--r-- | src/cc4group.c | 44 |
1 files changed, 20 insertions, 24 deletions
diff --git a/src/cc4group.c b/src/cc4group.c index abf0b12..ca5d0db 100644 --- a/src/cc4group.c +++ b/src/cc4group.c @@ -46,10 +46,16 @@ static bool cc4group_getEntryData(CC4Group* const this, const char* const entryP #define C4GroupMagic1 0x1e #define C4GroupMagic2 0x8c +typedef enum { + Take, + Copy, + Reference +} CC4Group_MemoryManagement; + struct list_GroupEntryList; typedef struct C4GroupEntryData_t { C4GroupEntryCore core; - bool freeData; + CC4Group_MemoryManagement memoryManagement; union { uint8_t* data; // if the entry is a directory, the beginning of the data contains the header @@ -91,12 +97,6 @@ struct CC4Group_t { } error; }; -typedef enum { - Take, - Copy, - Reference -} CC4Group_MemoryManagement; - static bool cc4group_applyMemoryManagementStart(CC4Group_MemoryManagement const management, const uint8_t** data, size_t size) { if(management == Copy) @@ -199,7 +199,7 @@ static bool buildChildren(CC4Group* const this, C4GroupEntryData* const entry, s return false; } - C4GroupEntryData* childEntry = &GroupEntryListAppend(entry->children, (C4GroupEntryData){.core = *core, .data = childData + core->Offset, .freeData = false, .children = NULL, .parent = entry})->value; + C4GroupEntryData* childEntry = &GroupEntryListAppend(entry->children, (C4GroupEntryData){.core = *core, .data = childData + core->Offset, .memoryManagement = Reference, .children = NULL, .parent = entry})->value; if(core->Directory) { @@ -218,9 +218,9 @@ static void deleteChildren(GroupEntryList* const entries) { ForeachGroupEntry(entries) { - if(entry->value.freeData && entry->value.data != NULL) + if(entry->value.data != NULL) { - free(entry->value.data); + cc4group_applyMemoryManagementEnd(entry->value.memoryManagement, entry->value.data); } if(entry->value.core.Directory) @@ -861,7 +861,7 @@ static void cc4group_init(CC4Group* const this) this->uncompressedSize = 0; this->root.data = NULL; - this->root.freeData = false; + this->root.memoryManagement = Reference; this->root.parent = NULL; this->root.children = NULL; this->root.core.Directory = true; @@ -1786,7 +1786,7 @@ static C4GroupEntryData* cc4group_createEntry(CC4Group* const this, const char* C4GroupEntryData entry; entry.data = NULL; - entry.freeData = false; + entry.memoryManagement = Reference; entry.children = GroupEntryListNew(); C4GroupEntryCore_init(&entry.core); @@ -1853,35 +1853,31 @@ static bool cc4group_setEntryData(CC4Group* const this, const char* const entryP return false; } - if(entry->freeData && entry->data != NULL) + if(entry->data != NULL) { - free(entry->data); + cc4group_applyMemoryManagementEnd(entry->memoryManagement, entry->data); } if(data != NULL && size != 0) { - if(memoryManagement == Copy) + const uint8_t* ownData = data; + if(!cc4group_applyMemoryManagementStart(memoryManagement, &ownData, size)) { - entry->data = malloc(size); - if(entry->data == NULL) - { - SET_ERRNO_ERROR("malloc: allocating memory for copying the file data"); - return false; - } - memcpy(entry->data, data, size); + SET_ERRNO_ERROR("memoryManagement: allocating memory for copying the file data"); + return false; } else { entry->data = (void*)data; } entry->core.Size = size; - entry->freeData = memoryManagement != Reference; + entry->memoryManagement = memoryManagement; } else { entry->data = NULL; entry->core.Size = 0; - entry->freeData = false; + entry->memoryManagement = Reference; } entry->core.HasCRC = C4GroupEntryCore_NoCRC; |
