diff --git a/src/conf.c b/src/conf.c index adbd3cc..be6d449 100644 --- a/src/conf.c +++ b/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; } diff --git a/src/conf.h b/src/conf.h index 5b06f00..cd4bb44 100644 --- a/src/conf.h +++ b/src/conf.h @@ -20,7 +20,6 @@ #define CONF_NO_MEM -3 //申请内存出错 #define CONF_KEY_ERR -4 //键错误 #define CONF_VALUE_ERR -5 //值错误 -#define STACK_MAX -6 //过大的参数 //保存配置文件数据结构 //value为键值对数据结构 diff --git a/src/hash/hash.c b/src/hash/hash.c index f768461..ab4cf4c 100644 --- a/src/hash/hash.c +++ b/src/hash/hash.c @@ -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; +} diff --git a/src/stack/stack.h b/src/stack/stack.h index a3016f6..be03997 100644 --- a/src/stack/stack.h +++ b/src/stack/stack.h @@ -9,6 +9,7 @@ #endif //键和参数的最大值 #define MAX_ARG_SIZE 512 +#define STACK_MAX -6 //过大的参数 /*栈数据结构*/ typedef struct {