FileName: read_config_file.h
Description:
Aurthor: angel
Date: 2013/10/22
Version: v.1.0
*/
#ifndef READ_CONF_FILE_H
#define READ_CONF_FILE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
/********************* macro define *****************/
#define Array(x) sizeof(x)/sizeof(x[0])
#define MAX_FILE_LINE 128 //配置文件每天行最大长度
#define MAX_PARA_LEN 50 //配置文件参数长度
/********************* data struct define *************/
typedef struct conf_para
{
char name[MAX_PARA_LEN];
char val[MAX_PARA_LEN];
}conf_para_t;
/******************** function define *******************/
char *l_trim(char *szOutput , const char *szInput);
char *r_trim(char *szOutput , const char *szInput);
char *a_trim(char *szOutput , const char *szInput);
int GetConfigFile(char *conf,const char *KeyName,char *KeyVal);
#endif
/*
FileName: read_config_file.c
Description:
Aurthor: angel
Date: 2013/10/22
Version: v.1.0
*/
#include "read_config_file.h"
/********************* macro define *****************/
/********************* data struct define *************/
/******************** function define ****************/
/**************************************************
description: 删除字符串左端空格
return :左端无空格的字符串
***************************************************/
char *l_trim(char *szOutput , const char *szInput)
{
assert(szInput != NULL);
assert(szOutput != NULL);
assert(szOutput != szInput);
while((*szInput != '\0') && (isspace(*szInput)))
{
++szInput;
}
return (strcpy(szOutput,szInput));
}
/**************************************************
description: 删除字符串右端空格
return : 右端无空格的字符串
***************************************************/
char *r_trim(char *szOutput , const char *szInput)
{
char *p = NULL;
assert(szInput != NULL);
assert(szOutput != NULL);
assert(szOutput != szInput);
strcpy(szOutput,szInput);
for(p = szOutput + strlen(szOutput) - 1;(p >= szOutput) && (isspace(*p));--p)
{
;
}
*(++p) = '\0';
return (szOutput);
}
/**************************************************
description: 删除字符串两端空格
return :两端无空格的字符串
***************************************************/
char *a_trim(char *szOutput , const char *szInput)
{
assert(szInput != NULL);
assert(szOutput != NULL);
assert(szOutput != szInput);
l_trim(szOutput , szInput);
r_trim(szOutput , szInput);
return (szOutput);
}
/****************************************************************************
description: 从conf文件中查找KeyName,结果保存在KeyVal中
conf格式: 关键字= 参数(等号两边可以有空格也可以没有)
'#'开头的内容为注释内容,不查找
return : -1 失败
0 成功
****************************************************************************/
int GetConfigFile(char *conf,const char *KeyName,char *KeyVal)
{
char buf_i[MAX_FILE_LINE],buf_o[MAX_FILE_LINE];
char *pos;
FILE *fp;
if((fp = fopen(conf,"r")) == NULL)
{
printf("openfile %s error \n",conf);
return (-1);
}
fseek(fp,0,SEEK_SET);
memset(buf_i,0,sizeof(buf_i));
while(!feof(fp) && (fgets(buf_i,sizeof(buf_i),fp) != NULL))
{
a_trim(buf_o,buf_i);
if(strlen(buf_o) <= 0) //file is empty
{
continue;
}
if(buf_o[0] == '#') //skip note message
{
continue;
}
pos = strstr(buf_o,KeyName);//search KeyName in one of the file line
if(pos != NULL)
{
pos += strlen(KeyName);
while((*pos != '\0') && ((*pos == ' ') || (*pos == '=')) )
{
pos++;
}
if(strlen(pos) <= 0)
{
continue;
}
strcpy(KeyVal,pos);
}
}
return 0;
}
/******************************** test programe *****************************、
void output_test(void)
{
int i;
for(i = 0;i < Array(gconf_opts);i++)
{
printf("%s = %s \n",gconf_opts[i].name,gconf_opts[i].val);
}
}
int main(int agrc ,char *argv[])
{
char buf[128];
int i;
if(agrc < 2)
{
printf("Usage : ./read_config_file ./filename \n");
return 1;
}
for(i = 0;i < Array(gconf_opts);i++)
{
GetConfigFile(argv[1],gconf_opts[i].name,gconf_opts[i].val);
}
output_test();
return 0;
}
//配置文件的格式
CGIRoot = ./cgi-bin/
DefaultFile = index.html
DocumentRoot = ./www/
ListenPort = 8090
MaxClient = 5
TimeOut = 6