From: Thadeu Lima de Souza Cascardo Date: Fri, 23 Sep 2005 02:42:44 +0000 (+0000) Subject: public and copy rule and symbol functions X-Git-Tag: cascardo@tlscascardo--private,libgrammatic--lr1--0.1--base-0~13 X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fgrammar.git;a=commitdiff_plain;h=045ec14b737624b1290c3cc7f5601a71f9fc4a0d;hp=d9258d06fc616367741428b0346f985fcb68ef75 public and copy rule and symbol functions 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 --- diff --git a/grammar.c b/grammar.c index 9795468..2b56a3a 100644 --- 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; diff --git a/grammar.h b/grammar.h index 81ec41d..0b26b12 100644 --- 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*);