[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/geas/src/classdef README classdef.c classd...
From: |
Reinhard Mueller |
Subject: |
gnue/geas/src/classdef README classdef.c classd... |
Date: |
Sat, 22 Sep 2001 14:26:45 -0400 |
CVSROOT: /cvsroot/gnue
Module name: gnue
Changes by: Reinhard Mueller <address@hidden> 01/09/22 14:26:44
Modified files:
geas/src/classdef: README classdef.c classdef.h parse.y
read-gcd.c
Log message:
Let the parser really start the second pass.
Note: read-gcd.[ch] is considered final.
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/README.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/classdef.c.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/classdef.h.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/parse.y.diff?tr1=1.9&tr2=1.10&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/read-gcd.c.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
Patches:
Index: gnue/geas/src/classdef/README
diff -u gnue/geas/src/classdef/README:1.2 gnue/geas/src/classdef/README:1.3
--- gnue/geas/src/classdef/README:1.2 Sun Sep 16 16:54:29 2001
+++ gnue/geas/src/classdef/README Sat Sep 22 14:26:44 2001
@@ -12,9 +12,11 @@
---------
>------------------------------+
- +--> classdef
- +--+
- |
+ |
+ +---------------+--> classdef
+ | |
+ | +--+
+ | |
+--> parse --+-----> scan
| |
>-- read-gcd --+ +--+
Index: gnue/geas/src/classdef/classdef.c
diff -u gnue/geas/src/classdef/classdef.c:1.9
gnue/geas/src/classdef/classdef.c:1.10
--- gnue/geas/src/classdef/classdef.c:1.9 Wed Sep 19 17:02:49 2001
+++ gnue/geas/src/classdef/classdef.c Sat Sep 22 14:26:44 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.9 2001/09/19 21:02:49 reinhard Exp $
+ $Id: classdef.c,v 1.10 2001/09/22 18:26:44 reinhard Exp $
*/
#include "config.h"
@@ -79,6 +79,91 @@
static GHashTable *_modules = NULL;
/* ========================================================================= *\
+ * Private functions
+\* ========================================================================= */
+
+/* ------------------------------------------------------------------------- *\
+ * Free the memory allocated for a class
+\* ------------------------------------------------------------------------- */
+static void
+_free_class (geas_cd_class *c)
+{
+ g_free (c->name);
+ /* TODO: free all fields */
+ g_hash_table_destroy (c->fields);
+ g_free (c);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free the memory allocated for a type
+\* ------------------------------------------------------------------------- */
+static void
+_free_type (geas_cd_type *t)
+{
+ g_free (t->name);
+ if (t->fields)
+ {
+ /* TODO: free all fields */
+ g_hash_table_destroy (t->fields);
+ }
+ g_free (t);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free a class (called in g_hash_table_foreach_remove)
+\* ------------------------------------------------------------------------- */
+static gboolean
+_hr_free_class (gpointer key, gpointer value, gpointer user_data)
+{
+ _free_class ((geas_cd_class *)value);
+ return (TRUE);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free a type (called in g_hash_table_foreach_remove)
+\* ------------------------------------------------------------------------- */
+static gboolean
+_hr_free_type (gpointer key, gpointer value, gpointer user_data)
+{
+ _free_type ((geas_cd_type *)value);
+ return (TRUE);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free the memory allocated for a module
+\* ------------------------------------------------------------------------- */
+static void
+_free_module (geas_cd_module *m)
+{
+ g_free (m->name);
+
+ g_hash_table_foreach_remove (m->classes, _hr_free_class, NULL);
+ g_hash_table_foreach_remove (m->types, _hr_free_type, NULL);
+
+ g_hash_table_destroy (m->classes);
+ g_hash_table_destroy (m->types);
+
+ g_free (m);
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Free a module except "builtin" (called in g_hash_table_foreach_remove)
+\* ------------------------------------------------------------------------- */
+static gboolean
+_hr_free_module (gpointer key, gpointer value, gpointer user_data)
+{
+ if (strcmp (key, "builtin"))
+ {
+ _free_module ((geas_cd_module *)value);
+ return (TRUE);
+ }
+ else
+ {
+ return (FALSE);
+ }
+}
+
+/* ========================================================================= *\
* General functions
\* ========================================================================= */
@@ -112,6 +197,16 @@
#undef NEWTYPE
}
+/* ------------------------------------------------------------------------- *\
+ * Clean up all data read so far
+\* ------------------------------------------------------------------------- */
+void
+geas_cd_clean (void)
+{
+ g_hash_table_foreach_remove (_modules, _hr_free_module, NULL);
+ g_assert (g_hash_table_size (_modules) == 1);
+}
+
/* ========================================================================= *\
* Modules
\* ========================================================================= */
@@ -256,14 +351,7 @@
g_hash_table_remove (_modules, m->name);
- g_free (m->name);
-
- /* TODO: free all classes and types */
-
- g_hash_table_destroy (m->classes);
- g_hash_table_destroy (m->types);
-
- g_free (m);
+ _free_module (m);
}
/* ========================================================================= *\
@@ -324,14 +412,8 @@
g_return_if_fail (c);
g_hash_table_remove (c->module->classes, c->name);
-
- g_free (c->name);
-
- /* TODO: free all fields */
- g_hash_table_destroy (c->fields);
-
- g_free (c);
+ _free_class (c);
}
/* ========================================================================= *\
@@ -393,13 +475,7 @@
g_hash_table_remove (t->module->types, t->name);
- g_free (t->name);
-
- /* TODO: free all fields */
-
- g_hash_table_destroy (t->fields);
-
- g_free (t);
+ _free_type (t);
}
/* TODO: */
Index: gnue/geas/src/classdef/classdef.h
diff -u gnue/geas/src/classdef/classdef.h:1.5
gnue/geas/src/classdef/classdef.h:1.6
--- gnue/geas/src/classdef/classdef.h:1.5 Sun Sep 16 16:54:29 2001
+++ gnue/geas/src/classdef/classdef.h Sat Sep 22 14:26:44 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.5 2001/09/16 20:54:29 reinhard Exp $
+ $Id: classdef.h,v 1.6 2001/09/22 18:26:44 reinhard Exp $
*/
/* ------------------------------------------------------------------------- *\
@@ -61,6 +61,7 @@
\* ------------------------------------------------------------------------- */
void geas_cd_init (void);
+void geas_cd_clean (void);
/* ------------------------------------------------------------------------- *\
* Modules
Index: gnue/geas/src/classdef/parse.y
diff -u gnue/geas/src/classdef/parse.y:1.9 gnue/geas/src/classdef/parse.y:1.10
--- gnue/geas/src/classdef/parse.y:1.9 Wed Sep 19 17:02:49 2001
+++ gnue/geas/src/classdef/parse.y Sat Sep 22 14:26:44 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.9 2001/09/19 21:02:49 reinhard Exp $
+ $Id: parse.y,v 1.10 2001/09/22 18:26:44 reinhard Exp $
*/
%{
@@ -648,8 +648,18 @@
case 2:
/* The type must exist now. Otherwise it's defined nowhere */
- result = geas_cd_module_find_type (module ? module : _current_module,
- name);
+ result = NULL;
+ if (!module)
+ {
+ /* First, it could be a builtin type */
+ result = geas_cd_module_find_type (_builtin_module, name);
+ }
+ if (!result)
+ {
+ /* If not, it must be already defined */
+ result = geas_cd_module_find_type (module ? module : _current_module,
+ name);
+ }
if (!result)
{
yyerror ("unknown type '%s'", name);
Index: gnue/geas/src/classdef/read-gcd.c
diff -u gnue/geas/src/classdef/read-gcd.c:1.5
gnue/geas/src/classdef/read-gcd.c:1.6
--- gnue/geas/src/classdef/read-gcd.c:1.5 Wed Sep 19 17:02:49 2001
+++ gnue/geas/src/classdef/read-gcd.c Sat Sep 22 14:26:44 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: read-gcd.c,v 1.5 2001/09/19 21:02:49 reinhard Exp $
+ $Id: read-gcd.c,v 1.6 2001/09/22 18:26:44 reinhard Exp $
*/
#include "config.h"
@@ -31,6 +31,7 @@
#include <sys/stat.h>
#include <glib.h>
#include "depend.h"
+#include "classdef.h"
/* defined by parse.y */
void _geas_cd_parse (const char *file, int pass);
@@ -107,6 +108,27 @@
}
}
+/* ------------------------------------------------------------------------- *\
+ * Pass all resolved gcd files with pass 2 in the order that is given by
+ * _geas_cd_depend
+\* ------------------------------------------------------------------------- */
+static void
+_pass_2 (void)
+{
+ char *c;
+
+ while ((c = _geas_cd_depend_get_next_resolved ()))
+ {
+ /* c can be "F filename" or "T typename" or "C classname". We just ignore
+ everything other than filenames */
+ if (c[0] == 'F')
+ {
+ _geas_cd_parse (&c[2], 2);
+ }
+ g_free (c);
+ }
+}
+
/* ========================================================================= *\
* Public functions
\* ========================================================================= */
@@ -123,20 +145,7 @@
_pass_1 (directory);
_geas_cd_depend_sort ();
_list_unresolved ();
-
- {
- char *c;
- puts ("would parse files in this order:");
- while ((c = _geas_cd_depend_get_next_resolved ()))
- {
- if (c[0] == 'F')
- {
- puts (&c[2]);
- }
- g_free (c);
- }
- }
-
-
+ geas_cd_clean (); /* Empty data structures to be rebuilt in 2nd pass */
+ _pass_2 ();
_geas_cd_depend_done ();
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/geas/src/classdef README classdef.c classd...,
Reinhard Mueller <=