support annotataion map set incrementally

pull/37/head
yuqing 2017-02-28 17:57:09 +08:00
parent c78d3d7a2a
commit b967e39e64
2 changed files with 52 additions and 25 deletions

View File

@ -1,10 +1,11 @@
Version 1.35 2017-02-27 Version 1.35 2017-02-28
* logger judge log_level in function log_it_ex and log_it_ex1 * logger judge log_level in function log_it_ex and log_it_ex1
* add php extension function: fastcommon_file_put_contents * add php extension function: fastcommon_file_put_contents
* add function fc_safe_read and fc_safe_write * add function fc_safe_read and fc_safe_write
* add function fc_ftok * add function fc_ftok
* add function fc_trim to avoid conflict with trim * add function fc_trim to avoid conflict with trim
* ini_file_reader support annotataion map set incrementally
Version 1.34 2017-02-06 Version 1.34 2017-02-06
* ini_file_reader: LOCAL_IP support CIDR addresses * ini_file_reader: LOCAL_IP support CIDR addresses

View File

@ -54,7 +54,8 @@
#define _MAX_DYNAMIC_CONTENTS 8 #define _MAX_DYNAMIC_CONTENTS 8
static AnnotationMap *g_annotataionMap = NULL; static AnnotationMap *g_annotataion_map = NULL;
static int g_annotataion_count = 0;
typedef struct { typedef struct {
int count; int count;
@ -74,12 +75,11 @@ typedef struct {
SetDirectiveVars set; SetDirectiveVars set;
} CDCPair; } CDCPair;
//dynamic alloced contents which will be freed when destroy
static int g_dynamic_content_count = 0; static int g_dynamic_content_count = 0;
static int g_dynamic_content_index = 0; static int g_dynamic_content_index = 0;
static CDCPair g_dynamic_contents[_MAX_DYNAMIC_CONTENTS] = {{false, NULL, {0, 0, NULL}, {0, NULL}}}; static CDCPair g_dynamic_contents[_MAX_DYNAMIC_CONTENTS] = {{false, NULL, {0, 0, NULL}, {0, NULL}}};
//dynamic alloced contents which will be freed when destroy
static int remallocSection(IniSection *pSection, IniItem **pItem); static int remallocSection(IniSection *pSection, IniItem **pItem);
static int iniDoLoadFromFile(const char *szFilename, \ static int iniDoLoadFromFile(const char *szFilename, \
IniContext *pContext); IniContext *pContext);
@ -95,7 +95,10 @@ static int iniLoadItemsFromBuffer(char *content, \
int iniSetAnnotationCallBack(AnnotationMap *map, int count) int iniSetAnnotationCallBack(AnnotationMap *map, int count)
{ {
int bytes; int bytes;
AnnotationMap *p; AnnotationMap *pSrc;
AnnotationMap *pSrcEnd;
AnnotationMap *pDest;
AnnotationMap *pDestEnd;
if (count <= 0) if (count <= 0)
{ {
@ -105,23 +108,44 @@ int iniSetAnnotationCallBack(AnnotationMap *map, int count)
return EINVAL; return EINVAL;
} }
bytes = sizeof(AnnotationMap) * (count + 1); bytes = sizeof(AnnotationMap) * (g_annotataion_count + count + 1);
g_annotataionMap = (AnnotationMap *) malloc(bytes); g_annotataion_map = (AnnotationMap *)realloc(g_annotataion_map, bytes);
if (g_annotataionMap == NULL) if (g_annotataion_map == NULL)
{ {
logError("file: "__FILE__", line: %d, " \ logError("file: "__FILE__", line: %d, " \
"malloc (%d) fail, errno: %d, error info: %s", \ "realloc %d fail, errno: %d, error info: %s", \
__LINE__, bytes, errno, STRERROR(errno)); __LINE__, bytes, errno, STRERROR(errno));
return ENOMEM; return ENOMEM;
} }
memcpy(g_annotataionMap, map, sizeof(AnnotationMap) * count); pSrcEnd = map + count;
pDestEnd = g_annotataion_map + g_annotataion_count;
for (pSrc=map; pSrc<pSrcEnd; pSrc++)
{
for (pDest=g_annotataion_map; pDest<pDestEnd; pDest++)
{
if (strcmp(pSrc->func_name, pDest->func_name) == 0)
{
break;
}
}
p = g_annotataionMap + count; pDest->func_name = pSrc->func_name;
p->func_name = NULL; pDest->func_init = pSrc->func_init;
p->func_init = NULL; pDest->func_destroy = pSrc->func_destroy;
p->func_destroy = NULL; pDest->func_get = pSrc->func_get;
p->func_get = NULL; if (pDest == pDestEnd) //insert
{
++g_annotataion_count;
pDestEnd = g_annotataion_map + g_annotataion_count;
}
}
pDest = g_annotataion_map + g_annotataion_count;
pDest->func_name = NULL;
pDest->func_init = NULL;
pDest->func_destroy = NULL;
pDest->func_get = NULL;
return 0; return 0;
} }
@ -130,22 +154,24 @@ void iniDestroyAnnotationCallBack()
{ {
AnnotationMap *pAnnoMap; AnnotationMap *pAnnoMap;
pAnnoMap = g_annotataionMap; if (g_annotataion_map == NULL)
if (pAnnoMap == NULL)
{ {
return; return;
} }
pAnnoMap = g_annotataion_map;
while (pAnnoMap->func_name) while (pAnnoMap->func_name)
{ {
if (pAnnoMap->func_destroy) if (pAnnoMap->func_destroy != NULL)
{ {
pAnnoMap->func_destroy(); pAnnoMap->func_destroy();
} }
pAnnoMap++; pAnnoMap++;
} }
g_annotataionMap = NULL;
free(g_annotataion_map);
g_annotataion_map = NULL;
g_annotataion_count = 0;
} }
static int iniCompareByItemName(const void *p1, const void *p2) static int iniCompareByItemName(const void *p1, const void *p2)
@ -617,7 +643,7 @@ static int iniDoLoadItemsFromBuffer(char *content, IniContext *pContext)
if (isAnnotation) if (isAnnotation)
{ {
isAnnotation = 0; isAnnotation = 0;
if (g_annotataionMap == NULL) if (g_annotataion_map == NULL)
{ {
logWarning("file: "__FILE__", line: %d, " \ logWarning("file: "__FILE__", line: %d, " \
"not set annotataionMap and (%s) will use " \ "not set annotataionMap and (%s) will use " \
@ -629,17 +655,17 @@ static int iniDoLoadItemsFromBuffer(char *content, IniContext *pContext)
} }
nItemCnt = -1; nItemCnt = -1;
pAnnoMap = g_annotataionMap; pAnnoMap = g_annotataion_map;
while (pAnnoMap->func_name) while (pAnnoMap->func_name != NULL)
{ {
if (strcmp(pFuncName, pAnnoMap->func_name) == 0) if (strcmp(pFuncName, pAnnoMap->func_name) == 0)
{ {
if (pAnnoMap->func_init) if (pAnnoMap->func_init != NULL)
{ {
pAnnoMap->func_init(); pAnnoMap->func_init();
} }
if (pAnnoMap->func_get) if (pAnnoMap->func_get != NULL)
{ {
nItemCnt = pAnnoMap->func_get(pItem->value, pItemValues, 100); nItemCnt = pAnnoMap->func_get(pItem->value, pItemValues, 100);
} }