Fixed first
[cascardo/grammar.git] / rdp.c
diff --git a/rdp.c b/rdp.c
index a6fca7c..3feee7d 100644 (file)
--- a/rdp.c
+++ b/rdp.c
@@ -1,29 +1,11 @@
-#include "rdp.h"
+#include <rdp.h>
 #include <stdlib.h>
 
-rdp_t* rdp_new (nextcb cb, gpointer data)
+struct _buffer
 {
-
-  rdp_t* parser;
-
-  parser = g_malloc (sizeof (rdp_t));
-  parser->cb = cb;
-  parser->data = data;
-
-  parser->rules = NULL;
-
-  parser->buffer = g_list_append (NULL, NULL);
-
-  return parser;
-
-}
-
-void rdp_delete (rdp_t* parser)
-{
-
-  g_free (parser);
-
-}
+  symbol_t* symbol;
+  gpointer attrib;
+};
 
 gpointer leaf_new (gpointer data)
 {
@@ -45,6 +27,29 @@ void tree_delete (gpointer tree)
   g_node_destroy (tree);
 }
 
+rdp_t* rdp_new (nextcb cb, gpointer data, gint value, grammar_t* grammar)
+{
+
+  rdp_t* parser;
+
+  parser = g_malloc (sizeof (rdp_t));
+
+  parser->cb = cb;
+  parser->data = data;
+  parser->start = symbol_new (FALSE, value);
+  parser->grammar = grammar;
+
+  parser->buffer = g_list_append (NULL, NULL);
+
+  return parser;
+
+}
+
+void rdp_delete (rdp_t* rdp)
+{
+  g_free (rdp->start);
+}
+
 symbol_t* buffer_next (rdp_t* parser, gpointer* attrib)
 {
 
@@ -91,44 +96,52 @@ 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))
+  l = grammar_get_rules (parser->grammar, symbol);
+  for (; 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;
@@ -140,7 +153,7 @@ gpointer rdp_build (rdp_t* parser)
 
   gpointer attrib;
 
-  if (rdp_step (parser, NULL, &attrib))
+  if (rdp_step (parser, parser->start, &attrib))
     return attrib;
 
   return NULL;