commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue/geas/src/classdef README classdef.c classd...


From: Reinhard Mueller
Subject: gnue/geas/src/classdef README classdef.c classd...
Date: Sat, 22 Sep 2001 14:26:45 -0400

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Reinhard Mueller <address@hidden>       01/09/22 14:26:44

Modified files:
        geas/src/classdef: README classdef.c classdef.h parse.y 
                           read-gcd.c 

Log message:
        Let the parser really start the second pass.
        Note: read-gcd.[ch] is considered final.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/README.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/classdef.c.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/classdef.h.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/parse.y.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/read-gcd.c.diff?tr1=1.5&tr2=1.6&r1=text&r2=text

Patches:
Index: gnue/geas/src/classdef/README
diff -u gnue/geas/src/classdef/README:1.2 gnue/geas/src/classdef/README:1.3
--- gnue/geas/src/classdef/README:1.2   Sun Sep 16 16:54:29 2001
+++ gnue/geas/src/classdef/README       Sat Sep 22 14:26:44 2001
@@ -12,9 +12,11 @@
 ---------
 
 >------------------------------+
-                               +--> classdef
-                            +--+
-                            |
+                               |
+               +---------------+--> classdef
+               |               |
+               |            +--+
+               |            |
                +--> parse --+-----> scan
                |            |
 >-- read-gcd --+            +--+
Index: gnue/geas/src/classdef/classdef.c
diff -u gnue/geas/src/classdef/classdef.c:1.9 
gnue/geas/src/classdef/classdef.c:1.10
--- gnue/geas/src/classdef/classdef.c:1.9       Wed Sep 19 17:02:49 2001
+++ gnue/geas/src/classdef/classdef.c   Sat Sep 22 14:26:44 2001
@@ -19,7 +19,7 @@
    along with GEAS; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-   $Id: classdef.c,v 1.9 2001/09/19 21:02:49 reinhard Exp $
+   $Id: classdef.c,v 1.10 2001/09/22 18:26:44 reinhard Exp $
 */
 
 #include "config.h"
@@ -79,6 +79,91 @@
 static GHashTable *_modules = NULL;
 
 /* ========================================================================= *\
+ * Private functions
+\* ========================================================================= */
+
+/* ------------------------------------------------------------------------- *\
+ * Free the memory allocated for a class
+\* ------------------------------------------------------------------------- */
+static void
+_free_class (geas_cd_class *c)
+{
+  g_free (c->name);
+  /* TODO: free all fields */
+  g_hash_table_destroy (c->fields);
+  g_free (c);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free the memory allocated for a type
+\* ------------------------------------------------------------------------- */
+static void
+_free_type (geas_cd_type *t)
+{
+  g_free (t->name);
+  if (t->fields)
+    {
+      /* TODO: free all fields */
+      g_hash_table_destroy (t->fields);
+    }
+  g_free (t);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free a class (called in g_hash_table_foreach_remove)
+\* ------------------------------------------------------------------------- */
+static gboolean
+_hr_free_class (gpointer key, gpointer value, gpointer user_data)
+{
+  _free_class ((geas_cd_class *)value);
+  return (TRUE);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free a type (called in g_hash_table_foreach_remove)
+\* ------------------------------------------------------------------------- */
+static gboolean
+_hr_free_type (gpointer key, gpointer value, gpointer user_data)
+{
+  _free_type ((geas_cd_type *)value);
+  return (TRUE);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free the memory allocated for a module
+\* ------------------------------------------------------------------------- */
+static void
+_free_module (geas_cd_module *m)
+{
+  g_free (m->name);
+  
+  g_hash_table_foreach_remove (m->classes, _hr_free_class, NULL);
+  g_hash_table_foreach_remove (m->types, _hr_free_type, NULL);
+
+  g_hash_table_destroy (m->classes);
+  g_hash_table_destroy (m->types);
+
+  g_free (m);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free a module except "builtin" (called in g_hash_table_foreach_remove)
+\* ------------------------------------------------------------------------- */
+static gboolean
+_hr_free_module (gpointer key, gpointer value, gpointer user_data)
+{
+  if (strcmp (key, "builtin"))
+    {
+      _free_module ((geas_cd_module *)value);
+      return (TRUE);
+    }
+  else
+    {
+      return (FALSE);
+    }
+}
+
+/* ========================================================================= *\
  * General functions
 \* ========================================================================= */
 
@@ -112,6 +197,16 @@
 #undef NEWTYPE
 }
 
+/* ------------------------------------------------------------------------- *\
+ * Clean up all data read so far
+\* ------------------------------------------------------------------------- */
+void
+geas_cd_clean (void)
+{
+  g_hash_table_foreach_remove (_modules, _hr_free_module, NULL);
+  g_assert (g_hash_table_size (_modules) == 1);
+}
+
 /* ========================================================================= *\
  * Modules
 \* ========================================================================= */
@@ -256,14 +351,7 @@
 
   g_hash_table_remove (_modules, m->name);
 
-  g_free (m->name);
-  
-  /* TODO: free all classes and types */
-
-  g_hash_table_destroy (m->classes);
-  g_hash_table_destroy (m->types);
-
-  g_free (m);
+  _free_module (m);
 }
 
 /* ========================================================================= *\
@@ -324,14 +412,8 @@
   g_return_if_fail (c);
 
   g_hash_table_remove (c->module->classes, c->name);
-
-  g_free (c->name);
-  
-  /* TODO: free all fields */
 
-  g_hash_table_destroy (c->fields);
-
-  g_free (c);
+  _free_class (c);
 }
 
 /* ========================================================================= *\
@@ -393,13 +475,7 @@
 
   g_hash_table_remove (t->module->types, t->name);
 
-  g_free (t->name);
-  
-  /* TODO: free all fields */
-
-  g_hash_table_destroy (t->fields);
-
-  g_free (t);
+  _free_type (t);
 }
 
 /* TODO: */
Index: gnue/geas/src/classdef/classdef.h
diff -u gnue/geas/src/classdef/classdef.h:1.5 
gnue/geas/src/classdef/classdef.h:1.6
--- gnue/geas/src/classdef/classdef.h:1.5       Sun Sep 16 16:54:29 2001
+++ gnue/geas/src/classdef/classdef.h   Sat Sep 22 14:26:44 2001
@@ -19,7 +19,7 @@
    along with GEAS; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-   $Id: classdef.h,v 1.5 2001/09/16 20:54:29 reinhard Exp $
+   $Id: classdef.h,v 1.6 2001/09/22 18:26:44 reinhard Exp $
 */
 
 /* ------------------------------------------------------------------------- *\
@@ -61,6 +61,7 @@
 \* ------------------------------------------------------------------------- */
 
 void geas_cd_init (void);
+void geas_cd_clean (void);
 
 /* ------------------------------------------------------------------------- *\
  * Modules
Index: gnue/geas/src/classdef/parse.y
diff -u gnue/geas/src/classdef/parse.y:1.9 gnue/geas/src/classdef/parse.y:1.10
--- gnue/geas/src/classdef/parse.y:1.9  Wed Sep 19 17:02:49 2001
+++ gnue/geas/src/classdef/parse.y      Sat Sep 22 14:26:44 2001
@@ -19,7 +19,7 @@
    along with GEAS; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-   $Id: parse.y,v 1.9 2001/09/19 21:02:49 reinhard Exp $
+   $Id: parse.y,v 1.10 2001/09/22 18:26:44 reinhard Exp $
 */
 
 %{
@@ -648,8 +648,18 @@
 
     case 2:
       /* The type must exist now. Otherwise it's defined nowhere */
-      result = geas_cd_module_find_type (module ? module : _current_module,
-                                         name);
+      result = NULL;
+      if (!module)
+        {
+          /* First, it could be a builtin type */
+          result = geas_cd_module_find_type (_builtin_module, name);
+        }
+      if (!result)
+        {
+          /* If not, it must be already defined */
+          result = geas_cd_module_find_type (module ? module : _current_module,
+                                             name);
+        }
       if (!result)
         {
           yyerror ("unknown type '%s'", name);
Index: gnue/geas/src/classdef/read-gcd.c
diff -u gnue/geas/src/classdef/read-gcd.c:1.5 
gnue/geas/src/classdef/read-gcd.c:1.6
--- gnue/geas/src/classdef/read-gcd.c:1.5       Wed Sep 19 17:02:49 2001
+++ gnue/geas/src/classdef/read-gcd.c   Sat Sep 22 14:26:44 2001
@@ -19,7 +19,7 @@
    along with GEAS; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-   $Id: read-gcd.c,v 1.5 2001/09/19 21:02:49 reinhard Exp $
+   $Id: read-gcd.c,v 1.6 2001/09/22 18:26:44 reinhard Exp $
 */
 
 #include "config.h"
@@ -31,6 +31,7 @@
 #include <sys/stat.h>
 #include <glib.h>
 #include "depend.h"
+#include "classdef.h"
 
 /* defined by parse.y */
 void _geas_cd_parse (const char *file, int pass);
@@ -107,6 +108,27 @@
     }
 }
 
+/* ------------------------------------------------------------------------- *\
+ * Pass all resolved gcd files with pass 2 in the order that is given by
+ * _geas_cd_depend
+\* ------------------------------------------------------------------------- */
+static void
+_pass_2 (void)
+{
+  char *c;
+
+  while ((c = _geas_cd_depend_get_next_resolved ()))
+    {
+      /* c can be "F filename" or "T typename" or "C classname". We just ignore
+         everything other than filenames */
+      if (c[0] == 'F')
+        {
+          _geas_cd_parse (&c[2], 2);
+        }
+      g_free (c);
+    }
+}
+
 /* ========================================================================= *\
  * Public functions
 \* ========================================================================= */
@@ -123,20 +145,7 @@
   _pass_1 (directory);
   _geas_cd_depend_sort ();
   _list_unresolved ();
-
-  {
-    char *c;
-    puts ("would parse files in this order:");
-    while ((c = _geas_cd_depend_get_next_resolved ()))
-      {
-        if (c[0] == 'F')
-          {
-            puts (&c[2]);
-          }
-        g_free (c);
-      }
-  }
-
-
+  geas_cd_clean ();     /* Empty data structures to be rebuilt in 2nd pass */
+  _pass_2 ();
   _geas_cd_depend_done ();
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]