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, 20 Oct 2001 15:16:43 -0400

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Reinhard Mueller <address@hidden>       01/10/20 15:16:43

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

Log message:
        Splitted up geas_cd_class_field_new and geas_cd_type_field new into 
three seperate functions for fields with types, reference fields, and list 
fields.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/classdef.c.diff?tr1=1.20&tr2=1.21&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/classdef.h.diff?tr1=1.17&tr2=1.18&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/parse.y.diff?tr1=1.16&tr2=1.17&r1=text&r2=text

Patches:
Index: gnue/geas/src/classdef/classdef.c
diff -u gnue/geas/src/classdef/classdef.c:1.20 
gnue/geas/src/classdef/classdef.c:1.21
--- gnue/geas/src/classdef/classdef.c:1.20      Sat Oct 20 06:46:19 2001
+++ gnue/geas/src/classdef/classdef.c   Sat Oct 20 15:16:43 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.20 2001/10/20 10:46:19 reinhard Exp $
+   $Id: classdef.c,v 1.21 2001/10/20 19:16:43 reinhard Exp $
 */
 
 #include "config.h"
@@ -262,16 +262,12 @@
 
       g_hash_table_insert (m->classes, c->name, c);
 
-      /* Create the automatic objectid field */
-      geas_cd_class_field_new (c, _geas_module, "id", _id_type, NULL, NULL);
-      geas_cd_class_field_new (c, _geas_module, "cre_user", _username_type,
-                               NULL, NULL);
-      geas_cd_class_field_new (c, _geas_module, "cre_time", _datetime_type,
-                               NULL, NULL);
-      geas_cd_class_field_new (c, _geas_module, "mod_user", _username_type,
-                               NULL, NULL);
-      geas_cd_class_field_new (c, _geas_module, "mod_time", _datetime_type,
-                               NULL, NULL);
+      /* Create the automatic fields */
+      geas_cd_class_field_new (c, _geas_module, "id", _id_type);
+      geas_cd_class_field_new (c, _geas_module, "cre_user", _username_type);
+      geas_cd_class_field_new (c, _geas_module, "cre_time", _datetime_type);
+      geas_cd_class_field_new (c, _geas_module, "mod_user", _username_type);
+      geas_cd_class_field_new (c, _geas_module, "mod_time", _datetime_type);
     }
 
   return (c);
@@ -597,7 +593,7 @@
 }
 
 /* ------------------------------------------------------------------------- *\
- * Copy a single field into a class (called in g_hash_table_foreach)
+ * Copy a single field into a class (called in g_list_foreach)
 \* ------------------------------------------------------------------------- */
 static void
 _lf_copy_field (gpointer data, gpointer user_data)
@@ -624,60 +620,94 @@
 }
 
 /* ------------------------------------------------------------------------- *\
- * Allocate a new field as a member of a class
- * One of the parameters type, reference or list must be filled in
+ * Allocate a new field as a member of a class, giving a type
 \* ------------------------------------------------------------------------- */
 geas_cd_field *
 geas_cd_class_field_new (geas_cd_class *c, geas_cd_module *m, const char *name,
-                         geas_cd_type *type, geas_cd_class *reference,
-                         geas_cd_class *list)
+                         geas_cd_type *type)
 {
   geas_cd_field *f;
 
   g_return_val_if_fail (c, NULL);
   g_return_val_if_fail (m, NULL);
   g_return_val_if_fail (name, NULL);
-  g_return_val_if_fail (type || reference || list, NULL);
+  g_return_val_if_fail (type, NULL);
+  g_return_val_if_fail (!geas_cd_class_find_field (c, m, name), NULL);
 
-  f = geas_cd_class_find_field (c, m, name);
-  if (!f)
+  f = _create_field (&(c->fields), c, m, g_strdup (name), type->datatype);
+
+  f->name_db    = g_strconcat (m->name, "__", name, NULL);
+  f->type       = type;
+  f->format     = type->format;
+  f->otherclass = type->otherclass;
+
+  if (type->fields)
     {
-      if (type)
-        {
-          f = _create_field (&(c->fields), c, m, g_strdup (name),
-                             type->datatype);
-          f->name_db    = g_strconcat (m->name, "__", name, NULL);
-          f->type       = type;
-          f->format     = type->format;
-          f->otherclass = type->otherclass;
-
-          if (type->fields)
-            {
-              /* Copy the fields from typedef to actual class */
-              g_list_foreach (type->fields, _lf_copy_field, f);
-            }
-        }
-      else if (reference)
-        {
-          f = _create_field (&(c->fields), c, m, g_strdup (name),
-                             GEAS_CD_DATATYPE_REFERENCE);
-          f->name_db    = g_strconcat (m->name, "__", name, NULL);
-          f->otherclass = reference;
-        }
-      else if (list)
-        {
-          f = _create_field (&(c->fields), c, m, g_strdup (name),
-                             GEAS_CD_DATATYPE_LIST);
-          f->name_db    = g_strconcat (m->name, "__", name, NULL);
-          f->otherclass = list;
-        }
-      else
-        {
-          g_assert_not_reached ();
-        }
-      _create_shadow_fields (f);
+      /* Copy the fields from typedef to actual class */
+      g_list_foreach (type->fields, _lf_copy_field, f);
     }
 
+  _create_shadow_fields (f);
+
+  return (f);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Allocate a new reference field as a member of a class
+\* ------------------------------------------------------------------------- */
+geas_cd_field *
+geas_cd_class_reference_new (geas_cd_class *c, geas_cd_module *m,
+                             const char *name, geas_cd_class *otherclass,
+                             geas_cd_field *thisfield,
+                             geas_cd_field *otherfield)
+{
+  geas_cd_field *f;
+
+  g_return_val_if_fail (c, NULL);
+  g_return_val_if_fail (m, NULL);
+  g_return_val_if_fail (name, NULL);
+  g_return_val_if_fail (otherclass, NULL);
+  g_return_val_if_fail (!geas_cd_class_find_field (c, m, name), NULL);
+
+  f = _create_field (&(c->fields), c, m, g_strdup (name),
+                     GEAS_CD_DATATYPE_REFERENCE);
+
+  f->name_db    = g_strconcat (m->name, "__", name, NULL);
+  f->otherclass = otherclass;
+  f->thisfield  = thisfield;
+  f->otherfield = otherfield;
+
+  _create_shadow_fields (f);
+
+  return (f);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Allocate a new list field as a member of a class
+\* ------------------------------------------------------------------------- */
+geas_cd_field *
+geas_cd_class_list_new (geas_cd_class *c, geas_cd_module *m, const char *name,
+                        geas_cd_class *otherclass, geas_cd_field *thisfield,
+                        geas_cd_field *otherfield)
+{
+  geas_cd_field *f;
+
+  g_return_val_if_fail (c, NULL);
+  g_return_val_if_fail (m, NULL);
+  g_return_val_if_fail (name, NULL);
+  g_return_val_if_fail (otherclass, NULL);
+  g_return_val_if_fail (!geas_cd_class_find_field (c, m, name), NULL);
+
+  f = _create_field (&(c->fields), c, m, g_strdup (name),
+                     GEAS_CD_DATATYPE_LIST);
+
+  f->name_db    = g_strconcat (m->name, "__", name, NULL);
+  f->otherclass = otherclass;
+  f->thisfield  = thisfield;
+  f->otherfield = otherfield;
+
+  _create_shadow_fields (f);
+
   return (f);
 }
 
@@ -826,53 +856,82 @@
 }
 
 /* ------------------------------------------------------------------------- *\
- * Allocate a new field as a member of a type
- * One of the parameters type, reference or list must be filled in
+ * Allocate a new field as a member of a type, giving another type
 \* ------------------------------------------------------------------------- */
 geas_cd_field *
-geas_cd_type_field_new (geas_cd_type *t, const char *name,
-                        geas_cd_type *type, geas_cd_class *reference,
-                        geas_cd_class *list)
+geas_cd_type_field_new (geas_cd_type *t, const char *name, geas_cd_type *type)
 {
   geas_cd_field *f;
 
   g_return_val_if_fail (t, NULL);
   g_return_val_if_fail (name, NULL);
-  g_return_val_if_fail (type || reference || list, NULL);
+  g_return_val_if_fail (type, NULL);
+  g_return_val_if_fail (!geas_cd_type_find_field (t, name), NULL);
 
-  f = geas_cd_type_find_field (t, name);
-  if (!f)
-    {
-      f = g_new0 (geas_cd_field, 1);
+  f = g_new0 (geas_cd_field, 1);
 
-      f->parent    = &(t->fields);
-      f->name      = g_strdup (name);
-      f->name_full = g_strdup (name);
+  f->parent     = &(t->fields);
+  f->name       = g_strdup (name);
+  f->type       = type;
+  f->datatype   = type->datatype;
+  f->format     = type->format;
+  f->otherclass = type->otherclass;
 
-      if (type)
-        {
-          f->type       = type;
-          f->datatype   = type->datatype;
-          f->format     = type->format;
-          f->otherclass = type->otherclass;
-        }
-      else if (reference)
-        {
-          f->datatype   = GEAS_CD_DATATYPE_REFERENCE;
-          f->otherclass = reference;
-        }
-      else if (list)
-        {
-          f->datatype   = GEAS_CD_DATATYPE_LIST;
-          f->otherclass = list;
-        }
-      else
-        {
-          g_assert_not_reached ();
-        }
+  t->fields = g_list_append (t->fields, f);
 
-      t->fields = g_list_append (t->fields, f);
-    }
+  return (f);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Allocate a new reference field as a member of a type.
+ * Can only be implicit references.
+\* ------------------------------------------------------------------------- */
+geas_cd_field *
+geas_cd_type_reference_new (geas_cd_type *t, const char *name,
+                            geas_cd_class *otherclass)
+{
+  geas_cd_field *f;
+
+  g_return_val_if_fail (t, NULL);
+  g_return_val_if_fail (name, NULL);
+  g_return_val_if_fail (otherclass, NULL);
+  g_return_val_if_fail (!geas_cd_type_find_field (t, name), NULL);
+
+  f = g_new0 (geas_cd_field, 1);
+
+  f->parent     = &(t->fields);
+  f->name       = g_strdup (name);
+  f->datatype   = GEAS_CD_DATATYPE_REFERENCE;
+  f->otherclass = otherclass;
+
+  t->fields = g_list_append (t->fields, f);
+
+  return (f);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Allocate a new list field as a member of a type.
+ * Can only be implicit lists.
+\* ------------------------------------------------------------------------- */
+geas_cd_field *
+geas_cd_type_list_new (geas_cd_type *t, const char *name,
+                       geas_cd_class *otherclass)
+{
+  geas_cd_field *f;
+
+  g_return_val_if_fail (t, NULL);
+  g_return_val_if_fail (name, NULL);
+  g_return_val_if_fail (otherclass, NULL);
+  g_return_val_if_fail (!geas_cd_type_find_field (t, name), NULL);
+
+  f = g_new0 (geas_cd_field, 1);
+
+  f->parent     = &(t->fields);
+  f->name       = g_strdup (name);
+  f->datatype   = GEAS_CD_DATATYPE_LIST;
+  f->otherclass = otherclass;
+
+  t->fields = g_list_append (t->fields, f);
 
   return (f);
 }
Index: gnue/geas/src/classdef/classdef.h
diff -u gnue/geas/src/classdef/classdef.h:1.17 
gnue/geas/src/classdef/classdef.h:1.18
--- gnue/geas/src/classdef/classdef.h:1.17      Sat Oct 13 17:46:33 2001
+++ gnue/geas/src/classdef/classdef.h   Sat Oct 20 15:16:43 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.17 2001/10/13 21:46:33 reinhard Exp $
+   $Id: classdef.h,v 1.18 2001/10/20 19:16:43 reinhard Exp $
 */
 
 /* ------------------------------------------------------------------------- *\
@@ -96,48 +96,61 @@
  * Classes
 \* ------------------------------------------------------------------------- */
 
-void              geas_cd_class_set_filename (geas_cd_class *c,
-                                              const char *filename);
-const char       *geas_cd_class_get_name (const geas_cd_class *c);
-const char       *geas_cd_class_get_name_full (const geas_cd_class *c);
-const char       *geas_cd_class_get_name_db (const geas_cd_class *c);
-const char       *geas_cd_class_get_filename (const geas_cd_class *c);
-geas_cd_field    *geas_cd_class_field_new (geas_cd_class *c, geas_cd_module *m,
+void               geas_cd_class_set_filename (geas_cd_class *c,
+                                               const char *filename);
+const char        *geas_cd_class_get_name (const geas_cd_class *c);
+const char        *geas_cd_class_get_name_full (const geas_cd_class *c);
+const char        *geas_cd_class_get_name_db (const geas_cd_class *c);
+const char        *geas_cd_class_get_filename (const geas_cd_class *c);
+geas_cd_field     *geas_cd_class_field_new (geas_cd_class *c,
+                                            geas_cd_module *m,
+                                            const char *name,
+                                            geas_cd_type *type);
+geas_cd_field     *geas_cd_class_reference_new (geas_cd_class *c,
+                                                geas_cd_module *m,
+                                                const char *name,
+                                                geas_cd_class *otherclass,
+                                                geas_cd_field *thisfield,
+                                                geas_cd_field *otherfield);
+geas_cd_field     *geas_cd_class_list_new (geas_cd_class *c, geas_cd_module *m,
                                            const char *name,
-                                           geas_cd_type *type,
-                                           geas_cd_class *reference,
-                                           geas_cd_class *list);
-geas_cd_field    *geas_cd_class_find_field (const geas_cd_class *c,
-                                            const geas_cd_module *m,
-                                            const char *name);
+                                           geas_cd_class *otherclass,
+                                           geas_cd_field *thisfield,
+                                           geas_cd_field *otherfield);
+geas_cd_field     *geas_cd_class_find_field (const geas_cd_class *c,
+                                             const geas_cd_module *m,
+                                             const char *name);
 geas_cd_fieldlist *geas_cd_class_fieldlist_new (const geas_cd_class *c);
-void              geas_cd_class_free (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_set_filename (geas_cd_type *t,
-                                             const char *filename);
-void              geas_cd_type_set_format (geas_cd_type *t, int format);
-const char       *geas_cd_type_get_name (const geas_cd_type *t);
-const char       *geas_cd_type_get_name_full (const geas_cd_type *t);
-const char       *geas_cd_type_get_filename (const geas_cd_type *t);
-int               geas_cd_type_get_format (const geas_cd_type *t);
-geas_cd_field    *geas_cd_type_field_new (geas_cd_type *t, const char *name,
-                                          geas_cd_type *type,
-                                          geas_cd_class *reference,
-                                          geas_cd_class *list);
-geas_cd_field    *geas_cd_type_find_field (const geas_cd_type *t,
-                                           const char *name);
-void              geas_cd_type_free (geas_cd_type *t);
+void           geas_cd_type_set_filename (geas_cd_type *t,
+                                          const char *filename);
+void           geas_cd_type_set_format (geas_cd_type *t, int format);
+const char    *geas_cd_type_get_name (const geas_cd_type *t);
+const char    *geas_cd_type_get_name_full (const geas_cd_type *t);
+const char    *geas_cd_type_get_filename (const geas_cd_type *t);
+int            geas_cd_type_get_format (const geas_cd_type *t);
+geas_cd_field *geas_cd_type_field_new (geas_cd_type *t, const char *name,
+                                       geas_cd_type *type);
+geas_cd_field *geas_cd_type_reference_new (geas_cd_type *t,
+                                           const char *name,
+                                           geas_cd_class *otherclass);
+geas_cd_field *geas_cd_type_list_new (geas_cd_type *t, const char *name,
+                                      geas_cd_class *otherclass);
+geas_cd_field *geas_cd_type_find_field (const geas_cd_type *t,
+                                        const char *name);
+void           geas_cd_type_free (geas_cd_type *t);
 
 /* ------------------------------------------------------------------------- *\
  * Fieldlists
 \* ------------------------------------------------------------------------- */
 
-geas_cd_field     *geas_cd_fieldlist_next (geas_cd_fieldlist *fl);
-void               geas_cd_fieldlist_free (geas_cd_fieldlist *fl);
+geas_cd_field *geas_cd_fieldlist_next (geas_cd_fieldlist *fl);
+void           geas_cd_fieldlist_free (geas_cd_fieldlist *fl);
 
 /* ------------------------------------------------------------------------- *\
  * Fields
Index: gnue/geas/src/classdef/parse.y
diff -u gnue/geas/src/classdef/parse.y:1.16 gnue/geas/src/classdef/parse.y:1.17
--- gnue/geas/src/classdef/parse.y:1.16 Mon Oct  8 10:33:34 2001
+++ gnue/geas/src/classdef/parse.y      Sat Oct 20 15:16:43 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.16 2001/10/08 14:33:34 reinhard Exp $
+   $Id: parse.y,v 1.17 2001/10/20 19:16:43 reinhard Exp $
 */
 
 %{
@@ -786,37 +786,80 @@
     case 2:
       if (_current_is_class)
         {
+          /* We are in a class definition */
           if (geas_cd_class_find_field (_current_class, _current_module, name))
             {
               yyerror ("duplicate field name");
               _current_field = NULL;
               return (FALSE);
             }
-          else
+          else if (_datatype_type)
             {
+              /* This field has a predefined type */
               _current_field = geas_cd_class_field_new (_current_class,
                                                         _current_module, name,
-                                                        _datatype_type,
-                                                        _datatype_reference,
-                                                        _datatype_list);
+                                                        _datatype_type);
+              return (TRUE);
+            }
+          else if (_datatype_reference)
+            {
+              /* This field is an implicit reference */
+              _current_field = geas_cd_class_reference_new (_current_class,
+                                                            _current_module,
+                                                            name,
+                                                            
_datatype_reference,
+                                                            NULL, NULL);
               return (TRUE);
             }
+          else if (_datatype_list)
+            {
+              /* This field is an implicit list */
+              _current_field = geas_cd_class_list_new (_current_class,
+                                                       _current_module, name,
+                                                       _datatype_list, NULL,
+                                                       NULL);
+              return (TRUE);
+            }
+          else
+            {
+              g_assert_not_reached ();
+              return (FALSE);
+            }
         }
       else
         {
+          /* We are in a compound type definition */
           if (geas_cd_type_find_field (_current_type, name))
             {
               yyerror ("duplicate field name");
               _current_field = NULL;
               return (FALSE);
             }
-          else
+          else if (_datatype_type)
             {
+              /* This field has a predefined type */
               _current_field = geas_cd_type_field_new (_current_type, name,
-                                                       _datatype_type,
-                                                       _datatype_reference,
-                                                       _datatype_list);
+                                                       _datatype_type);
+              return (TRUE);
+            }
+          else if (_datatype_reference)
+            {
+              /* This field is an implicit reference */
+              _current_field = geas_cd_type_reference_new (_current_type, name,
+                                                           
_datatype_reference);
               return (TRUE);
+            }
+          else if (_datatype_list)
+            {
+              /* This field is an implicit list */
+              _current_field = geas_cd_type_list_new (_current_type, name,
+                                                      _datatype_list);
+              return (TRUE);
+            }
+          else
+            {
+              g_assert_not_reached ();
+              return (FALSE);
             }
         }
       break;



reply via email to

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