0%

iniparser-C 配置解析

https://github.com/ndevilla/iniparser

特点

  • 相当小,4个文件(2个c,2个h),1500行左右
  • 不依赖其他库
  • 可重入,需要自己加锁实现线程安全

另外,使用也相当简单

基本用法

先准备ini格式的配置文件

1
2
3
4
5
6
7
[kafka]
broker = 127.0.0.1:9092
topic = hello

[db]
host = 127.0.0.1
port =3306

解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
direcotyr *d;
const char *s;
int n;


d = iniparser_load("haha.conf");
iniparser_dump(d,stderr);

// broker
s = iniparser_getstring(d, "kafka:broker", NULL);
printf("broker: %s\n", s);

// topic
s = iniparser_getstring(d, "kafka:topic", "hello");
printf("topic: %s\n", s);

// db.host
s = iniparser_getstring(d, "db:host", NULL);
printf("db.host: %s\n", s);

// db.port
n = iniparser_getint(d, "db:port", 3306);
printf("db.port: %d\n", n);

iniparser_freedict(d);

主要的API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 获取section个数
int iniparser_getnsec(const dictionary * d);

// 获取第n个section的个数
const char * iniparser_getsecname(const dictionary * d, int n);

// 导出配置到文件,可重新导入
void iniparser_dump_ini(const dictionary * d, FILE * f);
void iniparser_dumpsection_ini(const dictionary * d, const char * s, FILE * f);
// 导出配置到文件,方便查看,不可从新导入
void iniparser_dump(const dictionary * d, FILE * f);

// 解析
const char * iniparser_getstring(const dictionary * d, const char * key, const char * def);
int iniparser_getint(const dictionary * d, const char * key, int notfound);
long int iniparser_getlongint(const dictionary * d, const char * key, long int notfound);
double iniparser_getdouble(const dictionary * d, const char * key, double notfound);
int iniparser_getboolean(const dictionary * d, const char * key, int notfound);

// 设置配置
int iniparser_set(dictionary * ini, const char * entry, const char * val);
void iniparser_unset(dictionary * ini, const char * entry);

int iniparser_find_entry(const dictionary * ini, const char * entry) ;

// 导入,清理
dictionary * iniparser_load(const char * ininame);
void iniparser_freedict(dictionary * d);