- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2010-03-11 12:06 编辑
环境是linux
请问有没有现成的类库可以读取conf的文件
比如
http.confC 可以读取port的值?
54isno 发表于 2010-03-10 22:09 ![]()
在SDBC库里有一个envcfg函数,把你那语法配置到环境变量,使用者从环境变量取用即可,这样配置是比较自由的,应用程序可以自由定义配置项。而且配置项可以传送到子进程或从父进程继承。
源码如下:
- #include <strproc.h>
- #include <regex.h>
- #define REGNUM 3
- static char env_src[]="\\$[{(]{0,1}([A-Za-z_][0-9A-Za-z_]*)[})]{0,1}";
- static regex_t env_rp;
- static compflg=0;
- static void reg_free(void)
- {
- if(compflg) {
- compflg=0;
- regfree(&env_rp);
- }
- }
- int substitute_env(char *line)
- {
- char env[256];
- char *p=line,*envp,*getenv();
- regmatch_t pmatch[REGNUM];
- int i;
- if(!line) return 0;
- if(!compflg) {
- i=regcomp(&env_rp,env_src,REG_EXTENDED);
- if(i) {
- regerror(i,&env_rp,line,100);
- return -1;
- }
- compflg=1;
- }
- while(!(i=regexec(&env_rp,p,REGNUM,pmatch,0))) {
- for(envp=p+pmatch[1].rm_so;envp<p+pmatch[1].rm_eo;envp++) {
- env[i++]=*envp;
- }
- env[i]=0;
- envp=getenv(env);
- if(!envp) envp=".";
- p=strsubst(p+pmatch[0].rm_so,
- pmatch[0].rm_eo - pmatch[0].rm_so,envp);
- }
- return 0;
- }
- int envcfg(fname)
- char *fname;
- {
- FILE *fd;
- int i;
- char buffer[1024],*cp;
- fd=fopen(fname,"r");
- if(fd){
- while(!ferror(fd)){
- fgets(buffer,sizeof(buffer),fd);
- if(feof(fd)) break;
- TRIM(buffer);
- i=skipblk(buffer)-buffer;
- strsubst(buffer,i,(char *)0);
- if(!*buffer || *buffer=='#') continue;
- i=substitute_env(buffer);
- if(i) {
- fprintf(stderr,"%s",buffer);
- fclose(fd);
- reg_free();
- return i;
- }
- #ifdef WIN32
- putenv(buffer);
- #else
- cp=strdup(buffer);
- putenv(cp);
- #endif
- }
- reg_free();
- fclose(fd);
- } else {
- return errno;
- }
- return 0;
- }
- int strcfg(char *buffer)
- {
- int i;
- char *cp;
- i=skipblk(buffer)-buffer;
- strsubst(buffer,i,(char *)0);
- if(!*buffer || *buffer=='#') return 1;
- i=substitute_env(buffer);
- if(i) return i;
- #ifdef WIN32
- putenv(buffer);
- #else
- cp=strdup(buffer);
- putenv(cp);
- #endif
- reg_free();
- return 0;
- }
复制代码 使用envcfg(filename)即可,支持$NAME的宏代换。
例子:
cat xcom.ini
- #xcom的配置文件
- #uasge:xcom xcom.ini [option]
- #如果没有option,xcom默认的动作是取文件到本地的$RECVDIR目录下
- #option: l 目录列表。@/ 服务器上$HOME目录,$/服务器上$SENDDIR目录.
- # p 上传文件
- # E 远程执行命令
- #HOST=192.168.0.105
- #SERVER=xcomd
- #通过转发器
- SERVER=mid
- HOST=192.168.38.195
- LOGFILE=$HOME/log/cli
- LOGLEVEL=5
- RECVDIR=$HOME/recv
- CADIR=$HOME/config/ca
- DEVID=YLHTEST
- #由服务器安排的你的工作目录
- LABEL=wL~Vs5mto87ztOL0rSuW
- #SENDSIZE=1500;
- # if MVFLG != 0 NZ_GetFile() 成功后,服务器侧将文件移走(到 $RECVTMP 目录下);
- MVFLG=0
- # mid to xcomd
- DNODE=1
复制代码 使用方法:
- envcfg(argv[1]);
-
- cp=getenv("HOST");
- if(!cp||!*cp) cp="localhost";
- strcpy(conn.Host,cp);
- cp=getenv("SERVER");
- if(!cp||!*cp) cp="xcom";
- strcpy(conn.Service,cp);
- //printf("host=%s,server=%s\n",conn.Host,conn.Service);
- cc=Net_Connect(&conn,&clidata,0);
复制代码 |
|