diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2015-01-25 20:50:42 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2015-01-25 20:50:42 +0100 |
| commit | 7387a70b2f460d8a5e43de71cbe6a315430dc469 (patch) | |
| tree | 153c64bd03f869a7f54938f6d1b21f3774fb8c76 /src/block-parser.c | |
| parent | 5a9e74611d2faef1fb68873b1e7925a5850ec86f (diff) | |
| download | cataract-7387a70b2f460d8a5e43de71cbe6a315430dc469.tar.xz | |
block-parser: Enhance block_parser_register_function() with a destroy notify callback
Diffstat (limited to 'src/block-parser.c')
| -rw-r--r-- | src/block-parser.c | 20 |
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); } |
