为了写一个消息中间件,结果顺手写了一个读取 ini 配置文件的类库。
虽然小,但是够用了。
rwini.c
点击(此处)折叠或打开
-
#include <rwini.h>
-
#include <zPublic.h>
-
-
struct _inis *ini_loader(const char *inifile)
-
{
-
FILE *fp;
-
int i,j,k;
-
static struct _inis inis[512];
-
char str[2048];
-
char str_remark[2048];
-
char str_key[2048];
-
char str_value[2048];
-
char str_desce[2048];
-
-
fp = fopen(inifile,"rb");
-
if ( fp == NULL )
-
return NULL;
-
-
/* 从 ini 文件重读取信息,装入到 struct _inis 结构体 */
-
i = -1 ;
-
j = 0;
-
k = 0;
-
while(!feof(fp))
-
{
-
bzero(str,2048);
-
if ( fgets(str,2048,fp) == NULL )
-
break;
-
trim(str);
-
if ( str[0] == '[' && str[strlen(str)-1] == ']' )
-
{
-
/* 是一个节点定义 */
-
i++;
-
if ( i > 0 )
-
{
-
/* 不是首节点的时候 */
-
for(k = 0 ; k<j; k++ )
-
inis[i-1].ini_struct[k].max_key = j;
-
}
-
inis[i].node_name = (char *)malloc(sizeof(char)*strlen(str));
-
if ( inis[i].node_name == NULL )
-
{
-
fclose(fp);
-
return NULL;
-
}
-
j = 0 ;
-
snprintf(inis[i].node_name,strlen(str)-1,"%s",str+1);
-
} else {
-
if ( str[0] == ';' || str[0] == '#' || str[0] == '\n' || str[0] == 0 || str == NULL)
-
{
-
/* 首字符是 ; 号,抛弃 */
-
continue;
-
}
-
/* 不是一个节点,进行 key 和 value 拆解 */
-
/* 获得注释信息 */
-
bzero(str_remark,2048);
-
snprintf(str_remark,2048,"%s",strstr(str,";")+1);
-
inis[i].ini_struct[j].remark = ( char *) malloc(sizeof(char)*strlen(str_remark));
-
bzero(inis[i].ini_struct[j].remark,strlen(str_remark));
-
strcpy(inis[i].ini_struct[j].remark,str_remark);
-
/* 得到剔除注释信息后的 key = value 的串 */
-
bzero(str_desce,2048);
-
snprintf(str_desce,strlen(str)-strlen(str_remark)+1,"%s",str);
-
trim(str_desce);
-
if ( str_desce[strlen(str_desce)-1] == ';' )
-
str_desce[strlen(str_desce)-1] = '\0';
-
/* 获得 value 信息 */
-
bzero(str_value,2048);
-
snprintf(str_value,2048,"%s",strstr(str_desce,"=")+1);
-
inis[i].ini_struct[j].value = ( char *) malloc(sizeof(char)*strlen(str_value));
-
bzero(inis[i].ini_struct[j].value,strlen(str_value));
-
strcpy(inis[i].ini_struct[j].value,str_value);
-
trim(inis[i].ini_struct[j].value);
-
/* 获得 key 信息 */
-
bzero(str_key,2048);
-
snprintf(str_key,strlen(str_desce)-strlen(str_value),"%s",str_desce);
-
inis[i].ini_struct[j].key = ( char *) malloc(sizeof(char)*strlen(str_key));
-
bzero(inis[i].ini_struct[j].key,strlen(str_key));
-
strcpy(inis[i].ini_struct[j].key,str_key);
-
trim(inis[i].ini_struct[j].key);
-
j++;
-
}
-
}
-
fclose(fp);
-
/* {BANNED}{BANNED}{BANNED}{BANNED}最佳佳佳佳后一个节点的 max_key 进行赋值 */
-
for(k = 0 ; k<j; k++ )
-
inis[i].ini_struct[k].max_key = j;
-
/* 对inis 对象的 max_node 进行赋值 */
-
for ( k = 0 ; k <= i ; k++ )
-
inis[k].max_node = i+1;
-
return inis;
-
}
-
-
-
/* ************************************************************************* *\
-
* 根据节点名称和key,查找对应的 value 值
-
* char *ini_search ( const struct _inis *inis,
-
* const char *nodename,
-
* const char *key,
-
* char **value)
-
* ************************************************************************* */
-
char *ini_search ( const struct _inis *inis,const char *nodename,const char *key,char **value)
-
{
-
int i,j;
-
for ( i = 0 ; i < inis[i].max_node ; i++ )
-
{
-
if ( !strcmp(inis[i].node_name,nodename))
-
{
-
/* 找到了该节点 */
-
for ( j = 0 ; j < inis[i].ini_struct[j].max_key; j++)
-
{
-
if ( !strcmp(inis[i].ini_struct[j].key,key))
-
{
-
/* 找到了该节点对应的 key */
-
*value = inis[i].ini_struct[j].value;
-
return (inis[i].ini_struct[j].value);
-
}
-
}
-
return NULL;
-
}
-
}
-
return NULL;
-
}
-
-
/* ***************************************************************************** *\
-
* 从 *iniPrt 中找的到指定节点并 dump 成一个单一的 iniPrt
-
* struct _inis ini_nodedump(const struct _inis *inis,
-
* const char *nodename)
-
* ****************************************************************************** */
-
struct _inis ini_nodedump(const struct _inis *inis,const char *nodename)
-
{
-
static struct _inis ss;
-
int i,j;
-
for ( i = 0 ; i < inis[i].max_node; i++ )
-
{
-
if ( !strcmp(inis[i].node_name,nodename))
-
{
-
/* 找到了这个节点 */
-
ss.node_name = (char *)malloc(sizeof(char)*strlen(inis[i].node_name));
-
strcpy(ss.node_name , inis[i].node_name);
-
for ( j = 0 ; j < inis[i].ini_struct[j].max_key; j++ )
-
{
-
ss.ini_struct[j].key = (char *)malloc(sizeof(char)*strlen(inis[i].ini_struct[j].key));
-
strcpy(ss.ini_struct[j].key , inis[i].ini_struct[j].key);
-
ss.ini_struct[j].value = (char *)malloc(sizeof(char)*strlen(inis[i].ini_struct[j].value));
-
strcpy(ss.ini_struct[j].value , inis[i].ini_struct[j].value);
-
ss.ini_struct[j].max_key = inis[i].ini_struct[j].max_key;
-
}
-
break;
-
}
-
}
-
return (ss);
-
}
-
-
#if 0
-
int main ( int argc , char **argv )
-
{
-
char *file;
-
//="test.ini";
-
int i,j;
-
char *value;
-
-
INI_Prt *ss;
-
INI_Prt st;
-
-
file = ( char *)malloc(sizeof(char)*128);
-
if ( argc < 2 )
-
snprintf(file,128,"%s","test.ini");
-
else
-
snprintf(file,128,"%s/conf/zSync.ini",getenv("HOME"));
-
-
/* 将 ini 文件加载到结构体 INI_Prt 指针 *ss */
-
if ( (ss = ini_loader(file)) == NULL)
-
return 0;
-
-
/* 循环展示整个 ini 文件的 nodename . 每个 nodename 下对应的配置信息 */
-
for ( i = 0 ; i <= ss[i].max_node ; i++)
-
{
-
printf("=== nodename = %s ==\n",ss[i].node_name);
-
printf("=== max_node = %d ==\n",ss[i].max_node);
-
for ( j = 0 ; j < ss[i].ini_struct[j].max_key ; j++)
-
{
-
printf("=== [%s].[%d].key = %s ==\n",ss[i].node_name,j,ss[i].ini_struct[j].key);
-
printf("=== [%s].[%d].value = %s ==\n",ss[i].node_name,j,ss[i].ini_struct[j].value);
-
}
-
}
-
-
-
/* 验证按照给定的节点名称,key 名,在 INI_Prt 指针中获取到对应的 value */
-
printf(" == %s ==\n",ini_search ( ss,"odbc","driver",&value));
-
printf(" 1== %s ==\n",value);
-
-
/* 验证从 INI_Prt *ss 中按照指定的 nodename 名,将该节点 dump 出来,形成一个新的 INI_Prt */
-
st = ini_nodedump(ss,"odbc");
-
for ( j = 0 ; j < st.ini_struct[j].max_key; j++ )
-
{
-
printf(" == key = [ %s ] ==\n",st.ini_struct[j].key);
-
printf(" == value = [ %s ] ==\n",st.ini_struct[j].value);
-
}
-
-
return 0;
-
}
- #endif /* if 0 */
rwini.h
点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include <strings.h>
-
-
#ifndef __RW_INI__
-
#define __RW_INI__
-
typedef struct _ini_p {
-
char *key;
-
char *value;
-
char *remark;
-
int max_key;
-
}INI_Prt_Doc;
-
-
-
typedef struct _inis {
-
char *node_name;
-
struct _ini_p ini_struct[512];
-
int max_node;
-
}INI_Prt;
-
-
-
struct _inis *ini_loader(const char *inifile);
-
char *ini_search(const struct _inis *inis,const char *nodename,const char *key,char **value);
-
struct _inis ini_nodedump(const struct _inis *inis,const char *nodename);
-
-
- #endif /* __RW_INI__ */
zPublic.h
点击(此处)折叠或打开
-
#include <stdarg.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include <unistd.h>
-
#include <signal.h>
-
#include <sys/stat.h>
-
#include <sys/param.h>
-
#include <time.h>
-
-
#ifndef __ZPUBLIC__
-
#define __ZPUBLIC__
-
-
#ifndef TRUE
-
#define TRUE 1
-
#endif
-
-
#ifndef FALSE
-
#define FALSE 0
-
#endif
-
-
#ifndef ERROR
-
#define ERROR -1
-
#endif
-
-
#ifndef SUCCESS
-
#define SUCCESS 1
-
#endif
-
-
#ifndef OK
-
#define OK 0
-
#endif
-
-
-
-
-
-
#ifndef SPACE
-
#define SPACE '\040'
-
#endif
-
-
#ifndef LF
-
#define LF '\012'
-
#endif
-
-
#ifndef ESC
-
#define ESC '\033'
-
#endif
-
-
#ifndef LOGFILE
-
#define LOGFILE logfilename("zProgCTL-app")
-
#endif
-
-
-
-
#ifndef __THISFILE__
-
#define __THISFILE__ basename(__FILE__)
-
#endif
-
-
#ifndef __FUNCTION__
-
#define __FUNCTION__ (__func__)
-
#endif
-
-
#ifndef __FUNC__
-
#define __FUNC__ (__func__)
-
#endif
-
-
#ifndef __MIN__
-
#define __MIN__(a,b)( (a)<(b)?(a):(b) )
-
#endif
-
-
#ifndef __MAX__
-
#define __MAX__(a,b)( (a)>(b)>(a):(b) )
-
#endif
-
-
#ifndef PATH_MAX
-
#ifndef _POSIX_PATH_MAX
-
#define PATH_MAX 1024
-
#else
-
#define PATH_MAX _POSIX_PATH_MAX
-
#endif
-
#endif
-
-
-
#ifndef __LINE_MAX__
-
#define __LINE_MAX__ 512
-
#endif
-
-
-
typedef struct _sec_link_node { /* ini 文件的节点 key - value 结构体,以双链表的方式实现 */
-
char node_key[80]; /* 节点中 key 的名称 */
-
char node_value[256]; /* 节点中 value 的值 */
-
struct _sec_link_node *next;
-
struct _sec_link_node *proi;
-
} _SEC_LINK_NODE ;
-
-
-
-
-
/* ******************************************************************* *
-
* return filename from logfilename function with const char * *
-
* *
- * date : 2008-04-26 *
-
* ******************************************************************* */
-
char *logfilename(const char *);
-
-
int isValidTime(const char *,const char *); /* 判断字符串是否是时间格式 */
-
int isValidNum(const char *); /* 判断字符串是否是数字 */
-
char *getlogfilename(const char *s);
-
int writelogfile(const char *,const char *, ...); /* 将信息写入日志文件 */
-
int rtrim(char *str); /* 去掉字符串右边的空格 */
-
int ltrim(char *str); /* 去掉字符串左边的空格 */
-
int trim(char *str); /* 去掉字符串左右的空格 */
-
int freadcnf_to_text ( const char *filename,char **text); /* 读取配置信息到内存 text[512][512]*/
-
//int LoadIniFile(char *inifilename,const char *nodename , struct _Section *sec_ini);
-
//char *get_sec_key_value( struct _Section *sec_ini , const char *key);
-
_SEC_LINK_NODE *Init_Sec_Info(_SEC_LINK_NODE *sec_info); /* 初始化 ini 节点双链表 */
-
_SEC_LINK_NODE *Install_Sec_Info(_SEC_LINK_NODE *sec_info,char *key,char *value,int addnum);
-
/* 插入配置文件 ini 某个节点的所有 key->value 到链表 */
-
char *Select_Sec_Node (const char *filename,const char *sec_name,const char *key);
-
/* 从配置文件中读取指定节点的制定 key 的 value 值 */
-
int checkFileExists(char *filename); /* 检查文件状态,文件是否存在 */
-
void sha256(const unsigned char *data, size_t len, unsigned char *out);
-
/* 生成 sha256 字符串码 */
-
void replace_str(char *str,const char *s1,const char *s2); /* 从字符串 str 中查找到所有的 s1 字符串内容,并用 s2 进行替换 */
-
//void generate_uuid(char *uuid_str); /* 生成 uuid 字符串 */
-
-
char *generate_date(char *date_str);
-
char *generate_time(char *time_str);
-
-
char *GetSystemTime();
-
- #endif /* __ZPUBLIC__ */
trim.c
点击(此处)折叠或打开
-
#include <zPublic.h>
-
/* TRIM LEFT */
-
-
int rtrim( char *pszString)
-
{
-
int nForwardCursor = 0;
-
int nTrailingCursor = 0;
-
int bTrim = 1;
-
-
for( nForwardCursor = 0 ; pszString[nForwardCursor] != '\0'; nForwardCursor++ )
-
if ( bTrim && isspace( pszString[nForwardCursor] ))
-
continue ;
-
else {
-
bTrim = 0;
-
pszString[nTrailingCursor] = pszString[nForwardCursor];
-
nTrailingCursor++;
-
}
-
pszString[nTrailingCursor] = '\0';
-
return SUCCESS;
-
}
-
-
/* TRIM RIGHT */
-
int ltrim( char *pszString )
-
{
-
int nForwardCursor = 0;
-
int nTrailingCursor = 0;
-
int bTrim = 1;
-
for ( nForwardCursor=strlen(pszString)-1;
-
nForwardCursor >= 0 && isspace( pszString[nForwardCursor] );
-
nForwardCursor-- )
-
{
-
}
-
pszString[nForwardCursor+1] = '\0';
-
return SUCCESS;
-
}
-
-
/* TRIM LEFT & RIGHT */
-
int trim(char *str)
-
{
-
ltrim(str);
-
rtrim(str);
-
return SUCCESS;
-
}
-
-
/*
-
int main( void )
-
{
-
char s[80];
-
sprintf(s,"%s"," aaaaaa ");
-
printf("=== strlen = %d === \n",strlen(s));
-
trim(s);
-
printf("=== len = %d ===\n",strlen(s));
-
return 0;
-
}
- */