//配置文件是指 ini 格式
//
#include <string.h> //for memset
#define SET_ARRAY_CLEAN(x) memset((x),0,sizeof(x))
typedef void* (*ArgHandleFunc)(void* arg,...);
ArgHandleFunc gDefaultHandler;
struct Handler
{
//
ArgHandleFunc m_handler;
//指向具体参数结构体的指针
void *m_pas; //as: argument struct
} gp_Handler={gDefaultHandler,NULL};
int SetParamsByConfigFile(char *cfgfile,struct Handler *pHandler)
{
FILE *fp=fopen(cfgfile,"r");
if (fp==NULL)
{
printf("无法打开指定的参数文件[%s],可能是文件不存在!\n",cfgfile);
return -1;
}
struct Handler *localHandler=()(0!=pHandler)? pHandler :&gp_Handler);
char gline[128]={0};
char pname[64]={0},pvalue[64]={0};
int lineTotal=0,readOK=0;
while(feof(fp)==0)
{
if(0!=readOK)
{
ARRAY_SET_CLEAN(gline);
readOK=0;
}
if (fgets(gline,sizeof(gline),fp))
{
lineTotal++;
readOK=1;
if (gline[0]=='#'||gline[0]==';'||gline[0]=='"'
||(gline[0]=='/'&&gline[1]=='/')
||!strcmp(gline,"")||gline[0]=='\r'||gline[0]=='\n')
{
continue;
}
char *p=strstr(gline,"=");
if (NULL != p)
{
strncpy(pname,gline,p-gline);
char *pvStart=p+1;
p=strstr(pvStart,"\r");
if (NULL==p)
{
p=strstr(pvStart,"\n");
}
if (NULL !=p)
{
strncpy(pvalue,pvStart,p-pvStart);
}
if(pname[0]!='\0'&&pvalue[0]!='\0')
{
localHandler->m_handler(pname,pvalue);
SET_ARRAY_CLEAN(pname);
SET_ARRAY_CLEAN(pvalue);
}
else
{
printf("文件格式不对:参数文件中第%d行的参数项[%s]没有指明具体的参数值(参数=参数值).\r\n",lineTotal,gline);
return -1;
}
}
}
}
if (NULL!=fp)
{
fclose(fp);
}
return 0;
}