summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cc4group.c22
-rw-r--r--src/cc4group.h6
2 files changed, 18 insertions, 10 deletions
diff --git a/src/cc4group.c b/src/cc4group.c
index 4f9839b..3782681 100644
--- a/src/cc4group.c
+++ b/src/cc4group.c
@@ -109,7 +109,7 @@ typedef struct {
static bool cc4group_applyMemoryManagementStart(CC4Group_MemoryManagement const management, const uint8_t** data, size_t size)
{
- void* newData = management->start((void*)*data, size);
+ void* newData = management->start((void*)*data, size, management->arg);
if(newData == NULL)
{
return false;
@@ -120,7 +120,7 @@ static bool cc4group_applyMemoryManagementStart(CC4Group_MemoryManagement const
static void cc4group_applyMemoryManagementEnd(CC4Group_MemoryManagement const management, const uint8_t* data)
{
- management->end((void*)data);
+ management->end((void*)data, management->arg);
}
static const uint8_t* cc4group_getOnlyEntryData(CC4Group* const this, const C4GroupEntryData* entry);
@@ -2287,19 +2287,22 @@ static CC4Group* cc4group_openAsChild(CC4Group* const this, const char* const pa
return child;
}
-static void* cc4group_memoryManagementTakeStart(void* const data, size_t const size)
+static void* cc4group_memoryManagementTakeStart(void* const data, size_t const size, void* const arg)
{
(void)size;
+ (void)arg;
return data;
}
-static void cc4group_memoryManagementTakeEnd(void* const data)
+static void cc4group_memoryManagementTakeEnd(void* const data, void* const arg)
{
+ (void)arg;
free(data);
}
-static void* cc4group_memoryManagementCopyStart(void* const data, size_t const size)
+static void* cc4group_memoryManagementCopyStart(void* const data, size_t const size, void* const arg)
{
+ (void)arg;
uint8_t* copy = malloc(size);
if(copy == NULL)
{
@@ -2309,20 +2312,23 @@ static void* cc4group_memoryManagementCopyStart(void* const data, size_t const s
return copy;
}
-static void cc4group_memoryManagementCopyEnd(void* const data)
+static void cc4group_memoryManagementCopyEnd(void* const data, void* const arg)
{
+ (void)arg;
free(data);
}
-static void* cc4group_memoryManagementReferenceStart(void* const data, size_t const size)
+static void* cc4group_memoryManagementReferenceStart(void* const data, size_t const size, void* const arg)
{
(void)size;
+ (void)arg;
return data;
}
-static void cc4group_memoryManagementReferenceEnd(void* const data)
+static void cc4group_memoryManagementReferenceEnd(void* const data, void* const arg)
{
(void)data;
+ (void)arg;
}
static CC4Group_MemoryManagement_t takeMemoryManagement = {
diff --git a/src/cc4group.h b/src/cc4group.h
index 0a3ceb4..780c50e 100644
--- a/src/cc4group.h
+++ b/src/cc4group.h
@@ -140,10 +140,12 @@ typedef void* (*CC4Group_TmpMemoryStrategy)(CC4Group* const this, const size_t s
// actually, a memory management strategy is a pointer to an instance of this struct
// it consists of a start function (like allocating some memory and making a copy)
// and of an end function, which does the actual cleanup
+// and an optional custom arg that will be passed to both functions
// additionally to the predefined memory management strategies, custom strategies may be used
typedef struct {
- void* (*start)(void* const data, const size_t size);
- void (*end)(void* const data);
+ void* (*start)(void* const data, const size_t size, void* const arg);
+ void (*end)(void* const data, void* const arg);
+ void* arg;
} const CC4Group_MemoryManagement_t;
typedef CC4Group_MemoryManagement_t* CC4Group_MemoryManagement;