Properly delete Grammar hashtable content
authorThadeu Lima de Souza Cascardo <cascardo@dcc.ufmg.br>
Sat, 17 Sep 2005 15:25:59 +0000 (15:25 +0000)
committerThadeu Lima de Souza Cascardo <cascardo@dcc.ufmg.br>
Sat, 17 Sep 2005 15:25:59 +0000 (15:25 +0000)
Grammar hashtable content is properly freed.

--This line, and those below, will be ignored--
Files to commit:
   <can't compute list>

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

index b73cd39..72248e0 100644 (file)
--- 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)