summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cc4group.c44
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;