alues->remove(ini->keyvalues, pair); } static void write_keyvalue(struct tag_value_pair * pair, FILE *fp) { fputs(pair->szTag, fp); fputc('=', fp); fputs(pair->szValue, fp); fputc('\n', fp); } static int _save_to_file(struct ini_parser * ini, const char * file){ if(ini->keyvalues->size > 0) { FILE * fp = fopen(file, "w"); if(fp) { struct tag_value_pair * pair = ini->keyvalues->head; while(pair != ini->keyvalues->tail) { write_keyvalue(pair, fp); pair = pair->next; } if(pair)write_keyvalue(pair, fp); fclose(fp); return 0; } } return -1; } struct ini_parser * new_ini_parser(){ struct ini_parser * ini = (struct ini_parser*)malloc(sizeof(struct ini_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; return ini; } void delete_ini_parser(struct ini_parser *ini){ if(ini) { delete_tag_value_list(ini->keyvalues); free(ini); } }
测试代码:
#include "util/ini_parser.h"
#include "ini_test.h"
#include
#include
static char * g_szIniString = "#abc\nfirst=2\nsecond\nname=charli zhang \n"; static void ini_parser_test_string() { struct ini_parser * ini = new_ini_parser(); int size = 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("ini string: %s\n", g_szIniString); printf("key-value pairs count = %d\n", size); printf("key \'name\'', value = %s\n", ini->value(ini, "name")); printf("key \'first\'', value = %s\n", ini->value(ini, "first")); ini->set_value(ini, "baidu", "hahaha"); ini->save_to_file(ini, "write.conf"); ini->remove(ini, "first"); ini->save_to_file(ini, "write2.conf"); delete_ini_parser(ini); } static void ini_parser_test_file() { struct ini_parser * ini = new_ini_parser(); int size = ini->parse_file(ini, "test.conf"); 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("ini string: %s\n", g_szIniString); printf("key-value pairs count = %d\n", size); printf("key \'name\'', value = %s\n", ini->value(ini, "name")); printf("key \'first\'', value = %s\n", ini->value(ini, "first")); printf("key \'baidu\'', value = %s\n", ini->value(ini, "baidu")); delete_ini_parser(ini); } void ini_parser_test() { ini_parser_test_string(); ini_parser_test_file(); }
测试了解析字符串、文件、增、删、写文件,都没什么大问题。