卢骏 · 2020年07月18日

svlib(5) – ini文件操作

一、INI文件

INI文件是一个无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统,或是其他操作系统上,许多程序也会采用INI文件作为设置程序之用。Windows操作系统后来以注册表的形式替换掉INI文件。INI文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。

格式:

节:
[section]

参数:
name=value

注解:

注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。

;comment text

以下是ini文件的例子:

image.png

二、svlib对INI文件支持

svlib实现了 cfgFileINI 类,实现对INI文件的读取和写入。实现了cfgNodeMap类,来存储INI文件的内容。

svlib中,是以节点(Node)为单位,来管理INI中的内容。如以上的INI文件,有3个节点,分别是host,owner,database。这个三个节点,就会存在cfgNodeMap中的cfgNode中。而owner,又包括两个节点,name和organization。同理,database也是一样。

在cfgNodeMap类中,有cfgNode value[string],哈希属组,来存储同一层次的各个节点。在这里就是,host,owner,database这三个节点。
1.jpg
代码,这里就不分析了。底层原理,是从INI文件读取一行,然后进行正则匹配,判断之后,放入到DOM结构体中(cfgNodeMap)。

然后在从DOM结构体中,将内容转化到自定义的数据结构中。

三、 例子

如对于以下的ini文件。

总共有三个节点,label,stu1,stu2。stu1和stu2又分别有3个节点。
2.jpg
自己定义两个类,分别表示这些节点。注意,这里变量的名字,要和INI文件中的参数名要一致。
3.jpg
svlib中,提供了5个宏,来实现对节点的注册。

◾SVLIB_DOM_UTILS_BEGIN: 表示注册开始,参数是类名

◾SVLIB_DOM_FIELF_OBJECT: 注册一个对象

◾SVLIB_DOM_FIELD_STRING:注册一个字符串

◾SVLIB_DOM_FIELD_INT: 注册一个整数

◾SVLIB_DOM_FIELD_END: 表示注册结束

注册之后,就会在类中增加两个方法,

◾fromDom: 将dom的内容,保存在类的变量中

◾toDom: 将类中的变量,保存在dom中

dom,document object model,是svlib中为了管理树形结构的任意自定义数据,所使用的一种机制。

对于INI文件,svlib首先将INI文件内容,转换成dom结构,然后在将dom结构中的内容,转化到自定义的类中的变量中。
4.png
读取INI文件,然后使用deserialize方法,将INI文件的内容,反序列化后,保存在dom结构中。

调用类的fromDOM方法,将dom结构中的内容,转换到类中的变量中。最后访问类中的变量,就可以得到数据。

执行结果:
7.jpg

四、svlib中的bug

svlib提供的源代码,有一些bug存在,不能将INI中的整数,保存到类中的整数变量中,此时需要进行修改源代码,以支持读取整数。

在svlib_macros.svh代码中。将SVLIB_DOM_FIELD_INT宏的代码,改为以下代码,支持整数和16进制数据读取。
5.jpg
另外SVLIB_DOM_UTILS_BEGIN宏,也有bug。对于函数__svlib_dom_superfunction__函数,要将参数的名字进行修改,原来的参数,都是没带下划线的,因此,如果INI文件中,如果有的节点名字,叫purpose,name,dom,那么就获取不到这些节点的值。所以要将参数名字进行修改。这里参数修改后,后面的宏中的参数,都要进行修改。
6.jpg
至此,svlib的介绍,就到此结束了。

#### 更多相关阅读
svlib(2) – 目录操作
svlib(3) – 文件操作
svlib(4) – 正则表达式

原文首发于骏的世界博客
作者:卢骏
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。

推荐阅读
关注数
20176
内容数
1307
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息