summaryrefslogtreecommitdiff
path: root/src/block-parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/block-parser.c')
-rw-r--r--src/block-parser.c20
1 files changed, 18 insertions, 2 deletions
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);
}