[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, 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 */
}