public and copy rule and symbol functions
authorThadeu Lima de Souza Cascardo <cascardo@dcc.ufmg.br>
Fri, 23 Sep 2005 02:42:44 +0000 (02:42 +0000)
committerThadeu Lima de Souza Cascardo <cascardo@dcc.ufmg.br>
Fri, 23 Sep 2005 02:42:44 +0000 (02:42 +0000)
Some rule and symbol functions are public. Copy functions for both are
also provided.

git-archimport-id: cascardo@tlscascardo--private/libgrammatic--dev--0.1--patch-5

grammar.c
grammar.h

index 9795468..2b56a3a 100644 (file)
--- a/grammar.c
+++ b/grammar.c
@@ -14,6 +14,11 @@ symbol_t* symbol_new (gboolean terminal, gint value)
   return symbol;
 }
 
+symbol_t* symbol_copy (symbol_t* symbol)
+{
+  return symbol_new (symbol->terminal, symbol->value);
+}
+
 guint symbol_hash (gconstpointer data)
 {
   symbol_t* symbol;
@@ -44,6 +49,33 @@ void rule_append (rule_t* rule, symbol_t* right)
   rule->right = g_list_append (rule->right, right);
 }
 
+rule_t* rule_copy (rule_t* rule)
+{
+  rule_t* new_rule;
+  GList* r;
+  new_rule = rule_new ();
+  r = rule->right;
+  while (r != NULL)
+    {
+      rule_append (new_rule, symbol_copy (r->data));
+      r = g_list_next (r);
+    }
+  return new_rule;
+}
+
+symbol_t* rule_pop (rule_t* rule)
+{
+  GList* r;
+  if ((r = g_list_first (rule->right)) == NULL)
+    return NULL;
+  rule->right = g_list_remove_link (r, r);
+  g_free (r->data);
+  g_list_free (r);
+  if (rule->right == NULL)
+    return NULL;
+  return rule->right->data;
+}
+
 void rule_delete (rule_t* rule)
 {
   GList* l;
@@ -136,11 +168,6 @@ rule_t* grammar_rule_new (Grammar* grammar, symbol_t* left)
 
 }
 
-void grammar_rule_append (rule_t* rule, symbol_t* right)
-{
-  rule_append (rule, right);
-}
-
 GList* grammar_get_rules (Grammar* grammar, symbol_t* left)
 {
   GList** l;
index 81ec41d..0b26b12 100644 (file)
--- a/grammar.h
+++ b/grammar.h
@@ -39,9 +39,18 @@ typedef struct
 GType grammar_get_type ();
 
 symbol_t* symbol_new (gboolean, gint);
+symbol_t* symbol_copy (symbol_t*);
+guint symbol_hash (gconstpointer);
+gboolean symbol_equal (gconstpointer, gconstpointer);
+
+rule_t* rule_new ();
+rule_t* rule_copy (rule_t*);
+symbol_t* rule_pop (rule_t*);
+void rule_append (rule_t*, symbol_t*);
+void rule_delete (rule_t*);
+
 
 rule_t* grammar_rule_new (Grammar*, symbol_t*);
-void grammar_rule_append (rule_t*, symbol_t*);
 GList* grammar_get_rules (Grammar*, symbol_t*);
 GList* grammar_get_rule (rule_t*);