From 069d613ee210b7f1631b9f0bd15e52f270c72078 Mon Sep 17 00:00:00 2001 From: Lukas Slebodnik Date: Wed, 22 Jun 2016 00:50:50 +0200 Subject: [PATCH 07/10] INI: Reduce count of argumets for ini_rules_check We can use NULL terminated array of pointers instead of two argumets: array + length of array. It isn't an API change because lib_iniconfig has not been released yet. --- ini/ini_configobj.c | 22 +++++++-------- ini/ini_configobj.h | 11 +++----- ini/ini_validators_ut_check.c | 64 ++++++++++++++++++++++++------------------- 3 files changed, 50 insertions(+), 47 deletions(-) diff --git a/ini/ini_configobj.c b/ini/ini_configobj.c index 287377df2177368b8442f6fd259e9ea27ba4c53c..5c3be11913e316db377d20812ab7f8a95bdcf7a1 100644 --- a/ini/ini_configobj.c +++ b/ini/ini_configobj.c @@ -1515,10 +1515,9 @@ done: static ini_validator_func * get_validator(char *validator_name, - struct ini_validator *validators, - int num_validators) + struct ini_validator **validators) { - int i; + struct ini_validator *ext_validator; /* First we check all internal validators */ if (strcmp(validator_name, "ini_dummy_noerror") == 0) { @@ -1531,18 +1530,19 @@ get_validator(char *validator_name, return ini_allowed_sections; } - /* Now check the custom validators */ if (validators == NULL) { return NULL; } - for (i = 0; i < num_validators; i++) { + for (; *validators != NULL; ++validators) { + ext_validator = *validators; + /* Skip invalid external validator. Name is required */ - if (validators[i].name == NULL) { + if (ext_validator->name == NULL) { continue; } - if (strcmp(validator_name, validators[i].name) == 0) { - return validators[i].func; + if (strcmp(validator_name, ext_validator->name) == 0) { + return ext_validator->func; } } @@ -1551,8 +1551,7 @@ get_validator(char *validator_name, int ini_rules_check(struct ini_cfgobj *rules_obj, struct ini_cfgobj *config_obj, - struct ini_validator *extra_validators, - int num_extra_validators, + struct ini_validator **extra_validators, struct ini_errobj *errobj) { char **sections; @@ -1598,8 +1597,7 @@ int ini_rules_check(struct ini_cfgobj *rules_obj, } vname = ini_get_string_config_value(vo, NULL); - vfunc = get_validator(vname, extra_validators, - num_extra_validators); + vfunc = get_validator(vname, extra_validators); if (vfunc == NULL) { ret = ini_errobj_add_msg(errobj, "Rule '%s' uses unknown " diff --git a/ini/ini_configobj.h b/ini/ini_configobj.h index 4f47e7839ec9b7d82ea1e24fcfa07ac4e76ec890..648ef870bbc19c3b7545f87432365d5f23b94f9d 100644 --- a/ini/ini_configobj.h +++ b/ini/ini_configobj.h @@ -2206,11 +2206,9 @@ int ini_rules_read_from_file(const char *filename, * @param[in] rules_obj config object representing the rules * @param[in] config_obj config object representing the * configuration - * @param[in] extra_validators Array of extrenal validators. Can be - * NULL if no external validators are - * used. - * @param[in] num_extra_validators Number of external validators in - * extra_validators array. + * @param[in] extra_validators NULL terminated array of external + * validators. Can be NULL if no external + * validators are used. * * @param[in] errobj errobj to store generated errors * from validators. @@ -2219,8 +2217,7 @@ int ini_rules_read_from_file(const char *filename, */ int ini_rules_check(struct ini_cfgobj *rules_obj, struct ini_cfgobj *config_obj, - struct ini_validator *extra_validators, - int num_extra_validators, + struct ini_validator **extra_validators, struct ini_errobj *errobj); /** diff --git a/ini/ini_validators_ut_check.c b/ini/ini_validators_ut_check.c index de8738b570269b0341b08a1f17f24afb8c25c926..9aadc3c99231c19efcec15440db55b000550bb34 100644 --- a/ini/ini_validators_ut_check.c +++ b/ini/ini_validators_ut_check.c @@ -169,7 +169,7 @@ START_TEST(test_ini_noerror) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); fail_unless(ini_errobj_no_more_msgs(errobj)); @@ -205,7 +205,7 @@ START_TEST(test_ini_error) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate exactly one error */ @@ -225,7 +225,7 @@ START_TEST(test_ini_error) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate exactly one error */ @@ -263,7 +263,7 @@ START_TEST(test_unknown_validator) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate exactly one error */ @@ -299,10 +299,14 @@ START_TEST(test_custom_noerror) struct ini_cfgobj *cfg_obj; struct ini_errobj *errobj; int ret; - struct ini_validator noerror = { "custom_noerror", custom_noerror }; - struct ini_validator missing_name[] = { - { NULL, custom_noerror }, - { "custom_noerror", custom_noerror }, + struct ini_validator *noerror[] = { + &(struct ini_validator){ "custom_noerror", custom_noerror }, + NULL + }; + struct ini_validator *missing_name[] = { + &(struct ini_validator){ NULL, custom_noerror }, + &(struct ini_validator){ "custom_noerror", custom_noerror }, + NULL }; char input_rules[] = @@ -320,7 +324,7 @@ START_TEST(test_custom_noerror) fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); /* Pass the custom validator to ini_rules_check() */ - ret = ini_rules_check(rules_obj, cfg_obj, &noerror, 1, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, noerror, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate no errors */ @@ -328,7 +332,7 @@ START_TEST(test_custom_noerror) /* Pass wrong external validator to ini_rules_check() */ /* It should be skipped */ - ret = ini_rules_check(rules_obj, cfg_obj, missing_name, 2, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, missing_name, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate no errors */ @@ -346,9 +350,13 @@ START_TEST(test_custom_error) struct ini_cfgobj *cfg_obj; struct ini_errobj *errobj; int ret; - struct ini_validator error = { "custom_error", custom_error }; - struct ini_validator missing_function[] = { - { "custom_noerror", NULL }, + struct ini_validator *error[] = { + &(struct ini_validator){ "custom_error", custom_error }, + NULL + }; + struct ini_validator *missing_function[] = { + &(struct ini_validator){ "custom_noerror", NULL }, + NULL }; const char *errmsg; @@ -367,7 +375,7 @@ START_TEST(test_custom_error) fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); /* Pass the custom validator to ini_rules_check() */ - ret = ini_rules_check(rules_obj, cfg_obj, &error, 1, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, error, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate one error */ @@ -384,7 +392,7 @@ START_TEST(test_custom_error) fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); /* Pass the custom validator to ini_rules_check() */ - ret = ini_rules_check(rules_obj, cfg_obj, missing_function, 1, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, missing_function, errobj); /* Should generate one error for missing validator */ fail_if(ini_errobj_no_more_msgs(errobj)); @@ -433,7 +441,7 @@ START_TEST(test_ini_allowed_options_ok) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate no errors */ @@ -482,7 +490,7 @@ START_TEST(test_ini_allowed_options_no_section) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 2 errors (one from rules_check and one @@ -516,7 +524,7 @@ START_TEST(test_ini_allowed_options_no_section) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 2 errors (one from rules_check and one @@ -576,7 +584,7 @@ START_TEST(test_ini_allowed_options_wrong_regex) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 2 errors (one from rules_check and one @@ -638,7 +646,7 @@ START_TEST(test_ini_allowed_options_typos) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 4 errors */ @@ -681,7 +689,7 @@ START_TEST(test_ini_allowed_sections_str_ok) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 0 errors */ @@ -723,7 +731,7 @@ START_TEST(test_ini_allowed_sections_str_typos) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 2 errors */ @@ -778,7 +786,7 @@ START_TEST(test_ini_allowed_sections_str_insensitive) "ini_errobj_create() failed for case_insensitive = %s: %s", case_insensitive_values[i], strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed for case_insensitive = %s: %s", case_insensitive_values[i], strerror(ret)); @@ -822,7 +830,7 @@ START_TEST(test_ini_allowed_sections_re_ok) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 0 errors */ @@ -862,7 +870,7 @@ START_TEST(test_ini_allowed_sections_re_typos) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 2 errors */ @@ -906,7 +914,7 @@ START_TEST(test_ini_allowed_sections_re_insensitive) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 0 errors */ @@ -946,7 +954,7 @@ START_TEST(test_ini_allowed_sections_missing_section) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 1 errors */ @@ -999,7 +1007,7 @@ START_TEST(test_ini_allowed_sections_wrong_regex) ret = ini_errobj_create(&errobj); fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret)); - ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj); + ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj); fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret)); /* Should generate 2 errors */ -- 2.7.4