diff options
Diffstat (limited to 'src/cc4group.c')
| -rw-r--r-- | src/cc4group.c | 102 |
1 files changed, 71 insertions, 31 deletions
diff --git a/src/cc4group.c b/src/cc4group.c index f040f23..4f9839b 100644 --- a/src/cc4group.c +++ b/src/cc4group.c @@ -49,12 +49,6 @@ static bool cc4group_getEntryData(CC4Group* const this, const char* const entryP #define CC4GROUP_UNEXPECTED_EOD -100 #define CC4GROUP_MEM_ERROR -101 -typedef enum { - Take, - Copy, - Reference -} CC4Group_MemoryManagement; - struct list_GroupEntryList; typedef struct C4GroupEntryData_t { C4GroupEntryCore core; @@ -115,25 +109,18 @@ typedef struct { static bool cc4group_applyMemoryManagementStart(CC4Group_MemoryManagement const management, const uint8_t** data, size_t size) { - if(management == Copy) + void* newData = management->start((void*)*data, size); + if(newData == NULL) { - uint8_t* copy = malloc(size); - if(copy == NULL) - { - return false; - } - memcpy(copy, *data, size); - *data = copy; + return false; } + *data = newData; return true; } static void cc4group_applyMemoryManagementEnd(CC4Group_MemoryManagement const management, const uint8_t* data) { - if(management == Copy || management == Take) - { - free((void*)data); - } + management->end((void*)data); } static const uint8_t* cc4group_getOnlyEntryData(CC4Group* const this, const C4GroupEntryData* entry); @@ -254,7 +241,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, .memoryManagement = Reference, .children = NULL, .parent = entry})->value; + C4GroupEntryData* childEntry = &GroupEntryListAppend(entry->children, (C4GroupEntryData){.core = *core, .data = childData + core->Offset, .memoryManagement = cc4group.MemoryManagement.Reference, .children = NULL, .parent = entry})->value; if(core->Directory) { @@ -513,7 +500,7 @@ static bool cc4group_inflateFillOutput(z_stream* const strm, CC4Group_ReadCallba return false; } -static bool cc4group_uncompressGroup(CC4Group* const this, CC4Group_ReadCallback const readCallback, void* const callbackArg, int const memoryManagement, CC4Group_ReadSetupCallback const initCallback, CC4Group_ReadSetupCallback const deinitCallback) +static bool cc4group_uncompressGroup(CC4Group* const this, CC4Group_ReadCallback const readCallback, void* const callbackArg, CC4Group_MemoryManagement const memoryManagement, CC4Group_ReadSetupCallback const initCallback, CC4Group_ReadSetupCallback const deinitCallback) { assert(this); assert(readCallback); @@ -852,7 +839,7 @@ static bool cc4group_readFilePointerReadCallback(const void** const data, size_t #undef CHUNK_SIZE } -static bool cc4group_openMemory(CC4Group* const this, const void* const compressedData, size_t const size, int const memoryManagement) +static bool cc4group_openMemory(CC4Group* const this, const void* const compressedData, size_t const size, CC4Group_MemoryManagement const memoryManagement) { assert(this); assert(compressedData); @@ -957,7 +944,7 @@ static bool cc4group_uncompressGroupFromFile(CC4Group* const this, const char* c } CompleteDataReadCallbackArg data = {.data = mappedFile, .size = size}; - success = cc4group_uncompressGroup(this, cc4group_completeDataReadCallback, &data, Reference, NULL, NULL); + success = cc4group_uncompressGroup(this, cc4group_completeDataReadCallback, &data, cc4group.MemoryManagement.Reference, NULL, NULL); ret: if(mappedFile != MAP_FAILED) @@ -989,7 +976,7 @@ static void cc4group_init(CC4Group* const this) this->uncompressedSize = 0; this->root.data = NULL; - this->root.memoryManagement = Reference; + this->root.memoryManagement = cc4group.MemoryManagement.Reference; this->root.parent = NULL; this->root.children = NULL; this->root.core.Directory = true; @@ -1152,7 +1139,7 @@ static bool cc4group_openFd(CC4Group* const this, int fd) // assert is in cc4group_uncompressGroup ChunkedReadData arg = {.arg = &fd}; - return cc4group_uncompressGroup(this, cc4group_readFdReadCallback, &arg, Reference, cc4group_initChunkBufferCallback, cc4group_deinitChunkBufferCallback); + return cc4group_uncompressGroup(this, cc4group_readFdReadCallback, &arg, cc4group.MemoryManagement.Reference, cc4group_initChunkBufferCallback, cc4group_deinitChunkBufferCallback); } static bool cc4group_openFilePointer(CC4Group* const this, FILE* file) @@ -1161,7 +1148,7 @@ static bool cc4group_openFilePointer(CC4Group* const this, FILE* file) assert(file); ChunkedReadData arg = {.arg = file}; - return cc4group_uncompressGroup(this, cc4group_readFilePointerReadCallback, &arg, Reference, cc4group_initChunkBufferCallback, cc4group_deinitChunkBufferCallback); + return cc4group_uncompressGroup(this, cc4group_readFilePointerReadCallback, &arg, cc4group.MemoryManagement.Reference, cc4group_initChunkBufferCallback, cc4group_deinitChunkBufferCallback); } static bool cc4group_openExisting(CC4Group* const this, const char* const path) @@ -2156,7 +2143,7 @@ static C4GroupEntryData* cc4group_createEntry(CC4Group* const this, const char* C4GroupEntryData entry; entry.data = NULL; - entry.memoryManagement = Reference; + entry.memoryManagement = cc4group.MemoryManagement.Reference; entry.children = GroupEntryListNew(); C4GroupEntryCore_init(&entry.core); @@ -2212,7 +2199,7 @@ static bool cc4group_createFile(CC4Group* const this, const char* const path) return true; } -static bool cc4group_setEntryData(CC4Group* const this, const char* const entryPath, const void* const data, size_t const size, int const memoryManagement) +static bool cc4group_setEntryData(CC4Group* const this, const char* const entryPath, const void* const data, size_t const size, CC4Group_MemoryManagement const memoryManagement) { assert(this); assert(entryPath); @@ -2229,7 +2216,7 @@ static bool cc4group_setEntryData(CC4Group* const this, const char* const entryP entry->data = NULL; entry->core.Size = 0; - entry->memoryManagement = Reference; + entry->memoryManagement = cc4group.MemoryManagement.Reference; } if(data != NULL && size != 0) @@ -2300,11 +2287,64 @@ static CC4Group* cc4group_openAsChild(CC4Group* const this, const char* const pa return child; } +static void* cc4group_memoryManagementTakeStart(void* const data, size_t const size) +{ + (void)size; + return data; +} + +static void cc4group_memoryManagementTakeEnd(void* const data) +{ + free(data); +} + +static void* cc4group_memoryManagementCopyStart(void* const data, size_t const size) +{ + uint8_t* copy = malloc(size); + if(copy == NULL) + { + return NULL; + } + memcpy(copy, data, size); + return copy; +} + +static void cc4group_memoryManagementCopyEnd(void* const data) +{ + free(data); +} + +static void* cc4group_memoryManagementReferenceStart(void* const data, size_t const size) +{ + (void)size; + return data; +} + +static void cc4group_memoryManagementReferenceEnd(void* const data) +{ + (void)data; +} + +static CC4Group_MemoryManagement_t takeMemoryManagement = { + .start = cc4group_memoryManagementTakeStart, + .end = cc4group_memoryManagementTakeEnd, +}; + +static CC4Group_MemoryManagement_t copyMemoryManagement = { + .start = cc4group_memoryManagementCopyStart, + .end = cc4group_memoryManagementCopyEnd, +}; + +static CC4Group_MemoryManagement_t referenceMemoryManagement = { + .start = cc4group_memoryManagementReferenceStart, + .end = cc4group_memoryManagementReferenceEnd, +}; + CC4Group_API cc4group = { .MemoryManagement = { - .Take = Take, - .Copy = Copy, - .Reference = Reference + .Take = &takeMemoryManagement, + .Copy = ©MemoryManagement, + .Reference = &referenceMemoryManagement }, |
