From 42ec620295f62b6de81d9dac2eba04b4c558fcd0 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Thu, 29 Sep 2005 03:31:26 +0000 Subject: [PATCH] Added functions to compare symbols and hash and equal for rules Functions to compare two symbols and two rules were added. Also functions for hashing a rule, including equal and hash functions. git-archimport-id: cascardo@tlscascardo--private/libgrammatic--dev--0.1--patch-12 --- grammar.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ grammar.h | 4 ++++ 2 files changed, 61 insertions(+) diff --git a/grammar.c b/grammar.c index 411cd64..41172e2 100644 --- a/grammar.c +++ b/grammar.c @@ -36,6 +36,23 @@ gboolean symbol_equal (gconstpointer data1, gconstpointer data2) symbol1->terminal == symbol2->terminal; } +gint symbol_cmp (symbol_t* a, symbol_t* b) +{ + if (a->terminal == b->terminal) + { + if (a->value < b->value) + return -1; + else if (a->value > b->value) + return 1; + return 0; + } + else if (a->terminal == FALSE) + { + return -1; + } + return 1; +} + rule_t* rule_new () { rule_t* rule; @@ -63,6 +80,46 @@ rule_t* rule_copy (rule_t* rule) return new_rule; } +gint rule_cmp (rule_t* a, rule_t* b) +{ + GList* la; + GList* lb; + la = grammar_get_rule (a); + lb = grammar_get_rule (b); + while (la != NULL && lb != NULL) + { + int c; + if ((c = symbol_cmp (la->data, lb->data)) != 0) + return c; + la = g_list_next (la); + lb = g_list_next (lb); + } + if (la == lb) + return 0; + else if (la == NULL) + return -1; + return 1; +} + +gboolean rule_equal (gcontspointer data1, gconstpointer data2) +{ + return (rule_cmp (data, data2) == 0); +} + +guint rule_hash (gconstpointer data) +{ + GList* l; + guint hash; + l = grammar_get_rule (data); + hash = 0; + while (l != NULL) + { + hash = 37 * hash + symbol_hash (l->data); + l = g_list_next (l); + } + return hash; +} + symbol_t* rule_pop (rule_t* rule) { GList* r; diff --git a/grammar.h b/grammar.h index 526f06b..f945330 100644 --- a/grammar.h +++ b/grammar.h @@ -42,9 +42,13 @@ symbol_t* symbol_new (gboolean, GQuark); symbol_t* symbol_copy (symbol_t*); guint symbol_hash (gconstpointer); gboolean symbol_equal (gconstpointer, gconstpointer); +gint symbol_cmp (symbol_t*, symbol_t*); rule_t* rule_new (); rule_t* rule_copy (rule_t*); +gint rule_cmp (rule_t*, rule_t*); +gboolean rule_equal (gconstpointer, gconstpointer); +guint rule_hash (gconstpointer); symbol_t* rule_pop (rule_t*); void rule_append (rule_t*, symbol_t*); void rule_delete (rule_t*); -- 2.20.1