commit-gnue
[Top][All Lists]
Advanced

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

gnue/geas/src/classdef classdef.c classdef.h pa...


From: Reinhard Mueller
Subject: gnue/geas/src/classdef classdef.c classdef.h pa...
Date: Sat, 08 Sep 2001 15:01:01 -0700

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Reinhard Mueller <address@hidden>       01/09/08 15:01:00

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

Log message:
        started building the dependency structure in memory

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

Patches:
Index: gnue/geas/src/classdef/classdef.c
diff -u gnue/geas/src/classdef/classdef.c:1.2 
gnue/geas/src/classdef/classdef.c:1.3
--- gnue/geas/src/classdef/classdef.c:1.2       Thu Sep  6 14:18:16 2001
+++ gnue/geas/src/classdef/classdef.c   Sat Sep  8 15:01:00 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.2 2001/09/06 21:18:16 reinhard Exp $
+   $Id: classdef.c,v 1.3 2001/09/08 22:01:00 reinhard Exp $
 */
 
 #include "config.h"
@@ -46,6 +46,7 @@
   geas_cd_module *module;
   gchar          *name;
   geas_cd_access  access;
+  gchar          *filename;
   GHashTable     *fields;
 };
 
@@ -54,6 +55,7 @@
   geas_cd_module *module;
   gchar          *name;
   geas_cd_access  access;
+  gchar          *filename;
   GHashTable     *fields;
 };
 
@@ -77,9 +79,7 @@
 \* ========================================================================= */
 
 /* ------------------------------------------------------------------------- *\
- * Allocate a new module
- * If the module is already there, return existing module
- * Does always return something, except when name is NULL
+ * Allocate a new module, or find if existing
 \* ------------------------------------------------------------------------- */
 geas_cd_module *
 geas_cd_module_new (const char *name, geas_cd_access access)
@@ -122,8 +122,7 @@
 }
 
 /* ------------------------------------------------------------------------- *\
- * Allocate a new class as a member of a module
- * If the class is already there, return NULL
+ * Allocate a new class as a member of a module, or find if existing
 \* ------------------------------------------------------------------------- */
 geas_cd_class *
 geas_cd_module_new_class (geas_cd_module *m, const char *name,
@@ -133,14 +132,9 @@
 
   g_return_val_if_fail (name, NULL);
 
-  if (geas_cd_module_find_class (m, name))
+  c = geas_cd_module_find_class (m, name);
+  if (!c)
     {
-      g_warning ("Duplicate class name %s", name);
-      
-      c = NULL;
-    }
-  else
-    {
       c = g_new0 (geas_cd_class, 1);
 
       c->module = m;
@@ -158,14 +152,13 @@
  * Find an existing class in a module by name
 \* ------------------------------------------------------------------------- */
 geas_cd_class *
-geas_cd_module_find_class (geas_cd_module *m, const char *name)
+geas_cd_module_find_class (const geas_cd_module *m, const char *name)
 {
   return (g_hash_table_lookup (m->classes, name));
 }
 
 /* ------------------------------------------------------------------------- *\
- * Allocate a new type as a member of a module
- * If the type is already there, return NULL
+ * Allocate a new type as a member of a module, or find if existing
 \* ------------------------------------------------------------------------- */
 geas_cd_type *
 geas_cd_module_new_type (geas_cd_module *m, const char *name,
@@ -175,13 +168,8 @@
 
   g_return_val_if_fail (name, NULL);
 
-  if (geas_cd_module_find_type (m, name))
-    {
-      g_warning ("Duplicate type name %s", name);
-      
-      t = NULL;
-    }
-  else
+  t = geas_cd_module_find_type (m, name);
+  if (!t)
     {
       t = g_new0 (geas_cd_type, 1);
 
@@ -200,7 +188,7 @@
  * Find an existing type in a module by name
 \* ------------------------------------------------------------------------- */
 geas_cd_type *
-geas_cd_module_find_type (geas_cd_module *m, const char *name)
+geas_cd_module_find_type (const geas_cd_module *m, const char *name)
 {
   return (g_hash_table_lookup (m->types, name));
 }
@@ -230,6 +218,29 @@
 \* ========================================================================= */
 
 /* ------------------------------------------------------------------------- *\
+ * Set the filename where a class is stored
+\* ------------------------------------------------------------------------- */
+void
+geas_cd_class_set_filename (geas_cd_class *c, const char *filename)
+{
+  g_return_if_fail (c);
+  g_return_if_fail (filename);
+
+  c->filename = g_strdup (filename);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Get the filename where a class is stored
+\* ------------------------------------------------------------------------- */
+const char *
+geas_cd_class_get_filename (const geas_cd_class *c)
+{
+  g_return_val_if_fail (c, NULL);
+
+  return (c->filename);
+}
+
+/* ------------------------------------------------------------------------- *\
  * Free a class
 \* ------------------------------------------------------------------------- */
 void
@@ -251,6 +262,29 @@
 /* ========================================================================= *\
  * Types
 \* ========================================================================= */
+
+/* ------------------------------------------------------------------------- *\
+ * Set the filename where a type is stored
+\* ------------------------------------------------------------------------- */
+void
+geas_cd_type_set_filename (geas_cd_type *t, const char *filename)
+{
+  g_return_if_fail (t);
+  g_return_if_fail (filename);
+
+  t->filename = g_strdup (filename);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Get the filename where a type is stored
+\* ------------------------------------------------------------------------- */
+const char *
+geas_cd_type_get_filename (const geas_cd_type *t)
+{
+  g_return_val_if_fail (t, NULL);
+
+  return (t->filename);
+}
 
 /* ------------------------------------------------------------------------- *\
  * Free a type
Index: gnue/geas/src/classdef/classdef.h
diff -u gnue/geas/src/classdef/classdef.h:1.2 
gnue/geas/src/classdef/classdef.h:1.3
--- gnue/geas/src/classdef/classdef.h:1.2       Thu Sep  6 14:18:16 2001
+++ gnue/geas/src/classdef/classdef.h   Sat Sep  8 15:01:00 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.2 2001/09/06 21:18:16 reinhard Exp $
+   $Id: classdef.h,v 1.3 2001/09/08 22:01:00 reinhard Exp $
 */
 
 /* ------------------------------------------------------------------------- *\
@@ -47,12 +47,12 @@
 geas_cd_class  *geas_cd_module_new_class (geas_cd_module *m,
                                           const char *name,
                                           geas_cd_access access);
-geas_cd_class  *geas_cd_module_find_class (geas_cd_module *m,
+geas_cd_class  *geas_cd_module_find_class (const geas_cd_module *m,
                                            const char *name);
 geas_cd_type   *geas_cd_module_new_type (geas_cd_module *m,
                                          const char *name,
                                          geas_cd_access access);
-geas_cd_type   *geas_cd_module_find_type (geas_cd_module *m,
+geas_cd_type   *geas_cd_module_find_type (const geas_cd_module *m,
                                           const char *name);
 void            geas_cd_module_free (geas_cd_module *m);
 
@@ -60,13 +60,17 @@
  * Classes
 \* ------------------------------------------------------------------------- */
 
-void           geas_cd_class_free (geas_cd_class *c);
+void        geas_cd_class_set_filename (geas_cd_class *c, const char 
*filename);
+const char *geas_cd_class_get_filename (const geas_cd_class *c);
+void        geas_cd_class_free (geas_cd_class *c);
 
 /* ------------------------------------------------------------------------- *\
  * Types (can be plain type or structured type)
 \* ------------------------------------------------------------------------- */
 
-void          geas_cd_type_free (geas_cd_type *t);
+void        geas_cd_type_set_filename (geas_cd_type *t, const char *filename);
+const char *geas_cd_type_get_filename (const geas_cd_type *t);
+void        geas_cd_type_free (geas_cd_type *t);
 
 /* ------------------------------------------------------------------------- *\
  * Fields
Index: gnue/geas/src/classdef/parse.y
diff -u gnue/geas/src/classdef/parse.y:1.3 gnue/geas/src/classdef/parse.y:1.4
--- gnue/geas/src/classdef/parse.y:1.3  Sat Sep  8 02:11:55 2001
+++ gnue/geas/src/classdef/parse.y      Sat Sep  8 15:01:00 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.3 2001/09/08 09:11:55 reinhard Exp $
+   $Id: parse.y,v 1.4 2001/09/08 22:01:00 reinhard Exp $
 */
 
 %{
@@ -45,14 +45,17 @@
 /* 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 */
+
 /* ------------------------------------------------------------------------- *\
  * Parser functions defined at the end of this file
 \* ------------------------------------------------------------------------- */
 
 /* this function is called in the main program */
-/* pass 0 = parser test */
-/* pass 1 = create list of existing modules and passes */
-/* pass 2 = create fields */
 
 void geas_cd_parse (const char *file, int pass);
 
@@ -62,8 +65,6 @@
 static gboolean _new_class  (const gchar *name, geas_cd_access access);
 static void     _set_class  (geas_cd_class *clss);
 static gboolean _new_type   (const gchar *name, geas_cd_access access);
-static     void _new_field  (const gchar *name, gint format,
-                             const gchar *fdefault, gint properties);
 
 static geas_cd_module *_find_module (const gchar *name);
 static geas_cd_class  *_find_class  (geas_cd_module *module, const gchar 
*name);
@@ -73,6 +74,8 @@
 static void _set_type_ref  (geas_cd_class *clss);
 static void _set_type_list (geas_cd_class *clss);
 
+static     void _new_field  (const gchar *name, gint format,
+                             const gchar *fdefault, gint properties);
 %}
 
 /* ========================================================================= *\
@@ -356,7 +359,7 @@
 }
 
 /* ------------------------------------------------------------------------- *\
- * Found a new module
+ * [PUBLIC|PRIVATE] MODULE <name>
 \* ------------------------------------------------------------------------- */
 static void
 _new_module (const gchar *name, geas_cd_access access)
@@ -366,21 +369,20 @@
     case 0:
       g_message ("Entering module '%s'", name);
       break;
+
     case 1:
-      _current_module = geas_cd_module_new (name, access);
-      g_assert (_current_module);
-      break;
     case 2:
-      _current_module = geas_cd_module_find (name);
+      _current_module = geas_cd_module_new (name, access);
       g_assert (_current_module);
       break;
+
     default:
       g_assert_not_reached ();
     }
 }
 
 /* ------------------------------------------------------------------------- *\
- * Found a new class
+ * [PUBLIC|PRIVATE] CLASS <name>
 \* ------------------------------------------------------------------------- */
 static gboolean
 _new_class (const gchar *name, geas_cd_access access)
@@ -390,8 +392,18 @@
     case 0:
       g_message ("  New class '%s'", name);
       return (TRUE);
-      break;
+
     case 1:
+      /* Record the filename for the current class. The class may already exist
+         in memory because a dependency occured. */
+      _current_is_class = TRUE;
+      _current_type = NULL;
+      _current_class = geas_cd_module_new_class (_current_module, name, 
access);
+      geas_cd_class_set_filename (_current_class, _current_file);
+      return (TRUE);
+
+    case 2:
+      /* The class must be new, otherwise the classname is duplicate. */
       _current_is_class = TRUE;
       _current_type = NULL;
       if (geas_cd_module_find_class (_current_module, name))
@@ -400,87 +412,216 @@
           _current_class = NULL;
           return (FALSE);
         }
-      else
-        {
-          _current_class = geas_cd_module_new_class (_current_module, name,
-                                                     access);
-          return (TRUE);
-        }
-      break;
-    case 2:
-      _current_is_class = TRUE;
-      _current_type = NULL;
-      _current_class = geas_cd_module_find_class (_current_module, name);
-      g_assert (_current_class);
+      _current_class = geas_cd_module_new_class (_current_module, name, 
access);
+      geas_cd_class_set_filename (_current_class, _current_file);
       return (TRUE);
+
     default:
       g_assert_not_reached ();
-      return (TRUE);
+      return (FALSE);
     }
 }
 
 /* ------------------------------------------------------------------------- *\
- * Set the current class
+ * EXTEND <class>
 \* ------------------------------------------------------------------------- */
 static void
 _set_class (geas_cd_class *clss)
 {
-  _current_class = clss;
+  switch (_current_pass)
+    {
+    case 0:
+      /* clss is really a string with the class name */
+      g_message ("  Extending class '%s'", (char *)clss);
+      g_free (clss);
+      break;
+
+    case 1:
+    case 2:
+      _current_class = clss;
+      break;
+
+    default:
+      g_assert_not_reached ();
+    }
 }
 
 /* ------------------------------------------------------------------------- *\
- * Found a new type
+ * [PUBLIC|PRIVATE] TYPE <name>
 \* ------------------------------------------------------------------------- */
 static gboolean
 _new_type (const gchar *name, geas_cd_access access)
 {
-  /* TODO */
-  g_message ("Found new type '%s'", name);
-  return (TRUE);
-}
+  switch (_current_pass)
+    {
+    case 0:
+      g_message ("  New type '%s'", name);
+      return (TRUE);
 
-/* ------------------------------------------------------------------------- *\
- * Found a new field
-\* ------------------------------------------------------------------------- */
-static void
-_new_field (const gchar *name, gint format, const gchar *fdefault,
-            gint properties)
-{
-  /* TODO */
-  g_message ("Found new field '%s'", name);
+    case 1:
+      /* Record the filename for the current type. The type may already exist
+         in memory because a dependency occured. */
+      _current_is_class = FALSE;
+      _current_class = NULL;
+      _current_type = geas_cd_module_new_type (_current_module, name, access);
+      g_assert (_current_type);
+      return (TRUE);
+
+    case 2:
+      /* The type must be new, otherwise the typename is duplicate. */
+      _current_is_class = FALSE;
+      _current_class = NULL;
+      if (geas_cd_module_find_type (_current_module, name))
+        {
+          yyerror ("duplicate type name");
+          _current_type = NULL;
+          return (FALSE);
+        }
+      _current_type = geas_cd_module_new_type (_current_module, name, access);
+      return (TRUE);
+
+    default:
+      g_assert_not_reached ();
+      return (FALSE);
+    }
 }
 
 /* ------------------------------------------------------------------------- *\
- * Existing module
+ * Reference to a module
 \* ------------------------------------------------------------------------- */
 static geas_cd_module *
 _find_module (const gchar *name)
 {
-  /* TODO */
-  g_message ("Needs module '%s'", name);
-  return (NULL);
+  geas_cd_module *result;
+
+  switch (_current_pass)
+    {
+    case 0:
+      result = (geas_cd_module *)g_strdup (name);
+      break;
+
+    case 1:
+      /* If the module isn't registered, register it. Public/private doesn't
+         matter in this pass. */
+      result = geas_cd_module_new (name, GEAS_CD_ACCESS_PUBLIC);
+      g_assert (result);
+      break;
+
+    case 2:
+      /* The module must exist now. Otherwise it's defined nowhere */
+      result = geas_cd_module_find (name);
+      if (!result)
+        {
+          yyerror ("unknown module '%s'", name);
+        }
+      break;
+
+    default:
+      g_assert_not_reached ();
+      result = NULL;
+    }
+
+  return (result);
 }
 
 /* ------------------------------------------------------------------------- *\
- * Existing class
+ * Reference to a class
 \* ------------------------------------------------------------------------- */
 static geas_cd_class *
 _find_class (geas_cd_module *module, const gchar *name)
 {
-  /* TODO */
-  g_message ("Needs class '%s'", name);
-  return (NULL);
+  geas_cd_class *result;
+
+  switch (_current_pass)
+    {
+    case 0:
+      /* Module is really a string, and we return a string, too */
+      if (module)
+        {
+          result = (geas_cd_class *)g_strdup_printf ("%s::%s", (gchar *)module,
+                                                     name);
+          g_free (module);
+        }
+      else
+        {
+          result = (geas_cd_class *)g_strdup (name);
+        }
+      break;
+
+    case 1:
+      /* If the class is not yet registered, register it now. Public/private
+         doesn't matter in this pass. */
+      result = geas_cd_module_new_class (module ? module : _current_module,
+                                         name, GEAS_CD_ACCESS_PUBLIC);
+      g_assert (result);
+      break;
+
+    case 2:
+      /* The class must exist now. Otherwise it's defined nowhere */
+      result = geas_cd_module_find_class (module ? module : _current_module,
+                                          name);
+      if (!result)
+        {
+          yyerror ("unknown class '%s'", name);
+        }
+      break;
+
+    default:
+      g_assert_not_reached ();
+      result = NULL;
+    }
+
+  return (result);
 }
 
 /* ------------------------------------------------------------------------- *\
- * Existing type
+ * Reference to a type
 \* ------------------------------------------------------------------------- */
 static geas_cd_type *
 _find_type (geas_cd_module *module, const gchar *name)
 {
-  /* TODO */
-  g_message ("Needs type '%s'", name);
-  return (NULL);
+  geas_cd_type *result;
+
+  switch (_current_pass)
+    {
+    case 0:
+      /* Module is really a string, and we return a string, too */
+      if (module)
+        {
+          result = (geas_cd_type *)g_strdup_printf ("%s::%s", (gchar *)module,
+                                                     name);
+          g_free (module);
+        }
+      else
+        {
+          result = (geas_cd_type *)g_strdup (name);
+        }
+      break;
+
+    case 1:
+      /* If the type is not yet registered, register it now. Public/private
+         doesn't matter in this pass. */
+      result = geas_cd_module_new_type (module ? module : _current_module,
+                                        name, GEAS_CD_ACCESS_PUBLIC);
+      g_assert (result);
+      break;
+
+    case 2:
+      /* The type must exist now. Otherwise it's defined nowhere */
+      result = geas_cd_module_find_type (module ? module : _current_module,
+                                         name);
+      if (!result)
+        {
+          yyerror ("unknown type '%s'", name);
+        }
+      break;
+
+    default:
+      g_assert_not_reached ();
+      result = NULL;
+    }
+
+  return (result);
 }
 
 /* ------------------------------------------------------------------------- *\
@@ -489,7 +630,24 @@
 static void
 _set_type_type (geas_cd_type *type)
 {
-/* TODO */
+  switch (_current_pass)
+    {
+    case 0:
+      /* We are actually receving a string */
+      g_message ("    (depending on type '%s')", (gchar *)type);
+      break;
+
+    case 1:
+      /* TODO */
+      break;
+
+    case 2:
+      /* TODO */
+      break;
+
+    default:
+      g_assert_not_reached ();
+    }
 }
 
 /* ------------------------------------------------------------------------- *\
@@ -498,7 +656,24 @@
 static void
 _set_type_ref  (geas_cd_class *clss)
 {
-/* TODO */
+  switch (_current_pass)
+    {
+    case 0:
+      /* We are actually receving a string */
+      g_message ("    (depending on class '%s')", (gchar *)clss);
+      break;
+
+    case 1:
+      /* TODO */
+      break;
+
+    case 2:
+      /* TODO */
+      break;
+
+    default:
+      g_assert_not_reached ();
+    }
 }
 
 /* ------------------------------------------------------------------------- *\
@@ -506,6 +681,33 @@
 \* ------------------------------------------------------------------------- */
 static void
 _set_type_list (geas_cd_class *clss)
+{
+  switch (_current_pass)
+    {
+    case 0:
+      /* We are actually receving a string */
+      g_message ("    (depending on class '%s')", (gchar *)clss);
+      break;
+
+    case 1:
+      /* TODO */
+      break;
+
+    case 2:
+      /* TODO */
+      break;
+
+    default:
+      g_assert_not_reached ();
+    }
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Found a new field
+\* ------------------------------------------------------------------------- */
+static void
+_new_field (const gchar *name, gint format, const gchar *fdefault,
+            gint properties)
 {
-/* TODO */
+  /* TODO */
 }



reply via email to

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