[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/geas/src/classdef classdef.c classdef.h pa...,
Reinhard Mueller <=