#ifndef __INIPARSERHELPER_H_
#define __INIPARSERHELPER_H_ #define IN
#define OUT
#define INOUT typedef enum iniPraseValueType
{
INIP_STR = ,
INIP_INT,
INIP_DOUBLE,
INIP_BOOL,
}IniPraseType; typedef struct stIniParserResult
{
char * pcStrResult;
int iIntResult;
double dDoubleResult;
int iBoolResult;
int iErrorCode;
}STIniParserResult; #define RESULT_OK 0x00000000
#define DEFAULT_ERROR 0x00000001
#define PARAM_ERROR 0x00000002
#define MALLOC_ERROR 0x00000003
#define DATA_ERROR 0x00000004
#define FILE_NOTEXIST_ERROR 0x00000005 #include "iniparser.h" //初始化
int initIniParser(IN const char *pcFileName ,IN dictionary **dicIni); //获取section的个数
int getSectionCount(dictionary * dicIni, int *iSenctionCount); //获取指定位置的section的值
int getSectionByIndex(dictionary * dicIni, unsigned int n, char **pcResult); //获取section下key的个数
int getSectionKeyCount(dictionary * dicIni, const char *pcSectionName, unsigned int *n); //获取section的键的集合
int getSectionKeys(dictionary * dicIni, const char *pcSectionName, char **pcKeys); //获取指定section:key的值
STIniParserResult * getIniValue(dictionary * dicIni, const char *pcSectionName, const char *pcKey, IniPraseType enValueType); //获取指定section:key的字符串值
char * getIniValueExtend(dictionary * dicIni, const char *pcSectionName, const char *pcKey); //获取ini文件中字符串的值(section已经拼接完成)
char * inipGetStringExtend(IN dictionary * dicIni, IN const char * pcKey); //释放资源
void releaseIniParser(dictionary * dicIni); #endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include "iniParserHelper.h" //double类型允许的精度误差
#define ACCURACY 0.00001 /********************************************************
Func Name: inipGetString
Date Created: 2018-7-3
Description: 获取ini文件中字符串的值
Input: dicIni: dictionary struct
pcKey:key
Output: pstResult:返回结构体
Return: 无
Caution:
*********************************************************/
static void inipGetString(IN dictionary * dicIni, IN const char * pcKey, OUT STIniParserResult *pstResult)
{
if (NULL == dicIni || pcKey == NULL || NULL == pstResult)
{
return;
}
pstResult->pcStrResult = (char *)iniparser_getstring(dicIni, pcKey, NULL);
if (NULL == pstResult->pcStrResult)
{
pstResult->iErrorCode = DATA_ERROR;
}else
{
pstResult->iErrorCode = RESULT_OK;
}
} /********************************************************
Func Name: inipGetInt
Date Created: 2018-7-3
Description: 获取ini文件中int类型的值
Input: dicIni: dictionary struct
pcKey:key
Output: pstResult:返回结构体
Return: 无
Caution:
*********************************************************/
static void inipGetInt(IN dictionary * dicIni, IN const char * pcKey, OUT STIniParserResult *pstResult)
{
int iResCode1 = , iResCode2 = , iResCode = ;
int iFlag = ;
iResCode = iniparser_getint(dicIni, pcKey, iResCode1);
if (iResCode == iResCode1)
{
iFlag += ;
}
iResCode = iniparser_getint(dicIni, pcKey, iResCode2);
if (iResCode == iResCode1)
{
iFlag += ;
}
if (iFlag > )
{
pstResult->iErrorCode = DATA_ERROR;
}else
{
pstResult->iIntResult = iResCode;
pstResult->iErrorCode = RESULT_OK;
}
} /********************************************************
Func Name: inipGetDouble
Date Created: 2018-7-3
Description: 获取ini文件中double类型的值
Input: dicIni: dictionary struct
pcKey:key
Output: pstResult:返回结构体
Return: 无
Caution:
*********************************************************/
static void inipGetDouble(IN dictionary * dicIni, IN const char * pcKey, OUT STIniParserResult *pstResult)
{
double iResCode1 = 0.0001, iResCode2 = 0.0002, iResCode = 0.0;
int iFlag = ;
iResCode = iniparser_getdouble(dicIni, pcKey, iResCode1);
if (iResCode >= iResCode1-ACCURACY && iResCode <= iResCode1+ACCURACY)
{
iFlag += ;
}
iResCode = iniparser_getdouble(dicIni, pcKey, iResCode2);
if (iResCode >= iResCode2-ACCURACY && iResCode <= iResCode2+ACCURACY)
{
iFlag += ;
}
if (iFlag > )
{
pstResult->iErrorCode = DATA_ERROR;
}else
{
pstResult->dDoubleResult = iResCode;
pstResult->iErrorCode = RESULT_OK;
}
} /********************************************************
Func Name: inipGetBool
Date Created: 2018-7-3
Description: 获取ini文件中bool类型的值
Input: dicIni: dictionary struct
pcKey:key
Output: pstResult:返回结构体
Return: 无
Caution:
*********************************************************/
static void inipGetBool(IN dictionary * dicIni, IN const char * pcKey, OUT STIniParserResult *pstResult)
{
int iResCode = -, iTestNum = -;
iResCode = iniparser_getboolean(dicIni, pcKey, iTestNum);
if (iResCode == iTestNum)
{
pstResult->iErrorCode = DATA_ERROR;
}else
{
pstResult->iBoolResult = iResCode;
pstResult->iErrorCode = RESULT_OK;
}
} /********************************************************
Func Name: getIniValue
Date Created: 2018-7-3
Description: 获取ini文件的值
Input: dicIni : dictionary struct
pcSectionName : section name
pcKey :key
enValueType : value type
Output:
Return: result struct
Caution: need free return value
*********************************************************/
STIniParserResult * getIniValue(dictionary * dicIni, const char *pcSectionName, const char *pcKey, IniPraseType enValueType)
{
char *pcSectionKey = NULL;
size_t uiLen = ;
STIniParserResult * pstResult = NULL; pstResult = malloc(sizeof(STIniParserResult));
if(NULL == pstResult)
{
return NULL;
}
memset(pstResult, , sizeof(STIniParserResult)); if (NULL == dicIni || NULL == pcSectionName || NULL == pcKey)
{
pstResult->iErrorCode = PARAM_ERROR;
return pstResult;
}
//多一个":"和"/0"
uiLen = strlen(pcSectionName) + strlen(pcKey) + + ;
pcSectionKey = (char *)malloc(uiLen);
if(NULL == pcSectionKey)
{
pstResult->iErrorCode = MALLOC_ERROR;
return pstResult;
}
memset(pcSectionKey, , uiLen);
sprintf(pcSectionKey,"%s:%s",pcSectionName,pcKey);
switch (enValueType)
{
case INIP_STR:
inipGetString(dicIni, pcSectionKey, pstResult);
break;
case INIP_INT:
inipGetInt(dicIni, pcSectionKey, pstResult);
break;
case INIP_DOUBLE:
inipGetDouble(dicIni, pcSectionKey, pstResult);
break;
case INIP_BOOL:
inipGetBool(dicIni, pcSectionKey, pstResult);
break;
default:
pstResult->iErrorCode = DATA_ERROR;
break;
}
if(pcSectionKey)
{
free(pcSectionKey);
pcSectionKey = NULL;
}
return pstResult;
} /********************************************************
Func Name: initIniParser
Date Created: 2018-7-3
Description: 初始化ini解析器
Input: pcFileName : Name of the ini file to read
dicIni : dictionary object
Output:
Return: errcode
Caution: need call releaseIniParser()
*********************************************************/
int initIniParser(IN const char *pcFileName ,IN dictionary **dicIni)
{
int iResultCode = DEFAULT_ERROR; if (NULL == pcFileName || NULL == dicIni)
{
iResultCode = PARAM_ERROR;
return iResultCode;
} if (access(pcFileName, F_OK))
{
iResultCode = FILE_NOTEXIST_ERROR;
return iResultCode;
}
*dicIni = iniparser_load(pcFileName);
if(NULL == *dicIni)
{
iResultCode = DEFAULT_ERROR;
return iResultCode;
}
return RESULT_OK;
} /********************************************************
Func Name: releaseIniParser
Date Created: 2018-7-3
Description: 释放ini解析器
Input: dicIni : dictionary object
Output:
Return:
Caution:
*********************************************************/
void releaseIniParser(IN dictionary * dicIni)
{
if (dicIni)
{
iniparser_freedict(dicIni);
}
} /********************************************************
Func Name: getSectionCount
Date Created: 2018-7-4
Description: 获取section的个数
Input: dicIni : dictionary object
iSenctionCount :section numbers
Output:
Return: error code
Caution:
*********************************************************/
int getSectionCount(IN dictionary *dicIni, IN int *iSenctionCount)
{
int iResultCode = DEFAULT_ERROR;
if (NULL == dicIni || NULL == iSenctionCount)
{
iResultCode = PARAM_ERROR;
return iResultCode;
}
iResultCode = iniparser_getnsec(dicIni);
if (- == iResultCode)
{
iResultCode = DATA_ERROR;
return iResultCode;
}
*iSenctionCount = iResultCode;
return RESULT_OK;
} /********************************************************
Func Name: getSectionByIndex
Date Created: 2018-7-4
Description: 获取指定位置的section
Input: dicIni : dictionary object
n : section numbers
Output: pcResult : section name
Return: error code
Caution: Do not free or modify the returned pcResult
*********************************************************/
int getSectionByIndex( IN dictionary * dicIni, IN unsigned int n, OUT char **pcResult)
{
int iResultCode = DEFAULT_ERROR;
char *pcTmp = NULL;
if (NULL == dicIni || NULL == pcResult)
{
iResultCode = PARAM_ERROR;
return iResultCode;
}
pcTmp = (char *)iniparser_getsecname(dicIni, (int)n);
if (NULL == pcTmp)
{
iResultCode = DATA_ERROR;
return iResultCode;
}
*pcResult = pcTmp;
return RESULT_OK;
} /********************************************************
Func Name: getSectionKeyCount
Date Created: 2018-7-4
Description: 获取section下key的个数
Input: dicIni : dictionary object
pcSectionName : section name
Output: n : key numbers
Return: error code
Caution:
*********************************************************/
int getSectionKeyCount( IN dictionary * dicIni, IN const char *pcSectionName, OUT unsigned int *n)
{
int iResultCode = DEFAULT_ERROR;
unsigned int num = ;
if (NULL == dicIni || NULL == pcSectionName || NULL == n)
{
iResultCode = PARAM_ERROR;
return iResultCode;
}
num = (unsigned int)iniparser_getsecnkeys(dicIni,pcSectionName);
if ( == num)
{
iResultCode = DATA_ERROR;
return iResultCode;
}
*n = num;
return RESULT_OK;
} /********************************************************
Func Name: getSectionKeys
Date Created: 2018-7-4
Description: 获取section的键的集合
Input: dicIni : dictionary object
pcSectionName : section name
OutInput: pcKeys : keys in a section of a dictionary
Return: error code
Caution: pcKeys必须有函数调用者进行分配,但是pcKeys数组中的元素的内存不需要由调用者释放
*********************************************************/
int getSectionKeys(IN dictionary * dicIni, IN const char *pcSectionName,INOUT char **pcKeys)
{
int iResultCode = DEFAULT_ERROR;
if (NULL == dicIni || NULL == pcSectionName || NULL == pcKeys)
{
iResultCode = PARAM_ERROR;
return iResultCode;
}
iniparser_getseckeys(dicIni, pcSectionName, pcKeys);
return RESULT_OK;
} /********************************************************
Func Name: getIniValueExtend
Date Created: 2018-7-4
Description: 获取指定section:key的字符串值
Input: dicIni : dictionary object
pcSectionName : section name
pcKey : key name
OutInput:
Return: error code
Caution:
*********************************************************/
char * getIniValueExtend(IN dictionary * dicIni, IN const char *pcSectionName, IN const char *pcKey)
{
STIniParserResult *pstData = NULL;
char * pcResult = NULL; pstData = getIniValue(dicIni, pcSectionName, pcKey, INIP_STR);
if (pstData)
{
pcResult = pstData->pcStrResult;
free(pstData);
pstData = NULL;
}
return pcResult;
} /********************************************************
Func Name: inipGetStringExtend
Date Created: 2018-7-3
Description: 获取ini文件中字符串的值(section已经拼接完成)
Input: dicIni: dictionary struct
pcKey:key
Output:
Return: key的值
Caution:
*********************************************************/
char * inipGetStringExtend(IN dictionary * dicIni, IN const char * pcKey)
{
char *pcResult = NULL;
if (NULL == dicIni || pcKey == NULL)
{
return NULL;
}
pcResult= (char *)iniparser_getstring(dicIni, pcKey, NULL);
return pcResult;
}

该配置文件读取使用了iniparser开源库,需要从开源网站上下载源码编译生成动态库文件调用

Linux共享库 配置文件读取的更多相关文章

  1. linux共享库

    linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有 ...

  2. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  3. linux环境 :Linux 共享库LIBRARY_PATH, LD_LIBRARY_PATH 与ld.so.conf

    参考: 1. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径.(该路径在默 ...

  4. linux共享库加载

    参考自: <<程序员的自我修养--链接.装载与库>> 第八章 Linux共享库的组织 以下截取部分内容 (这本书比较好的讲解了从程序的链接,装载,到运行) 共享库的兼容性 li ...

  5. linux共享库的版本控制

    前几天看到一篇介绍linux共享库版本控制及使用的文章,觉得不错,这里就与大家分享一下. 1. Linux约定 经常看到Linux中,共享库的名字后面跟了一串数字,比如:libperl.so.5.18 ...

  6. Linux共享库、静态库、动态库详解

    1. 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用.程序函数库 ...

  7. Linux 共享库(动态库)

    Linux 系统上有两类根本不同的 Linux 可执行程序.第一类是静态链接的可执行程序.静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”.因为这一原因,静态可执行程序不依赖任何外 ...

  8. Linux Linux共享库

    so文件在linux中为共享库,与windows下的dll类似. so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用. 共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性 ...

  9. Linux共享库 日志方法

    mylog.h #ifdef __cplusplus extern "C" { #endif //写日志函数 //path:日志文件名 //msg:日志信息 int writelo ...

随机推荐

  1. SQL SERVER 的排序规则

    有时候查询数据库的时候会发现(比如做重名检查的时候):数据库的查询时对大小写不敏感的,也就是 A 和 a 是一样的. 也就是说 select * from tabletest where name = ...

  2. ARC指南 strong和weak指针

    一.简介 ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因为编 ...

  3. Atitit 面试问题总结

    Atitit 面试问题总结 1. 面试约人阶段可以预先1俩分钟大概问下情况1 2. 自我介绍阶段1 3. 技术方面2 3.1. 界面方面2 3.2. Java 本身   了解spring mybati ...

  4. Atitti 固化数据库表结构方案

    Atitti 固化数据库表结构方案 1. 固化数据库表结的重要意义1 2. 如何固化表结构1 2.1. 向上抽象一层,以动词有目标,以名词为存储对象.1 2.2. 数据类型datatype字段:这个用 ...

  5. ios开发中的一些小技巧

    1.如果在程序中想对某张图片进行处理的话(得到某张图片的一部分)可一用以下代码:   UIImage *image = [UIImage imageNamed:filename]; CGImageRe ...

  6. 深入理解Linux内核-块设备驱动程序

    扇区: 1.硬盘控制器将磁盘看成一大组扇区2.扇区就是一组相邻字节3.扇区按照惯例大小设置位512字节4.存放在块设备中的数据是通过它们在磁盘上的位置来标识,即首个扇区的下标和扇区的数目.5.扇区是硬 ...

  7. 有用的 JS 和 CSS 库

    1. Moon Moon 是一个灵感源于 Vue.js 的 JavaScript UI 库,但它却更轻量.简单.它具备优化的虚拟 DOM 引擎,对用户友好的 API,并且在 gzip 压缩后仅有 6K ...

  8. sql的split()函数

    ALTER function [dbo].[StrToList_Test](@Str varchar()) returns @table table( value nvarchar(max) ) as ...

  9. Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...

  10. 【delphi】Byte数组与String类型的转换

    string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...