diff --git a/Core/Stream.c b/Core/Stream.c
index 44964e9..fe7b268 100644
--- a/Core/Stream.c
+++ b/Core/Stream.c
@@ -261,18 +261,12 @@ int StreamSeek(Stream_t* st, int sek, SeekOrigin_e of)
return st->Position;
}
-static MemOptions_t const OptDefault =
-{
- .malloc = malloc,
- .free = free,
-};
-
// 自动扩容的 Steam 函数 API。
// 初始化的时候自动分配 128 字节。后续扩容按照 128 字节增加。
// 扩容的内存来自 GlobalMalloc GlobalFree 这对函数。
void AutoStreamInit(Stream_t* st, int len, MemOptions_t* opt)
{
- if (opt == NULL)opt = (MemOptions_t*)&OptDefault;
+ if (opt == NULL)opt = (MemOptions_t*)&GlobleMemOpt;
if (len < 1)len = 128;
byte* p = (byte*)opt->malloc(len);
@@ -291,7 +285,7 @@ void AutoStreamInit(Stream_t* st, int len, MemOptions_t* opt)
void AutoStreamDeInit(Stream_t* st, MemOptions_t* opt)
{
- if (opt == NULL)opt = (MemOptions_t*)&OptDefault;
+ if (opt == NULL)opt = (MemOptions_t*)&GlobleMemOpt;
if (st->MemStart != NULL)
{
@@ -306,7 +300,8 @@ void AutoStreamDeInit(Stream_t* st, MemOptions_t* opt)
bool AutoStreamSetCapacity(Stream_t* st, int len, MemOptions_t* opt)
{
if (st->Size >= len)return true;
- if (opt == NULL)opt = (MemOptions_t*)&OptDefault;
+
+ if (opt == NULL)opt = (MemOptions_t*)&GlobleMemOpt;
byte* p = (byte*)opt->malloc(len);
byte* oldp = st->MemStart;
@@ -323,7 +318,7 @@ bool AutoStreamSetCapacity(Stream_t* st, int len, MemOptions_t* opt)
int AutoStreamWriteByte(Stream_t* st, byte data, MemOptions_t* opt)
{
- if (opt == NULL)opt = (MemOptions_t*)&OptDefault;
+ if (opt == NULL)opt = (MemOptions_t*)&GlobleMemOpt;
int remain = StreamRemian(st);
if (remain < 1)
@@ -349,7 +344,7 @@ int AutoStreamWriteByte(Stream_t* st, byte data, MemOptions_t* opt)
int AutoStreamWriteBytes(Stream_t* st, byte* p, int len, MemOptions_t* opt)
{
- if (opt == NULL)opt = (MemOptions_t*)&OptDefault;
+ if (opt == NULL)opt = (MemOptions_t*)&GlobleMemOpt;
int remain = StreamRemian(st);
if (remain < len)
diff --git a/Core/Type.c b/Core/Type.c
index f5413e3..34edde6 100644
--- a/Core/Type.c
+++ b/Core/Type.c
@@ -5,17 +5,28 @@
#if defined ( __CC_ARM )
__weak MallocFunc GlobleMalloc = malloc;
__weak FreeFunc GlobleFree = free;
+__weak MemOptions_t GlobleMemOpt = {.malloc = malloc, .free = free };
#endif
#if defined ( __GNUC__ )
__attribute__((weak)) MallocFunc GlobleMalloc = malloc;
__attribute__((weak)) FreeFunc GlobleFree = free;
+__attribute__((weak)) MemOptions_t GlobleMemOpt = {.malloc = malloc, .free = free };
#endif
#if !(defined ( __CC_ARM ) || defined ( __GNUC__ ))
-#error "need define weak GlobleMalloc GlobleFree"
+#error "need define weak GlobleMalloc GlobleFree GlobleMemOpt"
#endif
+// 一次设置 GlobleMalloc GlobleFree GlobleMemOpt
+void SetGlobleMemOpt(MallocFunc malloc, FreeFunc free)
+{
+ GlobleMalloc = malloc;
+ GlobleFree = free;
+ GlobleMemOpt.malloc = malloc;
+ GlobleMemOpt.free = free;
+}
+
__inline void InitBuffer(Buffer_t* data) { memset(data, 0x00, sizeof(Buffer_t)); data->free = GlobleFree;}
__inline void InitBuffer2(Buffer2_t* data) { memset(data, 0x00, sizeof(Buffer2_t));data->free = GlobleFree;}
diff --git a/Core/Type.h b/Core/Type.h
index 6be9a4f..73ef0ba 100644
--- a/Core/Type.h
+++ b/Core/Type.h
@@ -33,17 +33,21 @@ typedef void(*EventHandler)(void* sender, void* param);
typedef void* (*MallocFunc)(size_t size);
typedef void (*FreeFunc)(void* p);
+typedef struct
+{
+ MallocFunc malloc;
+ FreeFunc free;
+}MemOptions_t;
+
// 全局的 malloc free 函数。
// 用于用系统和不用系统时候的切换。避免需要修改太多东西。
// 需要手动实现。
extern MallocFunc GlobleMalloc;
extern FreeFunc GlobleFree;
+extern MemOptions_t GlobleMemOpt;
+// 一次设置 GlobleMalloc GlobleFree GlobleMemOpt
+void SetGlobleMemOpt(MallocFunc malloc, FreeFunc free);
-typedef struct
-{
- MallocFunc malloc;
- FreeFunc free;
-}MemOptions_t;
// 缓冲区
typedef struct