parse_file(structini_parser*ini,constchar*file){
FILE*fp=fopen(file,"r");
if(fp)
{
structtag_value_pair*pair=0;
charbuf[1024]={0};
while(fgets(buf,1024,fp))
{
pair=parse_line(buf,strlen(buf));
if(pair)
{
ini->keyvalues->add(ini->keyvalues,pair);
}
}
fclose(fp);
returnini->keyvalues->size;
}
return-1;
}
staticint_parse_text(structini_parser*ini,constchar*text){
char*p=text;
char*start=0;
structtag_value_pair*pair=0;
if(!text)return-1;
while(1)
{
start=p;
while(*p!='\n'&&*p!='\0')++p;
if(*p=='\0')break;
pair=parse_line(start,p-start);
if(pair)ini->keyvalues->add(ini->keyvalues,pair);
++p;
}
returnini->keyvalues->size;
}
staticchar*_value(structini_parser*ini,constchar*key){
structtag_value_pair*pair=NODE_T(ini->keyvalues->find_by_key(ini->keyvalues,key),structtag_value_pair);
if(pair)returnpair->szValue;
return0;
}
staticvoid_set_value(structini_parser*ini,constchar*key,constchar*value){
structtag_value_pair*pair=NODE_T(ini->keyvalues->find_by_key(ini->keyvalues,key),structtag_value_pair);
if(pair)
{
if(pair->szValue)free(pair->szValue);
pair->szValue=strdup(value);
}
else
{
ini->keyvalues->add(ini->keyvalues,make_tag_value_pair(key,value));
}
}
staticvoid_remove(structini_parser*ini,constchar*key){
structtag_value_pair*pair=NODE_T(ini->keyvalues->find_by_key(ini->keyvalues,key),structtag_value_pair);
if(pair)ini->keyvalues->remove(ini->keyvalues,pair);
}
staticvoidwrite_keyvalue(structtag_value_pair*pair,FILE*fp)
{
fputs(pair->szTag,fp);
fputc('=',fp);
fputs(pair->szValue,fp);
fputc('\n',fp);
}
staticint_save_to_file(structini_parser*ini,constchar*file){
if(ini->keyvalues->size>0)
{
FILE*fp=fopen(file,"w");
if(fp)
{
structtag_value_pair*pair=NODE_T(ini->keyvalues->head,structtag_value_pair);
while(pair!=0)
{
write_keyvalue(pair,fp);
pair=NODE_T(pair->node.next,structtag_value_pair);
}
fclose(fp);
return0;
}
}
return-1;
}
staticvoid_delete_ini_parser(structini_parser*ini){
if(ini)
{
ini->keyvalues->deletor(ini->keyvalues);
free(ini);
}
}
structini_parser*new_ini_parser(){
structini_parser*ini=(structini_parser*)malloc(sizeof(structini_parser));
ini->keyvalues=new_tag_value_list();
ini->parse_file=_parse_file;
ini->parse_string=_parse_text;
ini->value=_value;
ini->set_value=_set_value;
ini->remove=_remove;
ini->save_to_file=_save_to_file;
ini->deletor=_delete_ini_parser;
returnini;
} 下面是简单的测试代码:
view plaincopy
在CODE上查看代码片派生到我的代码片
staticchar*g_szIniString="#abc\nfirst=2\nsecond\nname=charlizhang\n";
staticvoidini_parser_test_string()
{
structini_parser*ini=new_ini_parser();
intsize=ini->parse_string(ini,g_szIniString);
assert(size>0);
assert(ini->value(ini,"second")==0);
assert(ini->value(ini,"abc")==0);
assert(ini->value(ini,"name")!=NULL);
assert(ini->value(ini,"first")!=NULL);
printf("inistring:%s\n",g_szIniString);
printf("key-valuepairscount=%d\n",size);
printf("key\'name\'',value=%s\n" |