更新解析配置文件
parent
52b3d6e7ac
commit
1aeb4f6a33
37
src/conf.c
37
src/conf.c
|
|
@ -50,7 +50,7 @@ int conf_parse(CONF *conf)
|
|||
int i;
|
||||
|
||||
//加载配置文件内容到内存
|
||||
if(fseek(conf->fp,0L,SEEK_END) == 0)
|
||||
if(fseek(conf->fp,0L,SEEK_END) != 0)
|
||||
return CONF_NO_INIT;
|
||||
//得到长度
|
||||
file_len=ftell(conf->fp);
|
||||
|
|
@ -88,7 +88,7 @@ int conf_parse(CONF *conf)
|
|||
conf_value_insert(conf->hash_data,&value[i],conf->len);
|
||||
|
||||
free(data);
|
||||
free(value);
|
||||
//free(value);
|
||||
|
||||
return retcode;
|
||||
}
|
||||
|
|
@ -239,6 +239,9 @@ void conf_error(int errcode)
|
|||
case CONF_VALUE_ERR:
|
||||
printf("错误:错误的值!\n");
|
||||
break;
|
||||
case STACK_MAX:
|
||||
printf("参数字符过多!\n");
|
||||
break;
|
||||
default:
|
||||
printf("未知错误!\n");
|
||||
}
|
||||
|
|
@ -269,11 +272,14 @@ int parse_value(CONF *conf,char *data,CONF_VALUE **res)
|
|||
value[len].key=malloc(sizeof(char)*stack_length(&stack)+1);
|
||||
snprintf(value[len].key,sizeof(char)*stack_length(&stack)+1,"%s",stack.data);
|
||||
key=1;
|
||||
value[len].value=NULL;
|
||||
stack_cleanup(&stack);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(stack_push(&stack,data[i]) != 0) //否则则是值压入栈
|
||||
return STACK_MAX;
|
||||
}
|
||||
break;
|
||||
/* 如果第一次读到"则设置"标记
|
||||
* 如果不是第一次读入"则如果flags为1则表示读取完成
|
||||
|
|
@ -285,8 +291,10 @@ int parse_value(CONF *conf,char *data,CONF_VALUE **res)
|
|||
else if(flags == 1)
|
||||
flags=0;
|
||||
else if(flags == 2)
|
||||
{
|
||||
if(stack_push(&stack,data[i]) != 0)
|
||||
return STACK_MAX;
|
||||
}
|
||||
break;
|
||||
case '\'': //上同
|
||||
if(!flags)
|
||||
|
|
@ -294,8 +302,10 @@ int parse_value(CONF *conf,char *data,CONF_VALUE **res)
|
|||
else if(flags == 2)
|
||||
flags=0;
|
||||
else if(flags == 1)
|
||||
{
|
||||
if(stack_push(&stack,data[i]) != 0)
|
||||
return STACK_MAX;
|
||||
}
|
||||
break;
|
||||
/* 多参数标记
|
||||
* 如果已设置'/"标记则直接压入
|
||||
|
|
@ -309,8 +319,9 @@ int parse_value(CONF *conf,char *data,CONF_VALUE **res)
|
|||
arg=1;
|
||||
if(arg) //存入多参数
|
||||
{
|
||||
value[len].value=realloc(value[len].value,sizeof(char)*count+1);
|
||||
snprintf(value[len].value[count],sizeof(char)*count+1,"%s",stack.data);
|
||||
value[len].value=realloc(value[len].value,sizeof(char *)*(count+1));
|
||||
value[len].value[count]=malloc(sizeof(char)*stack_length(&stack)+1);
|
||||
snprintf(value[len].value[count],sizeof(char)*stack_length(&stack)+1,"%s",stack.data);
|
||||
++count;
|
||||
stack_cleanup(&stack);
|
||||
arg=0;
|
||||
|
|
@ -320,31 +331,41 @@ int parse_value(CONF *conf,char *data,CONF_VALUE **res)
|
|||
if(!flags)
|
||||
i+=next_line(data+i);
|
||||
else
|
||||
{
|
||||
if(stack_push(&stack,data[i]) != 0)
|
||||
return STACK_MAX;
|
||||
}
|
||||
break;
|
||||
case ' ':
|
||||
case '\t':
|
||||
if(flags)
|
||||
{
|
||||
if(stack_push(&stack,data[i]) != 0)
|
||||
return STACK_MAX;
|
||||
}
|
||||
break;
|
||||
case '\n': //一行数据读完
|
||||
if(stack_empty(&stack))
|
||||
break;
|
||||
value[len].value=realloc(value[len].value,sizeof(char)*count+1);
|
||||
snprintf(value[len].value[count],sizeof(char)*count+1,"%s",stack.data);
|
||||
value[len].value=realloc(value[len].value,sizeof(char *)*(count+2));
|
||||
value[len].value[count]=malloc(sizeof(char)*stack_length(&stack)+1);
|
||||
snprintf(value[len].value[count],sizeof(char)*stack_length(&stack)+1,"%s",stack.data);
|
||||
value[len].value[count+1]=NULL;
|
||||
count=0;
|
||||
++len;
|
||||
key=0;
|
||||
stack_cleanup(&stack);
|
||||
break;
|
||||
default: //插入字符
|
||||
if(stack_push(&stack,data[i]) != 0)
|
||||
return STACK_MAX;
|
||||
}
|
||||
|
||||
++i;
|
||||
}
|
||||
|
||||
*res=value;
|
||||
conf->len=len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -356,7 +377,7 @@ int next_line(char *data)
|
|||
while(data[i] != '\n')
|
||||
++i;
|
||||
|
||||
return i+1;
|
||||
return i;
|
||||
}
|
||||
|
||||
void free_data(CONF_ARG *data)
|
||||
|
|
@ -369,7 +390,7 @@ void free_data(CONF_ARG *data)
|
|||
for(i=0;data->value->value[i] != NULL;++i)
|
||||
free(data->value->value[i]);
|
||||
free(data->value->value);
|
||||
free(data->value);
|
||||
//free(data->value);
|
||||
|
||||
data=data->next;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@
|
|||
#define CONF_NO_MEM -3 //申请内存出错
|
||||
#define CONF_KEY_ERR -4 //键错误
|
||||
#define CONF_VALUE_ERR -5 //值错误
|
||||
#define STACK_MAX -6 //过大的参数
|
||||
|
||||
//保存配置文件数据结构
|
||||
//value为键值对数据结构
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@ unsigned int hash_func2(const char *key);
|
|||
/* 在hash_data中找出key
|
||||
* 如果找到则将值赋给value并返回1
|
||||
* 否则返回0 */
|
||||
int hash_search(CONF_ARG *arg,char *key,CONF_VALUE *value);
|
||||
int hash_search(CONF_ARG *arg,char *key,CONF_VALUE **value);
|
||||
//插入数据
|
||||
void hash_insert(CONF_ARG *arg,CONF_VALUE *value);
|
||||
|
||||
void conf_value_insert(CONF_ARG *arg,CONF_VALUE *value,int len)
|
||||
{
|
||||
|
|
@ -29,10 +31,11 @@ void conf_value_insert(CONF_ARG *arg,CONF_VALUE *value,int len)
|
|||
//当前位置数据个数加1
|
||||
++arg[hash].len;
|
||||
//插入数据
|
||||
while(arg[hash].next != NULL)
|
||||
arg[hash]=arg[hash].next;
|
||||
/*while(arg[hash].next != NULL)
|
||||
arg[hash]=arg[hash].next;*/
|
||||
hash_insert(&arg[hash],value);
|
||||
|
||||
arg[hash].value=value;
|
||||
//arg[hash].value=value;
|
||||
}
|
||||
|
||||
CONF_VALUE *conf_value_get(CONF *conf,const char *key)
|
||||
|
|
@ -44,12 +47,12 @@ CONF_VALUE *conf_value_get(CONF *conf,const char *key)
|
|||
* 否则使用第二个哈希函数计算值并比对key
|
||||
* 如果都未能匹配,则返回NULL */
|
||||
hash=hash_func1(key)%conf->len;
|
||||
if(hash_search(&conf->hash_data[hash],key,value))
|
||||
if(hash_search(&conf->hash_data[hash],key,&value))
|
||||
return value;
|
||||
else
|
||||
{
|
||||
hash=hash_func2(key)%conf->len;
|
||||
if(hash_search(&conf->hash_data[hash],key,value))
|
||||
if(hash_search(&conf->hash_data[hash],key,&value))
|
||||
return value;
|
||||
}
|
||||
|
||||
|
|
@ -121,18 +124,18 @@ unsigned int hash_func2(const char *key)
|
|||
return hash&0x7FFFFFFF;
|
||||
}
|
||||
|
||||
int hash_search(CONF_ARG *arg,char *key,CONF_VALUE *value)
|
||||
int hash_search(CONF_ARG *arg,char *key,CONF_VALUE **value)
|
||||
{
|
||||
//如果该位置没有数据返回0
|
||||
if(arg->len == 0)
|
||||
return 0;
|
||||
//否则进行查找
|
||||
while(arg->next != NULL)
|
||||
while(arg != NULL)
|
||||
{
|
||||
//如果找到返回
|
||||
if(strcmp(arg->value->key,key) == 0)
|
||||
{
|
||||
value=arg->value;
|
||||
*value=arg->value;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -143,3 +146,11 @@ int hash_search(CONF_ARG *arg,char *key,CONF_VALUE *value)
|
|||
//如果没有找到返回0
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hash_insert(CONF_ARG *arg,CONF_VALUE *value)
|
||||
{
|
||||
while(arg->next != NULL)
|
||||
arg=arg->next;
|
||||
|
||||
arg->value=value;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#endif
|
||||
//键和参数的最大值
|
||||
#define MAX_ARG_SIZE 512
|
||||
#define STACK_MAX -6 //过大的参数
|
||||
/*栈数据结构*/
|
||||
typedef struct
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue