From fecd14f5105395f94825326ea177e77956af2b04 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Sat, 17 Sep 2005 15:25:59 +0000 Subject: [PATCH 1/1] Properly delete Grammar hashtable content Grammar hashtable content is properly freed. --This line, and those below, will be ignored-- Files to commit: This list might be incomplete or outdated if editing the log message was not invoked from an up-to-date changes buffer! git-archimport-id: cascardo@tlscascardo--private/libgrammatic--dev--0.1--patch-3 --- grammar.c | 47 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/grammar.c b/grammar.c index b73cd39..72248e0 100644 --- a/grammar.c +++ b/grammar.c @@ -14,6 +14,23 @@ symbol_t* symbol_new (gboolean terminal, gint value) return symbol; } +guint symbol_hash (gconstpointer data) +{ + symbol_t* symbol; + symbol = (symbol_t*) data; + return g_direct_hash ((gpointer)symbol->value); +} + +gboolean symbol_equal (gconstpointer data1, gconstpointer data2) +{ + symbol_t* symbol1; + symbol_t* symbol2; + symbol1 = (symbol_t*) data1; + symbol2 = (symbol_t*) data2; + return symbol1->value == symbol2->value && + symbol1->terminal == symbol2->terminal; +} + rule_t* rule_new () { rule_t* rule; @@ -27,28 +44,34 @@ void rule_append (rule_t* rule, symbol_t* right) rule->right = g_list_append (rule->right, right); } -guint symbol_hash (gconstpointer data) +void rule_delete (rule_t* rule) { - symbol_t* symbol; - symbol = (symbol_t*) data; - return g_direct_hash ((gpointer)symbol->value); + GList* l; + for (l = g_list_first (rule->right); l != NULL; l = g_list_next (l)) + { + g_free (l->data); + } + g_list_free (rule->right); + g_free (rule); } -gboolean symbol_equal (gconstpointer data1, gconstpointer data2) +void rules_delete (GList** list) { - symbol_t* symbol1; - symbol_t* symbol2; - symbol1 = (symbol_t*) data1; - symbol2 = (symbol_t*) data2; - return symbol1->value == symbol2->value && - symbol1->terminal == symbol2->terminal; + GList* l; + for (l = g_list_first (*list); l != NULL; l = g_list_next (l)) + { + rule_delete (l->data); + } + g_list_free (*list); + g_free (list); } static void grammar_init (GTypeInstance* instance, gpointer g_class) { Grammar* self = GRAMMAR(instance); self->grammar = g_hash_table_new_full (symbol_hash, symbol_equal, - g_free, g_free); + g_free, + (GDestroyNotify) rules_delete); } static void grammar_finalize (GObject* obj) -- 2.20.1