commit-gnue
[Top][All Lists]
Advanced

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

gnue/geas/src/classdef depend.c depend.h parse.y


From: Reinhard Mueller
Subject: gnue/geas/src/classdef depend.c depend.h parse.y
Date: Wed, 19 Sep 2001 16:32:57 -0400

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Reinhard Mueller <address@hidden>       01/09/19 16:32:57

Modified files:
        geas/src/classdef: depend.c depend.h parse.y 

Log message:
        Make the dependency resolver ignore inter-file dependencies.  Those 
should not keep the files from being processed in the second pass.
        Note: with this change, depend.c and depend.h are considered finished.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/depend.c.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/depend.h.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/parse.y.diff?tr1=1.7&tr2=1.8&r1=text&r2=text

Patches:
Index: gnue/geas/src/classdef/depend.c
diff -u gnue/geas/src/classdef/depend.c:1.2 gnue/geas/src/classdef/depend.c:1.3
--- gnue/geas/src/classdef/depend.c:1.2 Wed Sep 19 16:04:21 2001
+++ gnue/geas/src/classdef/depend.c     Wed Sep 19 16:32:57 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: depend.c,v 1.2 2001/09/19 20:04:21 reinhard Exp $
+   $Id: depend.c,v 1.3 2001/09/19 20:32:57 reinhard Exp $
 */
 
 #include "config.h"
@@ -160,6 +160,27 @@
     }
   aft_ii->before++;
   bef_ii->after = g_list_append (bef_ii->after, aft_ii);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Remove a dependency between 2 items
+\* ------------------------------------------------------------------------- */
+void
+_geas_cd_depend_remove_dependency (const char *before, const char *after)
+{
+  struct _iteminfo *bef_ii, *aft_ii;
+
+  g_return_if_fail (before);
+  g_return_if_fail (after);
+  g_return_if_fail (_to_resolve);
+
+  bef_ii = g_hash_table_lookup (_to_resolve, before);
+  aft_ii = g_hash_table_lookup (_to_resolve, after);
+  if (bef_ii && aft_ii && g_list_find (bef_ii->after, aft_ii))
+    {
+      aft_ii->before--;
+      bef_ii->after = g_list_remove (bef_ii->after, aft_ii);
+    }
 }
 
 /* ------------------------------------------------------------------------- *\
Index: gnue/geas/src/classdef/depend.h
diff -u gnue/geas/src/classdef/depend.h:1.1 gnue/geas/src/classdef/depend.h:1.2
--- gnue/geas/src/classdef/depend.h:1.1 Sun Sep 16 16:54:29 2001
+++ gnue/geas/src/classdef/depend.h     Wed Sep 19 16:32:57 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: depend.h,v 1.1 2001/09/16 20:54:29 reinhard Exp $
+   $Id: depend.h,v 1.2 2001/09/19 20:32:57 reinhard Exp $
 */
 
 #ifndef _DEPEND_H
@@ -29,6 +29,8 @@
 void         _geas_cd_depend_add_item (const char *item);
 void         _geas_cd_depend_add_dependency (const char *before,
                                              const char *after);
+void         _geas_cd_depend_remove_dependency (const char *before,
+                                                const char *after);
 unsigned int _geas_cd_depend_sort (void);
 char        *_geas_cd_depend_get_next_resolved (void);
 char        *_geas_cd_depend_get_next_unresolved (void);
Index: gnue/geas/src/classdef/parse.y
diff -u gnue/geas/src/classdef/parse.y:1.7 gnue/geas/src/classdef/parse.y:1.8
--- gnue/geas/src/classdef/parse.y:1.7  Sun Sep 16 16:54:29 2001
+++ gnue/geas/src/classdef/parse.y      Wed Sep 19 16:32:57 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.7 2001/09/16 20:54:29 reinhard Exp $
+   $Id: parse.y,v 1.8 2001/09/19 20:32:57 reinhard Exp $
 */
 
 %{
@@ -46,11 +46,9 @@
 /* include debugging code */
 #define YYDEBUG 1
 
-/* pass 0 = parser test, only strings are passed around instead of the real
-            data structures */
 /* pass 1 = create list of existing classes and types and their dependencies */
 /* pass 2 = create the final structures in memory */
-/* error messages are only output in pass 0 and in pass 2 */
+/* error messages are only output in pass 2 */
 
 /* ------------------------------------------------------------------------- *\
  * Parser functions defined at the end of this file
@@ -389,6 +387,24 @@
 }
 
 /* ------------------------------------------------------------------------- *\
+ * Unregister a dependency
+\* ------------------------------------------------------------------------- */
+static void
+_undepend (const char *before, const char *before_type,
+           const char *after, const char *after_type)
+{
+  char *before_full, *after_full;
+
+  before_full = g_strconcat (before_type, " ", before, NULL);
+  after_full = g_strconcat (after_type, " ", after, NULL);
+
+  _geas_cd_depend_remove_dependency (before_full, after_full);
+
+  g_free (before_full);
+  g_free (after_full);
+}
+
+/* ------------------------------------------------------------------------- *\
  * [PUBLIC|PRIVATE] MODULE <name>
 \* ------------------------------------------------------------------------- */
 static void
@@ -425,6 +441,11 @@
       /* Now, this class depends on the current file */
       _depend (_current_file, "F",
                geas_cd_class_get_name_full (_current_class), "C");
+      /* In case a reference appeared earlier in this file, a reverse
+         dependency is already registered.  This must be removed to avoid
+         circular dependencies within a file. */
+      _undepend (geas_cd_class_get_name_full (_current_class), "C",
+                 _current_file, "F");
       return (TRUE);
 
     case 2:
@@ -484,6 +505,11 @@
       /* Now, this type depends on the current file */
       _depend (_current_file, "F",
                geas_cd_type_get_name_full (_current_type), "T");
+      /* In case a reference appeared earlier in this file, a reverse
+         dependency is already registered.  This must be removed to avoid
+         circular dependencies within a file. */
+      _undepend (geas_cd_type_get_name_full (_current_type), "T",
+                 _current_file, "F");
       return (TRUE);
 
     case 2:



reply via email to

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