X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fgrammar.git;a=blobdiff_plain;f=rdp.c;h=4dbdc6322b3a41b289437a0a57bc90abfd316ea4;hp=52245af1cc32509b3b37817d6c929edfff8e4209;hb=ff6be7b36955b064ae18868ee2d8e0c46b23ddb8;hpb=045ec14b737624b1290c3cc7f5601a71f9fc4a0d diff --git a/rdp.c b/rdp.c index 52245af..4dbdc63 100644 --- a/rdp.c +++ b/rdp.c @@ -1,53 +1,106 @@ -#include "rdp.h" +#include #include -rdp_t* rdp_new (nextcb cb, gpointer data, gint value) +struct _buffer { + symbol_t* symbol; + gpointer attrib; +}; - rdp_t* parser; - - parser = g_malloc (sizeof (rdp_t)); - parser->cb = cb; - parser->data = data; - parser->start = symbol_new (FALSE, value); - - parser->rules = NULL; - - parser->buffer = g_list_append (NULL, NULL); +gpointer leaf_new (gpointer data) +{ + return g_node_new (data); +} - return parser; +gpointer tree_new (rule_t* rule) +{ + return g_node_new (rule); +} +gpointer tree_add (gpointer tree, gpointer data) +{ + return g_node_append (tree, data); } -void rdp_delete (rdp_t* parser) +void tree_delete (gpointer tree) { + g_node_destroy (tree); +} - g_free (parser->start); - g_free (parser); +static void rdp_init (GTypeInstance* instance, gpointer g_class) +{ + Rdp* self = RDP(instance); + self->cb = NULL; + self->data = NULL; + self->buffer = NULL; + self->start = NULL; +} +static void rdp_finalize (GObject* obj) +{ + RdpClass* klass; + GObject* parent_class; + Rdp* self; + self = RDP(obj); + g_free (self->start); + klass = RDP_GET_CLASS(obj); + parent_class = g_type_class_peek_parent (klass); + G_OBJECT_CLASS(parent_class)->finalize (obj); } -gpointer leaf_new (gpointer data) +static void rdp_class_init (RdpClass* klass) { - return g_node_new (data); + GObjectClass* gobj_class = G_OBJECT_CLASS(klass); + gobj_class->finalize = rdp_finalize; } -gpointer tree_new (rule_t* rule) +GType rdp_get_type () { - return g_node_new (rule); + static GType type = 0; + if (type == 0) + { + static const GTypeInfo info = + { + sizeof (RdpClass), + NULL, + NULL, + (GClassInitFunc)rdp_class_init, + NULL, + NULL, + sizeof (Rdp), + 0, + rdp_init + }; + type = g_type_register_static (GRAMMAR_TYPE, "RdpType", &info, 0); + } + return type; } -gpointer tree_add (gpointer tree, gpointer data) +Rdp* rdp_new (nextcb cb, gpointer data, gint value) { - return g_node_append (tree, data); + + Rdp* parser; + + parser = g_object_new (RDP_TYPE, NULL); + + parser->cb = cb; + parser->data = data; + parser->start = symbol_new (FALSE, value); + + parser->buffer = g_list_append (NULL, NULL); + + return parser; + } -void tree_delete (gpointer tree) +void rdp_delete (Rdp* parser) { - g_node_destroy (tree); + + g_object_unref (parser); + } -symbol_t* buffer_next (rdp_t* parser, gpointer* attrib) +symbol_t* buffer_next (Rdp* parser, gpointer* attrib) { buffer_t* buffer; @@ -71,7 +124,7 @@ symbol_t* buffer_next (rdp_t* parser, gpointer* attrib) } -gboolean rdp_step (rdp_t* parser, symbol_t* symbol, gpointer* attrib) +gboolean rdp_step (Rdp* parser, symbol_t* symbol, gpointer* attrib) { GList* l; @@ -93,51 +146,58 @@ gboolean rdp_step (rdp_t* parser, symbol_t* symbol, gpointer* attrib) return TRUE; } - for (l = g_list_first (parser->rules); l != NULL; l = g_list_next (l)) + for (l = grammar_get_rules (parser, symbol); l != NULL; l = g_list_next (l)) { rule_t* rule; + GList* m; rule = (rule_t*) l->data; - if (symbol == NULL || symbol_equal (symbol, rule->left)) - { - - GList* m; - *attrib = tree_new (rule); + *attrib = tree_new (symbol_copy (symbol)); - for (m = g_list_first (rule->right); m != NULL; m = g_list_next (m)) - { + m = grammar_get_rule (rule); - symbol_t* s; + /* + if (m == NULL) + { + tree_add (*attrib, leaf_new (g_string_new (""))); + return TRUE; + } + */ - s = (symbol_t*) m->data; + while (m != NULL) + { - if (!rdp_step (parser, s, &attr)) - { - parser->buffer = buffer; - break; - } + symbol_t* s; - tree_add (*attrib, attr); + s = (symbol_t*) m->data; + if (!rdp_step (parser, s, &attr)) + { + parser->buffer = buffer; + break; } - if (m == NULL) - return TRUE; - else - tree_delete (*attrib); + tree_add (*attrib, attr); + + m = g_list_next (m); } + if (m == NULL) + return TRUE; + else + tree_delete (*attrib); + } return FALSE; } -gpointer rdp_build (rdp_t* parser) +gpointer rdp_build (Rdp* parser) { gpointer attrib;