From 7387a70b2f460d8a5e43de71cbe6a315430dc469 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 25 Jan 2015 20:50:42 +0100 Subject: block-parser: Enhance block_parser_register_function() with a destroy notify callback --- src/block-parser.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/block-parser.c') diff --git a/src/block-parser.c b/src/block-parser.c index 5c806cf..eb505ed 100644 --- a/src/block-parser.c +++ b/src/block-parser.c @@ -53,6 +53,7 @@ typedef struct { typedef struct { BlockParserConditionalFunction callback; gpointer user_data; + GDestroyNotify data_destroy_func; } BlockParserFuncData; @@ -70,6 +71,20 @@ block_parser_destroy_notify (gpointer data) g_free (d); } +static void +block_parser_func_data_destroy_notify (gpointer data) +{ + BlockParserFuncData *d = data; + + if (data == NULL) + return; + + if (d->data_destroy_func != NULL) + d->data_destroy_func (d->user_data); + g_free (d); +} + + BlockParser * block_parser_new () { @@ -77,7 +92,7 @@ block_parser_new () parser = g_new0 (BlockParser, 1); parser->table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, block_parser_destroy_notify); - parser->functions = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + parser->functions = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, block_parser_func_data_destroy_notify); parser->active_tree = g_queue_new (); return parser; @@ -133,7 +148,7 @@ block_parser_register_key (BlockParser *parser, const gchar *key, const gchar *r * */ void -block_parser_register_function (BlockParser *parser, const gchar *conditional_name, BlockParserConditionalFunction callback, gpointer user_data) +block_parser_register_function (BlockParser *parser, const gchar *conditional_name, BlockParserConditionalFunction callback, gpointer user_data, GDestroyNotify data_destroy_func) { BlockParserFuncData *func_data; @@ -142,6 +157,7 @@ block_parser_register_function (BlockParser *parser, const gchar *conditional_na func_data = g_malloc0 (sizeof (BlockParserFuncData)); func_data->callback = callback; func_data->user_data = user_data; + func_data->data_destroy_func = data_destroy_func; g_hash_table_insert (parser->functions, g_strdup (conditional_name), func_data); } -- cgit v1.2.3