From f47f136f56c825481f4d7eb4fe0b42f98fa13da7 Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Fri, 26 Aug 2022 11:02:36 +0800 Subject: [PATCH] add functions: iniGetDoubleCorrectValueEx and iniGetPercentCorrectValueEx --- HISTORY | 3 +- src/ini_file_reader.c | 88 +++++++++++++++++++++++++++++++++++++++++++ src/ini_file_reader.h | 68 ++++++++++++++++++++++++++++++++- 3 files changed, 157 insertions(+), 2 deletions(-) diff --git a/HISTORY b/HISTORY index f39ada1..8c30555 100644 --- a/HISTORY +++ b/HISTORY @@ -1,7 +1,8 @@ -Version 1.60 2022-08-25 +Version 1.60 2022-08-26 * normalize_path for base_path * struct fast_task_info add field recv_body for dynamic recv buffer + * add functions: iniGetDoubleCorrectValueEx and iniGetPercentCorrectValueEx Version 1.59 2022-07-21 * open file with flag O_CLOEXEC diff --git a/src/ini_file_reader.c b/src/ini_file_reader.c index 06d260c..54176dc 100644 --- a/src/ini_file_reader.c +++ b/src/ini_file_reader.c @@ -2921,6 +2921,64 @@ int64_t iniCheckAndCorrectIntValue(IniFullContext *pIniContext, return nValue; } +double iniCheckAndCorrectDoubleValue(IniFullContext *pIniContext, + const char *szItemName, const double dValue, + const double dMinValue, const double dMaxValue) +{ + char section_prompt[128]; + if (dValue < dMinValue) { + INI_FILL_SECTION_PROMPT(section_prompt, sizeof(section_prompt), + pIniContext->section_name); + logWarning("file: "__FILE__", line: %d, " + "config file: %s, %sitem name: %s, item value: %.2f" + " < min value: %.2f, set to min value: %.2f", + __LINE__, pIniContext->filename, section_prompt, + szItemName, dValue, dMinValue, dMinValue); + + return dMinValue; + } else if (dValue > dMaxValue) { + INI_FILL_SECTION_PROMPT(section_prompt, sizeof(section_prompt), + pIniContext->section_name); + logWarning("file: "__FILE__", line: %d, " + "config file: %s, %sitem name: %s, item value: %.2f" + " > max value: %.2f, set to max value: %.2f", + __LINE__, pIniContext->filename, section_prompt, + szItemName, dValue, dMaxValue, dMaxValue); + return dMaxValue; + } + + return dValue; +} + +double iniCheckAndCorrectPercentValue(IniFullContext *pIniContext, + const char *szItemName, const double dValue, + const double dMinValue, const double dMaxValue) +{ + char section_prompt[128]; + if (dValue < dMinValue) { + INI_FILL_SECTION_PROMPT(section_prompt, sizeof(section_prompt), + pIniContext->section_name); + logWarning("file: "__FILE__", line: %d, " + "config file: %s, %sitem name: %s, item value: %.2f%%" + " < min value: %.2f%%, set to min value: %.2f%%", + __LINE__, pIniContext->filename, section_prompt, + szItemName, dValue * 100, dMinValue * 100, dMinValue * 100); + + return dMinValue; + } else if (dValue > dMaxValue) { + INI_FILL_SECTION_PROMPT(section_prompt, sizeof(section_prompt), + pIniContext->section_name); + logWarning("file: "__FILE__", line: %d, " + "config file: %s, %sitem name: %s, item value: %.2f%%" + " > max value: %.2f%%, set to max value: %.2f%%", + __LINE__, pIniContext->filename, section_prompt, + szItemName, dValue * 100, dMaxValue * 100, dMaxValue * 100); + return dMaxValue; + } + + return dValue; +} + int64_t iniGetInt64ValueEx(const char *szSectionName, const char *szItemName, IniContext *pContext, const int64_t nDefaultValue, const bool bRetryGlobal) @@ -2952,6 +3010,36 @@ int64_t iniGetInt64CorrectValueEx(IniFullContext *pIniContext, value, nMinValue, nMaxValue); } +double iniGetDoubleCorrectValueEx(IniFullContext *pIniContext, + const char *szItemName, const double dbDefaultValue, + const double dbMinValue, const double dbMaxValue, + const bool bRetryGlobal) +{ + double value; + + value = iniGetDoubleValueEx(pIniContext->section_name, szItemName, + pIniContext->context, dbDefaultValue, bRetryGlobal); + return iniCheckAndCorrectDoubleValue(pIniContext, szItemName, + value, dbMinValue, dbMaxValue); +} + +int iniGetPercentCorrectValueEx(IniFullContext *pIniContext, + const char *szItemName, double *dbItemValue, + const double dbDefaultValue, const double dbMinValue, + const double dbMaxValue, const bool bRetryGlobal) +{ + int result; + + if ((result=iniGetPercentValueEx(pIniContext, szItemName, dbItemValue, + dbDefaultValue, bRetryGlobal)) == 0) + { + *dbItemValue = iniCheckAndCorrectPercentValue(pIniContext, + szItemName, *dbItemValue, dbMinValue, dbMaxValue); + } + + return result; +} + int64_t iniGetByteValueEx(const char *szSectionName, const char *szItemName, IniContext *pContext, const int64_t nDefaultValue, const int nDefaultUnitBytes, diff --git a/src/ini_file_reader.h b/src/ini_file_reader.h index 6c0e543..ae89081 100644 --- a/src/ini_file_reader.h +++ b/src/ini_file_reader.h @@ -159,6 +159,16 @@ extern "C" { iniGetByteCorrectValueEx(ini_ctx, item_name, \ default_value, 1, min_value, max_value, false) +#define iniGetDoubleCorrectValue(ini_ctx, item_name, \ + default_value, min_value, max_value) \ + iniGetDoubleCorrectValueEx(ini_ctx, item_name, \ + default_value, 1, min_value, max_value, false) + +#define iniGetPercentCorrectValue(ini_ctx, item_name, \ + item_value, default_value, min_value, max_value) \ + iniGetPercentCorrectValueEx(ini_ctx, item_name, item_value, \ + default_value, min_value, max_value, false) + int iniSetAnnotationCallBack(AnnotationEntry *annotations, int count); void iniDestroyAnnotationCallBack(); @@ -288,7 +298,7 @@ int iniGetIntValueEx(const char *szSectionName, const char *szItemName, IniContext *pContext, const int nDefaultValue, const bool bRetryGlobal); -/** check and correct item value +/** check and correct int value * parameters: * pIniContext: the full ini context * szItemName: the item name @@ -301,6 +311,32 @@ int64_t iniCheckAndCorrectIntValue(IniFullContext *pIniContext, const char *szItemName, const int64_t nValue, const int64_t nMinValue, const int64_t nMaxValue); +/** check and correct double value + * parameters: + * pIniContext: the full ini context + * szItemName: the item name + * dValue: the item value + * dMinValue: the min value to check (including) + * dMaxValue: the max value to check (including) + * return: corrected value +*/ +double iniCheckAndCorrectDoubleValue(IniFullContext *pIniContext, + const char *szItemName, const double dValue, + const double dMinValue, const double dMaxValue); + +/** check and correct double value (show as percentage) + * parameters: + * pIniContext: the full ini context + * szItemName: the item name + * dValue: the item value + * dMinValue: the min value to check (including) + * dMaxValue: the max value to check (including) + * return: corrected value +*/ +double iniCheckAndCorrectPercentValue(IniFullContext *pIniContext, + const char *szItemName, const double dValue, + const double dMinValue, const double dMaxValue); + /** get item correct value (32 bits integer) * parameters: * pIniContext: the full ini context @@ -416,6 +452,20 @@ double iniGetDoubleValueEx(const char *szSectionName, const char *szItemName, IniContext *pContext, const double dbDefaultValue, const bool bRetryGlobal); +/** get item correct double value + * parameters: + * pIniContext: the full ini context + * szItemName: the item name + * dbDefaultValue: the default value + * dbMinValue: the min value to check (including) + * dbMaxValue: the max value to check (including) + * bRetryGlobal: if fetch from global section when the item not exist + * return: double value, return dbDefaultValue when the item not exist +*/ +double iniGetDoubleCorrectValueEx(IniFullContext *pIniContext, + const char *szItemName, const double dbDefaultValue, + const double dbMinValue, const double dbMaxValue, + const bool bRetryGlobal); /** get item percent double value * parameters: @@ -430,6 +480,22 @@ int iniGetPercentValueEx(IniFullContext *ini_ctx, const char *item_name, double *item_value, const double default_value, const bool retry_global); +/** get item correct double value (show as percentage) + * parameters: + * pIniContext: the full ini context + * szItemName: the item name + * dbItemValue: store the item value + * dbDefaultValue: the default value + * dbMinValue: the min value to check (including) + * dbMaxValue: the max value to check (including) + * bRetryGlobal: if fetch from global section when the item not exist + * return: error no, 0 for success, != 0 for fail +*/ +int iniGetPercentCorrectValueEx(IniFullContext *pIniContext, + const char *szItemName, double *dbItemValue, + const double dbDefaultValue, const double dbMinValue, + const double dbMaxValue, const bool bRetryGlobal); + /** print all items * parameters: * pContext: the ini context