From 2f6902ce85cab3f1fba0ad32b1e11707c4206f4c Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Wed, 04 Oct 2017 18:14:11 -0400 Subject: src/config.[ch]: Support setting integer and double values Also declare mq_config_set() in src/config.h. --- (limited to 'src/config.c') diff --git a/src/config.c b/src/config.c index cf2d154..d4de2af 100644 --- a/src/config.c +++ b/src/config.c @@ -28,10 +28,14 @@ enum type { TYPE_BOOLEAN, + TYPE_INTEGER, + TYPE_DOUBLE, }; union callback { void (*boolean_cb)(const gchar *, gboolean, gpointer); + void (*integer_cb)(const gchar *, gint, gpointer); + void (*double_cb)(const gchar *, gdouble, gpointer); }; struct callbacks { @@ -76,6 +80,16 @@ set_type_or_run_callbacks(MqConfig *config, const gchar *name, gpointer value, *((gboolean *) value), cbs->user_data); break; + case TYPE_INTEGER: + cbs->cb.integer_cb(name, + *((gint *) value), + cbs->user_data); + break; + case TYPE_DOUBLE: + cbs->cb.double_cb(name, + *((gdouble *) value), + cbs->user_data); + break; } } } @@ -136,9 +150,38 @@ mq_config_set_boolean(MqConfig *config, const gchar *name, gboolean value) } void +mq_config_set_integer(MqConfig *config, const gchar *name, gint value) +{ + gchar *group; + gchar *key; + + split_name(name, &group, &key); + + g_key_file_set_integer(config->key_file, group, name, value); + + set_type_or_run_callbacks(config, name, &value, TYPE_INTEGER); +} + +void +mq_config_set_double(MqConfig *config, const gchar *name, gdouble value) +{ + gchar *group; + gchar *key; + + split_name(name, &group, &key); + + g_key_file_set_double(config->key_file, group, name, value); + + set_type_or_run_callbacks(config, name, &value, TYPE_DOUBLE); +} + +gboolean mq_config_set(MqConfig *config, const gchar *name, const gchar *value) { struct item *item; + gint integer_value; + gdouble double_value; + gchar *endptr; item = g_hash_table_lookup(config->types_and_cbs, name); g_assert(item); @@ -149,6 +192,23 @@ mq_config_set(MqConfig *config, const gchar *name, const gchar *value) * mq_html_input_checkbox()). */ mq_config_set_boolean(config, name, value[1] == 'n' ? TRUE : FALSE); - break; + return TRUE; + case TYPE_INTEGER: + integer_value = strtol(value, &endptr, 10); + if (*endptr != '\0') { + return FALSE; + } + mq_config_set_integer(config, name, integer_value); + return TRUE; + case TYPE_DOUBLE: + double_value = strtod(value, &endptr); + if (*endptr != '\0') { + return FALSE; + } + mq_config_set_double(config, name, double_value); + return TRUE; } + + g_assert_not_reached(); + return FALSE; } -- cgit v0.9.1