#ifndef INIFILE_H_
#define INIFILE_H_

#include "ax_global_type.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef AX_VOID * AX_INI_HANDLE;

/* 打开并解析一个名为fname的INI文件 */
AX_S32 AX_INI_Load(const AX_CHAR *fname, AX_INI_HANDLE *handle);

/* 关闭文件 */
AX_S32 AX_INI_Close(AX_INI_HANDLE handle);

/* 将内容保存到当前文件 */
AX_S32 AX_INI_Save(AX_INI_HANDLE handle);

/* 将内容另存到一个名为fname的文件 */
AX_S32 AX_INI_SaveAs(AX_INI_HANDLE handle, const AX_CHAR *fname);

/* 获取section段第一个键为key的string值，成功返回0，否则返回错误码 */
AX_S32 AX_INI_GetStringValue(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, const AX_CHAR **value);

/* 获取section段第一个键为key的数组，成功返回0，否则返回错误码 */
AX_S32 AX_INI_GetArrayValue(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_F64 *value, AX_S32 *valueSize, AX_S32 maxSize);

/* 获取section段第一个键为key的AX_S32值，成功返回0，否则返回错误码 */
AX_S32 AX_INI_GetIntValue(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_S32 *value);
/* 获取section段第一个键为key的double值，成功返回0，否则返回错误码 */
AX_S32 AX_INI_GetDoubleValue(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_F64 *value);
/* 获取section段第一个键为key的AX_BOOL值，成功返回0，否则返回错误码 */
AX_S32 AX_INI_GetBoolValue(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_BOOL *value);
/* 获取注释，如果key=""则获取段注释 */
AX_S32 AX_INI_GetComment(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, const AX_CHAR **comment);
/* 获取行尾注释，如果key=""则获取段的行尾注释 */
AX_S32 AX_INI_GetRightComment(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, const AX_CHAR **rightComment);

/* 获取section段第一个键为key的string值，成功返回获取的值，否则返回默认值 */
AX_S32 AX_INI_GetStringValueOrDefault(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, const AX_CHAR **value, const AX_CHAR *defaultValue);
/* 获取section段第一个键为key的AX_S32值，成功返回获取的值，否则返回默认值 */
AX_S32 AX_INI_GetIntValueOrDefault(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_S32 *value, AX_S32 defaultValue);
/* 获取section段第一个键为key的double值，成功返回获取的值，否则返回默认值 */
AX_S32 AX_INI_GetDoubleValueOrDefault(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_F64 *value, AX_F64 defaultValue);
/* 获取section段第一个键为key的AX_BOOL值，成功返回获取的值，否则返回默认值 */
AX_S32 AX_INI_GetBoolValueOrDefault(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_BOOL *value, AX_BOOL defaultValue);

/* 获取section个数，至少存在一个空section */
AX_S32 AX_INI_GetSectionNum(AX_INI_HANDLE handle);
/* 是否存在某个section */
AX_BOOL AX_INI_HasSection(AX_INI_HANDLE handle, const AX_CHAR *section);

/* 是否存在某个key */
AX_BOOL AX_INI_HasKey(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key);

/* 设置字符串值 */
AX_S32 AX_INI_SetStringValue(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, const AX_CHAR *value);
/* 设置整形值 */
AX_S32 AX_INI_SetIntValue(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_S32 value);
/* 设置浮点数值 */
AX_S32 AX_INI_SetDoubleValue(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_F64 value);
/* 设置布尔值 */
AX_S32 AX_INI_SetBoolValue(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, AX_BOOL value);
/* 设置注释，如果key=""则设置段注释 */
AX_S32 AX_INI_SetComment(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, const AX_CHAR *comment);
/* 设置行尾注释，如果key=""则设置段的行尾注释 */
AX_S32 AX_INI_SetRightComment(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key, const AX_CHAR *rightComment);

/* 删除段 */
AX_S32 AX_INI_DeleteSection(AX_INI_HANDLE handle, const AX_CHAR *section);
/* 删除特定段的特定参数 */
AX_S32 AX_INI_DeleteKey(AX_INI_HANDLE handle, const AX_CHAR *section, const AX_CHAR *key);
/*设置注释分隔符，默认为"#" */
AX_S32 AX_INI_SetCommentDelimiter(AX_INI_HANDLE handle, const AX_CHAR *delimiter);

#ifdef __cplusplus
}
#endif

#endif  // INIFILE_H_

