aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2015-12-17 19:18:33 -0800
committerGuy Harris <guy@alum.mit.edu>2015-12-18 03:19:03 +0000
commitd222dd398904dda499cb6fe2d5f300643076c2b1 (patch)
tree2ed0f5f624edd872ec333a4858ceed8da3d67dee /epan
parent4bec4b0167961bf557f82fb20ba3e95e4dfd3f86 (diff)
Provide routines to set string-like and range preferences from a string.
That gets rid of some duplicate code. Change-Id: I4b65c6c73929d18602f6b0425e4f3dbbabbf0127 Reviewed-on: https://code.wireshark.org/review/12713 Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'epan')
-rw-r--r--epan/prefs-int.h15
-rw-r--r--epan/prefs.c84
2 files changed, 67 insertions, 32 deletions
diff --git a/epan/prefs-int.h b/epan/prefs-int.h
index e10cf3d61d..2a6dee279e 100644
--- a/epan/prefs-int.h
+++ b/epan/prefs-int.h
@@ -174,6 +174,21 @@ struct preference {
*/
typedef prefs_set_pref_e (*pref_set_pair_cb) (gchar *key, const gchar *value, void *private_data, gboolean return_range_errors);
+/** Set the value of a string-like preference. */
+WS_DLL_PUBLIC
+void
+prefs_set_string_like_value(pref_t *pref, const gchar *value, gboolean *changed);
+
+/** Set the value of a range preference. Return FALSE on error, TRUE otherwise. */
+WS_DLL_PUBLIC
+gboolean
+prefs_set_range_value(pref_t *pref, const gchar *value, gboolean *changed);
+
+/** Set the value of an enum preference. */
+WS_DLL_PUBLIC
+void
+prefs_set_enum_value(pref_t *pref, const gchar *value, gboolean *changed);
+
/** read the preferences file (or similar) and call the callback
* function to set each key/value pair found
*/
diff --git a/epan/prefs.c b/epan/prefs.c
index ec288b1864..c6e7b1e9a4 100644
--- a/epan/prefs.c
+++ b/epan/prefs.c
@@ -1023,6 +1023,23 @@ register_string_like_preference(module_t *module, const char *name,
}
/*
+ * For use by UI code that sets preferences.
+ */
+void
+prefs_set_string_like_value(pref_t *pref, const gchar *value, gboolean *changed)
+{
+ if (*pref->varp.string) {
+ if (strcmp(*pref->varp.string, value) != 0) {
+ *changed = TRUE;
+ g_free((void *)*pref->varp.string);
+ *pref->varp.string = g_strdup(value);
+ }
+ } else if (value) {
+ *pref->varp.string = g_strdup(value);
+ }
+}
+
+/*
* Register a preference with a character-string value.
*/
void
@@ -1107,6 +1124,36 @@ prefs_register_range_preference(module_t *module, const char *name,
preference->stashed_val.range = NULL;
}
+static gboolean
+prefs_set_range_value_work(pref_t *pref, const gchar *value,
+ gboolean return_range_errors, gboolean *changed)
+{
+ range_t *newrange;
+
+ if (range_convert_str_work(&newrange, value, pref->info.max_value,
+ return_range_errors) != CVT_NO_ERROR) {
+ return FALSE; /* number was bad */
+ }
+
+ if (!ranges_are_equal(*pref->varp.range, newrange)) {
+ *changed = TRUE;
+ g_free(*pref->varp.range);
+ *pref->varp.range = newrange;
+ } else {
+ g_free(newrange);
+ }
+ return TRUE;
+}
+
+/*
+ * For use by UI code that sets preferences.
+ */
+gboolean
+prefs_set_range_value(pref_t *pref, const gchar *value, gboolean *changed)
+{
+ return prefs_set_range_value_work(pref, value, TRUE, changed);
+}
+
/*
* Register a static text 'preference'. It can be used to add explanatory
* text inline with other preferences in the GUI.
@@ -1456,15 +1503,7 @@ column_hidden_set_cb(pref_t* pref, const gchar* value, gboolean* changed)
fmt_data *cfmt;
pref_t *format_pref;
- if (*pref->varp.string) {
- if (strcmp(*pref->varp.string, value) != 0) {
- *changed = TRUE;
- g_free((void *)*pref->varp.string);
- *pref->varp.string = g_strdup(value);
- }
- } else if (value) {
- *pref->varp.string = g_strdup(value);
- }
+ prefs_set_string_like_value(pref, value, changed);
/*
* Set the "visible" flag for the existing columns; we need to
@@ -1995,11 +2034,7 @@ colorized_frame_reset_cb(pref_t* pref)
static prefs_set_pref_e
colorized_frame_set_cb(pref_t* pref, const gchar* value, gboolean* changed)
{
- if (strcmp(*pref->varp.string, value) != 0) {
- *changed = TRUE;
- g_free((void *)*pref->varp.string);
- *pref->varp.string = g_strdup(value);
- }
+ prefs_set_string_like_value(pref, value, changed);
return PREFS_SET_OK;
}
@@ -4394,29 +4429,14 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_,
case PREF_STRING:
case PREF_FILENAME:
case PREF_DIRNAME:
- if (strcmp(*pref->varp.string, value) != 0) {
- module->prefs_changed = TRUE;
- g_free((void *)*pref->varp.string);
- *pref->varp.string = g_strdup(value);
- }
+ prefs_set_string_like_value(pref, value, &module->prefs_changed);
break;
case PREF_RANGE:
{
- range_t *newrange;
-
- if (range_convert_str_work(&newrange, value, pref->info.max_value,
- return_range_errors) != CVT_NO_ERROR) {
+ if (!prefs_set_range_value_work(pref, value, return_range_errors,
+ &module->prefs_changed))
return PREFS_SET_SYNTAX_ERR; /* number was bad */
- }
-
- if (!ranges_are_equal(*pref->varp.range, newrange)) {
- module->prefs_changed = TRUE;
- g_free(*pref->varp.range);
- *pref->varp.range = newrange;
- } else {
- g_free (newrange);
- }
break;
}