From 7d51b83f5953467924ab93ec33820cf015b96743 Mon Sep 17 00:00:00 2001 From: Martin Nagy Date: Mon, 12 Jan 2009 18:36:41 +0100 Subject: Don't use obscure pointer arithmetics in settings. --- settings.c | 46 +++++++++++++++++++++------------------------- settings.h | 13 ++++--------- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/settings.c b/settings.c index 99025a4..d07f62a 100644 --- a/settings.c +++ b/settings.c @@ -29,32 +29,31 @@ #include "str.h" #include "util.h" -/* Forward declarations. */ + +/* + * Forward declarations. + */ static int args_are_equal(const char *setting_argument, const char *argv_argument); -static isc_result_t set_value(isc_mem_t *mctx, setting_t *setting, void *target, +static isc_result_t set_value(isc_mem_t *mctx, setting_t *setting, const char *arg); -static isc_result_t set_default_value(isc_mem_t *mctx, setting_t *setting, - void *target); +static isc_result_t set_default_value(isc_mem_t *mctx, setting_t *setting); static const char * get_value_str(const char *arg); isc_result_t -set_settings(isc_mem_t *mctx, void *target, setting_t settings[], - const char * const* argv) +set_settings(isc_mem_t *mctx, setting_t settings[], const char * const* argv) { isc_result_t result; int i, j; const char *value_ptr; - void *target_member; for (i = 0; argv[i] != NULL; i++) { for (j = 0; settings[j].name != NULL; j++) { - if (!args_are_equal(settings[j].name, argv[i])) - continue; - - target_member = (char *)target + settings[j].offset; - value_ptr = get_value_str(argv[i]); - CHECK(set_value(mctx, &settings[j], target, value_ptr)); + if (args_are_equal(settings[j].name, argv[i])) { + value_ptr = get_value_str(argv[i]); + CHECK(set_value(mctx, &settings[j], value_ptr)); + break; + } } } @@ -67,8 +66,7 @@ set_settings(isc_mem_t *mctx, void *target, setting_t settings[], result = ISC_R_FAILURE; goto cleanup; } - target_member = (char *)target + settings[j].offset; - CHECK(set_default_value(mctx, &settings[j], target_member)); + CHECK(set_default_value(mctx, &settings[j])); } return ISC_R_SUCCESS; @@ -109,19 +107,17 @@ args_are_equal(const char *setting_argument, const char *argv_argument) } static isc_result_t -set_value(isc_mem_t *mctx, setting_t *setting, void *target, const char *arg) +set_value(isc_mem_t *mctx, setting_t *setting, const char *arg) { isc_result_t result; int numeric_value; const char *value; ld_string_t **ld_string_ptr; - REQUIRE(target != NULL); - value = get_value_str(arg); if (setting->type == ST_LD_STRING) { - ld_string_ptr = (ld_string_t **)target; + ld_string_ptr = (ld_string_t **)setting->target; if (setting->set) str_destroy(ld_string_ptr); @@ -137,14 +133,14 @@ set_value(isc_mem_t *mctx, setting_t *setting, void *target, const char *arg) /* TODO: better type checking. */ numeric_value = atoi(value); if (setting->type == ST_SIGNED_INTEGER) { - (*(signed int *)target) = (signed int)numeric_value; + (*(signed *)setting->target) = (signed)numeric_value; } else { if (numeric_value < 0) { log_error("argument %s must be an unsigned integer", setting->name); result = ISC_R_FAILURE; goto cleanup; } - (*(unsigned int *)target) = (unsigned int)numeric_value; + (*(unsigned *)setting->target) = (unsigned)numeric_value; } } else { fatal_error("unknown type in function set_value()"); @@ -161,17 +157,17 @@ cleanup: } static isc_result_t -set_default_value(isc_mem_t *mctx, setting_t *setting, void *target) +set_default_value(isc_mem_t *mctx, setting_t *setting) { switch (setting->type) { case ST_LD_STRING: - return set_value(mctx, setting, target, setting->value_char); + return set_value(mctx, setting, setting->default_value.value_char); break; case ST_SIGNED_INTEGER: - (*(signed int *)target) = (signed int)setting->value_sint; + (*(signed *)setting->target) = setting->default_value.value_sint; break; case ST_UNSIGNED_INTEGER: - (*(unsigned int *)target) = (unsigned int)setting->value_uint; + (*(unsigned *)setting->target) = setting->default_value.value_uint; break; default: fatal_error("unknown type in function set_default_value()"); diff --git a/settings.h b/settings.h index 617cfed..a978331 100644 --- a/settings.h +++ b/settings.h @@ -38,7 +38,7 @@ struct setting { signed int value_sint; unsigned int value_uint; } default_value; - size_t offset; + void *target; }; /* @@ -46,7 +46,7 @@ struct setting { * * const setting_t my_setting = { * "name", default_string("this is the default"), - * offsetof(some_struct, some_member + * &target_variable * } */ #define default_string(value) 0, ST_LD_STRING, { .value_char = (value) } @@ -55,17 +55,12 @@ struct setting { #define default_nothing() 0, ST_NO_DEFAULT, { .value_uint = 0 } /* This is used in the end of setting_t arrays. */ -#define end_of_settings { NULL, default_sint(0), 0 } - -#define value_char default_value.value_char -#define value_sint default_value.value_sint -#define value_uint default_value.value_uint +#define end_of_settings { NULL, default_sint(0), NULL } /* * Prototypes. */ isc_result_t -set_settings(isc_mem_t *mctx, void *target, setting_t settings[], - const char * const* argv); +set_settings(isc_mem_t *mctx, setting_t settings[], const char * const* argv); #endif /* !_LD_SETTINGS_H_ */ -- cgit