仿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 ...
随机推荐
- BZOJ2457 [BeiJing2011]双端队列 【贪心】
题目 Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事: 1.新建一个双端队列 ...
- 刷题总结——table(ssoi)
题目: 题目背景 SOURCE:NOIP2016-RZZ-2 T2 题目描述 给定一个 n×m 的矩阵,行列均从 1 开始标号. 一个矩阵被认为是稳定的,当且仅当对于任意的 2≤i≤n,第 i 行的数 ...
- GFS, HDFS, Blob File System架构对比
分布式文件系统很多,包括GFS,HDFS,淘宝开源的TFS,Tencent用于相册存储的TFS (Tencent FS,为了便于区别,后续称为QFS),以及Facebook Haystack.其中,T ...
- 解决 IDEA 中src下xml等资源文件无法读取的问题
该问题的实质是,idea对classpath的规定. 在eclipse中,把资源文件放在src文件夹下,是可以找到的: 但是在idea中,直接把资源文件放在src文件夹下,如果不进行设置,是不能被找到 ...
- Codeforces983E. NN country
新鲜出炉! $n \leq 200000$的树,给$m \leq 200000$条链,$q \leq 200000$个询问,每次问一条询问链最少用m条中的几条给定链覆盖其所有边,可能无解. 首先确定一 ...
- 在dedecms系统下, 改写火车头的入库接口 写一个接口文件运行一次自动读取 http://news.163.com/rank/
1:火车头入库接口里面的密码与login.php传过来的密码是保持一致的: 2:在(!$ispost)里面编写一个form表单提交,验证用户名,channelid,以及typeid; html代码格式 ...
- PC下ubuntu查找PC串口并加入用户组
1. 查看ttyS0隶属的组:ls -l /dev/ttyS0 //发现隶属于dialout组 输出: crw-rw---- 1 root dialout 4, 64 9月 9 08:23 /d ...
- luogu P1342 请柬
题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被雇来分发这些请 ...
- Spark学习(四)Spark2.3 HA集群的分布式安装
一.下载Spark安装包 1.从官网下载 http://spark.apache.org/downloads.html 2.从微软的镜像站下载 http://mirrors.hust.edu.cn/a ...
- Go -- PipleLine
1.pipeline的产生 从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客人A来到柜台,客人B紧随其后,客人C排在客人B后面,客人D排在客人C后面,客人E排在客人D后面,一直排到店面 ...