注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天马行空

宠辱不惊,闲看庭前花开花落;去留无意,漫观天外云展云舒……

 
 
 

日志

 
 
 
 

用lex/yacc来解析配置文件  

2012-05-04 16:12:43|  分类: LINUX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


linux平台下的较为庞大的命令一般都带有一个配置文件,用于存储该命令启动时要设置的参数,用户还可以变更该配置文件中的某些域的值。因此,在命令中就要考虑怎么来存取这些文件里的值。一般情况下,大多数程序员都愿意自己编写一段程序来解析配置文件里内容,在配置文件比较小的情况下,该中方法也非常方便适用,我平时也喜欢这么作。但是,当在配置文件非常大情况下,配置文件里面的sectionfield非常多的情况下,自己编写程序来读取的话就变得非常麻烦和挠头了。幸亏,linux下还有lex/yacc这么一套工具来帮助程序员来完成这样的工作。

在互联网上,搜索了lexyacc这两个关键字,可以发现很多的相关文章,但这些文章大都是千篇一律,讲了那么一大堆理论,看完之后还是不知道在C程序里怎么使用lex/yacc。只有这些文章《LexYacc从入门到精通》还比较贴近实际编码,对我有一些帮助,建议大家可以先看看。

在这里,我就从配置文件解析这个日常编程经常要碰到的问题来作为例子,来告诉大家lex/yacc这玩意儿的使用方法。

首先,说明一下大概的原理。先看一下下面的图.

注:本文中的图摘自《Lex and Yacc for Embedded Programmers


 用lex/yacc来解析配置文件 - 547502462 - 天马行空

Figure1: Execution path and data flow in a typical lex/yacc derived parser

1显示了在一个典型的扫描器/解析器的应用中的控制和数据流程。这个数据流通过扫描器规约成很多符号并且标识成有效的符号组合聚集在解析器中。也就是说,输入流(或者说是配置文件)中的所有单词通过lex工具的扫描生成很多的符号(token--- 就是资料上常说的词法分析,然后,这些符号再通过yacc工具进行语法解析(按照,编译原理中的巴克斯范式)。 

2描述了一个基于lex/yacc的应用程序的流程。一般情况下,做成一个读取配置文件的程序都要包含两个脚本文件,第一个是lex脚本文件(文件名的后缀一般都是.l形式,不过文件名的形式都没有作特别严格的定义),该脚本文件主要是利用正则表达式的形式对文件进行对配置文件进行正则匹配,这一点非常类似linuxawk工具。另外一个脚本就是yacc脚本(后缀名一般为.y形式),它主要是根据lex的分析结果进行语法解析。

用lex/yacc来解析配置文件 - 547502462 - 天马行空 

Figure 2: Development sequence when using lex and yacc 

3表示了配置文件解析的数据流。正如下图描述的那样,配置文件里的内容首先是作为字符流的形式,通过lexyylex函数进行正则匹配后形成许多符号,然后作为yacc的输入,通过yyparse函数对这些符号流进行语法解析。

用lex/yacc来解析配置文件 - 547502462 - 天马行空

Figure 3: Data flow in a configuration file parser application

在上面提到的lex脚本,yacc脚本文件作成后,只需要在你自己的C程序中,手动调用yaccyyparse函数就可以了,只不过,还需要在C程序中添加一些存储yacc解析结果的处理函数,这得根据程序中的实际情况来定。 

下面是两个脚本文件和一个C程序文件的样例:
http://lymons.googlepages.com/yacc.html

lex脚本    :   test.conf.l
yacc脚本 :   test.conf.y
c源文件    :   test_conf.c
              test_conf.c第二版
编译方法及执行:

cvs parser #lex test_config.l

cvs parser #yacc -d test_config.y

cvs parser #cc lex.yy.c y.tab.c test_config.c -o test_config<!--[endif]-->

cvs parser # ./test_config test.conf.example

用lex/yacc来解析配置文件---test.conf.l 
用lex/yacc来解析配置文件 - 547502462 - 天马行空%{
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
#
include <string.h>
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空#include "y.tab.h"

用lex/yacc来解析配置文件 - 547502462 - 天马行空

用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空extern 
int line;      //当前正在解析字符串的行号
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%
}
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%%

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//下面定义配置文件里各关键字的正则,注意各关键字返回的token必须是在yacc的脚本文件中有定义
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//
首先是定义section标题和field名的正则表达式
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空share                                   
return
 T_SHARE;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空temp                                    
return
 T_TEMP;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空public                                  
return
 T_PUBLIC;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空comment                                 
return
 T_COMMENT;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空writeable                               
return
 T_WRITEABLE;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空path                                    
return
 T_PATH;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空guest[ ]ok                              
return
 T_GUESTOK;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空valid[ ]users                           
return
 T_VALID_USERS;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
write[ ]list                            return
 T_WRITE_LIST;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空create[ ]mode                           
return
 T_CREATE_MODE;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空directory[ ]mask                        
return
 T_DIRECTORY_MODE;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
<!--[if !supportEmptyParas]--> <!--[endif]-->

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//其次是field的值的表达式
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空y
|Y|yes|Yes|YES    yylval.string = strdup(yytext); return
 T_STATE;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空n
|N|no|No|NO       yylval.string = strdup(yytext); return
 T_STATE;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
\"[^\n]+\"         yylval.string = strdup(yytext); return T_STRING; //要求字符串以""
为开头和结尾
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空[
0-9]+             yylval.number = strtol(yytext,NULL,8); return T_NUMBER; //因为是权限,
故要转化成8进制
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
\n                 line++//
遇到回车行号加一
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
\t]+             ;       //
忽略空格和tab
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
\#[^\n]*           ;       //忽略#开头的行

用lex/yacc来解析配置文件 - 547502462 - 天马行空

用lex/yacc来解析配置文件 - 547502462 - 天马行空
\;[^\n]*           ;       //忽略;开头的行
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
.                  return (int)yytext[0
];
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空

用lex/yacc来解析配置文件---test.conf.y
用lex/yacc来解析配置文件 - 547502462 - 天马行空//test.conf.y
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%
{
用lex/yacc来解析配置文件 - 547502462 - 天马行空void section_print(
int
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空void parameter_print(
int
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%
}
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//
定义每个关键字对应的token
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_SHARE
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_TEMP
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_PUBLIC
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_COMMENT
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_WRITEABLE
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_PATH
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_GUESTOK
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_VALID_USERS
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_WRITE_LIST
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_CREATE_MODE
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token
 T_DIRECTORY_MODE
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//定义配置文件里field值的基本类型,
一般有两种;数字和字符串
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%union

用lex/yacc来解析配置文件 - 547502462 - 天马行空{
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
int number;
用lex/yacc来解析配置文件 - 547502462 - 天马行空        char 
*
string;
用lex/yacc来解析配置文件 - 547502462 - 天马行空}
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token <string> T_STRING //普通字符串,
例如路径
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token <number> T_NUMBER  //数字,
例如端口号
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%token <string> T_STATE  //状态,例如yes,no

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//定义语法解析树
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//
为每一个section标题和field名定义相应的动作(函数)
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//该动作(函数)的实现在.c文件里定义.

用lex/yacc来解析配置文件 - 547502462 - 天马行空
%%
用lex/yacc来解析配置文件 - 547502462 - 天马行空parameters
:
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
| parameters parameter
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空parameter
:

用lex/yacc来解析配置文件 - 547502462 - 天马行空        section_share
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        comment
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        writeable
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        path
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        guestok
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        public
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        valid_users
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        write_list
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        section_temp
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        create_mode
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
|
用lex/yacc来解析配置文件 - 547502462 - 天马行空        directory_mode
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空section_share
:
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
'[' T_SHARE ']'
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                section_print(T_SHARE);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空comment
:
用lex/yacc来解析配置文件 - 547502462 - 天马行空        T_COMMENT 
'=' T_STRING
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                parameter_print(T_COMMENT);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空writeable
:

用lex/yacc来解析配置文件 - 547502462 - 天马行空        T_WRITEABLE 
'=' T_STATE
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                parameter_print(T_WRITEABLE);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空path
:

用lex/yacc来解析配置文件 - 547502462 - 天马行空        T_PATH 
'=' T_STRING
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                parameter_print(T_PATH);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空guestok
:

用lex/yacc来解析配置文件 - 547502462 - 天马行空        T_GUESTOK 
'=' T_STATE
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                parameter_print(T_GUESTOK);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空public
:

用lex/yacc来解析配置文件 - 547502462 - 天马行空        T_PUBLIC 
'=' T_STATE
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                parameter_print(T_PUBLIC);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空valid_users
:

用lex/yacc来解析配置文件 - 547502462 - 天马行空        T_VALID_USERS 
'=' T_STRING
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                parameter_print(T_VALID_USERS);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空write_list
:

用lex/yacc来解析配置文件 - 547502462 - 天马行空        T_WRITE_LIST 
'=' T_STRING
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                parameter_print(T_WRITE_LIST);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空section_temp
:

用lex/yacc来解析配置文件 - 547502462 - 天马行空        
'[' T_TEMP ']'
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                section_print(T_TEMP);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空create_mode
:
用lex/yacc来解析配置文件 - 547502462 - 天马行空        T_CREATE_MODE 
'=' T_NUMBER
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                parameter_print(T_CREATE_MODE);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空directory_mode
:

用lex/yacc来解析配置文件 - 547502462 - 天马行空        T_DIRECTORY_MODE 
'=' T_NUMBER
用lex/yacc来解析配置文件 - 547502462 - 天马行空        {
用lex/yacc来解析配置文件 - 547502462 - 天马行空                parameter_print(T_DIRECTORY_MODE);
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
用lex/yacc来解析配置文件 - 547502462 - 天马行空        ;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
%% 

用lex/yacc来解析配置文件---test_conf.c
用lex/yacc来解析配置文件 - 547502462 - 天马行空//test_conf.c
用lex/yacc来解析配置文件 - 547502462 - 天马行空

用lex/yacc来解析配置文件 - 547502462 - 天马行空#include 
<stdio.h>
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空#include 
<string.h>
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空#include 
<errno.h>
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空#include 
"y.tab.h"
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
extern FILE *yyin;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
int line = 1//定义当前正在解析字符串的行号

用lex/yacc来解析配置文件 - 547502462 - 天马行空

用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
void yyerror(const char *str) {
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        fprintf(stderr,
"config: parse error at %d"
, line);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        fprintf(stderr,
" : %s\n"
,str);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        exit(
1
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空}

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
int yywrap() {
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
return 1
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空}

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
int main(int argc, char **argv) {
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
if (argc > 1
{
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                yyin 
= fopen(argv[1], "r"
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }
 else {
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                fprintf(stdout, 
"Usage: config <file_path>\n"
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                exit(
1
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
if (yyin == NULL) {
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                fprintf(stdout, 
"config: file access error. func=%s ""fopen()"
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                fprintf(stdout, 
"errno=%d(%s) name=%s\n", errno, strerror(errno), argv[0
]);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                exit(
1
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        printf(
"### %s ###\n", argv[1]);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        yyparse();
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        fclose(yyin);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        exit(
0
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空}

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
<!--[if !supportEmptyParas]--> <!--[endif]-->
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//定义当解析到每一个section标题时,yacc所采取的动作.
用lex/yacc来解析配置文件 - 547502462 - 天马行空

用lex/yacc来解析配置文件 - 547502462 - 天马行空
void section_print(int section) {
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
static int ishare = 0
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
static int itemp = 0
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空 
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
switch (section) 
{
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_SHARE:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                ishare
++
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"[share:%d]\n"
, ishare);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_TEMP:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                itemp 
++
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"[temp:%d]\n"
, itemp);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
default
:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空}

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
<!--[if !supportEmptyParas]--> <!--[endif]-->
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空
//定义解析到每一个field时,yacc所采取的动作
用lex/yacc来解析配置文件 - 547502462 - 天马行空

用lex/yacc来解析配置文件 - 547502462 - 天马行空
void parameter_print(int parameter) {
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
switch (parameter) 
{
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_PUBLIC:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"\tpublic = %s\n", yylval.string
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_COMMENT:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"\tcomment = %s\n", yylval.string
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_WRITEABLE:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"\twriteable = %s\n", yylval.string
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_PATH:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"\tpath = %s\n", yylval.string
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_GUESTOK:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"\tguest ok = %s\n", yylval.string
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_VALID_USERS:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"\tvalid users = %s\n", yylval.string
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_WRITE_LIST:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"\twrite list = %s\n", yylval.string
);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_CREATE_MODE:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"\tcreate mode = %o\n"
, yylval.number);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
case
 T_DIRECTORY_MODE:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                printf(
"\tdriectory mask = %d\n"
, yylval.number);
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        
default
:
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空                
break
;
用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空        }

用lex/yacc来解析配置文件 - 547502462 - 天马行空
用lex/yacc来解析配置文件 - 547502462 - 天马行空}
 


yacc读取配置文件内容 --- c源文件改进版 
为了读取配置文件某一个区域的数据,特在C源文件里
把读取某区域的动作封装成一个函数,方便调用.
例如:
read_share_section,read_server_section
注意
yylval.string的内存实在test_conf.l文件中生成的,
所以在
parameter_print使用完毕后要释放该内存

因为该程序事先把配置文件中的内容按照类型存储到
全局变量的数组里,等到用户指定要读取那一段区域
的内容是在把该段的内容返回给用户.
因为说明的重点并不是怎么释放内存,
程序里并没有加入释放该全局数组的内存的代码.
  1用lex/yacc来解析配置文件 - 547502462 - 天马行空#include <stdio.h>
  2用lex/yacc来解析配置文件 - 547502462 - 天马行空#include <string.h>
  3用lex/yacc来解析配置文件 - 547502462 - 天马行空#include <stdlib.h>
  4用lex/yacc来解析配置文件 - 547502462 - 天马行空#include <errno.h>
  5用lex/yacc来解析配置文件 - 547502462 - 天马行空#include "y.tab.h"
  6用lex/yacc来解析配置文件 - 547502462 - 天马行空
  7用lex/yacc来解析配置文件 - 547502462 - 天马行空extern FILE *yyin;
  8用lex/yacc来解析配置文件 - 547502462 - 天马行空
  9用lex/yacc来解析配置文件 - 547502462 - 天马行空int line = 1;
 10用lex/yacc来解析配置文件 - 547502462 - 天马行空
 11用lex/yacc来解析配置文件 - 547502462 - 天马行空void yyerror(const char *str) {
 12用lex/yacc来解析配置文件 - 547502462 - 天马行空  fprintf(stderr,"config: parse error at %d", line);
 13用lex/yacc来解析配置文件 - 547502462 - 天马行空  fprintf(stderr," : %s\n",str);
 14用lex/yacc来解析配置文件 - 547502462 - 天马行空  exit(1);
 15用lex/yacc来解析配置文件 - 547502462 - 天马行空}

 16用lex/yacc来解析配置文件 - 547502462 - 天马行空 
 17用lex/yacc来解析配置文件 - 547502462 - 天马行空int yywrap() {
 18用lex/yacc来解析配置文件 - 547502462 - 天马行空  return 1;
 19用lex/yacc来解析配置文件 - 547502462 - 天马行空}

 20用lex/yacc来解析配置文件 - 547502462 - 天马行空
 21用lex/yacc来解析配置文件 - 547502462 - 天马行空#define LEN 129
 22用lex/yacc来解析配置文件 - 547502462 - 天马行空#define UGNUM 128
 23用lex/yacc来解析配置文件 - 547502462 - 天马行空#define NAMELEN 9
 24用lex/yacc来解析配置文件 - 547502462 - 天马行空#define PASSLEN 17
 25用lex/yacc来解析配置文件 - 547502462 - 天马行空#ifndef PATH_MAX
 26用lex/yacc来解析配置文件 - 547502462 - 天马行空#define PATH_MAX 4096
 27用lex/yacc来解析配置文件 - 547502462 - 天马行空#endif
 28用lex/yacc来解析配置文件 - 547502462 - 天马行空
 29用lex/yacc来解析配置文件 - 547502462 - 天马行空typedef struct share_section {
 30用lex/yacc来解析配置文件 - 547502462 - 天马行空  char comment[LEN];
 31用lex/yacc来解析配置文件 - 547502462 - 天马行空  int writeable;
 32用lex/yacc来解析配置文件 - 547502462 - 天马行空  char path[PATH_MAX];
 33用lex/yacc来解析配置文件 - 547502462 - 天马行空  int guestok;
 34用lex/yacc来解析配置文件 - 547502462 - 天马行空  int public;
 35用lex/yacc来解析配置文件 - 547502462 - 天马行空  int create_mode;
 36用lex/yacc来解析配置文件 - 547502462 - 天马行空  int directory_mask;
 37用lex/yacc来解析配置文件 - 547502462 - 天马行空  char *valid_users;
 38用lex/yacc来解析配置文件 - 547502462 - 天马行空  char *write_list;
 39用lex/yacc来解析配置文件 - 547502462 - 天马行空}
share_section_t;
 40用lex/yacc来解析配置文件 - 547502462 - 天马行空
 41用lex/yacc来解析配置文件 - 547502462 - 天马行空typedef struct server_section {
 42用lex/yacc来解析配置文件 - 547502462 - 天马行空  char comment[LEN];
 43用lex/yacc来解析配置文件 - 547502462 - 天马行空  char hostname[LEN];
 44用lex/yacc来解析配置文件 - 547502462 - 天马行空  char ipaddr[16];
 45用lex/yacc来解析配置文件 - 547502462 - 天马行空  char loginname[NAMELEN];
 46用lex/yacc来解析配置文件 - 547502462 - 天马行空  char loginpass[PASSLEN];
 47用lex/yacc来解析配置文件 - 547502462 - 天马行空  int port;
 48用lex/yacc来解析配置文件 - 547502462 - 天马行空  char encoding[NAMELEN];
 49用lex/yacc来解析配置文件 - 547502462 - 天马行空}
 server_section_t;
 50用lex/yacc来解析配置文件 - 547502462 - 天马行空
 51用lex/yacc来解析配置文件 - 547502462 - 天马行空
 52用lex/yacc来解析配置文件 - 547502462 - 天马行空share_section_t *share_sections[16];
 53用lex/yacc来解析配置文件 - 547502462 - 天马行空server_section_t *server_sections[16];
 54用lex/yacc来解析配置文件 - 547502462 - 天马行空int ishare = 0;
 55用lex/yacc来解析配置文件 - 547502462 - 天马行空int iserver = 0;
 56用lex/yacc来解析配置文件 - 547502462 - 天马行空
 57用lex/yacc来解析配置文件 - 547502462 - 天马行空int main(int argc, char **argv) {
 58用lex/yacc来解析配置文件 - 547502462 - 天马行空  share_section_t share;
 59用lex/yacc来解析配置文件 - 547502462 - 天马行空  server_section_t server;
 60用lex/yacc来解析配置文件 - 547502462 - 天马行空
 61用lex/yacc来解析配置文件 - 547502462 - 天马行空  if (argc > 1{
 62用lex/yacc来解析配置文件 - 547502462 - 天马行空    yyin = fopen(argv[1], "r");
 63用lex/yacc来解析配置文件 - 547502462 - 天马行空  }
 else {
 64用lex/yacc来解析配置文件 - 547502462 - 天马行空    fprintf(stdout, "Usage: config <file_path>\n");
 65用lex/yacc来解析配置文件 - 547502462 - 天马行空    exit(1);
 66用lex/yacc来解析配置文件 - 547502462 - 天马行空  }

 67用lex/yacc来解析配置文件 - 547502462 - 天马行空  if (yyin == NULL) {
 68用lex/yacc来解析配置文件 - 547502462 - 天马行空    fprintf(stdout, "config: file access error. func=%s ""fopen()");
 69用lex/yacc来解析配置文件 - 547502462 - 天马行空    fprintf(stdout, "errno=%d(%s) name=%s\n", errno, strerror(errno), argv[0]);
 70用lex/yacc来解析配置文件 - 547502462 - 天马行空    exit(1);
 71用lex/yacc来解析配置文件 - 547502462 - 天马行空  }

 72用lex/yacc来解析配置文件 - 547502462 - 天马行空
 73用lex/yacc来解析配置文件 - 547502462 - 天马行空  yyparse();
 74用lex/yacc来解析配置文件 - 547502462 - 天马行空
 75用lex/yacc来解析配置文件 - 547502462 - 天马行空  fclose(yyin);
 76用lex/yacc来解析配置文件 - 547502462 - 天马行空
 77用lex/yacc来解析配置文件 - 547502462 - 天马行空  read_share_section(0&share);//读取配置文件中第一个share区的内容.
 78用lex/yacc来解析配置文件 - 547502462 - 天马行空
 79用lex/yacc来解析配置文件 - 547502462 - 天马行空  exit(0);
 80用lex/yacc来解析配置文件 - 547502462 - 天马行空}

 81用lex/yacc来解析配置文件 - 547502462 - 天马行空
 82用lex/yacc来解析配置文件 - 547502462 - 天马行空void section_print(int section) {
 83用lex/yacc来解析配置文件 - 547502462 - 天马行空
 84用lex/yacc来解析配置文件 - 547502462 - 天马行空  switch (section) {
 85用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_SHARE:
 86用lex/yacc来解析配置文件 - 547502462 - 天马行空    if (ishare > 16)
 87用lex/yacc来解析配置文件 - 547502462 - 天马行空      return;
 88用lex/yacc来解析配置文件 - 547502462 - 天马行空    share_sections[ishare ++= 
 89用lex/yacc来解析配置文件 - 547502462 - 天马行空      (share_section_t *)malloc(sizeof(share_section_t));
 90用lex/yacc来解析配置文件 - 547502462 - 天马行空
 91用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("[share:%d]\n", ishare);
 92用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
 93用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_SERVER:
 94用lex/yacc来解析配置文件 - 547502462 - 天马行空    if (iserver > 16)
 95用lex/yacc来解析配置文件 - 547502462 - 天马行空      return;
 96用lex/yacc来解析配置文件 - 547502462 - 天马行空    server_sections[iserver ++= 
 97用lex/yacc来解析配置文件 - 547502462 - 天马行空      (server_section_t*)malloc(sizeof(server_section_t));
 98用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("[temp:%d]\n", itemp);
 99用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
100用lex/yacc来解析配置文件 - 547502462 - 天马行空  default:
101用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
102用lex/yacc来解析配置文件 - 547502462 - 天马行空  }

103用lex/yacc来解析配置文件 - 547502462 - 天马行空}

104用lex/yacc来解析配置文件 - 547502462 - 天马行空
105用lex/yacc来解析配置文件 - 547502462 - 天马行空void parameter_print(int parameter) {
106用lex/yacc来解析配置文件 - 547502462 - 天马行空  if (ishare <= 0 || ishare > 16 || iserver <= 0 || iserver > 16)
107用lex/yacc来解析配置文件 - 547502462 - 天马行空    return;
108用lex/yacc来解析配置文件 - 547502462 - 天马行空
109用lex/yacc来解析配置文件 - 547502462 - 天马行空  share_section_t *sharesec = share_sections[ishare-1];
110用lex/yacc来解析配置文件 - 547502462 - 天马行空  server_section_t *serversec = server_sections[iserver-1];
111用lex/yacc来解析配置文件 - 547502462 - 天马行空
112用lex/yacc来解析配置文件 - 547502462 - 天马行空  switch (parameter) {
113用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_PUBLIC:
114用lex/yacc来解析配置文件 - 547502462 - 天马行空  //  printf("\tpublic = %s\n", yylval.string);
115用lex/yacc来解析配置文件 - 547502462 - 天马行空    sharesec->public = yylval.number;
116用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
117用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_COMMENT:
118用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("\tcomment = %s\n", yylval.string);
119用lex/yacc来解析配置文件 - 547502462 - 天马行空    strncpy(sharesec->comment, yylval.string, LEN);
120用lex/yacc来解析配置文件 - 547502462 - 天马行空    free(yylval.string);
121用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
122用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_WRITEABLE:
123用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("\twriteable = %s\n", yylval.string);
124用lex/yacc来解析配置文件 - 547502462 - 天马行空    sharesec->writeable = yylval.number;
125用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
126用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_PATH:
127用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("\tpath = %s\n", yylval.string);
128用lex/yacc来解析配置文件 - 547502462 - 天马行空    strncpy(sharesec->path, yylval.string, PATH_MAX);
129用lex/yacc来解析配置文件 - 547502462 - 天马行空    free(yylval.string);
130用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
131用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_GUESTOK:
132用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("\tguest ok = %s\n", yylval.string);
133用lex/yacc来解析配置文件 - 547502462 - 天马行空    sharesec->guestok = yylval.number;
134用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
135用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_VALID_USERS:
136用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("\tvalid users = %s\n", yylval.string);
137用lex/yacc来解析配置文件 - 547502462 - 天马行空    sharesec->valid_users = strdup(yylval.string);
138用lex/yacc来解析配置文件 - 547502462 - 天马行空    free(yylval.string);
139用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
140用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_WRITE_LIST:
141用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("\twrite list = %s\n", yylval.string);
142用lex/yacc来解析配置文件 - 547502462 - 天马行空    sharesec->write_list = strdup(yylval.string);
143用lex/yacc来解析配置文件 - 547502462 - 天马行空    free(yylval.string);
144用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
145用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_CREATE_MODE:
146用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("\tcreate mode = %o\n", yylval.number);
147用lex/yacc来解析配置文件 - 547502462 - 天马行空    sharesec->create_mode = yylval.number;
148用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
149用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_DIRECTORY_MODE:
150用lex/yacc来解析配置文件 - 547502462 - 天马行空    //printf("\tdriectory mask = %d\n", yylval.number);
151用lex/yacc来解析配置文件 - 547502462 - 天马行空    sharesec->directory_mask = yylval.number;
152用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
153用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_HOSTNAME:
154用lex/yacc来解析配置文件 - 547502462 - 天马行空    strncpy(serversec->hostname, yylval.string, LEN);
155用lex/yacc来解析配置文件 - 547502462 - 天马行空    free(yylval.string);
156用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
157用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_IPADDR:
158用lex/yacc来解析配置文件 - 547502462 - 天马行空    strncpy(serversec->ipaddr, yylval.string15);
159用lex/yacc来解析配置文件 - 547502462 - 天马行空    free(yylval.string);
160用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
161用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_LOGINNAME:
162用lex/yacc来解析配置文件 - 547502462 - 天马行空    strncpy(serversec->loginname, yylval.string, NAMELEN);
163用lex/yacc来解析配置文件 - 547502462 - 天马行空    free(yylval.string);
164用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
165用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_LOGINPASS:
166用lex/yacc来解析配置文件 - 547502462 - 天马行空    strncpy(serversec->loginpass, yylval.string, NAMELEN);
167用lex/yacc来解析配置文件 - 547502462 - 天马行空    free(yylval.string);
168用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
169用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_PORT:
170用lex/yacc来解析配置文件 - 547502462 - 天马行空    serversec->port = yylval.number;
171用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
172用lex/yacc来解析配置文件 - 547502462 - 天马行空  case T_ENCODE:
173用lex/yacc来解析配置文件 - 547502462 - 天马行空    strncpy(serversec->encoding, yylval.string, NAMELEN);
174用lex/yacc来解析配置文件 - 547502462 - 天马行空    free(yylval.string);
175用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
176用lex/yacc来解析配置文件 - 547502462 - 天马行空  default:
177用lex/yacc来解析配置文件 - 547502462 - 天马行空    break;
178用lex/yacc来解析配置文件 - 547502462 - 天马行空  }

179用lex/yacc来解析配置文件 - 547502462 - 天马行空}
 
180用lex/yacc来解析配置文件 - 547502462 - 天马行空
181用lex/yacc来解析配置文件 - 547502462 - 天马行空int read_share_section(int offset,  share_section_t *section)
182用lex/yacc来解析配置文件 - 547502462 - 天马行空{
183用lex/yacc来解析配置文件 - 547502462 - 天马行空  if (offset >= ishare)
184用lex/yacc来解析配置文件 - 547502462 - 天马行空    return -1;
185用lex/yacc来解析配置文件 - 547502462 - 天马行空
186用lex/yacc来解析配置文件 - 547502462 - 天马行空  section = share_sections[offset]; 
187用lex/yacc来解析配置文件 - 547502462 - 天马行空  
188用lex/yacc来解析配置文件 - 547502462 - 天马行空  return 0;
189用lex/yacc来解析配置文件 - 547502462 - 天马行空}

190用lex/yacc来解析配置文件 - 547502462 - 天马行空
191用lex/yacc来解析配置文件 - 547502462 - 天马行空int read_server_section(int offset, server_section_t *section)
192用lex/yacc来解析配置文件 - 547502462 - 天马行空{
193用lex/yacc来解析配置文件 - 547502462 - 天马行空  if (offset >= iserver)
194用lex/yacc来解析配置文件 - 547502462 - 天马行空    return -1;
195用lex/yacc来解析配置文件 - 547502462 - 天马行空
196用lex/yacc来解析配置文件 - 547502462 - 天马行空  section = server_sections[offset];
197用lex/yacc来解析配置文件 - 547502462 - 天马行空
198用lex/yacc来解析配置文件 - 547502462 - 天马行空  return 0;
199用lex/yacc来解析配置文件 - 547502462 - 天马行空}

200用lex/yacc来解析配置文件 - 547502462 - 天马行空

  评论这张
 
阅读(754)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018