仿udhcpd配置文件读取的一段代码
前段时间看udhcpd的源代码,后来因为没直接应用,也就放弃了。网上有文章udhcpd详解(搜索一下有很多),其中在介绍udhcpd的配置相关代码时,有如下一句话,学习了这段代码后,以后用到需要读配置文件的地方可以直接使用。恰巧项目需要,就认真学习了下这段代码。不得不说,高人就是高人,写得代码简直是艺术品。我再做任何改动都毁了这件艺术品。我参看的源代码是udhcp-0.9.8。主要文件看的文件就是file.c,相关头文件就是file.h和dhcp.h。下面我贴我应用的代码,建议直接看源代码,我做一点注释。
下面是.c文件。
struct general_config_t g_general_config;
static struct config_keyword keywords[] = {
/* keyword[14] handler variable address default[30] */
{"server_ip", read_str, &(g_general_config.server_ip), "192.168.1.50"},
{"my_id", read_str, &(g_general_config.my_id), "lt1000"},
{"position",read_str,&(g_general_config.my_positon),"not set position"},
{"", NULL, NULL, ""},
};
/***********************************************************************************************
*函数名 :read_str
*函数功能描述:关键字对应的参数为字符串
*函数参数 : 输入参数字符串,存储输入参数的地址
*函数返回值 : 1 成功返回1
*作者 : nelson
*函数创建日期 : 2015.12.09
*函数修改日期 : 尚未修改
*修改人 :尚未修改
*修改原因 : 尚未修改
*版本 : 1.0
*历史版本 : 无
***********************************************************************************************/
int read_str(char *line, void *arg)
{
char *dest = (char *)arg; //arg是指向数组首地址的地址
strcpy(dest,line);
return ;
}
/***********************************************************************************************
*函数名 :read_config
*函数功能描述:读配置文件
*函数参数 :file 配置文件文件名 相对路径或者绝对路径都可以
*函数返回值 :成功返回1 失败返回0
*作者 : nelson
*函数创建日期 : 2015.12.09
*函数修改日期 : 尚未修改
*修改人 :尚未修改
*修改原因 : 尚未修改
*版本 : 1.0
*历史版本 : 无
***********************************************************************************************/
int read_config(char *file)
{
FILE *in;
char buffer[], *token, *line;
int i;
for (i = ; strlen(keywords[i].keyword); i++)
{
if (strlen(keywords[i].def))
keywords[i].handler(keywords[i].def, keywords[i].var);
}
if (!(in = fopen(file, "r")))
{
Important_Printf("config file not found,using the default value!");
return ;
}
while (fgets(buffer, , in))
{
if (strchr(buffer, '\n'))
*(strchr(buffer, '\n')) = '\0';
if (strchr(buffer, '#'))
*(strchr(buffer, '#')) = '\0';
token = buffer + strspn(buffer, " \t");
if (*token == '\0')
continue;
line = token + strcspn(token, " \t=");
if (*line == '\0')
continue;
*line = '\0';
line++;
/* eat leading whitespace */
line = line + strspn(line, " \t=");
/* eat trailing whitespace */
for (i = strlen(line); i > && isspace(line[i - ]); i--);
line[i] = '\0';
for (i = ; strlen(keywords[i].keyword); i++)
{
if(!strcmp(token, keywords[i].keyword))
{
if (!keywords[i].handler(line, keywords[i].var))
{
keywords[i].handler(keywords[i].def, keywords[i].var);
}
}
}
}
fclose(in);
return ;
}
然后是.h文件
#define SERVER_IP_LEN 16
#define MY_ID_LEN 12
#define POSITION_STRING_LEN 30 #pragma pack(1)
struct config_keyword
{
char keyword[]; //关键字
int (*handler)(char *line, void *var); //关键字处理函数
void *var; //关键字对应的输入参数存储地址
char def[]; //关键字对应的输入参数默认值
};
#pragma pack() #pragma pack(1)
struct general_config_t //全局配置参数结构体
{
char server_ip[SERVER_IP_LEN]; /*save tcp server's ip*/
char my_id[MY_ID_LEN]; /*id of myself*/
char my_positon[POSITION_STRING_LEN]; /*meachine's positon*/
};
#pragma pack() extern struct general_config_t g_general_config; int read_str(char *line, void *arg);
稍微需要讲的是config_keyword结构体,不得不说设计的真好。
然后就是strchr、strspn、strcspn、isspace这几个字符串操作函数。认真看,就会发现,使用strspn和strcspn可以从未知字符串中提取出自己想要的字符串,很方便。
仿udhcpd配置文件读取的一段代码的更多相关文章
- vim移动一行或一段代码
nmap <M-j> mz:m+<cr>`z nmap <M-k> mz:m-2<cr>`z vmap <M-j> :m'>+< ...
- 【Spring源码分析】配置文件读取流程
前言 Spring配置文件读取流程本来是和http://www.cnblogs.com/xrq730/p/6285358.html一文放在一起的,这两天在看Spring自定义标签的时候,感觉对Spri ...
- Spring源码分析:Bean加载流程概览及配置文件读取
很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...
- 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之三(配置文件读取)
干了一天的活,还有点时间,给兄弟们写点东西吧. 大家有没有发现一个问题?那就是在.Net Core的MVC项目里面,没有.config文件了!!!同志们,没有config文件了啊,这样搞,我以后要做些 ...
- [spring源码学习]二、IOC源码——配置文件读取
一.环境准备 对于学习源码来讲,拿到一大堆的代码,脑袋里肯定是嗡嗡的,所以从代码实例进行跟踪调试未尝不是一种好的办法,此处,我们准备了一个小例子: package com.zjl; public cl ...
- VS2012中,C# 配置文件读取 + C#多个工程共享共有变量 + 整理using语句
(一) C# 配置文件读取 C#工程可以自动生成配置文件,以便整个工程可以使用设置的配置进行后续的处理工作. 1. 首先,右键工程文件-->Properties -->settings-- ...
- C 构造一个 简单配置文件读取库
前言 最近看到这篇文章, json引擎性能对比报告 http://www.oschina.net/news/61942/cpp-json-compare?utm_source=tuicool 感觉技术 ...
- C# 配置文件读取与修改(转)
C# 配置文件读取与修改 配置文件在很多情况下都使用到, 配置文件分为两种 一种是应用程序的配置文件, 一种是web的配置文件. 两种配置文件最大的区别是web的配置文件更新之后会实时更新, 应用 ...
- smarty 从配置文件读取变量
smarty变量分3种: Variables [变量] Variables assigned from PHP [从PHP分配的变量] Variables loaded from config fil ...
随机推荐
- HDU——2612Find a way(多起点多终点BFS)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- BZOJ 3747: [POI2015]Kinoman 【线段树】
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- Win7开启SNMP服务
通过SNMP监控Windows主机需要在被监控的服务器上安装简单网络管理协议(SNMP)的Windows组件,以Windows 7系统为例: 首先,在控制面板中找到“卸载程序”: 在弹出的窗口中单击“ ...
- 常州模拟赛d4t1 立方体
题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...
- bzoj1584 [Usaco2009 Mar]Cleaning Up 打扫卫生 动态规划+思维
Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的 ...
- BZOJ 3733 [Pa2013]Iloczyn 模拟爆搜
Description 给定正整数n和k,问能否将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示测试组数 接下来T行每行两个数n(n<=10^9),k(k& ...
- 【jquery创建元素添加元素】
使用jquery创建新元素的方法为:$(html标签),例如 $("<p></p>")创建了一个段落.注意此时只是创建了对象,尚未添加到文档节点中去:以下四 ...
- Honey Heist
5092: Honey Heist 时间限制: 1 Sec 内存限制: 128 MB 题目描述 0x67 is a scout ant searching for food and discover ...
- android中自定义下拉框(转)
android自带的下拉框好用不?我觉得有时候好用,有时候难有,项目规定这样的效果,自带的控件实现不了,那么只有我们自己来老老实实滴写一个新的了,其实最基本的下拉框就像一些资料填写时,点击的时候出现在 ...
- hdu 3594 Cactus /uva 10510 仙人掌图判定
仙人掌图(有向):同时满足:1强连通:2任何边不在俩个环中. 个人理解:其实就是环之间相连,两两只有一个公共点,(其实可以缩块),那个公共点是割点.HDU数据弱,网上很多错误代码和解法也可以过. 个人 ...