]> git.draconx.ca Git - gob-dx.git/commitdiff
Release 1.99.1 v1.99.1
authorGeorge Lebl <jirka@5z.com>
Fri, 5 Oct 2001 10:59:00 +0000 (02:59 -0800)
committerNick Bowler <nbowler@draconx.ca>
Tue, 19 Feb 2019 17:32:54 +0000 (12:32 -0500)
39 files changed:
ChangeLog
Makefile.am
Makefile.in
README
aclocal.m4
config.h.in
configure
configure.in
doc/Makefile.am
doc/Makefile.in
doc/gob2.1.in [moved from doc/gob.1.in with 92% similarity]
doc/makehtml.pl [new file with mode: 0755]
examples/GNOME_Foo_SomeInterface.idl [new file with mode: 0644]
examples/Makefile.am
examples/Makefile.in
examples/README
examples/foo-some-interface.gob [new file with mode: 0644]
examples/my-person.gob
gob2.m4 [moved from gob.m4 with 84% similarity]
gob2.spec [moved from gob.spec with 63% similarity]
gob2.spec.in [moved from gob.spec.in with 66% similarity]
src/Makefile.am
src/Makefile.in
src/checks.c
src/checks.h
src/generate_treefuncs.pl
src/lexer.c
src/lexer.l
src/main.c
src/parse.c
src/parse.h [new file with mode: 0644]
src/parse.y
src/test.gob
src/treefuncs.c
src/treefuncs.def
src/treefuncs.h
src/util.c
src/util.h
stamp-h.in

index b4190e26c4d9c3dc62aaa5a1e1043ac873d78cbe..99e9511bd9546f03ba55f2eea9f46a55287f2a40 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,178 @@
+Sat Sep 29 17:00:39 2001  George Lebl <jirka@5z.com>
+
+       * doc/Makefile.am: update
+
+Sat Sep 29 16:44:13 2001  George Lebl <jirka@5z.com>
+
+       * doc/gob2.1.in:  update a tad and add a note that the manual
+         is now out of date
+
+Sat Sep 29 16:33:57 2001  George Lebl <jirka@5z.com>
+
+       * gob2.spec.in: update for gob2
+
+Fri Sep 28 17:39:57 2001  George Lebl <jirka@5z.com>
+
+       * **/*: Merge from gob-2 to HEAD
+
+Fri Sep 28 17:08:19 2001  George Lebl <jirka@5z.com>
+
+       * configure.in, gob2.spec.in, gob2.m4, doc/gob2.1.in, Makefile.am,
+         doc/Makefile.am: rename rest of files for gob2
+
+       * src/main.c: minor cleanup
+
+Thu Sep 27 21:56:17 2001  George Lebl <jirka@5z.com>
+
+       * src/generate_treefuncs.pl, src/treefuncs.def, src/parse.y,
+         src/main.c:  Revamp the tree funcs stuff to be saner and cooler,
+         and fix some crashes and other things related to this.
+
+       * src/parse.y, src/lexer.l, src/main.c, src/util.[ch],
+         src/checks.[ch], treefuncs.def:  Add properties (GParam), fix
+         C++ generation, add GET_NEW_VARG, whack the propname alias for
+         arguments setters/getters (they're deprecated anyway)
+
+       * src/test.gob: update tests
+
+Sun Sep 16 13:07:37 2001  George Lebl <jirka@5z.com>
+
+       * src/main.c: replace GOB_ prefix for local functions with
+         self_.  This makes much more sense.
+
+Sun Sep 16 12:43:24 2001  George Lebl <jirka@5z.com>
+
+       * src/lexer.l, src/parse.y, src/main.c, src/treefuncs.(def|c|h),
+         src/util.[ch], src/test.gob: Add syntax for properties (GParam
+         or whatever you call these:).  The code behind them is not yet
+         there though.
+
+Sun Aug 12 16:15:46 2001  George Lebl <jirka@5z.com>
+
+       * src/main.c, src/parse.y, src/test.gob, src/util.c:  Things now
+         make compilable objects, including with signals, how well it
+         works I don't know.  cpp support seems broken in glib mostly.
+
+Sat Jun 30 15:01:26 2001  George Lebl <jirka@5z.com>
+
+       * Applied the following from HEAD
+
+ Sat Jun 30 14:57:37 2001  George Lebl <jirka@5z.com>
+
+       * doc/gob.1.in: add documentation for (export)
+
+ Tue Jun 26 15:54:08 2001  George Lebl <jirka@5z.com>
+
+       * src/Makefile.am: add built sources to EXTRA_DIST
+
+ 2001-06-24  Mark Brown  <broonie@sirena.org.uk>
+
+       * src/main.c: Default to PRIVATE_HEADER_ONDEMAND rather than
+         PRIVATE_HEADER_ALWAYS as per documentation.
+
+       * doc/gob.1.in: Fix cut & paste error in object_{get,set}
+         examples.
+
+ Sat Jun 09 13:38:53 2001  George Lebl <jirka@5z.com>
+
+       * src/parse.y: was freeing the wrong token
+
+ 2001-06-03  Eskil Heyn Olsen  <eskil@eskil.dk>
+
+       * examples/my-person.gob:
+       Fixed some comments
+       
+       * examples/test-export.gob:
+       File that tests the (export) keyword.
+       
+       * src/parse.y:
+       Added a (export) keyword to argument, so gob will
+       autodefine the my_object_[get|set]_var functions.
+
+Sun May 13 02:45:43 2001  George Lebl <jirka@5z.com>
+
+       * src/main.c: revert the GET_NEW_VARG since it just won't work
+         with non-gcc systems
+
+Sun May 13 02:31:52 2001  George Lebl <jirka@5z.com>
+
+       * src/main.c: add GET_NEW_VARG macro/static func (for non-gcc)
+         and add TYPE_SELF macro
+
+Sun May 13 02:02:47 2001  George Lebl <jirka@5z.com>
+
+       * src/util.c: patch from Frederic Crozat <fcrozat@mandrakesoft.com>
+         to fix warning
+
+Sat Apr 21 20:06:10 2001  George Lebl <jirka@5z.com>
+
+       * examples/Makefile.am, examples/README,
+         examples/GNOME_Foo_SomeInterface.idl,
+         examples/foo-some-interface.gob:  Add an example for BonoboXObject
+
+Sat Apr 21 19:33:08 2001  George Lebl <jirka@5z.com>
+
+       * configure.in:  Raise version to 1.0.9
+
+       * src/lexer.l:  Properly check major version requirements (majors
+         must match in the requires line)
+
+       * src/parse.y, src/main.c, src/treefuncs.(def|c|h), src/checks.c:
+         Add direct BonoboXObject support
+
+       * src/parse.y: fix the chunks usage
+
+       * doc/gob.1.in: document BonoboXObject stuff, fix the bugs section
+         wrt gtk-doc which has been supported for quite some time
+
+Sat Apr 14 00:11:50 2001  George Lebl <jirka@5z.com>
+
+       * configure.in: compile with glib 2.0
+
+       * src/test.gob, src/Makefile.am: make the test glib pure, or mostly
+         so
+
+       * src/lexer.l: added fixme
+
+       * src/main.c: work on signals a little bit
+
+Fri Apr 13 21:23:19 2001  George Lebl <jirka@5z.com>
+
+       * src/checks.[ch], src/lexer.l, src/main.c, src/parse.y,
+         src/treefuncs.[ch], src/treefuncs.def:  Work on gobject support,
+         based on the patch Sven sent me.  Also do add unref as well as
+         destroy handlers to vars, and moved the destructors to finalize and
+         unreffers to shutdown.  This all compiles, but that doesn't mean it
+         makes usable objects.
+
+Fri Apr 13 17:45:14 2001  George Lebl <jirka@5z.com>
+
+       * src/parse.y, doc/gob.1.in: Fix a problem found by Eric Kidd
+         <eric.kidd@pobox.com>, where objectlink was not completely
+         refcounting safe.  Could underref if you set the same object.
+
+Sat Mar 31 00:24:58 2001  George Lebl <jirka@5z.com>
+
+       * src/main.c: fix crash with marshallers of signals with a return
+          type and no arguments.
+
+Sun Mar 04 19:14:03 2001  George Lebl <jirka@5z.com>
+
+       * src/main.c, src/checks.c, src/util.[ch]:  Remove the underscore
+         hack, remove the 1.2 code from the 1.3 compat hacks, make all
+         short names start with GOB_.  Start of the direct GObject
+         support, gob compiles, but it will not create useful object
+         files yet.
+
+Tue Feb 27 06:14:59 2001  George Lebl <jirka@5z.com>
+
+       * configure.in, src/Makefile.am, README: this is the gob-2 branch
+         for GObject support
+
+Tue Feb 27 00:53:41 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * README: Use my new-found maintainer status!!! The power!
+
 Sun Feb 25 17:17:46 2001  George Lebl <jirka@5z.com>
 
        * Release 1.0.7
 Sun Feb 25 17:17:46 2001  George Lebl <jirka@5z.com>
 
        * Release 1.0.7
index 4809e57e654309e4f6991125fd39973371d4d0d8..c8c5081e0b8e99e9094fb56b5e1b7ed35ee12892 100644 (file)
@@ -2,9 +2,9 @@ SUBDIRS = @SUBDIRS@
 DIST_SUBDIRS = src doc examples
 
 m4dir=$(datadir)/aclocal
 DIST_SUBDIRS = src doc examples
 
 m4dir=$(datadir)/aclocal
-m4_DATA=gob.m4
+m4_DATA=gob2.m4
 
 
-EXTRA_DIST = gob.spec.in $(m4_DATA)
+EXTRA_DIST = gob2.spec.in $(m4_DATA)
 
 
-dist-hook: gob.spec
-       cp gob.spec $(distdir)
+dist-hook: gob2.spec
+       cp gob2.spec $(distdir)
index d25d6d4f4fdd436c7f41b3581cfb605f38896028..7385530df0ac0f247fe3ae274b86ec96c9452f74 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
 
 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 
 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
@@ -63,8 +63,10 @@ CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 DOINSTGOB = @DOINSTGOB@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 CPPFLAGS = @CPPFLAGS@
 DOINSTGOB = @DOINSTGOB@
 GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_QUERY = @GOBJECT_QUERY@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
 MAINT = @MAINT@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
 MAINT = @MAINT@
@@ -72,6 +74,7 @@ MAKEINFO = @MAKEINFO@
 MV = @MV@
 NOINSTGOB = @NOINSTGOB@
 PACKAGE = @PACKAGE@
 MV = @MV@
 NOINSTGOB = @NOINSTGOB@
 PACKAGE = @PACKAGE@
+PKG_CONFIG = @PKG_CONFIG@
 RM = @RM@
 TAR = @TAR@
 VERSION = @VERSION@
 RM = @RM@
 TAR = @TAR@
 VERSION = @VERSION@
@@ -81,18 +84,18 @@ SUBDIRS = @SUBDIRS@
 DIST_SUBDIRS = src doc examples
 
 m4dir = $(datadir)/aclocal
 DIST_SUBDIRS = src doc examples
 
 m4dir = $(datadir)/aclocal
-m4_DATA = gob.m4
+m4_DATA = gob2.m4
 
 
-EXTRA_DIST = gob.spec.in $(m4_DATA)
+EXTRA_DIST = gob2.spec.in $(m4_DATA)
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = config.h
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =  gob.spec
+CONFIG_CLEAN_FILES =  gob2.spec
 DATA =  $(m4_DATA)
 
 DIST_COMMON =  README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \
 Makefile.am Makefile.in NEWS TODO aclocal.m4 config.h.in configure \
 DATA =  $(m4_DATA)
 
 DIST_COMMON =  README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \
 Makefile.am Makefile.in NEWS TODO aclocal.m4 config.h.in configure \
-configure.in gob.spec.in install-sh missing mkinstalldirs
+configure.in gob2.spec.in install-sh missing mkinstalldirs
 
 
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
 
 
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
@@ -110,7 +113,7 @@ Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in 
        cd $(srcdir) && $(ACLOCAL)
 
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in 
        cd $(srcdir) && $(ACLOCAL)
 
-config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+config.status: $(srcdir)/configure.in $(CONFIG_STATUS_DEPENDENCIES)
        $(SHELL) ./config.status --recheck
 $(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
        cd $(srcdir) && $(AUTOCONF)
        $(SHELL) ./config.status --recheck
 $(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
        cd $(srcdir) && $(AUTOCONF)
@@ -142,7 +145,7 @@ distclean-hdr:
        -rm -f config.h
 
 maintainer-clean-hdr:
        -rm -f config.h
 
 maintainer-clean-hdr:
-gob.spec: $(top_builddir)/config.status gob.spec.in
+gob2.spec: $(top_builddir)/config.status gob2.spec.in
        cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
 install-m4DATA: $(m4_DATA)
        cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
 install-m4DATA: $(m4_DATA)
@@ -294,7 +297,7 @@ distdir: $(DISTFILES)
        @for file in $(DISTFILES); do \
          d=$(srcdir); \
          if test -d $$d/$$file; then \
        @for file in $(DISTFILES); do \
          d=$(srcdir); \
          if test -d $$d/$$file; then \
-           cp -pr $$/$$file $(distdir)/$$file; \
+           cp -pr $$d/$$file $(distdir)/$$file; \
          else \
            test -f $(distdir)/$$file \
            || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
          else \
            test -f $(distdir)/$$file \
            || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
@@ -388,8 +391,8 @@ installdirs mostlyclean-generic distclean-generic clean-generic \
 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
 
 
 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
 
 
-dist-hook: gob.spec
-       cp gob.spec $(distdir)
+dist-hook: gob2.spec
+       cp gob2.spec $(distdir)
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/README b/README
index cb1c740ef9b22ed2fa7ee05edfe738cb62f41911..4ce0a2d099a170129533c10e1e04fbcb3b781d2d 100644 (file)
--- a/README
+++ b/README
@@ -1,12 +1,18 @@
-GTK+ Object Builder (GOB)
+[
+  Note: if you are looking for the old GOB (for GTK+ objects), which is what
+  used to be here, look into the gob-1-0 branch in CVS!
+]
 
 
-Very simple preprocessor for making GTK+ objects with inline C code so that
+GObject Builder (GOB-2)
+(George's Obfuscated Bits)
+
+Very simple preprocessor for making GObject objects with inline C code so that
 generated files are not editted.  Syntax is inspired by java and yacc or lex.
 The implementation is intentionaly kept simple, and no C code parsing is done.
 
 Reasons:
        - C is a perfect (well mostly) language, no need for another language
 generated files are not editted.  Syntax is inspired by java and yacc or lex.
 The implementation is intentionaly kept simple, and no C code parsing is done.
 
 Reasons:
        - C is a perfect (well mostly) language, no need for another language
-       - Writing a fully featured GTK+ object is a hassle
+       - Writing a fully featured GObject object is a hassle
        - Need for a generator that doesn't require changes to generated code
        - I like how Java writes method code directly into the class
          definition.
        - Need for a generator that doesn't require changes to generated code
        - I like how Java writes method code directly into the class
          definition.
@@ -16,31 +22,31 @@ To build:
        run "./configure;make"
 
 To install:
        run "./configure;make"
 
 To install:
-       run "make install" as root, or just take the gob binary and place
+       run "make install" as root, or just take the gob2 binary and place
        it anywhere you want.
 
 To use:
        it anywhere you want.
 
 To use:
-       run gob with the .gob file on the command line
+       run gob2 with the .gob file on the command line
 
 What's generated:
        two (.c and .h) files named by the object name with words
        separated by a hyphen (not neccessairly the .gob file prefix)
 
 How to write .gob files?
 
 What's generated:
        two (.c and .h) files named by the object name with words
        separated by a hyphen (not neccessairly the .gob file prefix)
 
 How to write .gob files?
-       1) read "man gob" for some documenation on how to use GOB
+       1) read "man gob2" for some documenation on how to use GOB
        2) if you can't find what you need, read src/test.gob for an
           example of GOB code
        3) If you still can't find what you need, read src/lexer.l
           and src/parse.y (in other words: RTFS)
 
        2) if you can't find what you need, read src/test.gob for an
           example of GOB code
        3) If you still can't find what you need, read src/lexer.l
           and src/parse.y (in other words: RTFS)
 
-How to include gob inside your project:
+How to include gob2 inside your project:
 
 
-       Put the gob distribution into a subdirectory in your main
+       Put the gob2 distribution into a subdirectory in your main
        project directory.  Use the AC_CONFIG_SUBDIRS to include that
        directory in your configure run.  And finally add a file called
        NOINST_GOB into your toplevel project directory (this can be done
        project directory.  Use the AC_CONFIG_SUBDIRS to include that
        directory in your configure run.  And finally add a file called
        NOINST_GOB into your toplevel project directory (this can be done
-       inside your configure script in fact) so that gob doesn't install
-       itself.  Then just use the made gob binary as you would other
+       inside your configure script in fact) so that gob2 doesn't install
+       itself.  Then just use the made gob2 binary as you would other
        preprocessors.
 
 TODO:
        preprocessors.
 
 TODO:
index 3a5eda482a3260081ba36ae821672cbc89c49cc9..05af4e49417214de7671fde770d6c0c58ef73d10 100644 (file)
@@ -1,4 +1,4 @@
-dnl aclocal.m4 generated automatically by aclocal 1.4
+dnl aclocal.m4 generated automatically by aclocal 1.4-p4
 
 dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 
 dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
@@ -135,62 +135,76 @@ AC_PROG_LEX
 AC_DECL_YYTEXT])
 
 # Configure paths for GLIB
 AC_DECL_YYTEXT])
 
 # Configure paths for GLIB
-# Owen Taylor     97-11-3
+# Owen Taylor     1997-2001
 
 
-dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
-dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or 
-dnl gthread is specified in MODULES, pass to glib-config
+dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject or 
+dnl gthread is specified in MODULES, pass to pkg-config
 dnl
 dnl
-AC_DEFUN(AM_PATH_GLIB,
+AC_DEFUN(AM_PATH_GLIB_2_0,
 [dnl 
 [dnl 
-dnl Get the cflags and libraries from the glib-config script
+dnl Get the cflags and libraries from pkg-config
 dnl
 dnl
-AC_ARG_WITH(glib-prefix,[  --with-glib-prefix=PFX   Prefix where GLIB is installed (optional)],
-            glib_config_prefix="$withval", glib_config_prefix="")
-AC_ARG_WITH(glib-exec-prefix,[  --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)],
-            glib_config_exec_prefix="$withval", glib_config_exec_prefix="")
 AC_ARG_ENABLE(glibtest, [  --disable-glibtest       Do not try to compile and run a test GLIB program],
                    , enable_glibtest=yes)
 
 AC_ARG_ENABLE(glibtest, [  --disable-glibtest       Do not try to compile and run a test GLIB program],
                    , enable_glibtest=yes)
 
-  if test x$glib_config_exec_prefix != x ; then
-     glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix"
-     if test x${GLIB_CONFIG+set} != xset ; then
-        GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config
-     fi
-  fi
-  if test x$glib_config_prefix != x ; then
-     glib_config_args="$glib_config_args --prefix=$glib_config_prefix"
-     if test x${GLIB_CONFIG+set} != xset ; then
-        GLIB_CONFIG=$glib_config_prefix/bin/glib-config
-     fi
-  fi
-
+  pkg_config_args=glib-2.0
   for module in . $4
   do
       case "$module" in
          gmodule) 
   for module in . $4
   do
       case "$module" in
          gmodule) 
-             glib_config_args="$glib_config_args gmodule"
+             pkg_config_args="$pkg_config_args gmodule-2.0"
+         ;;
+         gobject) 
+             pkg_config_args="$pkg_config_args gobject-2.0"
          ;;
          gthread) 
          ;;
          gthread) 
-             glib_config_args="$glib_config_args gthread"
+             pkg_config_args="$pkg_config_args gthread-2.0"
          ;;
       esac
   done
 
          ;;
       esac
   done
 
-  AC_PATH_PROG(GLIB_CONFIG, glib-config, no)
-  min_glib_version=ifelse([$1], ,0.99.7,$1)
-  AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+  AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+
   no_glib=""
   no_glib=""
-  if test "$GLIB_CONFIG" = "no" ; then
-    no_glib=yes
+
+  if test x$PKG_CONFIG != xno ; then
+    if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
+      :
+    else
+      echo *** pkg-config too old; version 0.7 or better required.
+      no_glib=yes
+      PKG_CONFIG=no
+    fi
+  fi
+
+  ## don't try to run the test against uninstalled libtool libs
+  if $PKG_CONFIG --uninstalled $pkg_config_args; then
+        echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH"
+        enable_glibtest=no
+  fi
+
+  min_glib_version=ifelse([$1], ,1.3.3,$1)
+  AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+
+  if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then
+        :
   else
   else
-    GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags`
-    GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs`
-    glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \
+        no_glib = yes
+  fi
+
+  if test x"$no_glib" = x ; then
+    GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
+    GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0`
+    GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+
+    GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args`
+    GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args`
+    glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \
            sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
            sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
-    glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \
+    glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \
            sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
            sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
-    glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \
+    glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \
            sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
     if test "x$enable_glibtest" = "xyes" ; then
       ac_save_CFLAGS="$CFLAGS"
            sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
     if test "x$enable_glibtest" = "xyes" ; then
       ac_save_CFLAGS="$CFLAGS"
@@ -199,7 +213,7 @@ AC_ARG_ENABLE(glibtest, [  --disable-glibtest       Do not try to compile and ru
       LIBS="$GLIB_LIBS $LIBS"
 dnl
 dnl Now check if the installed GLIB is sufficiently new. (Also sanity
       LIBS="$GLIB_LIBS $LIBS"
 dnl
 dnl Now check if the installed GLIB is sufficiently new. (Also sanity
-dnl checks the results of glib-config to some extent
+dnl checks the results of pkg-config to some extent)
 dnl
       rm -f conf.glibtest
       AC_TRY_RUN([
 dnl
       rm -f conf.glibtest
       AC_TRY_RUN([
@@ -226,17 +240,16 @@ main ()
       (glib_minor_version != $glib_config_minor_version) ||
       (glib_micro_version != $glib_config_micro_version))
     {
       (glib_minor_version != $glib_config_minor_version) ||
       (glib_micro_version != $glib_config_micro_version))
     {
-      printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", 
+      printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", 
              $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
              glib_major_version, glib_minor_version, glib_micro_version);
              $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
              glib_major_version, glib_minor_version, glib_micro_version);
-      printf ("*** was found! If glib-config was correct, then it is best\n");
-      printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n");
+      printf ("*** was found! If pkg-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
       printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
       printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
       printf("*** required on your system.\n");
       printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
       printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
       printf("*** required on your system.\n");
-      printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n");
-      printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n");
-      printf("*** before re-running configure\n");
+      printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+      printf("*** to point to the correct configuration files\n");
     } 
   else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
           (glib_minor_version != GLIB_MINOR_VERSION) ||
     } 
   else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
           (glib_minor_version != GLIB_MINOR_VERSION) ||
@@ -264,10 +277,10 @@ main ()
         printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
         printf("***\n");
         printf("*** If you have already installed a sufficiently new version, this error\n");
         printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
         printf("***\n");
         printf("*** If you have already installed a sufficiently new version, this error\n");
-        printf("*** probably means that the wrong copy of the glib-config shell script is\n");
+        printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
         printf("*** being found. The easiest way to fix this is to remove the old version\n");
         printf("*** being found. The easiest way to fix this is to remove the old version\n");
-        printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n");
-        printf("*** correct copy of glib-config. (In this case, you will have to\n");
+        printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
+        printf("*** correct copy of pkg-config. (In this case, you will have to\n");
         printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
         printf("*** so that the correct libraries are found at run-time))\n");
       }
         printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
         printf("*** so that the correct libraries are found at run-time))\n");
       }
@@ -280,15 +293,13 @@ main ()
      fi
   fi
   if test "x$no_glib" = x ; then
      fi
   fi
   if test "x$no_glib" = x ; then
-     AC_MSG_RESULT(yes)
+     AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version))
      ifelse([$2], , :, [$2])     
   else
      AC_MSG_RESULT(no)
      ifelse([$2], , :, [$2])     
   else
      AC_MSG_RESULT(no)
-     if test "$GLIB_CONFIG" = "no" ; then
-       echo "*** The glib-config script installed by GLIB could not be found"
-       echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in"
-       echo "*** your path, or set the GLIB_CONFIG environment variable to the"
-       echo "*** full path to glib-config."
+     if test "$PKG_CONFIG" = "no" ; then
+       echo "*** A new enough version of pkg-config was not found."
+       echo "*** See http://www.freedesktop.org/software/pkgconfig/"
      else
        if test -f conf.glibtest ; then
         :
      else
        if test -f conf.glibtest ; then
         :
@@ -308,26 +319,27 @@ main ()
           echo "*** is required on your system"
          echo "***"
           echo "*** If you have an old version installed, it is best to remove it, although"
           echo "*** is required on your system"
          echo "***"
           echo "*** If you have an old version installed, it is best to remove it, although"
-          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
-          echo "***"
-          echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
-          echo "*** came with the system with the command"
-          echo "***"
-          echo "***    rpm --erase --nodeps gtk gtk-devel" ],
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
         [ echo "*** The test program failed to compile or link. See the file config.log for the"
           echo "*** exact error that occured. This usually means GLIB was incorrectly installed"
           echo "*** or that you have moved GLIB since it was installed. In the latter case, you"
         [ echo "*** The test program failed to compile or link. See the file config.log for the"
           echo "*** exact error that occured. This usually means GLIB was incorrectly installed"
           echo "*** or that you have moved GLIB since it was installed. In the latter case, you"
-          echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ])
+          echo "*** may want to edit the pkg-config script: $PKG_CONFIG" ])
           CFLAGS="$ac_save_CFLAGS"
           LIBS="$ac_save_LIBS"
        fi
      fi
      GLIB_CFLAGS=""
      GLIB_LIBS=""
           CFLAGS="$ac_save_CFLAGS"
           LIBS="$ac_save_LIBS"
        fi
      fi
      GLIB_CFLAGS=""
      GLIB_LIBS=""
+     GLIB_GENMARSHAL=""
+     GOBJECT_QUERY=""
+     GLIB_MKENUMS=""
      ifelse([$3], , :, [$3])
   fi
   AC_SUBST(GLIB_CFLAGS)
   AC_SUBST(GLIB_LIBS)
      ifelse([$3], , :, [$3])
   fi
   AC_SUBST(GLIB_CFLAGS)
   AC_SUBST(GLIB_LIBS)
+  AC_SUBST(GLIB_GENMARSHAL)
+  AC_SUBST(GOBJECT_QUERY)
+  AC_SUBST(GLIB_MKENUMS)
   rm -f conf.glibtest
 ])
 
   rm -f conf.glibtest
 ])
 
index d97a883617afea252e11495bd75607a5351ca9f2..7c600b96d24df540801ae52c03e203a58ec9ac2c 100644 (file)
@@ -1,14 +1,14 @@
 /* config.h.in.  Generated automatically from configure.in by autoheader.  */
 
 /* config.h.in.  Generated automatically from configure.in by autoheader.  */
 
-/* Define if you have the ANSI C header files.  */
-#undef STDC_HEADERS
-
-/* Define if lex declares yytext as a char * by default, not a char[].  */
-#undef YYTEXT_POINTER
-
 /* Name of package */
 #undef PACKAGE
 
 /* Name of package */
 #undef PACKAGE
 
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
 /* Version number of package */
 #undef VERSION
 
 /* Version number of package */
 #undef VERSION
 
+/* Define if `lex' declares `yytext' as a `char *' by default, not a `char[]'.
+   */
+#undef YYTEXT_POINTER
index d013f62f6286b27259f6b58ebd9b599d7a8ed6d7..59e47ec0828bd9a158c846ce53b9fd502555ea4b 100755 (executable)
--- a/configure
+++ b/configure
 #! /bin/sh
 #! /bin/sh
-
 # Guess values for system-dependent variables and create Makefiles.
 # Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13 
-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+# Generated by Autoconf 2.52.
 #
 #
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 
-# Defaults:
-ac_help=
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
 ac_default_prefix=/usr/local
 ac_default_prefix=/usr/local
-# Any additions from configure.in:
-ac_help="$ac_help
-  --with-glib-prefix=PFX   Prefix where GLIB is installed (optional)"
-ac_help="$ac_help
-  --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)"
-ac_help="$ac_help
-  --disable-glibtest       Do not try to compile and run a test GLIB program"
-ac_help="$ac_help
-  --enable-maintainer-mode enable make rules and dependencies not useful
-                          (and sometimes confusing) to the casual installer"
+cross_compiling=no
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+ac_unique_file="src/treefuncs.h"
 
 # Initialize some variables set by options.
 
 # Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
 # The variables have the same names as the options, with
 # dashes changed to underlines.
 # The variables have the same names as the options, with
 # dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
+cache_file=/dev/null
 exec_prefix=NONE
 exec_prefix=NONE
-host=NONE
 no_create=
 no_create=
-nonopt=NONE
 no_recursion=
 prefix=NONE
 program_prefix=NONE
 no_recursion=
 prefix=NONE
 program_prefix=NONE
@@ -38,10 +122,15 @@ program_transform_name=s,x,x,
 silent=
 site=
 srcdir=
 silent=
 site=
 srcdir=
-target=NONE
 verbose=
 x_includes=NONE
 x_libraries=NONE
 verbose=
 x_includes=NONE
 x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
 bindir='${exec_prefix}/bin'
 sbindir='${exec_prefix}/sbin'
 libexecdir='${exec_prefix}/libexec'
 bindir='${exec_prefix}/bin'
 sbindir='${exec_prefix}/sbin'
 libexecdir='${exec_prefix}/libexec'
@@ -55,17 +144,16 @@ oldincludedir='/usr/include'
 infodir='${prefix}/info'
 mandir='${prefix}/man'
 
 infodir='${prefix}/info'
 mandir='${prefix}/man'
 
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
 
 ac_prev=
 for ac_option
 do
 
 ac_prev=
 for ac_option
 do
-
   # If the previous option needs an argument, assign it.
   if test -n "$ac_prev"; then
     eval "$ac_prev=\$ac_option"
   # If the previous option needs an argument, assign it.
   if test -n "$ac_prev"; then
     eval "$ac_prev=\$ac_option"
@@ -73,59 +161,59 @@ do
     continue
   fi
 
     continue
   fi
 
-  case "$ac_option" in
-  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) ac_optarg= ;;
-  esac
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
 
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
 
-  case "$ac_option" in
+  case $ac_option in
 
   -bindir | --bindir | --bindi | --bind | --bin | --bi)
     ac_prev=bindir ;;
   -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
 
   -bindir | --bindir | --bindi | --bind | --bin | --bi)
     ac_prev=bindir ;;
   -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir="$ac_optarg" ;;
+    bindir=$ac_optarg ;;
 
   -build | --build | --buil | --bui | --bu)
 
   -build | --build | --buil | --bui | --bu)
-    ac_prev=build ;;
+    ac_prev=build_alias ;;
   -build=* | --build=* | --buil=* | --bui=* | --bu=*)
   -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build="$ac_optarg" ;;
+    build_alias=$ac_optarg ;;
 
   -cache-file | --cache-file | --cache-fil | --cache-fi \
   | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
     ac_prev=cache_file ;;
   -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
   | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
 
   -cache-file | --cache-file | --cache-fil | --cache-fi \
   | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
     ac_prev=cache_file ;;
   -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
   | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file="$ac_optarg" ;;
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
 
   -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
     ac_prev=datadir ;;
   -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
   | --da=*)
 
   -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
     ac_prev=datadir ;;
   -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
   | --da=*)
-    datadir="$ac_optarg" ;;
+    datadir=$ac_optarg ;;
 
   -disable-* | --disable-*)
 
   -disable-* | --disable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
     # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    eval "enable_${ac_feature}=no" ;;
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
 
   -enable-* | --enable-*)
 
   -enable-* | --enable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
     # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
       *) ac_optarg=yes ;;
     esac
       *) ac_optarg=yes ;;
     esac
-    eval "enable_${ac_feature}='$ac_optarg'" ;;
+    eval "enable_$ac_feature='$ac_optarg'" ;;
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -134,95 +222,47 @@ do
   -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
   | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
   | --exec=* | --exe=* | --ex=*)
   -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
   | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
   | --exec=* | --exe=* | --ex=*)
-    exec_prefix="$ac_optarg" ;;
+    exec_prefix=$ac_optarg ;;
 
   -gas | --gas | --ga | --g)
     # Obsolete; use --with-gas.
     with_gas=yes ;;
 
 
   -gas | --gas | --ga | --g)
     # Obsolete; use --with-gas.
     with_gas=yes ;;
 
-  -help | --help | --hel | --he)
-    # Omit some internal or obsolete options to make the list less imposing.
-    # This message is too long to be a string in the A/UX 3.1 sh.
-    cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
-  --cache-file=FILE       cache test results in FILE
-  --help                  print this message
-  --no-create             do not create output files
-  --quiet, --silent       do not print \`checking...' messages
-  --version               print the version of autoconf that created configure
-Directory and file names:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [same as prefix]
-  --bindir=DIR            user executables in DIR [EPREFIX/bin]
-  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
-  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
-  --datadir=DIR           read-only architecture-independent data in DIR
-                          [PREFIX/share]
-  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
-                          [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
-  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
-  --includedir=DIR        C header files in DIR [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
-  --infodir=DIR           info documentation in DIR [PREFIX/info]
-  --mandir=DIR            man documentation in DIR [PREFIX/man]
-  --srcdir=DIR            find the sources in DIR [configure dir or ..]
-  --program-prefix=PREFIX prepend PREFIX to installed program names
-  --program-suffix=SUFFIX append SUFFIX to installed program names
-  --program-transform-name=PROGRAM
-                          run sed PROGRAM on installed program names
-EOF
-    cat << EOF
-Host type:
-  --build=BUILD           configure for building on BUILD [BUILD=HOST]
-  --host=HOST             configure for HOST [guessed]
-  --target=TARGET         configure for TARGET [TARGET=HOST]
-Features and packages:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --x-includes=DIR        X include files are in DIR
-  --x-libraries=DIR       X library files are in DIR
-EOF
-    if test -n "$ac_help"; then
-      echo "--enable and --with options recognized:$ac_help"
-    fi
-    exit 0 ;;
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
 
   -host | --host | --hos | --ho)
 
   -host | --host | --hos | --ho)
-    ac_prev=host ;;
+    ac_prev=host_alias ;;
   -host=* | --host=* | --hos=* | --ho=*)
   -host=* | --host=* | --hos=* | --ho=*)
-    host="$ac_optarg" ;;
+    host_alias=$ac_optarg ;;
 
   -includedir | --includedir | --includedi | --included | --include \
   | --includ | --inclu | --incl | --inc)
     ac_prev=includedir ;;
   -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
   | --includ=* | --inclu=* | --incl=* | --inc=*)
 
   -includedir | --includedir | --includedi | --included | --include \
   | --includ | --inclu | --incl | --inc)
     ac_prev=includedir ;;
   -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
   | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir="$ac_optarg" ;;
+    includedir=$ac_optarg ;;
 
   -infodir | --infodir | --infodi | --infod | --info | --inf)
     ac_prev=infodir ;;
   -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
 
   -infodir | --infodir | --infodi | --infod | --info | --inf)
     ac_prev=infodir ;;
   -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir="$ac_optarg" ;;
+    infodir=$ac_optarg ;;
 
   -libdir | --libdir | --libdi | --libd)
     ac_prev=libdir ;;
   -libdir=* | --libdir=* | --libdi=* | --libd=*)
 
   -libdir | --libdir | --libdi | --libd)
     ac_prev=libdir ;;
   -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir="$ac_optarg" ;;
+    libdir=$ac_optarg ;;
 
   -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
   | --libexe | --libex | --libe)
     ac_prev=libexecdir ;;
   -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
   | --libexe=* | --libex=* | --libe=*)
 
   -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
   | --libexe | --libex | --libe)
     ac_prev=libexecdir ;;
   -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
   | --libexe=* | --libex=* | --libe=*)
-    libexecdir="$ac_optarg" ;;
+    libexecdir=$ac_optarg ;;
 
   -localstatedir | --localstatedir | --localstatedi | --localstated \
   | --localstate | --localstat | --localsta | --localst \
 
   -localstatedir | --localstatedir | --localstatedi | --localstated \
   | --localstate | --localstat | --localsta | --localst \
@@ -231,12 +271,12 @@ EOF
   -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
   | --localstate=* | --localstat=* | --localsta=* | --localst=* \
   | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
   -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
   | --localstate=* | --localstat=* | --localsta=* | --localst=* \
   | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
-    localstatedir="$ac_optarg" ;;
+    localstatedir=$ac_optarg ;;
 
   -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
     ac_prev=mandir ;;
   -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
 
   -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
     ac_prev=mandir ;;
   -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir="$ac_optarg" ;;
+    mandir=$ac_optarg ;;
 
   -nfp | --nfp | --nf)
     # Obsolete; use --without-fp.
 
   -nfp | --nfp | --nf)
     # Obsolete; use --without-fp.
@@ -257,26 +297,26 @@ EOF
   -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
   | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
   | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
   -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
   | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
   | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir="$ac_optarg" ;;
+    oldincludedir=$ac_optarg ;;
 
   -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
     ac_prev=prefix ;;
   -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
 
   -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
     ac_prev=prefix ;;
   -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix="$ac_optarg" ;;
+    prefix=$ac_optarg ;;
 
   -program-prefix | --program-prefix | --program-prefi | --program-pref \
   | --program-pre | --program-pr | --program-p)
     ac_prev=program_prefix ;;
   -program-prefix=* | --program-prefix=* | --program-prefi=* \
   | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
 
   -program-prefix | --program-prefix | --program-prefi | --program-pref \
   | --program-pre | --program-pr | --program-p)
     ac_prev=program_prefix ;;
   -program-prefix=* | --program-prefix=* | --program-prefi=* \
   | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix="$ac_optarg" ;;
+    program_prefix=$ac_optarg ;;
 
   -program-suffix | --program-suffix | --program-suffi | --program-suff \
   | --program-suf | --program-su | --program-s)
     ac_prev=program_suffix ;;
   -program-suffix=* | --program-suffix=* | --program-suffi=* \
   | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
 
   -program-suffix | --program-suffix | --program-suffi | --program-suff \
   | --program-suf | --program-su | --program-s)
     ac_prev=program_suffix ;;
   -program-suffix=* | --program-suffix=* | --program-suffi=* \
   | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix="$ac_optarg" ;;
+    program_suffix=$ac_optarg ;;
 
   -program-transform-name | --program-transform-name \
   | --program-transform-nam | --program-transform-na \
 
   -program-transform-name | --program-transform-name \
   | --program-transform-nam | --program-transform-na \
@@ -293,7 +333,7 @@ EOF
   | --program-transfo=* | --program-transf=* \
   | --program-trans=* | --program-tran=* \
   | --progr-tra=* | --program-tr=* | --program-t=*)
   | --program-transfo=* | --program-transf=* \
   | --program-trans=* | --program-tran=* \
   | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name="$ac_optarg" ;;
+    program_transform_name=$ac_optarg ;;
 
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil)
 
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil)
@@ -303,7 +343,7 @@ EOF
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
   | --sbi=* | --sb=*)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
   | --sbi=* | --sb=*)
-    sbindir="$ac_optarg" ;;
+    sbindir=$ac_optarg ;;
 
   -sharedstatedir | --sharedstatedir | --sharedstatedi \
   | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
 
   -sharedstatedir | --sharedstatedir | --sharedstatedi \
   | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
@@ -314,58 +354,57 @@ EOF
   | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
   | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
   | --sha=* | --sh=*)
   | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
   | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
   | --sha=* | --sh=*)
-    sharedstatedir="$ac_optarg" ;;
+    sharedstatedir=$ac_optarg ;;
 
   -site | --site | --sit)
     ac_prev=site ;;
   -site=* | --site=* | --sit=*)
 
   -site | --site | --sit)
     ac_prev=site ;;
   -site=* | --site=* | --sit=*)
-    site="$ac_optarg" ;;
+    site=$ac_optarg ;;
 
   -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
     ac_prev=srcdir ;;
   -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
 
   -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
     ac_prev=srcdir ;;
   -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir="$ac_optarg" ;;
+    srcdir=$ac_optarg ;;
 
   -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
   | --syscon | --sysco | --sysc | --sys | --sy)
     ac_prev=sysconfdir ;;
   -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
   | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
 
   -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
   | --syscon | --sysco | --sysc | --sys | --sy)
     ac_prev=sysconfdir ;;
   -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
   | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir="$ac_optarg" ;;
+    sysconfdir=$ac_optarg ;;
 
   -target | --target | --targe | --targ | --tar | --ta | --t)
 
   -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target ;;
+    ac_prev=target_alias ;;
   -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
   -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target="$ac_optarg" ;;
+    target_alias=$ac_optarg ;;
 
   -v | -verbose | --verbose | --verbos | --verbo | --verb)
     verbose=yes ;;
 
 
   -v | -verbose | --verbose | --verbos | --verbo | --verb)
     verbose=yes ;;
 
-  -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.13"
-    exit 0 ;;
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
 
   -with-* | --with-*)
 
   -with-* | --with-*)
-    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
     # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
     ac_package=`echo $ac_package| sed 's/-/_/g'`
     ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
       *) ac_optarg=yes ;;
     esac
       *) ac_optarg=yes ;;
     esac
-    eval "with_${ac_package}='$ac_optarg'" ;;
+    eval "with_$ac_package='$ac_optarg'" ;;
 
   -without-* | --without-*)
 
   -without-* | --without-*)
-    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
     # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    eval "with_${ac_package}=no" ;;
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
 
   --x)
     # Obsolete; use --with-x.
 
   --x)
     # Obsolete; use --with-x.
@@ -376,98 +415,98 @@ EOF
     ac_prev=x_includes ;;
   -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
   | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
     ac_prev=x_includes ;;
   -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
   | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes="$ac_optarg" ;;
+    x_includes=$ac_optarg ;;
 
   -x-libraries | --x-libraries | --x-librarie | --x-librari \
   | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
     ac_prev=x_libraries ;;
   -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
   | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
 
   -x-libraries | --x-libraries | --x-librarie | --x-librari \
   | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
     ac_prev=x_libraries ;;
   -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
   | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries="$ac_optarg" ;;
+    x_libraries=$ac_optarg ;;
 
 
-  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
     ;;
 
     ;;
 
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
   *)
   *)
-    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
-      echo "configure: warning: $ac_option: invalid host type" 1>&2
-    fi
-    if test "x$nonopt" != xNONE; then
-      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
-    fi
-    nonopt="$ac_option"
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
     ;;
 
   esac
 done
 
 if test -n "$ac_prev"; then
     ;;
 
   esac
 done
 
 if test -n "$ac_prev"; then
-  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
-fi
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
-  exec 6>/dev/null
-else
-  exec 6>&1
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
 fi
 fi
-exec 5>./config.log
 
 
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
 
 
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+              localstatedir libdir includedir oldincludedir infodir mandir
 do
 do
-  case "$ac_arg" in
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c) ;;
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
-  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
-  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
   esac
 done
 
   esac
 done
 
-# NLS nuisances.
-# Only set these to C if already set.  These must not be set unconditionally
-# because not all systems understand e.g. LANG=C (notably SCO).
-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
-# Non-C LC_CTYPE values break the ctype check.
-if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
-if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: should be removed in autoconf 3.0.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
 
 
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
 
 
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=src/treefuncs.h
+test "$silent" = yes && exec 6>/dev/null
 
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
   # Try the directory containing this script, then its parent.
   ac_prog=$0
 
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
   # Try the directory containing this script, then its parent.
   ac_prog=$0
-  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'`
   test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
   srcdir=$ac_confdir
   if test ! -r $srcdir/$ac_unique_file; then
   test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
   srcdir=$ac_confdir
   if test ! -r $srcdir/$ac_unique_file; then
@@ -478,13 +517,307 @@ else
 fi
 if test ! -r $srcdir/$ac_unique_file; then
   if test "$ac_srcdir_defaulted" = yes; then
 fi
 if test ! -r $srcdir/$ac_unique_file; then
   if test "$ac_srcdir_defaulted" = yes; then
-    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+    { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
   else
   else
-    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+    { echo "$as_me: error: cannot find sources in $srcdir" >&2
+   { (exit 1); exit 1; }; }
   fi
 fi
   fi
 fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<EOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+EOF
+
+  cat <<EOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+EOF
+
+  cat <<\EOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+EOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\EOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-glibtest       Do not try to compile and run a test GLIB program
+  --enable-maintainer-mode enable make rules and dependencies not useful
+                          (and sometimes confusing) to the casual installer
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+EOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue
+    cd $ac_subdir
+    # A "../" for each directory in /$ac_subdir.
+    ac_dots=`echo $ac_subdir |
+             sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'`
+
+    case $srcdir in
+    .) # No --srcdir option.  We are building in place.
+      ac_sub_srcdir=$srcdir ;;
+    [\\/]* | ?:[\\/]* ) # Absolute path.
+      ac_sub_srcdir=$srcdir/$ac_subdir ;;
+    *) # Relative path.
+      ac_sub_srcdir=$ac_dots$srcdir/$ac_subdir ;;
+    esac
+
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_sub_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_sub_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_sub_srcdir/configure; then
+      echo
+      $SHELL $ac_sub_srcdir/configure  --help=recursive
+    elif test -f $ac_sub_srcdir/configure.ac ||
+           test -f $ac_sub_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\EOF
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+EOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<EOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.52.  Invocation command line was
+
+  $ $0 $@
+
+EOF
+{
+cat <<_ASUNAME
+## ---------- ##
+## Platform.  ##
+## ---------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+PATH = $PATH
+
+_ASUNAME
+} >&5
+
+cat >&5 <<EOF
+## ------------ ##
+## Core tests.  ##
+## ------------ ##
+
+EOF
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+  case $ac_arg in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"`
+    ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+    ac_sep=" " ;;
+  *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg"
+     ac_sep=" " ;;
+  esac
+  # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  echo >&5
+  echo "## ----------------- ##" >&5
+  echo "## Cache variables.  ##" >&5
+  echo "## ----------------- ##" >&5
+  echo >&5
+  # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} >&5
+  sed "/^$/d" confdefs.h >conftest.log
+  if test -s conftest.log; then
+    echo >&5
+    echo "## ------------ ##" >&5
+    echo "## confdefs.h.  ##" >&5
+    echo "## ------------ ##" >&5
+    echo >&5
+    cat conftest.log >&5
+  fi
+  (echo; echo) >&5
+  test "$ac_signal" != 0 &&
+    echo "$as_me: caught signal $ac_signal" >&5
+  echo "$as_me: exit $exit_status" >&5
+  rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
 
 
+# Let the site file select an alternate cache file if it wants to.
 # Prefer explicitly selected file to automatically selected ones.
 if test -z "$CONFIG_SITE"; then
   if test "x$prefix" != xNONE; then
 # Prefer explicitly selected file to automatically selected ones.
 if test -z "$CONFIG_SITE"; then
   if test "x$prefix" != xNONE; then
@@ -495,43 +828,111 @@ if test -z "$CONFIG_SITE"; then
 fi
 for ac_site_file in $CONFIG_SITE; do
   if test -r "$ac_site_file"; then
 fi
 for ac_site_file in $CONFIG_SITE; do
   if test -r "$ac_site_file"; then
-    echo "loading site script $ac_site_file"
+    { echo "$as_me:831: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    cat "$ac_site_file" >&5
     . "$ac_site_file"
   fi
 done
 
 if test -r "$cache_file"; then
     . "$ac_site_file"
   fi
 done
 
 if test -r "$cache_file"; then
-  echo "loading cache $cache_file"
-  . $cache_file
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:842: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
 else
 else
-  echo "creating cache $cache_file"
-  > $cache_file
+  { echo "$as_me:850: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:866: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:870: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+        { echo "$as_me:876: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+        { echo "$as_me:878:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+        { echo "$as_me:880:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+        ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.  It doesn't matter if
+  # we pass some twice (in addition to the command line arguments).
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"   "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"`
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val"
+       ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:899: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:901: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
 fi
 
 ac_ext=c
 fi
 
 ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
 ac_cpp='$CPP $CPPFLAGS'
 ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-ac_exeext=
-ac_objext=o
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
-  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
-  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
-    ac_n= ac_c='
-' ac_t='       '
-  else
-    ac_n=-n ac_c= ac_t=
-  fi
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)      ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+echo "#! $SHELL" >conftest.sh
+echo  "exit 0"   >>conftest.sh
+chmod +x conftest.sh
+if { (echo "$as_me:921: PATH=\".;.\"; conftest.sh") >&5
+  (PATH=".;."; conftest.sh) 2>&5
+  ac_status=$?
+  echo "$as_me:924: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  ac_path_separator=';'
 else
 else
-  ac_n= ac_c='\c' ac_t=
+  ac_path_separator=:
 fi
 fi
+PATH_SEPARATOR="$ac_path_separator"
+rm -f conftest.sh
 
 
+ac_config_headers="$ac_config_headers config.h"
 
 
-
-
+ac_config_commands="$ac_config_commands default-1"
 
 ac_aux_dir=
 for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
 
 ac_aux_dir=
 for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
@@ -543,14 +944,20 @@ for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install.sh -c"
     break
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install.sh -c"
     break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
   fi
 done
 if test -z "$ac_aux_dir"; then
   fi
 done
 if test -z "$ac_aux_dir"; then
-  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+  { { echo "$as_me:954: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
 fi
 fi
-ac_config_guess=$ac_aux_dir/config.guess
-ac_config_sub=$ac_aux_dir/config.sub
-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -559,31 +966,39 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
 # SunOS /usr/etc/install
 # IRIX /sbin/install
 # AIX /bin/install
 # SunOS /usr/etc/install
 # IRIX /sbin/install
 # AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
 # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
 # AFS /usr/afsws/bin/install, which mishandles nonexistent args
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
 # AFS /usr/afsws/bin/install, which mishandles nonexistent args
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:568: checking for a BSD compatible install" >&5
+echo "$as_me:974: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
 if test -z "$INSTALL"; then
 if test -z "$INSTALL"; then
-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+    ac_save_IFS=$IFS; IFS=$ac_path_separator
   for ac_dir in $PATH; do
   for ac_dir in $PATH; do
+    IFS=$ac_save_IFS
     # Account for people who put trailing slashes in PATH elements.
     # Account for people who put trailing slashes in PATH elements.
-    case "$ac_dir/" in
-    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    case $ac_dir/ in
+    / | ./ | .// | /cC/* \
+    | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \
+    | /usr/ucb/* ) ;;
     *)
       # OSF1 and SCO ODT 3.0 have their own names for install.
       # Don't use installbsd from OSF since it installs stuff as root
       # by default.
       for ac_prog in ginstall scoinst install; do
     *)
       # OSF1 and SCO ODT 3.0 have their own names for install.
       # Don't use installbsd from OSF since it installs stuff as root
       # by default.
       for ac_prog in ginstall scoinst install; do
-        if test -f $ac_dir/$ac_prog; then
+        if $as_executable_p "$ac_dir/$ac_prog"; then
          if test $ac_prog = install &&
          if test $ac_prog = install &&
-            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+            grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
            :
            # AIX install.  It has an incompatible calling convention.
            :
+         elif test $ac_prog = install &&
+           grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
          else
            ac_cv_path_install="$ac_dir/$ac_prog -c"
            break 2
          else
            ac_cv_path_install="$ac_dir/$ac_prog -c"
            break 2
@@ -593,31 +1008,31 @@ else
       ;;
     esac
   done
       ;;
     esac
   done
-  IFS="$ac_save_IFS"
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
-    INSTALL="$ac_cv_path_install"
+    INSTALL=$ac_cv_path_install
   else
     # As a last resort, use the slow shell script.  We don't cache a
     # path for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
     # removed, or if the path is relative.
   else
     # As a last resort, use the slow shell script.  We don't cache a
     # path for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
     # removed, or if the path is relative.
-    INSTALL="$ac_install_sh"
+    INSTALL=$ac_install_sh
   fi
 fi
   fi
 fi
-echo "$ac_t""$INSTALL" 1>&6
+echo "$as_me:1023: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
 test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
 
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
 test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
 
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
-echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:621: checking whether build environment is sane" >&5
+echo "$as_me:1034: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
 # Just in case
 sleep 1
 echo timestamp > conftestfile
 # Just in case
 sleep 1
 echo timestamp > conftestfile
@@ -639,8 +1054,11 @@ if (
       # if, for instance, CONFIG_SHELL is bash and it inherits a
       # broken ls alias from the environment.  This has actually
       # happened.  Such a system could not be considered "sane".
       # if, for instance, CONFIG_SHELL is bash and it inherits a
       # broken ls alias from the environment.  This has actually
       # happened.  Such a system could not be considered "sane".
-      { echo "configure: error: ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" 1>&2; exit 1; }
+      { { echo "$as_me:1057: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
    fi
 
    test "$2" = conftestfile
    fi
 
    test "$2" = conftestfile
@@ -649,366 +1067,737 @@ then
    # Ok.
    :
 else
    # Ok.
    :
 else
-   { echo "configure: error: newly created file is older than distributed files!
-Check your system clock" 1>&2; exit 1; }
+   { { echo "$as_me:1070: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
 fi
 rm -f conftest*
 fi
 rm -f conftest*
-echo "$ac_t""yes" 1>&6
-if test "$program_transform_name" = s,x,x,; then
-  program_transform_name=
-else
-  # Double any \ or $.  echo might interpret backslashes.
-  cat <<\EOF_SED > conftestsed
-s,\\,\\\\,g; s,\$,$$,g
-EOF_SED
-  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
-  rm -f conftestsed
-fi
+echo "$as_me:1077: result: yes" >&5
+echo "${ECHO_T}yes" >&6
 test "$program_prefix" != NONE &&
 test "$program_prefix" != NONE &&
-  program_transform_name="s,^,${program_prefix},; $program_transform_name"
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
 # Use a double $ so make ignores it.
 test "$program_suffix" != NONE &&
 # Use a double $ so make ignores it.
 test "$program_suffix" != NONE &&
-  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
-
-# sed with no file args requires a program.
-test "$program_transform_name" = "" && program_transform_name="s,x,x,"
-
-echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:678: checking whether ${MAKE-make} sets \${MAKE}" >&5
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+echo "$as_me:1092: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-  cat > conftestmake <<\EOF
+  cat >conftest.make <<\EOF
 all:
        @echo 'ac_maketemp="${MAKE}"'
 EOF
 # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
 all:
        @echo 'ac_maketemp="${MAKE}"'
 EOF
 # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
 if test -n "$ac_maketemp"; then
   eval ac_cv_prog_make_${ac_make}_set=yes
 else
   eval ac_cv_prog_make_${ac_make}_set=no
 fi
 if test -n "$ac_maketemp"; then
   eval ac_cv_prog_make_${ac_make}_set=yes
 else
   eval ac_cv_prog_make_${ac_make}_set=no
 fi
-rm -f conftestmake
+rm -f conftest.make
 fi
 if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
 fi
 if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
+  echo "$as_me:1112: result: yes" >&5
+echo "${ECHO_T}yes" >&6
   SET_MAKE=
 else
   SET_MAKE=
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me:1116: result: no" >&5
+echo "${ECHO_T}no" >&6
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
+PACKAGE=gob2
 
 
-PACKAGE=gob
-
-VERSION=1.0.7
+VERSION=1.99.1
 
 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
 
 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
-  { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+  { { echo "$as_me:1126: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
 fi
 fi
-cat >> confdefs.h <<EOF
+
+cat >>confdefs.h <<EOF
 #define PACKAGE "$PACKAGE"
 EOF
 
 #define PACKAGE "$PACKAGE"
 EOF
 
-cat >> confdefs.h <<EOF
+cat >>confdefs.h <<EOF
 #define VERSION "$VERSION"
 EOF
 
 #define VERSION "$VERSION"
 EOF
 
-
-
 missing_dir=`cd $ac_aux_dir && pwd`
 missing_dir=`cd $ac_aux_dir && pwd`
-echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:724: checking for working aclocal" >&5
+echo "$as_me:1140: checking for working aclocal" >&5
+echo $ECHO_N "checking for working aclocal... $ECHO_C" >&6
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (aclocal --version) < /dev/null > /dev/null 2>&1; then
    ACLOCAL=aclocal
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (aclocal --version) < /dev/null > /dev/null 2>&1; then
    ACLOCAL=aclocal
-   echo "$ac_t""found" 1>&6
+   echo "$as_me:1147: result: found" >&5
+echo "${ECHO_T}found" >&6
 else
    ACLOCAL="$missing_dir/missing aclocal"
 else
    ACLOCAL="$missing_dir/missing aclocal"
-   echo "$ac_t""missing" 1>&6
+   echo "$as_me:1151: result: missing" >&5
+echo "${ECHO_T}missing" >&6
 fi
 
 fi
 
-echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:737: checking for working autoconf" >&5
+echo "$as_me:1155: checking for working autoconf" >&5
+echo $ECHO_N "checking for working autoconf... $ECHO_C" >&6
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (autoconf --version) < /dev/null > /dev/null 2>&1; then
    AUTOCONF=autoconf
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (autoconf --version) < /dev/null > /dev/null 2>&1; then
    AUTOCONF=autoconf
-   echo "$ac_t""found" 1>&6
+   echo "$as_me:1162: result: found" >&5
+echo "${ECHO_T}found" >&6
 else
    AUTOCONF="$missing_dir/missing autoconf"
 else
    AUTOCONF="$missing_dir/missing autoconf"
-   echo "$ac_t""missing" 1>&6
+   echo "$as_me:1166: result: missing" >&5
+echo "${ECHO_T}missing" >&6
 fi
 
 fi
 
-echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:750: checking for working automake" >&5
+echo "$as_me:1170: checking for working automake" >&5
+echo $ECHO_N "checking for working automake... $ECHO_C" >&6
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (automake --version) < /dev/null > /dev/null 2>&1; then
    AUTOMAKE=automake
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (automake --version) < /dev/null > /dev/null 2>&1; then
    AUTOMAKE=automake
-   echo "$ac_t""found" 1>&6
+   echo "$as_me:1177: result: found" >&5
+echo "${ECHO_T}found" >&6
 else
    AUTOMAKE="$missing_dir/missing automake"
 else
    AUTOMAKE="$missing_dir/missing automake"
-   echo "$ac_t""missing" 1>&6
+   echo "$as_me:1181: result: missing" >&5
+echo "${ECHO_T}missing" >&6
 fi
 
 fi
 
-echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:763: checking for working autoheader" >&5
+echo "$as_me:1185: checking for working autoheader" >&5
+echo $ECHO_N "checking for working autoheader... $ECHO_C" >&6
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (autoheader --version) < /dev/null > /dev/null 2>&1; then
    AUTOHEADER=autoheader
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (autoheader --version) < /dev/null > /dev/null 2>&1; then
    AUTOHEADER=autoheader
-   echo "$ac_t""found" 1>&6
+   echo "$as_me:1192: result: found" >&5
+echo "${ECHO_T}found" >&6
 else
    AUTOHEADER="$missing_dir/missing autoheader"
 else
    AUTOHEADER="$missing_dir/missing autoheader"
-   echo "$ac_t""missing" 1>&6
+   echo "$as_me:1196: result: missing" >&5
+echo "${ECHO_T}missing" >&6
 fi
 
 fi
 
-echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:776: checking for working makeinfo" >&5
+echo "$as_me:1200: checking for working makeinfo" >&5
+echo $ECHO_N "checking for working makeinfo... $ECHO_C" >&6
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
    MAKEINFO=makeinfo
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
 if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
    MAKEINFO=makeinfo
-   echo "$ac_t""found" 1>&6
+   echo "$as_me:1207: result: found" >&5
+echo "${ECHO_T}found" >&6
 else
    MAKEINFO="$missing_dir/missing makeinfo"
 else
    MAKEINFO="$missing_dir/missing makeinfo"
-   echo "$ac_t""missing" 1>&6
+   echo "$as_me:1211: result: missing" >&5
+echo "${ECHO_T}missing" >&6
 fi
 
 fi
 
-
-
 if test -f ../NOINST_GOB ; then
   DOINSTGOB=
 if test -f ../NOINST_GOB ; then
   DOINSTGOB=
-  NOINSTGOB=gob
-  echo "$ac_t""*** NOT Going to install GOB ***" 1>&6
+  NOINSTGOB=gob2
+  echo "$as_me:1218: result: *** NOT Going to install GOB ***" >&5
+echo "${ECHO_T}*** NOT Going to install GOB ***" >&6
   SUBDIRS="src examples"
   SUBDIRS="src examples"
-  
+
 else
 else
-  DOINSTGOB=gob
+  DOINSTGOB=gob2
   NOINSTGOB=
   SUBDIRS="src examples doc"
   NOINSTGOB=
   SUBDIRS="src examples doc"
-  
+
 fi
 
 fi
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:1237: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="${ac_tool_prefix}gcc"
+echo "$as_me:1252: found $ac_dir/$ac_word" >&5
+break
+done
 
 
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:1260: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:1263: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
 
 
-# Extract the first word of "gcc", so it can be a program name with args.
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 set dummy gcc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:808: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:1272: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="gcc"
+echo "$as_me:1287: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:1295: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:1298: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:1311: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_CC="gcc"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="${ac_tool_prefix}cc"
+echo "$as_me:1326: found $ac_dir/$ac_word" >&5
+break
+done
+
 fi
 fi
 fi
 fi
-CC="$ac_cv_prog_CC"
+CC=$ac_cv_prog_CC
 if test -n "$CC"; then
 if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
+  echo "$as_me:1334: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:1337: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:1346: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="cc"
+echo "$as_me:1361: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:1369: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:1372: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
 else
 else
-  echo "$ac_t""no" 1>&6
+  CC="$ac_cv_prog_CC"
 fi
 
 fi
 
+fi
 if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:838: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:1385: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
   ac_prog_rejected=no
   ac_prog_rejected=no
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
-        ac_prog_rejected=yes
-       continue
-      fi
-      ac_cv_prog_CC="cc"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+  ac_prog_rejected=yes
+  continue
+fi
+ac_cv_prog_CC="cc"
+echo "$as_me:1405: found $ac_dir/$ac_word" >&5
+break
+done
+
 if test $ac_prog_rejected = yes; then
   # We found a bogon in the path, so make sure we never use it.
   set dummy $ac_cv_prog_CC
   shift
 if test $ac_prog_rejected = yes; then
   # We found a bogon in the path, so make sure we never use it.
   set dummy $ac_cv_prog_CC
   shift
-  if test $# -gt 0; then
+  if test $# != 0; then
     # We chose a different compiler from the bogus one.
     # However, it has the same basename, so the bogon will be chosen
     # first if we set CC to just the basename; use the full file name.
     shift
     # We chose a different compiler from the bogus one.
     # However, it has the same basename, so the bogon will be chosen
     # first if we set CC to just the basename; use the full file name.
     shift
-    set dummy "$ac_dir/$ac_word" "$@"
+    set dummy "$ac_dir/$ac_word" ${1+"$@"}
     shift
     ac_cv_prog_CC="$@"
   fi
 fi
 fi
 fi
     shift
     ac_cv_prog_CC="$@"
   fi
 fi
 fi
 fi
-CC="$ac_cv_prog_CC"
+CC=$ac_cv_prog_CC
 if test -n "$CC"; then
 if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
+  echo "$as_me:1427: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
 else
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me:1430: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 
 fi
 
-  if test -z "$CC"; then
-    case "`uname -s`" in
-    *win32* | *WIN32*)
-      # Extract the first word of "cl", so it can be a program name with args.
-set dummy cl; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:889: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:1441: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_CC="cl"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+echo "$as_me:1456: found $ac_dir/$ac_word" >&5
+break
+done
+
 fi
 fi
 fi
 fi
-CC="$ac_cv_prog_CC"
+CC=$ac_cv_prog_CC
 if test -n "$CC"; then
 if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
+  echo "$as_me:1464: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
 else
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me:1467: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 fi
- ;;
-    esac
-  fi
-  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1480: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="$ac_prog"
+echo "$as_me:1495: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:1503: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:1506: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 
 fi
 
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:921: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+  test -n "$ac_ct_CC" && break
+done
 
 
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
+  CC=$ac_ct_CC
+fi
 
 
-cat > conftest.$ac_ext << EOF
+fi
 
 
-#line 932 "configure"
+test -z "$CC" && { { echo "$as_me:1518: error: no acceptable cc found in \$PATH" >&5
+echo "$as_me: error: no acceptable cc found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:1523:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:1526: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1529: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:1531: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1534: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:1536: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1539: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+#line 1543 "configure"
 #include "confdefs.h"
 
 #include "confdefs.h"
 
-main(){return(0);}
-EOF
-if { (eval echo configure:937: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  ac_cv_prog_cc_works=yes
-  # If we can't run a trivial program, we are probably using a cross compiler.
-  if (./conftest; exit) 2>/dev/null; then
-    ac_cv_prog_cc_cross=no
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:1559: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:1562: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:1565: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+for ac_file in `ls a.exe conftest.exe 2>/dev/null;
+                ls a.out conftest 2>/dev/null;
+                ls a.* conftest.* 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;;
+    a.out ) # We found the default executable, but exeext='' is most
+            # certainly right.
+            break;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:1588: error: C compiler cannot create executables" >&5
+echo "$as_me: error: C compiler cannot create executables" >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:1594: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1599: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:1605: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1608: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
   else
   else
-    ac_cv_prog_cc_cross=yes
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:1615: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
   fi
   fi
+fi
+echo "$as_me:1623: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1630: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:1632: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:1635: checking for executable suffix" >&5
+echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6
+if { (eval echo "$as_me:1637: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:1640: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
 else
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  ac_cv_prog_cc_works=no
+  { { echo "$as_me:1656: error: cannot compute EXEEXT: cannot compile and link" >&5
+echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;}
+   { (exit 1); exit 1; }; }
 fi
 fi
-rm -fr conftest*
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
-if test $ac_cv_prog_cc_works = no; then
-  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
-fi
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:963: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
-echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:968: checking whether we are using GNU C" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.c <<EOF
-#ifdef __GNUC__
-  yes;
-#endif
-EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:977: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
-  ac_cv_prog_gcc=yes
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:1662: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:1668: checking for object suffix" >&5
+echo $ECHO_N "checking for object suffix... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-  ac_cv_prog_gcc=no
+  cat >conftest.$ac_ext <<_ACEOF
+#line 1674 "configure"
+#include "confdefs.h"
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:1686: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1689: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:1701: error: cannot compute OBJEXT: cannot compile" >&5
+echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;}
+   { (exit 1); exit 1; }; }
 fi
 fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
 fi
+echo "$as_me:1708: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:1712: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 1718 "configure"
+#include "confdefs.h"
 
 
-echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
 
 
-if test $ac_cv_prog_gcc = yes; then
-  GCC=yes
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1733: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1736: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:1739: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1742: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
 else
 else
-  GCC=
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_compiler_gnu=no
 fi
 fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 
-ac_test_CFLAGS="${CFLAGS+set}"
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS=
-echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:996: checking whether ${CC-cc} accepts -g" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+fi
+echo "$as_me:1754: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:1760: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-  echo 'void f(){}' > conftest.c
-if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  cat >conftest.$ac_ext <<_ACEOF
+#line 1766 "configure"
+#include "confdefs.h"
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1778: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1781: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:1784: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1787: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
   ac_cv_prog_cc_g=yes
 else
   ac_cv_prog_cc_g=yes
 else
-  ac_cv_prog_cc_g=no
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_prog_cc_g=no
 fi
 fi
-rm -f conftest*
-
+rm -f conftest.$ac_objext conftest.$ac_ext
 fi
 fi
-
-echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+echo "$as_me:1797: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
 if test "$ac_test_CFLAGS" = set; then
 if test "$ac_test_CFLAGS" = set; then
-  CFLAGS="$ac_save_CFLAGS"
+  CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
   if test "$GCC" = yes; then
     CFLAGS="-g -O2"
 elif test $ac_cv_prog_cc_g = yes; then
   if test "$GCC" = yes; then
     CFLAGS="-g -O2"
@@ -1022,127 +1811,368 @@ else
     CFLAGS=
   fi
 fi
     CFLAGS=
   fi
 fi
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1824: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1827: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:1830: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1833: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+#line 1845 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1858: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1861: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:1864: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1867: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+#line 1877 "configure"
+#include "confdefs.h"
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1889: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1892: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:1895: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1898: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
 
 
-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1028: checking how to run the C preprocessor" >&5
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:1930: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
 fi
 if test -z "$CPP"; then
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
 fi
 if test -z "$CPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-    # This must be in double quotes, not single quotes, because CPP may get
-  # substituted into the Makefile and "${CC-cc}" will confuse make.
-  CPP="${CC-cc} -E"
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp.
-  cat > conftest.$ac_ext <<EOF
-#line 1043 "configure"
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line 1951 "configure"
 #include "confdefs.h"
 #include <assert.h>
 #include "confdefs.h"
 #include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1049: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:1956: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:1962: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
   :
 else
   :
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
+  echo "$as_me: failed program was:" >&5
   cat conftest.$ac_ext >&5
   cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP="${CC-cc} -E -traditional-cpp"
-  cat > conftest.$ac_ext <<EOF
-#line 1060 "configure"
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line 1985 "configure"
 #include "confdefs.h"
 #include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1066: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  :
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:1989: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:1995: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
 else
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
+  echo "$as_me: failed program was:" >&5
   cat conftest.$ac_ext >&5
   cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP="${CC-cc} -nologo -E"
-  cat > conftest.$ac_ext <<EOF
-#line 1077 "configure"
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:2032: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2042 "configure"
 #include "confdefs.h"
 #include <assert.h>
 #include "confdefs.h"
 #include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1083: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:2047: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2053: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
   :
 else
   :
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
+  echo "$as_me: failed program was:" >&5
   cat conftest.$ac_ext >&5
   cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP=/lib/cpp
-fi
-rm -f conftest*
+  # Broken: fails on valid input.
+continue
 fi
 fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2076 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2080: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2086: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
 fi
 fi
-rm -f conftest*
-  ac_cv_prog_CPP="$CPP"
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
 fi
 fi
-  CPP="$ac_cv_prog_CPP"
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
 else
 else
-  ac_cv_prog_CPP="$CPP"
+  { { echo "$as_me:2114: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+   { (exit 1); exit 1; }; }
 fi
 fi
-echo "$ac_t""$CPP" 1>&6
 
 
-echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1108: checking for ANSI C header files" >&5
-if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+echo "$as_me:2125: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-  cat > conftest.$ac_ext <<EOF
-#line 1113 "configure"
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2131 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
 #include <string.h>
 #include <float.h>
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
 #include <string.h>
 #include <float.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1121: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  rm -rf conftest*
+
+_ACEOF
+if { (eval echo "$as_me:2139: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2145: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
   ac_cv_header_stdc=yes
 else
   ac_cv_header_stdc=yes
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
+  echo "$as_me: failed program was:" >&5
   cat conftest.$ac_ext >&5
   cat conftest.$ac_ext >&5
-  rm -rf conftest*
   ac_cv_header_stdc=no
 fi
   ac_cv_header_stdc=no
 fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 1138 "configure"
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2167 "configure"
 #include "confdefs.h"
 #include <string.h>
 #include "confdefs.h"
 #include <string.h>
-EOF
+
+_ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
   egrep "memchr" >/dev/null 2>&1; then
   :
 else
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
   egrep "memchr" >/dev/null 2>&1; then
   :
 else
-  rm -rf conftest*
   ac_cv_header_stdc=no
 fi
 rm -f conftest*
   ac_cv_header_stdc=no
 fi
 rm -f conftest*
@@ -1151,16 +2181,16 @@ fi
 
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 1156 "configure"
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2185 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include "confdefs.h"
 #include <stdlib.h>
-EOF
+
+_ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
   egrep "free" >/dev/null 2>&1; then
   :
 else
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
   egrep "free" >/dev/null 2>&1; then
   :
 else
-  rm -rf conftest*
   ac_cv_header_stdc=no
 fi
 rm -f conftest*
   ac_cv_header_stdc=no
 fi
 rm -f conftest*
@@ -1169,39 +2199,62 @@ fi
 
 if test $ac_cv_header_stdc = yes; then
   # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
 
 if test $ac_cv_header_stdc = yes; then
   # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-if test "$cross_compiling" = yes; then
+  if test "$cross_compiling" = yes; then
   :
 else
   :
 else
-  cat > conftest.$ac_ext <<EOF
-#line 1177 "configure"
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2206 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #include "confdefs.h"
 #include <ctype.h>
-#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int main () { int i; for (i = 0; i < 256; i++)
-if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
-exit (0); }
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+                     || ('j' <= (c) && (c) <= 'r') \
+                     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
 
 
-EOF
-if { (eval echo configure:1188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+        || toupper (i) != TOUPPER (i))
+      exit(2);
+  exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:2232: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:2235: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:2237: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2240: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
   :
 else
   :
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  ac_cv_header_stdc=no
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_header_stdc=no
 fi
 fi
-rm -fr conftest*
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
-
 fi
 fi
 fi
 fi
-
-echo "$ac_t""$ac_cv_header_stdc" 1>&6
+echo "$as_me:2253: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
 if test $ac_cv_header_stdc = yes; then
 if test $ac_cv_header_stdc = yes; then
-  cat >> confdefs.h <<\EOF
+
+cat >>confdefs.h <<\EOF
 #define STDC_HEADERS 1
 EOF
 
 #define STDC_HEADERS 1
 EOF
 
 
 for ac_prog in 'bison -y' byacc
 do
 
 for ac_prog in 'bison -y' byacc
 do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1216: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:2267: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_YACC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test -n "$YACC"; then
   ac_cv_prog_YACC="$YACC" # Let the user override the test.
 else
 else
   if test -n "$YACC"; then
   ac_cv_prog_YACC="$YACC" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_YACC="$ac_prog"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_YACC="$ac_prog"
+echo "$as_me:2282: found $ac_dir/$ac_word" >&5
+break
+done
+
 fi
 fi
 fi
 fi
-YACC="$ac_cv_prog_YACC"
+YACC=$ac_cv_prog_YACC
 if test -n "$YACC"; then
 if test -n "$YACC"; then
-  echo "$ac_t""$YACC" 1>&6
+  echo "$as_me:2290: result: $YACC" >&5
+echo "${ECHO_T}$YACC" >&6
 else
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me:2293: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 
 fi
 
-test -n "$YACC" && break
+  test -n "$YACC" && break
 done
 test -n "$YACC" || YACC="yacc"
 
 missing_dir=`cd $ac_aux_dir && pwd`
 for ac_prog in flex lex
 do
 done
 test -n "$YACC" || YACC="yacc"
 
 missing_dir=`cd $ac_aux_dir && pwd`
 for ac_prog in flex lex
 do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1252: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:2306: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LEX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test -n "$LEX"; then
   ac_cv_prog_LEX="$LEX" # Let the user override the test.
 else
 else
   if test -n "$LEX"; then
   ac_cv_prog_LEX="$LEX" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_LEX="$ac_prog"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LEX="$ac_prog"
+echo "$as_me:2321: found $ac_dir/$ac_word" >&5
+break
+done
+
 fi
 fi
 fi
 fi
-LEX="$ac_cv_prog_LEX"
+LEX=$ac_cv_prog_LEX
 if test -n "$LEX"; then
 if test -n "$LEX"; then
-  echo "$ac_t""$LEX" 1>&6
+  echo "$as_me:2329: result: $LEX" >&5
+echo "${ECHO_T}$LEX" >&6
 else
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me:2332: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 
 fi
 
-test -n "$LEX" && break
+  test -n "$LEX" && break
 done
 test -n "$LEX" || LEX=""$missing_dir/missing flex""
 
 done
 test -n "$LEX" || LEX=""$missing_dir/missing flex""
 
-# Extract the first word of "flex", so it can be a program name with args.
-set dummy flex; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1285: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+for ac_prog in flex lex
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2344: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LEX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test -n "$LEX"; then
   ac_cv_prog_LEX="$LEX" # Let the user override the test.
 else
 else
   if test -n "$LEX"; then
   ac_cv_prog_LEX="$LEX" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_LEX="flex"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_LEX" && ac_cv_prog_LEX="lex"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LEX="$ac_prog"
+echo "$as_me:2359: found $ac_dir/$ac_word" >&5
+break
+done
+
 fi
 fi
 fi
 fi
-LEX="$ac_cv_prog_LEX"
+LEX=$ac_cv_prog_LEX
 if test -n "$LEX"; then
 if test -n "$LEX"; then
-  echo "$ac_t""$LEX" 1>&6
+  echo "$as_me:2367: result: $LEX" >&5
+echo "${ECHO_T}$LEX" >&6
 else
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me:2370: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 
 fi
 
+  test -n "$LEX" && break
+done
+test -n "$LEX" || LEX=":"
+
 if test -z "$LEXLIB"
 then
 if test -z "$LEXLIB"
 then
-  case "$LEX" in
-  flex*) ac_lib=fl ;;
-  *) ac_lib=l ;;
-  esac
-  echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
-echo "configure:1319: checking for yywrap in -l$ac_lib" >&5
-ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_save_LIBS="$LIBS"
-LIBS="-l$ac_lib  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1327 "configure"
+  echo "$as_me:2380: checking for yywrap in -lfl" >&5
+echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6
+if test "${ac_cv_lib_fl_yywrap+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lfl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 2388 "configure"
 #include "confdefs.h"
 #include "confdefs.h"
+
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
 /* We use char because int might match the return type of a gcc2
 /* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char yywrap();
-
-int main() {
-yywrap()
-; return 0; }
-EOF
-if { (eval echo configure:1338: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+   builtin and then its argument prototype would still apply.  */
+char yywrap ();
+int
+main ()
+{
+yywrap ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2407: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:2410: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:2413: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2416: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_fl_yywrap=yes
 else
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_fl_yywrap=no
 fi
 fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
 fi
 fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LEXLIB="-l$ac_lib"
+echo "$as_me:2427: result: $ac_cv_lib_fl_yywrap" >&5
+echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6
+if test $ac_cv_lib_fl_yywrap = yes; then
+  LEXLIB="-lfl"
+else
+  echo "$as_me:2432: checking for yywrap in -ll" >&5
+echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6
+if test "${ac_cv_lib_l_yywrap+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ll  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 2440 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char yywrap ();
+int
+main ()
+{
+yywrap ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2459: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:2462: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:2465: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2468: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_l_yywrap=yes
 else
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_l_yywrap=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:2479: result: $ac_cv_lib_l_yywrap" >&5
+echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6
+if test $ac_cv_lib_l_yywrap = yes; then
+  LEXLIB="-ll"
 fi
 
 fi
 
 fi
 
 fi
 
-echo $ac_n "checking lex output file root""... $ac_c" 1>&6
-echo "configure:1361: checking lex output file root" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_lex_root'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+fi
+
+if test "x$LEX" != "x:"; then
+  echo "$as_me:2490: checking lex output file root" >&5
+echo $ECHO_N "checking lex output file root... $ECHO_C" >&6
+if test "${ac_cv_prog_lex_root+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   # The minimal lex program is just a single line: %%.  But some broken lexes
 # (Solaris, I think it was) want two %% lines, so accommodate them.
 else
   # The minimal lex program is just a single line: %%.  But some broken lexes
 # (Solaris, I think it was) want two %% lines, so accommodate them.
@@ -1370,54 +2501,64 @@ if test -f lex.yy.c; then
 elif test -f lexyy.c; then
   ac_cv_prog_lex_root=lexyy
 else
 elif test -f lexyy.c; then
   ac_cv_prog_lex_root=lexyy
 else
-  { echo "configure: error: cannot find output from $LEX; giving up" 1>&2; exit 1; }
+  { { echo "$as_me:2504: error: cannot find output from $LEX; giving up" >&5
+echo "$as_me: error: cannot find output from $LEX; giving up" >&2;}
+   { (exit 1); exit 1; }; }
 fi
 fi
 fi
 fi
-
-echo "$ac_t""$ac_cv_prog_lex_root" 1>&6
+echo "$as_me:2509: result: $ac_cv_prog_lex_root" >&5
+echo "${ECHO_T}$ac_cv_prog_lex_root" >&6
 LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
 
 LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
 
-echo $ac_n "checking whether yytext is a pointer""... $ac_c" 1>&6
-echo "configure:1382: checking whether yytext is a pointer" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_lex_yytext_pointer'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:2513: checking whether yytext is a pointer" >&5
+echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6
+if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   # POSIX says lex can declare yytext either as a pointer or an array; the
 # default is implementation-dependent. Figure out which it is, since
 # not all implementations provide the %pointer and %array declarations.
 ac_cv_prog_lex_yytext_pointer=no
 echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c
 else
   # POSIX says lex can declare yytext either as a pointer or an array; the
 # default is implementation-dependent. Figure out which it is, since
 # not all implementations provide the %pointer and %array declarations.
 ac_cv_prog_lex_yytext_pointer=no
 echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c
-ac_save_LIBS="$LIBS"
+ac_save_LIBS=$LIBS
 LIBS="$LIBS $LEXLIB"
 LIBS="$LIBS $LEXLIB"
-cat > conftest.$ac_ext <<EOF
-#line 1394 "configure"
-#include "confdefs.h"
+cat >conftest.$ac_ext <<_ACEOF
 `cat $LEX_OUTPUT_ROOT.c`
 `cat $LEX_OUTPUT_ROOT.c`
-int main() {
-
-; return 0; }
-EOF
-if { (eval echo configure:1401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2529: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:2532: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:2535: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2538: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
   ac_cv_prog_lex_yytext_pointer=yes
 else
   ac_cv_prog_lex_yytext_pointer=yes
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
 fi
 fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_save_LIBS
 rm -f "${LEX_OUTPUT_ROOT}.c"
 
 fi
 rm -f "${LEX_OUTPUT_ROOT}.c"
 
 fi
-
-echo "$ac_t""$ac_cv_prog_lex_yytext_pointer" 1>&6
+echo "$as_me:2550: result: $ac_cv_prog_lex_yytext_pointer" >&5
+echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6
 if test $ac_cv_prog_lex_yytext_pointer = yes; then
 if test $ac_cv_prog_lex_yytext_pointer = yes; then
-  cat >> confdefs.h <<\EOF
+
+cat >>confdefs.h <<\EOF
 #define YYTEXT_POINTER 1
 EOF
 
 fi
 
 #define YYTEXT_POINTER 1
 EOF
 
 fi
 
+fi
+
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
@@ -1425,31 +2566,39 @@ fi
 # SunOS /usr/etc/install
 # IRIX /sbin/install
 # AIX /bin/install
 # SunOS /usr/etc/install
 # IRIX /sbin/install
 # AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
 # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
 # AFS /usr/afsws/bin/install, which mishandles nonexistent args
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
 # AFS /usr/afsws/bin/install, which mishandles nonexistent args
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1434: checking for a BSD compatible install" >&5
+echo "$as_me:2574: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
 if test -z "$INSTALL"; then
 if test -z "$INSTALL"; then
-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+    ac_save_IFS=$IFS; IFS=$ac_path_separator
   for ac_dir in $PATH; do
   for ac_dir in $PATH; do
+    IFS=$ac_save_IFS
     # Account for people who put trailing slashes in PATH elements.
     # Account for people who put trailing slashes in PATH elements.
-    case "$ac_dir/" in
-    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    case $ac_dir/ in
+    / | ./ | .// | /cC/* \
+    | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \
+    | /usr/ucb/* ) ;;
     *)
       # OSF1 and SCO ODT 3.0 have their own names for install.
       # Don't use installbsd from OSF since it installs stuff as root
       # by default.
       for ac_prog in ginstall scoinst install; do
     *)
       # OSF1 and SCO ODT 3.0 have their own names for install.
       # Don't use installbsd from OSF since it installs stuff as root
       # by default.
       for ac_prog in ginstall scoinst install; do
-        if test -f $ac_dir/$ac_prog; then
+        if $as_executable_p "$ac_dir/$ac_prog"; then
          if test $ac_prog = install &&
          if test $ac_prog = install &&
-            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+            grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
            :
            # AIX install.  It has an incompatible calling convention.
            :
+         elif test $ac_prog = install &&
+           grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
          else
            ac_cv_path_install="$ac_dir/$ac_prog -c"
            break 2
          else
            ac_cv_path_install="$ac_dir/$ac_prog -c"
            break 2
@@ -1459,317 +2608,445 @@ else
       ;;
     esac
   done
       ;;
     esac
   done
-  IFS="$ac_save_IFS"
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
-    INSTALL="$ac_cv_path_install"
+    INSTALL=$ac_cv_path_install
   else
     # As a last resort, use the slow shell script.  We don't cache a
     # path for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
     # removed, or if the path is relative.
   else
     # As a last resort, use the slow shell script.  We don't cache a
     # path for INSTALL within a source directory, because that will
     # break other packages using the cache if that directory is
     # removed, or if the path is relative.
-    INSTALL="$ac_install_sh"
+    INSTALL=$ac_install_sh
   fi
 fi
   fi
 fi
-echo "$ac_t""$INSTALL" 1>&6
+echo "$as_me:2623: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
 test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
 
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
 test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
 
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1487: checking how to run the C preprocessor" >&5
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:2639: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
 fi
 if test -z "$CPP"; then
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
 fi
 if test -z "$CPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-    # This must be in double quotes, not single quotes, because CPP may get
-  # substituted into the Makefile and "${CC-cc}" will confuse make.
-  CPP="${CC-cc} -E"
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp.
-  cat > conftest.$ac_ext <<EOF
-#line 1502 "configure"
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2660 "configure"
 #include "confdefs.h"
 #include <assert.h>
 #include "confdefs.h"
 #include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1508: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:2665: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2671: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
   :
 else
   :
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
+  echo "$as_me: failed program was:" >&5
   cat conftest.$ac_ext >&5
   cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP="${CC-cc} -E -traditional-cpp"
-  cat > conftest.$ac_ext <<EOF
-#line 1519 "configure"
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2694 "configure"
 #include "confdefs.h"
 #include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1525: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  :
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2698: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2704: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
 else
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
+  echo "$as_me: failed program was:" >&5
   cat conftest.$ac_ext >&5
   cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP="${CC-cc} -nologo -E"
-  cat > conftest.$ac_ext <<EOF
-#line 1536 "configure"
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:2741: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2751 "configure"
 #include "confdefs.h"
 #include <assert.h>
 #include "confdefs.h"
 #include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1542: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:2756: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2762: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
   :
 else
   :
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
+  echo "$as_me: failed program was:" >&5
   cat conftest.$ac_ext >&5
   cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP=/lib/cpp
-fi
-rm -f conftest*
+  # Broken: fails on valid input.
+continue
 fi
 fi
-rm -f conftest*
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line 2785 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2789: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2795: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
 fi
 fi
-rm -f conftest*
-  ac_cv_prog_CPP="$CPP"
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
 fi
 fi
-  CPP="$ac_cv_prog_CPP"
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
 else
 else
-  ac_cv_prog_CPP="$CPP"
+  { { echo "$as_me:2823: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+   { (exit 1); exit 1; }; }
 fi
 fi
-echo "$ac_t""$CPP" 1>&6
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 # Extract the first word of "rm", so it can be a program name with args.
 set dummy rm; ac_word=$2
 
 # Extract the first word of "rm", so it can be a program name with args.
 set dummy rm; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1569: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_RM'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:2836: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_RM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-  case "$RM" in
-  /*)
+  case $RM in
+  [\\/]* | ?:[\\/]*)
   ac_cv_path_RM="$RM" # Let the user override the test with a path.
   ;;
   ac_cv_path_RM="$RM" # Let the user override the test with a path.
   ;;
-  ?:/*)                         
-  ac_cv_path_RM="$RM" # Let the user override the test with a dos path.
-  ;;
   *)
   *)
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_path_RM="$ac_dir/$ac_word"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_RM="$ac_dir/$ac_word"
+   echo "$as_me:2853: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
   test -z "$ac_cv_path_RM" && ac_cv_path_RM="/bin/rm"
   ;;
 esac
 fi
   test -z "$ac_cv_path_RM" && ac_cv_path_RM="/bin/rm"
   ;;
 esac
 fi
-RM="$ac_cv_path_RM"
+RM=$ac_cv_path_RM
+
 if test -n "$RM"; then
 if test -n "$RM"; then
-  echo "$ac_t""$RM" 1>&6
+  echo "$as_me:2865: result: $RM" >&5
+echo "${ECHO_T}$RM" >&6
 else
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me:2868: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 
 # Extract the first word of "mv", so it can be a program name with args.
 set dummy mv; ac_word=$2
 fi
 
 # Extract the first word of "mv", so it can be a program name with args.
 set dummy mv; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1605: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_MV'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:2874: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MV+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-  case "$MV" in
-  /*)
+  case $MV in
+  [\\/]* | ?:[\\/]*)
   ac_cv_path_MV="$MV" # Let the user override the test with a path.
   ;;
   ac_cv_path_MV="$MV" # Let the user override the test with a path.
   ;;
-  ?:/*)                         
-  ac_cv_path_MV="$MV" # Let the user override the test with a dos path.
-  ;;
   *)
   *)
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_path_MV="$ac_dir/$ac_word"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_MV="$ac_dir/$ac_word"
+   echo "$as_me:2891: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
   test -z "$ac_cv_path_MV" && ac_cv_path_MV="/bin/mv"
   ;;
 esac
 fi
   test -z "$ac_cv_path_MV" && ac_cv_path_MV="/bin/mv"
   ;;
 esac
 fi
-MV="$ac_cv_path_MV"
+MV=$ac_cv_path_MV
+
 if test -n "$MV"; then
 if test -n "$MV"; then
-  echo "$ac_t""$MV" 1>&6
+  echo "$as_me:2903: result: $MV" >&5
+echo "${ECHO_T}$MV" >&6
 else
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me:2906: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 
 # Extract the first word of "tar", so it can be a program name with args.
 set dummy tar; ac_word=$2
 fi
 
 # Extract the first word of "tar", so it can be a program name with args.
 set dummy tar; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1641: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_TAR'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:2912: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_TAR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-  case "$TAR" in
-  /*)
+  case $TAR in
+  [\\/]* | ?:[\\/]*)
   ac_cv_path_TAR="$TAR" # Let the user override the test with a path.
   ;;
   ac_cv_path_TAR="$TAR" # Let the user override the test with a path.
   ;;
-  ?:/*)                         
-  ac_cv_path_TAR="$TAR" # Let the user override the test with a dos path.
-  ;;
   *)
   *)
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_path_TAR="$ac_dir/$ac_word"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_TAR="$ac_dir/$ac_word"
+   echo "$as_me:2929: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
   test -z "$ac_cv_path_TAR" && ac_cv_path_TAR="/bin/tar"
   ;;
 esac
 fi
   test -z "$ac_cv_path_TAR" && ac_cv_path_TAR="/bin/tar"
   ;;
 esac
 fi
-TAR="$ac_cv_path_TAR"
-if test -n "$TAR"; then
-  echo "$ac_t""$TAR" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
+TAR=$ac_cv_path_TAR
 
 
-# Check whether --with-glib-prefix or --without-glib-prefix was given.
-if test "${with_glib_prefix+set}" = set; then
-  withval="$with_glib_prefix"
-  glib_config_prefix="$withval"
-else
-  glib_config_prefix=""
-fi
-
-# Check whether --with-glib-exec-prefix or --without-glib-exec-prefix was given.
-if test "${with_glib_exec_prefix+set}" = set; then
-  withval="$with_glib_exec_prefix"
-  glib_config_exec_prefix="$withval"
+if test -n "$TAR"; then
+  echo "$as_me:2941: result: $TAR" >&5
+echo "${ECHO_T}$TAR" >&6
 else
 else
-  glib_config_exec_prefix=""
+  echo "$as_me:2944: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 
 # Check whether --enable-glibtest or --disable-glibtest was given.
 if test "${enable_glibtest+set}" = set; then
   enableval="$enable_glibtest"
 fi
 
 # Check whether --enable-glibtest or --disable-glibtest was given.
 if test "${enable_glibtest+set}" = set; then
   enableval="$enable_glibtest"
-  :
+
 else
   enable_glibtest=yes
 else
   enable_glibtest=yes
-fi
+fi;
 
 
-
-  if test x$glib_config_exec_prefix != x ; then
-     glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix"
-     if test x${GLIB_CONFIG+set} != xset ; then
-        GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config
-     fi
-  fi
-  if test x$glib_config_prefix != x ; then
-     glib_config_args="$glib_config_args --prefix=$glib_config_prefix"
-     if test x${GLIB_CONFIG+set} != xset ; then
-        GLIB_CONFIG=$glib_config_prefix/bin/glib-config
-     fi
-  fi
-
-  for module in . 
+  pkg_config_args=glib-2.0
+  for module in .
   do
       case "$module" in
   do
       case "$module" in
-         gmodule) 
-             glib_config_args="$glib_config_args gmodule"
+         gmodule)
+             pkg_config_args="$pkg_config_args gmodule-2.0"
          ;;
          ;;
-         gthread) 
-             glib_config_args="$glib_config_args gthread"
+         gobject)
+             pkg_config_args="$pkg_config_args gobject-2.0"
+         ;;
+         gthread)
+             pkg_config_args="$pkg_config_args gthread-2.0"
          ;;
       esac
   done
 
          ;;
       esac
   done
 
-  # Extract the first word of "glib-config", so it can be a program name with args.
-set dummy glib-config; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1727: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_GLIB_CONFIG'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+echo "$as_me:2974: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 else
-  case "$GLIB_CONFIG" in
-  /*)
-  ac_cv_path_GLIB_CONFIG="$GLIB_CONFIG" # Let the user override the test with a path.
-  ;;
-  ?:/*)                         
-  ac_cv_path_GLIB_CONFIG="$GLIB_CONFIG" # Let the user override the test with a dos path.
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
   ;;
   *)
   ;;
   *)
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_path_GLIB_CONFIG="$ac_dir/$ac_word"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_GLIB_CONFIG" && ac_cv_path_GLIB_CONFIG="no"
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
+   echo "$as_me:2991: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no"
   ;;
 esac
 fi
   ;;
 esac
 fi
-GLIB_CONFIG="$ac_cv_path_GLIB_CONFIG"
-if test -n "$GLIB_CONFIG"; then
-  echo "$ac_t""$GLIB_CONFIG" 1>&6
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+
+if test -n "$PKG_CONFIG"; then
+  echo "$as_me:3003: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6
 else
 else
-  echo "$ac_t""no" 1>&6
+  echo "$as_me:3006: result: no" >&5
+echo "${ECHO_T}no" >&6
 fi
 
 fi
 
-  min_glib_version=1.2.0
-  echo $ac_n "checking for GLIB - version >= $min_glib_version""... $ac_c" 1>&6
-echo "configure:1762: checking for GLIB - version >= $min_glib_version" >&5
   no_glib=""
   no_glib=""
-  if test "$GLIB_CONFIG" = "no" ; then
-    no_glib=yes
+
+  if test x$PKG_CONFIG != xno ; then
+    if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
+      :
+    else
+      echo *** pkg-config too old; version 0.7 or better required.
+      no_glib=yes
+      PKG_CONFIG=no
+    fi
+  fi
+
+  ## don't try to run the test against uninstalled libtool libs
+  if $PKG_CONFIG --uninstalled $pkg_config_args; then
+        echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH"
+        enable_glibtest=no
+  fi
+
+  min_glib_version=1.3.3
+  echo "$as_me:3029: checking for GLIB - version >= $min_glib_version" >&5
+echo $ECHO_N "checking for GLIB - version >= $min_glib_version... $ECHO_C" >&6
+
+  if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then
+        :
   else
   else
-    GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags`
-    GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs`
-    glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \
+        no_glib = yes
+  fi
+
+  if test x"$no_glib" = x ; then
+    GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
+    GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0`
+    GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+
+    GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args`
+    GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args`
+    glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \
            sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
            sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
-    glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \
+    glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \
            sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
            sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
-    glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \
+    glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \
            sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
     if test "x$enable_glibtest" = "xyes" ; then
       ac_save_CFLAGS="$CFLAGS"
            sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
     if test "x$enable_glibtest" = "xyes" ; then
       ac_save_CFLAGS="$CFLAGS"
@@ -1780,15 +3057,15 @@ echo "configure:1762: checking for GLIB - version >= $min_glib_version" >&5
       if test "$cross_compiling" = yes; then
   echo $ac_n "cross compiling; assumed OK... $ac_c"
 else
       if test "$cross_compiling" = yes; then
   echo $ac_n "cross compiling; assumed OK... $ac_c"
 else
-  cat > conftest.$ac_ext <<EOF
-#line 1785 "configure"
+  cat >conftest.$ac_ext <<_ACEOF
+#line 3061 "configure"
 #include "confdefs.h"
 
 #include <glib.h>
 #include <stdio.h>
 #include <stdlib.h>
 
 #include "confdefs.h"
 
 #include <glib.h>
 #include <stdio.h>
 #include <stdlib.h>
 
-int 
+int
 main ()
 {
   int major, minor, micro;
 main ()
 {
   int major, minor, micro;
@@ -1807,18 +3084,17 @@ main ()
       (glib_minor_version != $glib_config_minor_version) ||
       (glib_micro_version != $glib_config_micro_version))
     {
       (glib_minor_version != $glib_config_minor_version) ||
       (glib_micro_version != $glib_config_micro_version))
     {
-      printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", 
+      printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
              $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
              glib_major_version, glib_minor_version, glib_micro_version);
              $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
              glib_major_version, glib_minor_version, glib_micro_version);
-      printf ("*** was found! If glib-config was correct, then it is best\n");
-      printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n");
+      printf ("*** was found! If pkg-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
       printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
       printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
       printf("*** required on your system.\n");
       printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
       printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
       printf("*** required on your system.\n");
-      printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n");
-      printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n");
-      printf("*** before re-running configure\n");
-    } 
+      printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+      printf("*** to point to the correct configuration files\n");
+    }
   else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
           (glib_minor_version != GLIB_MINOR_VERSION) ||
            (glib_micro_version != GLIB_MICRO_VERSION))
   else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
           (glib_minor_version != GLIB_MINOR_VERSION) ||
            (glib_micro_version != GLIB_MICRO_VERSION))
@@ -1845,10 +3121,10 @@ main ()
         printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
         printf("***\n");
         printf("*** If you have already installed a sufficiently new version, this error\n");
         printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
         printf("***\n");
         printf("*** If you have already installed a sufficiently new version, this error\n");
-        printf("*** probably means that the wrong copy of the glib-config shell script is\n");
+        printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
         printf("*** being found. The easiest way to fix this is to remove the old version\n");
         printf("*** being found. The easiest way to fix this is to remove the old version\n");
-        printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n");
-        printf("*** correct copy of glib-config. (In this case, you will have to\n");
+        printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
+        printf("*** correct copy of pkg-config. (In this case, you will have to\n");
         printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
         printf("*** so that the correct libraries are found at run-time))\n");
       }
         printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
         printf("*** so that the correct libraries are found at run-time))\n");
       }
@@ -1856,33 +3132,41 @@ main ()
   return 1;
 }
 
   return 1;
 }
 
-EOF
-if { (eval echo configure:1861: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:3137: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:3140: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:3142: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3145: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
   :
 else
   :
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  no_glib=yes
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+no_glib=yes
 fi
 fi
-rm -fr conftest*
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
-
        CFLAGS="$ac_save_CFLAGS"
        LIBS="$ac_save_LIBS"
      fi
   fi
   if test "x$no_glib" = x ; then
        CFLAGS="$ac_save_CFLAGS"
        LIBS="$ac_save_LIBS"
      fi
   fi
   if test "x$no_glib" = x ; then
-     echo "$ac_t""yes" 1>&6
-     :     
+     echo "$as_me:3161: result: yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)" >&5
+echo "${ECHO_T}yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)" >&6
+     :
   else
   else
-     echo "$ac_t""no" 1>&6
-     if test "$GLIB_CONFIG" = "no" ; then
-       echo "*** The glib-config script installed by GLIB could not be found"
-       echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in"
-       echo "*** your path, or set the GLIB_CONFIG environment variable to the"
-       echo "*** full path to glib-config."
+     echo "$as_me:3165: result: no" >&5
+echo "${ECHO_T}no" >&6
+     if test "$PKG_CONFIG" = "no" ; then
+       echo "*** A new enough version of pkg-config was not found."
+       echo "*** See http://www.freedesktop.org/software/pkgconfig/"
      else
        if test -f conf.glibtest ; then
         :
      else
        if test -f conf.glibtest ; then
         :
@@ -1890,19 +3174,33 @@ fi
           echo "*** Could not run GLIB test program, checking why..."
           CFLAGS="$CFLAGS $GLIB_CFLAGS"
           LIBS="$LIBS $GLIB_LIBS"
           echo "*** Could not run GLIB test program, checking why..."
           CFLAGS="$CFLAGS $GLIB_CFLAGS"
           LIBS="$LIBS $GLIB_LIBS"
-          cat > conftest.$ac_ext <<EOF
-#line 1895 "configure"
+          cat >conftest.$ac_ext <<_ACEOF
+#line 3178 "configure"
 #include "confdefs.h"
 
 #include <glib.h>
 #include <stdio.h>
 
 #include "confdefs.h"
 
 #include <glib.h>
 #include <stdio.h>
 
-int main() {
- return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); 
-; return 0; }
-EOF
-if { (eval echo configure:1905: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
+int
+main ()
+{
+ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version));
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3193: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:3196: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:3199: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3202: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
    echo "*** The test program compiled, but did not run. This usually means"
           echo "*** that the run-time linker is not finding GLIB or finding the wrong"
           echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
    echo "*** The test program compiled, but did not run. This usually means"
           echo "*** that the run-time linker is not finding GLIB or finding the wrong"
           echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
@@ -1912,48 +3210,40 @@ if { (eval echo configure:1905: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && t
          echo "***"
           echo "*** If you have an old version installed, it is best to remove it, although"
           echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
          echo "***"
           echo "*** If you have an old version installed, it is best to remove it, although"
           echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
-          echo "***"
-          echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
-          echo "*** came with the system with the command"
-          echo "***"
-          echo "***    rpm --erase --nodeps gtk gtk-devel" 
 else
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-   echo "*** The test program failed to compile or link. See the file config.log for the"
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ echo "*** The test program failed to compile or link. See the file config.log for the"
           echo "*** exact error that occured. This usually means GLIB was incorrectly installed"
           echo "*** or that you have moved GLIB since it was installed. In the latter case, you"
           echo "*** exact error that occured. This usually means GLIB was incorrectly installed"
           echo "*** or that you have moved GLIB since it was installed. In the latter case, you"
-          echo "*** may want to edit the glib-config script: $GLIB_CONFIG" 
+          echo "*** may want to edit the pkg-config script: $PKG_CONFIG"
 fi
 fi
-rm -f conftest*
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
           CFLAGS="$ac_save_CFLAGS"
           LIBS="$ac_save_LIBS"
        fi
      fi
      GLIB_CFLAGS=""
      GLIB_LIBS=""
           CFLAGS="$ac_save_CFLAGS"
           LIBS="$ac_save_LIBS"
        fi
      fi
      GLIB_CFLAGS=""
      GLIB_LIBS=""
+     GLIB_GENMARSHAL=""
+     GOBJECT_QUERY=""
+     GLIB_MKENUMS=""
      :
   fi
      :
   fi
-  
-  
-  rm -f conf.glibtest
-
-
 
 
+  rm -f conf.glibtest
 
 
-echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:1947: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "$as_me:3236: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
     # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
 if test "${enable_maintainer_mode+set}" = set; then
   enableval="$enable_maintainer_mode"
   USE_MAINTAINER_MODE=$enableval
 else
   USE_MAINTAINER_MODE=no
     # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
 if test "${enable_maintainer_mode+set}" = set; then
   enableval="$enable_maintainer_mode"
   USE_MAINTAINER_MODE=$enableval
 else
   USE_MAINTAINER_MODE=no
-fi
-
-  echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6
-  
+fi;
+  echo "$as_me:3245: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
 
 if test $USE_MAINTAINER_MODE = yes; then
   MAINTAINER_MODE_TRUE=
 
 if test $USE_MAINTAINER_MODE = yes; then
   MAINTAINER_MODE_TRUE=
@@ -1963,404 +3253,877 @@ else
   MAINTAINER_MODE_FALSE=
 fi
   MAINT=$MAINTAINER_MODE_TRUE
   MAINTAINER_MODE_FALSE=
 fi
   MAINT=$MAINTAINER_MODE_TRUE
-  
-
-
-
 
 
-
-
-trap '' 1 2 15
-cat > confcache <<\EOF
+ac_config_files="$ac_config_files gob2.spec Makefile src/Makefile doc/Makefile examples/Makefile doc/gob2.1"
+cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
-# scripts and configure runs.  It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
 #
 #
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already.  You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --recheck option to rerun configure.
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
 #
 #
-EOF
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
 # The following way of writing the cache mishandles newlines in values,
 # but we know of no workaround that is simple, portable, and efficient.
 # So, don't put newlines in cache variables' values.
 # Ultrix sh set writes to stderr and can't be redirected directly,
 # and sets the high bit in the cache file unless we assign to the vars.
 # The following way of writing the cache mishandles newlines in values,
 # but we know of no workaround that is simple, portable, and efficient.
 # So, don't put newlines in cache variables' values.
 # Ultrix sh set writes to stderr and can't be redirected directly,
 # and sets the high bit in the cache file unless we assign to the vars.
-(set) 2>&1 |
-  case `(ac_space=' '; set | grep ac_space) 2>&1` in
-  *ac_space=\ *)
-    # `set' does not quote correctly, so add quotes (double-quote substitution
-    # turns \\\\ into \\, and sed turns \\ into \).
-    sed -n \
-      -e "s/'/'\\\\''/g" \
-      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
-    ;;
-  *)
-    # `set' quotes correctly as required by POSIX, so do not add quotes.
-    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
-    ;;
-  esac >> confcache
-if cmp -s $cache_file confcache; then
-  :
-else
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+        "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
   if test -w $cache_file; then
   if test -w $cache_file; then
-    echo "updating cache $cache_file"
-    cat confcache > $cache_file
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
   else
     echo "not updating unwritable cache $cache_file"
   fi
 fi
 rm -f confcache
 
   else
     echo "not updating unwritable cache $cache_file"
   fi
 fi
 rm -f confcache
 
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
 test "x$prefix" = xNONE && prefix=$ac_default_prefix
 # Let make expand exec_prefix.
 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 
 test "x$prefix" = xNONE && prefix=$ac_default_prefix
 # Let make expand exec_prefix.
 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 
-# Any assignment to VPATH causes Sun make to only execute
-# the first set of double-colon rules, so remove it if not needed.
-# If there is a colon in the path, we need to keep it.
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
 if test "x$srcdir" = x.; then
 if test "x$srcdir" = x.; then
-  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+  ac_vpsub='/^[        ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[   ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[     ]*$//;
+}'
 fi
 
 fi
 
-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
-
 DEFS=-DHAVE_CONFIG_H
 
 DEFS=-DHAVE_CONFIG_H
 
-# Without the "./", some shells look in PATH for config.status.
 : ${CONFIG_STATUS=./config.status}
 : ${CONFIG_STATUS=./config.status}
-
-echo creating $CONFIG_STATUS
-rm -f $CONFIG_STATUS
-cat > $CONFIG_STATUS <<EOF
-#! /bin/sh
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:3337: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
 # Generated automatically by configure.
 # Run this file to recreate the current configuration.
 # Generated automatically by configure.
 # Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# $0 $ac_configure_args
-#
 # Compiler output produced by configure, useful for debugging
 # Compiler output produced by configure, useful for debugging
-# configure, is in ./config.log if it exists.
+# configure, is in config.log if it exists.
 
 
-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
-for ac_option
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+ac_cs_invocation="\$0 \$@"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+exec 6>&1
+
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\EOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+EOF
+
+cat >>$CONFIG_STATUS <<EOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.52,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+EOF
+
+cat >>$CONFIG_STATUS <<\EOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
 do
 do
-  case "\$ac_option" in
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    shift
+    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+    shift
+    ;;
+  -*);;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_need_defaults=false;;
+  esac
+
+  case $1 in
+  # Handling of the options.
+EOF
+cat >>$CONFIG_STATUS <<EOF
   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
-    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
-    echo "$CONFIG_STATUS generated by autoconf version 2.13"
-    exit 0 ;;
-  -help | --help | --hel | --he | --h)
-    echo "\$ac_cs_usage"; exit 0 ;;
-  *) echo "\$ac_cs_usage"; exit 1 ;;
+    echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+    exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+EOF
+cat >>$CONFIG_STATUS <<\EOF
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:3513: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    shift
+    CONFIG_FILES="$CONFIG_FILES $1"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $1"
+    ac_need_defaults=false;;
+
+  # This is an error.
+  -*) { { echo "$as_me:3532: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
   esac
   esac
+  shift
 done
 
 done
 
-ac_given_srcdir=$srcdir
-ac_given_INSTALL="$INSTALL"
+exec 5>>config.log
+cat >&5 << _ACEOF
 
 
-trap 'rm -fr `echo "
-gob.spec
-Makefile
-src/Makefile
-doc/Makefile
-examples/Makefile
-doc/gob.1 config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+## ----------------------- ##
+## Running config.status.  ##
+## ----------------------- ##
+
+This file was extended by $as_me 2.52, executed with
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  > $ac_cs_invocation
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+
+_ACEOF
 EOF
 EOF
-cat >> $CONFIG_STATUS <<EOF
 
 
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
-$ac_vpsub
-$extrasub
-s%@SHELL@%$SHELL%g
-s%@CFLAGS@%$CFLAGS%g
-s%@CPPFLAGS@%$CPPFLAGS%g
-s%@CXXFLAGS@%$CXXFLAGS%g
-s%@FFLAGS@%$FFLAGS%g
-s%@DEFS@%$DEFS%g
-s%@LDFLAGS@%$LDFLAGS%g
-s%@LIBS@%$LIBS%g
-s%@exec_prefix@%$exec_prefix%g
-s%@prefix@%$prefix%g
-s%@program_transform_name@%$program_transform_name%g
-s%@bindir@%$bindir%g
-s%@sbindir@%$sbindir%g
-s%@libexecdir@%$libexecdir%g
-s%@datadir@%$datadir%g
-s%@sysconfdir@%$sysconfdir%g
-s%@sharedstatedir@%$sharedstatedir%g
-s%@localstatedir@%$localstatedir%g
-s%@libdir@%$libdir%g
-s%@includedir@%$includedir%g
-s%@oldincludedir@%$oldincludedir%g
-s%@infodir@%$infodir%g
-s%@mandir@%$mandir%g
-s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
-s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
-s%@INSTALL_DATA@%$INSTALL_DATA%g
-s%@PACKAGE@%$PACKAGE%g
-s%@VERSION@%$VERSION%g
-s%@ACLOCAL@%$ACLOCAL%g
-s%@AUTOCONF@%$AUTOCONF%g
-s%@AUTOMAKE@%$AUTOMAKE%g
-s%@AUTOHEADER@%$AUTOHEADER%g
-s%@MAKEINFO@%$MAKEINFO%g
-s%@SET_MAKE@%$SET_MAKE%g
-s%@SUBDIRS@%$SUBDIRS%g
-s%@DOINSTGOB@%$DOINSTGOB%g
-s%@NOINSTGOB@%$NOINSTGOB%g
-s%@CC@%$CC%g
-s%@CPP@%$CPP%g
-s%@YACC@%$YACC%g
-s%@LEX@%$LEX%g
-s%@LEXLIB@%$LEXLIB%g
-s%@LEX_OUTPUT_ROOT@%$LEX_OUTPUT_ROOT%g
-s%@RM@%$RM%g
-s%@MV@%$MV%g
-s%@TAR@%$TAR%g
-s%@GLIB_CONFIG@%$GLIB_CONFIG%g
-s%@GLIB_CFLAGS@%$GLIB_CFLAGS%g
-s%@GLIB_LIBS@%$GLIB_LIBS%g
-s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g
-s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g
-s%@MAINT@%$MAINT%g
+cat >>$CONFIG_STATUS <<EOF
+#
+# INIT-COMMANDS section.
+#
 
 
-CEOF
 EOF
 
 EOF
 
-cat >> $CONFIG_STATUS <<\EOF
-
-# Split the substitutions into bite-sized pieces for seds with
-# small command number limits, like on Digital OSF/1 and HP-UX.
-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
-ac_file=1 # Number of current file.
-ac_beg=1 # First line for current file.
-ac_end=$ac_max_sed_cmds # Line after last line for current file.
-ac_more_lines=:
-ac_sed_cmds=""
-while $ac_more_lines; do
-  if test $ac_beg -gt 1; then
-    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
-  else
-    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
-  fi
-  if test ! -s conftest.s$ac_file; then
-    ac_more_lines=false
-    rm -f conftest.s$ac_file
-  else
-    if test -z "$ac_sed_cmds"; then
-      ac_sed_cmds="sed -f conftest.s$ac_file"
-    else
-      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
-    fi
-    ac_file=`expr $ac_file + 1`
-    ac_beg=$ac_end
-    ac_end=`expr $ac_end + $ac_max_sed_cmds`
-  fi
+cat >>$CONFIG_STATUS <<\EOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "gob2.spec" ) CONFIG_FILES="$CONFIG_FILES gob2.spec" ;;
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+  "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+  "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
+  "doc/gob2.1" ) CONFIG_FILES="$CONFIG_FILES doc/gob2.1" ;;
+  "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:3582: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
 done
 done
-if test -z "$ac_sed_cmds"; then
-  ac_sed_cmds=cat
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
 fi
 fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/cs$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+
+EOF
+
+cat >>$CONFIG_STATUS <<EOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@DEFS@,$DEFS,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@SUBDIRS@,$SUBDIRS,;t t
+s,@DOINSTGOB@,$DOINSTGOB,;t t
+s,@NOINSTGOB@,$NOINSTGOB,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@CPP@,$CPP,;t t
+s,@YACC@,$YACC,;t t
+s,@LEX@,$LEX,;t t
+s,@LEXLIB@,$LEXLIB,;t t
+s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t
+s,@RM@,$RM,;t t
+s,@MV@,$MV,;t t
+s,@TAR@,$TAR,;t t
+s,@PKG_CONFIG@,$PKG_CONFIG,;t t
+s,@GLIB_CFLAGS@,$GLIB_CFLAGS,;t t
+s,@GLIB_LIBS@,$GLIB_LIBS,;t t
+s,@GLIB_GENMARSHAL@,$GLIB_GENMARSHAL,;t t
+s,@GOBJECT_QUERY@,$GOBJECT_QUERY,;t t
+s,@GLIB_MKENUMS@,$GLIB_MKENUMS,;t t
+s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
+s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
+s,@MAINT@,$MAINT,;t t
+CEOF
+
 EOF
 
 EOF
 
-cat >> $CONFIG_STATUS <<EOF
+  cat >>$CONFIG_STATUS <<\EOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+       ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+       ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
 
 
-CONFIG_FILES=\${CONFIG_FILES-"gob.spec
-Makefile
-src/Makefile
-doc/Makefile
-examples/Makefile
-doc/gob.1"}
 EOF
 EOF
-cat >> $CONFIG_STATUS <<\EOF
-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+cat >>$CONFIG_STATUS <<\EOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case "$ac_file" in
-  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
-       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-  *) ac_file_in="${ac_file}.in" ;;
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
   esac
 
   esac
 
-  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
-
-  # Remove last slash and all that follows it.  Not all systems have dirname.
-  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
   if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
   if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
-    # The file is in a subdirectory.
-    test ! -d "$ac_dir" && mkdir "$ac_dir"
-    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+    ;;
+  esac
+done; }
+
+    ac_dir_suffix="/`echo $ac_dir|sed 's,^\./,,'`"
     # A "../" for each directory in $ac_dir_suffix.
     # A "../" for each directory in $ac_dir_suffix.
-    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+    ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'`
   else
     ac_dir_suffix= ac_dots=
   fi
 
   else
     ac_dir_suffix= ac_dots=
   fi
 
-  case "$ac_given_srcdir" in
-  .)  srcdir=.
-      if test -z "$ac_dots"; then top_srcdir=.
-      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
-  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  case $srcdir in
+  .)  ac_srcdir=.
+      if test -z "$ac_dots"; then
+         ac_top_srcdir=.
+      else
+         ac_top_srcdir=`echo $ac_dots | sed 's,/$,,'`
+      fi ;;
+  [\\/]* | ?:[\\/]* )
+      ac_srcdir=$srcdir$ac_dir_suffix;
+      ac_top_srcdir=$srcdir ;;
   *) # Relative path.
   *) # Relative path.
-    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
-    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+    ac_srcdir=$ac_dots$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_dots$srcdir ;;
   esac
 
   esac
 
-  case "$ac_given_INSTALL" in
-  [/$]*) INSTALL="$ac_given_INSTALL" ;;
-  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_dots$INSTALL ;;
   esac
 
   esac
 
-  echo creating "$ac_file"
-  rm -f "$ac_file"
-  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
-  case "$ac_file" in
-  *Makefile*) ac_comsub="1i\\
-# $configure_input" ;;
-  *) ac_comsub= ;;
-  esac
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:3816: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated automatically by config.status.  */
+  configure_input="Generated automatically from `echo $ac_file_in |
+                                                 sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:3834: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:3847: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+EOF
+cat >>$CONFIG_STATUS <<EOF
+  sed "$ac_vpsub
+$extrasub
+EOF
+cat >>$CONFIG_STATUS <<\EOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+EOF
+cat >>$CONFIG_STATUS <<\EOF
 
 
-  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
-  sed -e "$ac_comsub
-s%@configure_input@%$configure_input%g
-s%@srcdir@%$srcdir%g
-s%@top_srcdir@%$top_srcdir%g
-s%@INSTALL@%$INSTALL%g
-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
-fi; done
-rm -f conftest.s*
+#
+# CONFIG_HEADER section.
+#
 
 # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
 # NAME is the cpp macro being defined and VALUE is the value it is being given.
 #
 # ac_d sets the value in "#define NAME VALUE" lines.
 
 # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
 # NAME is the cpp macro being defined and VALUE is the value it is being given.
 #
 # ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s%^\([  ]*\)#\([        ]*define[       ][      ]*\)'
-ac_dB='\([     ][      ]*\)[^  ]*%\1#\2'
-ac_dC='\3'
-ac_dD='%g'
-# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
-ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
-ac_uB='\([     ]\)%\1#\2define\3'
+ac_dA='s,^\([  ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='[       ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='$,\1#\2define\3'
 ac_uC=' '
 ac_uC=' '
-ac_uD='\4%g'
-# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
-ac_eB='$%\1#\2define\3'
-ac_eC=' '
-ac_eD='%g'
-
-if test "${CONFIG_HEADERS+set}" != set; then
-EOF
-cat >> $CONFIG_STATUS <<EOF
-  CONFIG_HEADERS="config.h"
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-fi
-for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case "$ac_file" in
-  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
-       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-  *) ac_file_in="${ac_file}.in" ;;
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
   esac
 
   esac
 
-  echo creating $ac_file
-
-  rm -f conftest.frag conftest.in conftest.out
-  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
-  cat $ac_file_inputs > conftest.in
+  test x"$ac_file" != x- && { echo "$as_me:3908: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:3919: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:3932: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[     ]*$//' $ac_file_inputs >$tmp/in
 
 EOF
 
 
 EOF
 
-# Transform confdefs.h into a sed script conftest.vals that substitutes
-# the proper values into config.h.in to produce config.h.  And first:
-# Protect against being on the right side of a sed subst in config.status.
-# Protect against being in an unquoted here document in config.status.
-rm -f conftest.vals
-cat > conftest.hdr <<\EOF
-s/[\\&%]/\\&/g
-s%[\\$`]%\\&%g
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
-s%ac_d%ac_u%gp
-s%ac_u%ac_e%gp
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\EOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[   ]*#[    ]*define[       ][      ]*\(\([^        (][^    (]*\)([^)]*)\)[         ]*\(.*\)$,${ac_dA}\2${ac_dB}\1${ac_dC}\3${ac_dD},gp
+t end
+s,^[   ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
 EOF
 EOF
-sed -n -f conftest.hdr confdefs.h > conftest.vals
-rm -f conftest.hdr
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
 
 # This sed command replaces #undef with comments.  This is necessary, for
 # example, in the case of _POSIX_SOURCE, which is predefined and required
 # on some systems where configure will not decide to define it.
 
 # This sed command replaces #undef with comments.  This is necessary, for
 # example, in the case of _POSIX_SOURCE, which is predefined and required
 # on some systems where configure will not decide to define it.
-cat >> conftest.vals <<\EOF
-s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+cat >>conftest.undefs <<\EOF
+s,^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
 EOF
 
 EOF
 
-# Break up conftest.vals because some shells have a limit on
-# the size of here documents, and old seds have small limits too.
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if egrep "^[   ]*#[    ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[    ]*#[    ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # egrep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
 
 
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
 rm -f conftest.tail
 rm -f conftest.tail
-while :
+while grep . conftest.undefs >/dev/null
 do
 do
-  ac_lines=`grep -c . conftest.vals`
-  # grep -c gives empty output for an empty file on some AIX systems.
-  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
-  # Write a limited-size here document to conftest.frag.
-  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[    ]*#[    ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
   echo 'CEOF
   echo 'CEOF
-  sed -f conftest.frag conftest.in > conftest.out
-  rm -f conftest.in
-  mv conftest.out conftest.in
-' >> $CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
-  rm -f conftest.vals
-  mv conftest.tail conftest.vals
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
 done
 done
-rm -f conftest.vals
-
-cat >> $CONFIG_STATUS <<\EOF
-  rm -f conftest.frag conftest.h
-  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
-  cat conftest.in >> conftest.h
-  rm -f conftest.in
-  if cmp -s $ac_file conftest.h 2>/dev/null; then
-    echo "$ac_file is unchanged"
-    rm -f conftest.h
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\EOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated automatically by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated automatically by configure.  */" >$tmp/config.h
   else
   else
-    # Remove last slash and all that follows it.  Not all systems have dirname.
-      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+    echo "/* $ac_file.  Generated automatically by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
+      { echo "$as_me:4049: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
       if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
       if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
-      # The file is in a subdirectory.
-      test ! -d "$ac_dir" && mkdir "$ac_dir"
+        { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+    ;;
+  esac
+done; }
+
+      fi
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
     fi
     fi
-    rm -f $ac_file
-    mv conftest.h $ac_file
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
   fi
   fi
-fi; done
-
+done
 EOF
 EOF
-cat >> $CONFIG_STATUS <<EOF
+cat >>$CONFIG_STATUS <<\EOF
 
 
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
 
 
+  case $ac_dest in
+    default-1 ) test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h ;;
+  esac
+done
 EOF
 EOF
-cat >> $CONFIG_STATUS <<\EOF
-test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
 
 
-exit 0
+cat >>$CONFIG_STATUS <<\EOF
+
+{ (exit 0); exit 0; }
 EOF
 chmod +x $CONFIG_STATUS
 EOF
 chmod +x $CONFIG_STATUS
-rm -fr confdefs* $ac_clean_files
-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+ac_clean_files=$ac_clean_files_save
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
 
 
index 91e1277ee2dfd65eb3e139d0b40679be26697053..caebd1b5804cb1d89255ab5ce04aa162abdeea5b 100644 (file)
@@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script.
 AC_PREREQ(2.2)
 AC_INIT(src/treefuncs.h)
 AM_CONFIG_HEADER(config.h)
 AC_PREREQ(2.2)
 AC_INIT(src/treefuncs.h)
 AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(gob,1.0.7)
+AM_INIT_AUTOMAKE(gob2,1.99.1)
 
 dnl
 dnl  An utter hack to allow embedding of gob inside other packages.
 
 dnl
 dnl  An utter hack to allow embedding of gob inside other packages.
@@ -11,12 +11,12 @@ dnl  gob is not installed
 dnl
 if test -f ../NOINST_GOB ; then
   DOINSTGOB=
 dnl
 if test -f ../NOINST_GOB ; then
   DOINSTGOB=
-  NOINSTGOB=gob
+  NOINSTGOB=gob2
   AC_MSG_RESULT([*** NOT Going to install GOB ***])
   SUBDIRS="src examples"
   AC_SUBST(SUBDIRS)
 else
   AC_MSG_RESULT([*** NOT Going to install GOB ***])
   SUBDIRS="src examples"
   AC_SUBST(SUBDIRS)
 else
-  DOINSTGOB=gob
+  DOINSTGOB=gob2
   NOINSTGOB=
   SUBDIRS="src examples doc"
   AC_SUBST(SUBDIRS)
   NOINSTGOB=
   SUBDIRS="src examples doc"
   AC_SUBST(SUBDIRS)
@@ -34,7 +34,7 @@ AC_PROG_CPP
 AC_PATH_PROG(RM, rm, /bin/rm)
 AC_PATH_PROG(MV, mv, /bin/mv)
 AC_PATH_PROG(TAR, tar, /bin/tar)
 AC_PATH_PROG(RM, rm, /bin/rm)
 AC_PATH_PROG(MV, mv, /bin/mv)
 AC_PATH_PROG(TAR, tar, /bin/tar)
-AM_PATH_GLIB(1.2.0,,,)
+AM_PATH_GLIB_2_0(1.3.3,,,)
 dnl We don't check popt since we're not using it at the moment, but
 dnl We just might use it later
 dnl AC_CHECK_LIB(popt,poptGetContext, [POPT_LIB="-lpopt"],
 dnl We don't check popt since we're not using it at the moment, but
 dnl We just might use it later
 dnl AC_CHECK_LIB(popt,poptGetContext, [POPT_LIB="-lpopt"],
@@ -51,9 +51,9 @@ AC_SUBST(CPPFLAGS)
 AC_SUBST(LDFLAGS)
 
 AC_OUTPUT([
 AC_SUBST(LDFLAGS)
 
 AC_OUTPUT([
-gob.spec
+gob2.spec
 Makefile
 src/Makefile
 doc/Makefile
 examples/Makefile
 Makefile
 src/Makefile
 doc/Makefile
 examples/Makefile
-doc/gob.1])
+doc/gob2.1])
index ffe85562c2af2d680446f2205af1849d7ce30df3..4654781edd0581206c339d585226c7540ef0a8e9 100644 (file)
@@ -1,4 +1,7 @@
-man_MANS = gob.1
+man_MANS = gob2.1
 SUBDIRS =
 
 SUBDIRS =
 
-EXTRA_DIST = gob.1.in
+EXTRA_DIST = gob2.1.in makehtml.pl
+
+html:
+       perl $(top_srcdir)/doc/makehtml.pl < $(top_srcdir)/doc/gob2.1 > $(top_builddir)/doc/gob2.1.html
index ce6de43aaa04442b99db455882cfb2fe06b6eaeb..e162ae12fe55ed39038790e5b6bc1bbb78622c35 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
 
 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 
 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
@@ -63,8 +63,10 @@ CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 DOINSTGOB = @DOINSTGOB@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 CPPFLAGS = @CPPFLAGS@
 DOINSTGOB = @DOINSTGOB@
 GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_QUERY = @GOBJECT_QUERY@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
 MAINT = @MAINT@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
 MAINT = @MAINT@
@@ -72,23 +74,24 @@ MAKEINFO = @MAKEINFO@
 MV = @MV@
 NOINSTGOB = @NOINSTGOB@
 PACKAGE = @PACKAGE@
 MV = @MV@
 NOINSTGOB = @NOINSTGOB@
 PACKAGE = @PACKAGE@
+PKG_CONFIG = @PKG_CONFIG@
 RM = @RM@
 TAR = @TAR@
 VERSION = @VERSION@
 YACC = @YACC@
 
 RM = @RM@
 TAR = @TAR@
 VERSION = @VERSION@
 YACC = @YACC@
 
-man_MANS = gob.1
+man_MANS = gob2.1
 SUBDIRS = 
 
 SUBDIRS = 
 
-EXTRA_DIST = gob.1.in
+EXTRA_DIST = gob2.1.in makehtml.pl
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ../config.h
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ../config.h
-CONFIG_CLEAN_FILES =  gob.1
+CONFIG_CLEAN_FILES =  gob2.1
 man1dir = $(mandir)/man1
 MANS = $(man_MANS)
 
 NROFF = nroff
 man1dir = $(mandir)/man1
 MANS = $(man_MANS)
 
 NROFF = nroff
-DIST_COMMON =  Makefile.am Makefile.in gob.1.in
+DIST_COMMON =  Makefile.am Makefile.in gob2.1.in
 
 
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
 
 
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
@@ -103,7 +106,7 @@ Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
        cd $(top_builddir) \
          && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
        cd $(top_builddir) \
          && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
-gob.1: $(top_builddir)/config.status gob.1.in
+gob2.1: $(top_builddir)/config.status gob2.1.in
        cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
 install-man1:
        cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
 install-man1:
@@ -242,7 +245,7 @@ distdir: $(DISTFILES)
        @for file in $(DISTFILES); do \
          d=$(srcdir); \
          if test -d $$d/$$file; then \
        @for file in $(DISTFILES); do \
          d=$(srcdir); \
          if test -d $$d/$$file; then \
-           cp -pr $$/$$file $(distdir)/$$file; \
+           cp -pr $$d/$$file $(distdir)/$$file; \
          else \
            test -f $(distdir)/$$file \
            || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
          else \
            test -f $(distdir)/$$file \
            || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
@@ -329,6 +332,9 @@ installdirs mostlyclean-generic distclean-generic clean-generic \
 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
 
 
 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
 
 
+html:
+       perl $(top_srcdir)/doc/makehtml.pl < $(top_srcdir)/doc/gob2.1 > $(top_builddir)/doc/gob2.1.html
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
similarity index 92%
rename from doc/gob.1.in
rename to doc/gob2.1.in
index 81aa107e361bd31c5f0dca22d48b033e18649850..adf08b01903875b632d792f5219ab59d58e76ab9 100644 (file)
@@ -1,22 +1,29 @@
 .\"
 .\" gob manual page
 .\"
 .\" gob manual page
-.\" (C) 1999 George Lebl <jirka@5z.com>
+.\" (C) 1999,2000,2001 George Lebl <jirka@5z.com>
 .\" 
 .\" This manual page is covered by the terms of the GNU General
 .\" Public License.  
 .\"
 .\" 
 .\" This manual page is covered by the terms of the GNU General
 .\" Public License.  
 .\"
-.TH GOB 1 "GOB @VERSION@" 
+.TH GOB2 1 "GOB2 @VERSION@" 
 .SH NAME
 .SH NAME
-GOB \- The GTK+ Object Builder
+GOB2 \- The GObject Builder
 .SH SYNOPSIS
 .PP
 .B gob
 [ option ] ...
 file
 .SH SYNOPSIS
 .PP
 .B gob
 [ option ] ...
 file
+.SH OUT OF DATE
+.PP
+This manual is out of date.  I will be updating it when I can but it
+mostly covers the GOB 1.0.x versions and not GOB2 yet.  There ARE wrong
+things in this manual for now.  Keep that in mind.  However most things
+still apply.  Just not all.
+
 .SH DESCRIPTION
 .PP
 .SH DESCRIPTION
 .PP
-GTK+ Object Builder is a simple preprocessor for easily creating
-GTK+ objects.  It does not parse any C code and ignores any C errors.  It
+GObject Builder is a simple preprocessor for easily creating
+GObject objects.  It does not parse any C code and ignores any C errors.  It
 is in spirit similar to things like lex or yacc.
 
 .SH OPTIONS
 is in spirit similar to things like lex or yacc.
 
 .SH OPTIONS
@@ -26,7 +33,7 @@ is in spirit similar to things like lex or yacc.
 Display a simple help screen.
 .TP
 .B --version
 Display a simple help screen.
 .TP
 .B --version
-Display version information (note, --version was not added until 0.92.0)
+Display version information
 .TP
 .B -w --exit-on-warn
 Exit with an error code even when you encounter a warning.
 .TP
 .B -w --exit-on-warn
 Exit with an error code even when you encounter a warning.
@@ -391,7 +398,7 @@ And for getting, you would use:
 .nf
 
   int height;
 .nf
 
   int height;
-  gtk_object_set (GTK_OBJECT (object),
+  gtk_object_get (GTK_OBJECT (object),
                   MY_OBJECT_GET_ARG_HEIGHT (&height),
                   NULL);
 
                   MY_OBJECT_GET_ARG_HEIGHT (&height),
                   NULL);
 
@@ -466,11 +473,11 @@ is just like
   get {
         ARG = self->foo;
   } set {
   get {
         ARG = self->foo;
   } set {
-        if(self->foo)
+        if(ARG != NULL)
+                gtk_object_ref(ARG);
+        if(self->foo != NULL)
                 gtk_object_unref(self->foo);
         self->foo = ARG;
                 gtk_object_unref(self->foo);
         self->foo = ARG;
-        if(self->foo)
-                gtk_object_ref(self->foo);
   }
 
 .fi
   }
 
 .fi
@@ -481,6 +488,19 @@ For objectlink, just a pointer is returned on get, if you wish to keep it around
 you should call gtk_object_ref on it.  For stringlink, get makes a copy of
 the string which you should free after use.  This is the behaviour since 1.0.2.
 .PP
 you should call gtk_object_ref on it.  For stringlink, get makes a copy of
 the string which you should free after use.  This is the behaviour since 1.0.2.
 .PP
+You can also automatically export get and set methods for each of the arguments
+by appending '(export)' flag before the get and set statements.  For example:
+.nf
+
+  public int foo;
+  argument INT (type int) foo (export)
+  get { ARG = self->foo; }
+  set { self->foo = ARG; };
+
+.fi
+Will export public methods get_foo(self) and set_foo(self, int foo) for you
+automatically.  Note that this behaviour is new in 1.0.10.
+.PP
 Methods:
 .PP
 There is a whole array of possible methods.  The three normal,
 Methods:
 .PP
 There is a whole array of possible methods.  The three normal,
@@ -696,55 +716,26 @@ you can use.  It will return whatever the parent handler returned, or the
 Method names:
 .PP
 Inside the code, aliases are set for the methods, so that you don't
 Method names:
 .PP
 Inside the code, aliases are set for the methods, so that you don't
-have to type the class name before each call, just the name of the method.
+have to type the class name before each call, just type \fBself_\fR instead
+of the name of the class.  So to call a method called \fBblah\fR, you
+would use the name \fBself_blah\fR.
 Example:
 .nf
 
   private int
 Example:
 .nf
 
   private int
-  foo(self)
+  foo (self)
   {
          return self->len;
   }
   
   private int
   {
          return self->len;
   }
   
   private int
-  bar(self,int i)
+  bar (self,int i)
   {
   {
-         return foo(self) + i;
+         return self_foo (self) + i;
   }
 
 .fi
 .PP
   }
 
 .fi
 .PP
-Underscore removal (0.93.5+):
-.PP
-Sometimes this causes conflicts with other libraries.  For example a library
-might have already used the identifier foo.  You can prepend an underscore to
-the name in the .gob file.  This will make the local short alias have an
-initial underscore, but it will not change the name of the actual name of the
-function.  For example:
-.nf
-  class My:Object from Gtk:Object {
-          public void
-          _foo(self) {
-                  /* foo body */
-          }
-          public void
-          bar(self) {
-                  /* short calling convention */
-                  _foo(self);
-                  /* long calling convention */
-                  my_object_foo(self);
-          }
-  }
-.fi
-Thus you see that the "_foo" method still generates the method "my_object_foo"
-just as "foo" would generate.  You can turn off this behavior if you depend
-on the old (pre 0.93.5) behavior with the --no-kill-underscores option.  This
-also means that if both "_foo" and "foo" are defined, it is treated as a
-conflict.
-.PP
-This does not apply to override methods.  Override methods are special beasts
-and this is not necessary and would make the code behave in weird ways.
-.PP
 Making new objects:
 .PP
 You should define a new method which should be a normal public method.  Inside
 Making new objects:
 .PP
 You should define a new method which should be a normal public method.  Inside
@@ -828,7 +819,8 @@ compile with a C++ compiler.
 .PP
 The get_type is not really a method, but a function which initializes your
 object.  Recently objects appeared which require you to make a custom
 .PP
 The get_type is not really a method, but a function which initializes your
 object.  Recently objects appeared which require you to make a custom
-get_type function (BonoboXObject currently).  So in 1.0.7 it is now possible
+get_type function (BonoboXObject currently, see next section for direct
+BonoboXObject support).  So in 1.0.7 it is now possible
 to override this function.  To do so, just define a new public method called
 get_type, with no arguments.  Example:
 .nf
 to override this function.  To do so, just define a new public method called
 get_type, with no arguments.  Example:
 .nf
@@ -842,6 +834,45 @@ get_type, with no arguments.  Example:
 
 .fi
 
 
 .fi
 
+.SH DIRECT BonoboXObject SUPPORT
+.PP
+If you want to build a BonoboXObject class gob has direct support for these
+classes since 1.0.9.  Just create a new object that derives from
+Bonobo:X:Object.  Then use a "BonoboX" class flag with the interface name as an
+argument.  The interface name should be as you would type it in C, that is with
+underscores as namespace separators.  Then you add the methods (using exact
+same names as in the idl file) and prepend those methods with a BonoboX
+keyword.  For example imagine you have an interface GNOME/Foo/SomeInterface,
+with a method fooBar that takes a single string:
+.nf
+
+  class Foo:Some:Interface from Bonobo:X:Object
+    (BonoboX GNOME_Foo_SomeInterface) {
+
+          BonoboX
+          private void
+          fooBar (PortableServer_Servant servant,
+                  const CORBA_char *string,
+                  CORBA_Environment *ev)
+          {
+                  Self *self = SELF (bonobo_object_from_servant (servant));
+
+                  /* your code here */
+          }
+
+          /* rest of class */
+  }
+
+.fi
+Note that the implementation method can be private, in fact that's probably
+a good idea to do.  It won't work to make this a signal, it can however
+be a virtual.  Note that the method prototype must match the one from the
+interface header file, or you will get a bad assignment warning.  You should
+check the header file generated by orbit-idl and see the epv structure
+for the correct prototypes if you can't figure them out from the idl itself.
+Also note that the first argument is not "self", but the servant and you must
+use bonobo_object_from_servant function to get the actual object pointer.
+
 .SH IDENTIFIER CONFLICTS
 .PP
 Gob will need to define some local variables and functions in the generated
 .SH IDENTIFIER CONFLICTS
 .PP
 Gob will need to define some local variables and functions in the generated
@@ -866,7 +897,7 @@ the same as defining it as "name" except that the local alias will be "_name"
 rather then "name".
 .PP
 There are a couple of defines which you shouldn't be redefining in the code
 rather then "name".
 .PP
 There are a couple of defines which you shouldn't be redefining in the code
-or other headers.  These are SELF, IS_SELF, SELF_CLASS, ARG, VAR,
+or other headers.  These are SELF, IS_SELF, SELF_CLASS, SELF_TYPE, ARG, VAR,
 PARENT_HANDLER, GET_NEW, GOB_VERSION_MAJOR, GOB_VERSION_MINOR and
 GOB_VERSION_PATCHLEVEL.
 .PP
 PARENT_HANDLER, GET_NEW, GOB_VERSION_MAJOR, GOB_VERSION_MINOR and
 GOB_VERSION_PATCHLEVEL.
 .PP
@@ -1028,8 +1059,7 @@ that's about as far as I can really take it and even that is problematic.
 Basically, if you use gob, just don't use the C preprocessor too extensively.
 .PP
 Comments will not get through to the generated files unless inside C code.
 Basically, if you use gob, just don't use the C preprocessor too extensively.
 .PP
 Comments will not get through to the generated files unless inside C code.
-This makes using something like gtk-doc harder.  However I'm planning to
-fix this somehow.
+This is not the case for gtk-doc style comments which are supported.
 .PP
 The short name aliases are actually implemented as pointers to functions.  Thus
 if you want to get the pointer of a function using the short name alias you
 .PP
 The short name aliases are actually implemented as pointers to functions.  Thus
 if you want to get the pointer of a function using the short name alias you
diff --git a/doc/makehtml.pl b/doc/makehtml.pl
new file mode 100755 (executable)
index 0000000..8b14c5d
--- /dev/null
@@ -0,0 +1,82 @@
+#!/usr/bin/perl
+$printbr = 1;
+$printtable = 0;
+while (<>) {
+       s/&/&amp;/g;
+       s/\</&lt;/g;
+       s/\>/&gt;/g;
+       if ($printtable == 1) {
+               $printtable = 2;
+       } elsif ($printtable == 2) {
+               $printtable = 3;
+               print "</TD><TD ALIGN=\"left\">";
+       }
+
+       #hack, we're inside .nf so highlight comments and
+       # other such stuff
+       if ($printbr == 0) {
+               s/\/\*/<FONT COLOR="#5555ff">\/\*/g;
+               s/\*\//\*\/<\/FONT>/g;
+       }
+       
+       if (/^\.\\"/) {
+               # comment ignore
+       } elsif (/^\.TH .*\"([^"]*)\"/) {
+               # must be at the front
+               print "<HTML><HEAD><TITLE>$1 Manual page</TITLE></HEAD>\n";
+               print "<BODY BGCOLOR=\"#ffffff\">\n";
+               print "<H1>$1 Manual page</H1>\n";
+       } elsif (/^\.SH (.*)$/) {
+               if ($printtable == 3) {
+                       $printtable = 0;
+                       print "</TD></TR></TABLE>\n";
+               }
+               print "<H3>$1</H3>\n";
+       } elsif (/^\.PP/) {
+               if ($printtable == 3) {
+                       $printtable = 0;
+                       print "</TD></TR></TABLE>\n";
+               }
+               print "<P>\n";
+       } elsif (/^\.B (.*)$/) {
+               print "<B>$1</B>\n";
+       } elsif (/^\.I (.*)$/) {
+               print "<I>$1</I>\n";
+       } elsif (/^\.nf/) {
+               if ($printtable == 3) {
+                       $printtable = 0;
+                       print "</TD></TR></TABLE>\n";
+               }
+               print "<TABLE WIDTH=100%><TR><TD BGCOLOR=\"#dddddd\"><PRE>\n";
+               $printbr = 0;
+       } elsif (/^\.fi/) {
+               print "</PRE>\n";
+               print "</TD></TR></TABLE>\n";
+               $printbr = 1;
+       } elsif (/^[    ]*$/) {
+               if ($printtable == 3) {
+                       $printtable = 0;
+                       print "</TD></TR></TABLE>\n";
+               }
+               if ($printbr) {
+                       print "<BR>\n";
+               } else {
+                       print "\n";
+               }
+       } elsif (/^\.TP/) {
+               if ($printtable == 3) {
+                       $printtable = 1;
+                       print "</TD></TR><TR>\n<TD ALIGN=\"left\">";
+               } else {
+                       $printtable = 1;
+                       print "<TABLE BORDER><TR>\n<TD ALIGN=\"left\">";
+               }
+       } else {
+               s/\\fB([^\\]*)\\fR/<B>\1<\/B>/gm;
+               s/\\fI([^\\]*)\\fR/<I>\1<\/I>/gm;
+               s/\\(.)/\1>/g;
+               print;
+       }
+}
+
+print "</BODY></HTML>\n";
diff --git a/examples/GNOME_Foo_SomeInterface.idl b/examples/GNOME_Foo_SomeInterface.idl
new file mode 100644 (file)
index 0000000..c6a3d0d
--- /dev/null
@@ -0,0 +1,26 @@
+#include <Bonobo.idl>
+
+/* An example interface
+ *
+ * Do note that the GNOME namespace is not just a freeforall,
+ * so this file should not be installed as Foo is not a registered
+ * name.  To see the current namespece setup see doc/NAMESPACE
+ * in the bonobo cvs module or from a recent bonobo tarball.
+ * To register a new name under the GNOME namespace just drop
+ * a mail to:
+ * Michael Meeks <michael@ximian.com> or George Lebl <jirka@5z.com>
+ * and we'll get you all set.  (This is just to avoid conflicts in
+ * the namespace, and no it doesn't cost anything)
+ */
+
+module GNOME {
+
+module Foo {
+
+interface SomeInterface {
+       void fooBar (in string foo);
+};
+
+};
+
+};
index 9197fa7d67b2ab1c4dd2f7263fe432e790102e13..b92c41322e84b003100992485bfff504c5476113 100644 (file)
@@ -2,6 +2,8 @@ EXTRA_DIST = \
        README                  \
        gtk-button-count.gob    \
        my-person.gob           \
        README                  \
        gtk-button-count.gob    \
        my-person.gob           \
-       my-person2.gob
+       my-person2.gob          \
+       GNOME_Foo_SomeInterface.idl \
+       foo-some-interface.gob
 
 SUBDIRS =
 
 SUBDIRS =
index 3695c5619b26051e8d9ab89f38984464b7035d45..43b648c0fa16ee3a0f86d5683ebe67eb0d2829be 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
 
 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 
 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
@@ -63,8 +63,10 @@ CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 DOINSTGOB = @DOINSTGOB@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 CPPFLAGS = @CPPFLAGS@
 DOINSTGOB = @DOINSTGOB@
 GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_QUERY = @GOBJECT_QUERY@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
 MAINT = @MAINT@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
 MAINT = @MAINT@
@@ -72,12 +74,13 @@ MAKEINFO = @MAKEINFO@
 MV = @MV@
 NOINSTGOB = @NOINSTGOB@
 PACKAGE = @PACKAGE@
 MV = @MV@
 NOINSTGOB = @NOINSTGOB@
 PACKAGE = @PACKAGE@
+PKG_CONFIG = @PKG_CONFIG@
 RM = @RM@
 TAR = @TAR@
 VERSION = @VERSION@
 YACC = @YACC@
 
 RM = @RM@
 TAR = @TAR@
 VERSION = @VERSION@
 YACC = @YACC@
 
-EXTRA_DIST =   README                          gtk-button-count.gob            my-person.gob                   my-person2.gob
+EXTRA_DIST =   README                          gtk-button-count.gob            my-person.gob                   my-person2.gob                  GNOME_Foo_SomeInterface.idl     foo-some-interface.gob
 
 
 SUBDIRS = 
 
 
 SUBDIRS = 
@@ -197,7 +200,7 @@ distdir: $(DISTFILES)
        @for file in $(DISTFILES); do \
          d=$(srcdir); \
          if test -d $$d/$$file; then \
        @for file in $(DISTFILES); do \
          d=$(srcdir); \
          if test -d $$d/$$file; then \
-           cp -pr $$/$$file $(distdir)/$$file; \
+           cp -pr $$d/$$file $(distdir)/$$file; \
          else \
            test -f $(distdir)/$$file \
            || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
          else \
            test -f $(distdir)/$$file \
            || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
index 1eebe5533d180299a5f4ac7b39c2ca8e70ed5692..dba804d8ad49877d4c7f7e1492bbc547ef7f1df4 100644 (file)
@@ -15,3 +15,8 @@ my-person.gob         A simple file which can store some identity
 
 my-person2.gob         The same as above but using automatic initialization,
                        destruction and argument linking features of 0.93.0+
 
 my-person2.gob         The same as above but using automatic initialization,
                        destruction and argument linking features of 0.93.0+
+
+GNOME_Foo_SomeInterface.idl
+foo-some-interface.gob Example idl and gob file for a BonoboXClass
+                       implementation.  It can be this easy to write
+                       Bonobo classes.
diff --git a/examples/foo-some-interface.gob b/examples/foo-some-interface.gob
new file mode 100644 (file)
index 0000000..15aa928
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Example BonoboXObject class
+ *
+ * see GNOME_Foo_SomeInterface.idl
+ */
+requires 1.0.9
+
+%{
+/* some standard includes */
+#include <gnome.h>
+#include <bonobo.h>
+
+/* this requires you to use orbit-idl on GNOME_Foo_SomeInterface.idl first */
+#include "GNOME_Foo_SomeInterface.h"
+
+#include "foo-some-interface.h"
+#include "foo-some-interface-private.h"
+%}
+
+class Foo:Some:Interface from Bonobo:X:Object
+       (BonoboX GNOME_Foo_SomeInterface)
+{
+
+       BonoboX
+       private void
+       fooBar (PortableServer_Servant servant,
+               const CORBA_char *string,
+               CORBA_Environment *ev)
+       {
+               Self *self = SELF (bonobo_object_from_servant (servant));
+
+               /* your code here */
+       }
+
+       /* rest of class */
+}
index cad0672fd22ea5f8589df0bdd48ac16b8f3b9131..d895a629562f12c40b0c9a3b4625f13dfdc8ad5e 100644 (file)
@@ -16,14 +16,14 @@ class My:Person from Gtk:Object {
        public long dod; /* date of death as a time_t */
 
        private int rounds_in_shotgun; /* number of rounds in our shotgun */
        public long dod; /* date of death as a time_t */
 
        private int rounds_in_shotgun; /* number of rounds in our shotgun */
-
+       
        argument POINTER (type char *) name
        get {
        argument POINTER (type char *) name
        get {
-               /* note that strdup handles NULL correctly */
+               /* note that g_strdup handles NULL correctly */
                ARG = g_strdup(self->name);
        }
        set {
                ARG = g_strdup(self->name);
        }
        set {
-               /* note that strdup handles NULL correctly */
+               /* note that g_free and g_strdup handles NULL correctly */
                g_free(self->name);
                self->name = g_strdup(ARG);
        };
                g_free(self->name);
                self->name = g_strdup(ARG);
        };
diff --git a/gob.m4 b/gob2.m4
similarity index 84%
rename from gob.m4
rename to gob2.m4
index 625007314202433d93cf84bf67e9cb87f5dd9fe0..70a78bb061ba3766d9d444db8753d95cb22f6168 100644 (file)
--- a/gob.m4
+++ b/gob2.m4
@@ -4,11 +4,11 @@ dnl if fail = "failure", abort if GOB not found
 dnl
 
 
 dnl
 
 
-AC_DEFUN(GOB_HOOK,[
-       AC_PATH_PROG(GOB,gob)
-       if test ! x$GOB = x; then       
+AC_DEFUN(GOB2_HOOK,[
+       AC_PATH_PROG(GOB2,gob2)
+       if test ! x$GOB2 = x; then      
                if test ! x$1 = x; then 
                if test ! x$1 = x; then 
-                       AC_MSG_CHECKING(for gob >= $1)
+                       AC_MSG_CHECKING(for gob-2 >= $1)
                        g_r_ve=`echo $1|sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
                        g_r_ma=`echo $1|sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
                        g_r_mi=`echo $1|sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
                        g_r_ve=`echo $1|sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
                        g_r_ma=`echo $1|sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
                        g_r_mi=`echo $1|sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
@@ -46,13 +46,13 @@ AC_DEFUN(GOB_HOOK,[
                        unset g_r_ma
                        unset g_r_mi
                fi
                        unset g_r_ma
                        unset g_r_mi
                fi
-               AC_SUBST(GOB)
+               AC_SUBST(GOB2)
                $2
        else            
                $3
        fi
 ])
 
                $2
        else            
                $3
        fi
 ])
 
-AC_DEFUN([GOB_CHECK],[
-       GOB_HOOK($1,[],[AC_MSG_WARN([Cannot find GOB, check http://www.5z.com/jirka/gob.html])])
+AC_DEFUN([GOB2_CHECK],[
+       GOB2_HOOK($1,[],[AC_MSG_WARN([Cannot find GOB-2, check http://www.5z.com/jirka/gob.html])])
 ])
 ])
similarity index 63%
rename from gob.spec
rename to gob2.spec
index 06064dbc3fe4bbc0e350c6146c9953bd0208bdd6..592628bd174119fe68e63d591105f94dc76a6751 100644 (file)
--- a/gob.spec
+++ b/gob2.spec
@@ -1,24 +1,27 @@
-%define  ver     1.0.7
-%define  rel     1
+%define  ver     1.99.1
+%define  rel     SNAP
 %define  prefix  /usr
 
 %define  prefix  /usr
 
-Summary: GOB, The GTK+ Object Builder
-Name: gob
+Summary: GOB2, The GObject Builder
+Name: gob2
 Version: %ver
 Release: %rel
 Copyright: GPL
 Group: Development/Tools
 Version: %ver
 Release: %rel
 Copyright: GPL
 Group: Development/Tools
-Source: gob-%{ver}.tar.gz
+Source: gob2-%{ver}.tar.gz
 Url: http://www.5z.com/jirka/linux.html#gob
 Url: http://www.5z.com/jirka/linux.html#gob
-BuildRoot: /var/tmp/gob-%{ver}-root
+BuildRoot: /var/tmp/gob2-%{ver}-root
 Prefix: %prefix
 
 %description
 Prefix: %prefix
 
 %description
-GOB is a simple preprocessor for making GTK+ objects.  It makes objects
-from a single file which has inline C code so that you don't have to edit
-the generated files.  Syntax is somewhat inspired by java and yacc.
+GOB is a simple preprocessor for making GObject objects (glib objects).
+It makes objects from a single file which has inline C code so that
+you don't have to edit the generated files.  Syntax is somewhat inspired
+by java and yacc.  It supports generating C++ code
 
 %changelog
 
 %changelog
+* Fri Sep 28 2001  George Lebl <jirka@5z.com>
+- Updated for gob2
 * Tue Feb 7 2000  George Lebl <jirka@5z.com>
 - added %{prefix}/share/aclocal/* to %files
 * Tue Dec 14 1999  George Lebl <jirka@5z.com>
 * Tue Feb 7 2000  George Lebl <jirka@5z.com>
 - added %{prefix}/share/aclocal/* to %files
 * Tue Dec 14 1999  George Lebl <jirka@5z.com>
similarity index 66%
rename from gob.spec.in
rename to gob2.spec.in
index c4ed4e749f231d351a37842e99a11093609ea505..c90c857a62869e5311378ca4fb493689ca9e2ba7 100644 (file)
@@ -2,23 +2,26 @@
 %define  rel     SNAP
 %define  prefix  /usr
 
 %define  rel     SNAP
 %define  prefix  /usr
 
-Summary: GOB, The GTK+ Object Builder
-Name: gob
+Summary: GOB2, The GObject Builder
+Name: gob2
 Version: %ver
 Release: %rel
 Copyright: GPL
 Group: Development/Tools
 Version: %ver
 Release: %rel
 Copyright: GPL
 Group: Development/Tools
-Source: gob-%{ver}.tar.gz
+Source: gob2-%{ver}.tar.gz
 Url: http://www.5z.com/jirka/linux.html#gob
 Url: http://www.5z.com/jirka/linux.html#gob
-BuildRoot: /var/tmp/gob-%{ver}-root
+BuildRoot: /var/tmp/gob2-%{ver}-root
 Prefix: %prefix
 
 %description
 Prefix: %prefix
 
 %description
-GOB is a simple preprocessor for making GTK+ objects.  It makes objects
-from a single file which has inline C code so that you don't have to edit
-the generated files.  Syntax is somewhat inspired by java and yacc.
+GOB is a simple preprocessor for making GObject objects (glib objects).
+It makes objects from a single file which has inline C code so that
+you don't have to edit the generated files.  Syntax is somewhat inspired
+by java and yacc.  It supports generating C++ code
 
 %changelog
 
 %changelog
+* Fri Sep 28 2001  George Lebl <jirka@5z.com>
+- Updated for gob2
 * Tue Feb 7 2000  George Lebl <jirka@5z.com>
 - added %{prefix}/share/aclocal/* to %files
 * Tue Dec 14 1999  George Lebl <jirka@5z.com>
 * Tue Feb 7 2000  George Lebl <jirka@5z.com>
 - added %{prefix}/share/aclocal/* to %files
 * Tue Dec 14 1999  George Lebl <jirka@5z.com>
index ffe911378269005857be807b0df195847d567a77..769bfc84979b0faa8c6f259192f82712de83562a 100644 (file)
@@ -8,11 +8,11 @@ INCLUDES = @GLIB_CFLAGS@ -I$(includedir)
 
 bin_PROGRAMS = @DOINSTGOB@
 noinst_PROGRAMS = @NOINSTGOB@
 
 bin_PROGRAMS = @DOINSTGOB@
 noinst_PROGRAMS = @NOINSTGOB@
-EXTRA_PROGRAMS = gob
+EXTRA_PROGRAMS = gob2
 
 BUILT_SOURCES = parse.h parse.c lexer.c
 
 
 BUILT_SOURCES = parse.h parse.c lexer.c
 
-gob_SOURCES =  \
+gob2_SOURCES =         \
        main.c          \
        main.h          \
        treefuncs.c     \
        main.c          \
        main.h          \
        treefuncs.c     \
@@ -26,7 +26,7 @@ gob_SOURCES =         \
        parse.y         \
        lexer.l
 
        parse.y         \
        lexer.l
 
-gob_LDADD = \
+gob2_LDADD = \
        -lm \
        $(GLIB_LIBS) \
        @LEXLIB@
        -lm \
        $(GLIB_LIBS) \
        @LEXLIB@
@@ -34,25 +34,25 @@ gob_LDADD = \
 # we might want popt back in the future
 #      @POPT_LIB@
 
 # we might want popt back in the future
 #      @POPT_LIB@
 
-CLEANFILES += $(BUILT_SOURCES) gtk-weird-button.* gtk-weird-button-private.h
+CLEANFILES += $(BUILT_SOURCES) test-object.* test-object-private.h
 
 
-EXTRA_DIST = test.gob generate_treefuncs.pl treefuncs.def
+EXTRA_DIST = $(BUILT_SOURCES) test.gob generate_treefuncs.pl treefuncs.def
 
 parse.h parse.c: parse.y
        $(YACC) $(YFLAGS) $<
        test -f y.tab.c && mv -f y.tab.c parse.c
        test -f y.tab.h && mv -f y.tab.h parse.h
 
 
 parse.h parse.c: parse.y
        $(YACC) $(YFLAGS) $<
        test -f y.tab.c && mv -f y.tab.c parse.c
        test -f y.tab.h && mv -f y.tab.h parse.h
 
-test: gtk-weird-button.c gtk-weird-button.h
-       $(CC) -g -Wall `gtk-config --cflags` -c gtk-weird-button.c
+test: test-object.c test-object.h
+       $(CC) -g -Wall `pkg-config --cflags gobject-2.0` -c test-object.c
 
 
-gtk-weird-button.c gtk-weird-button.h: test.gob gob
-       ./gob test.gob
+test-object.c test-object.h: test.gob gob2
+       ./gob2 test.gob
 
 # can't depend on the header file as that would break the above rule
 # since it's just for testing, who cares
 
 # can't depend on the header file as that would break the above rule
 # since it's just for testing, who cares
-testcpp: gtk-weird-button.cc
-       g++ -g -Wall `gtk-config --cflags` -c gtk-weird-button.cc
+testcpp: test-object.cc
+       g++ -g -Wall `pkg-config --cflags gobject-2.0` -c test-object.cc
 
 
-gtk-weird-button.cc: test.gob gob
-       ./gob --for-cpp test.gob
+test-object.cc: test.gob gob2
+       ./gob2 --for-cpp test.gob
index d4e16e4c4a5c66977669a6bb8057e621c28ad1bb..fc33b67a5c003cc52bafa7001c9851180aecab0c 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
 
 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 
 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
@@ -64,8 +64,10 @@ CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 DOINSTGOB = @DOINSTGOB@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 CPPFLAGS = @CPPFLAGS@
 DOINSTGOB = @DOINSTGOB@
 GLIB_CFLAGS = @GLIB_CFLAGS@
-GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_QUERY = @GOBJECT_QUERY@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
 MAINT = @MAINT@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
 MAINT = @MAINT@
@@ -73,6 +75,7 @@ MAKEINFO = @MAKEINFO@
 MV = @MV@
 NOINSTGOB = @NOINSTGOB@
 PACKAGE = @PACKAGE@
 MV = @MV@
 NOINSTGOB = @NOINSTGOB@
 PACKAGE = @PACKAGE@
+PKG_CONFIG = @PKG_CONFIG@
 RM = @RM@
 TAR = @TAR@
 VERSION = @VERSION@
 RM = @RM@
 TAR = @TAR@
 VERSION = @VERSION@
@@ -87,22 +90,22 @@ INCLUDES = @GLIB_CFLAGS@ -I$(includedir)
 
 bin_PROGRAMS = @DOINSTGOB@
 noinst_PROGRAMS = @NOINSTGOB@
 
 bin_PROGRAMS = @DOINSTGOB@
 noinst_PROGRAMS = @NOINSTGOB@
-EXTRA_PROGRAMS = gob
+EXTRA_PROGRAMS = gob2
 
 BUILT_SOURCES = parse.h parse.c lexer.c
 
 
 BUILT_SOURCES = parse.h parse.c lexer.c
 
-gob_SOURCES =          main.c                  main.h                  treefuncs.c             treefuncs.h             out.c                   out.h                   util.c                  util.h                  checks.c                checks.h                parse.y                 lexer.l
+gob2_SOURCES =         main.c                  main.h                  treefuncs.c             treefuncs.h             out.c                   out.h                   util.c                  util.h                  checks.c                checks.h                parse.y                 lexer.l
 
 
 
 
-gob_LDADD =    -lm     $(GLIB_LIBS)    @LEXLIB@
+gob2_LDADD =   -lm     $(GLIB_LIBS)    @LEXLIB@
 
 
 # we might want popt back in the future
 #      @POPT_LIB@
 
 
 
 # we might want popt back in the future
 #      @POPT_LIB@
 
-CLEANFILES =  $(BUILT_SOURCES) gtk-weird-button.* gtk-weird-button-private.h
+CLEANFILES =  $(BUILT_SOURCES) test-object.* test-object-private.h
 
 
-EXTRA_DIST = test.gob generate_treefuncs.pl treefuncs.def
+EXTRA_DIST = $(BUILT_SOURCES) test.gob generate_treefuncs.pl treefuncs.def
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ../config.h
 CONFIG_CLEAN_FILES = 
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ../config.h
 CONFIG_CLEAN_FILES = 
@@ -111,9 +114,9 @@ PROGRAMS =  $(bin_PROGRAMS) $(noinst_PROGRAMS)
 
 DEFS = @DEFS@ -I. -I$(srcdir) -I..
 LIBS = @LIBS@
 
 DEFS = @DEFS@ -I. -I$(srcdir) -I..
 LIBS = @LIBS@
-gob_OBJECTS =  main.o treefuncs.o out.o util.o checks.o parse.o lexer.o
-gob_DEPENDENCIES = 
-gob_LDFLAGS = 
+gob2_OBJECTS =  main.o treefuncs.o out.o util.o checks.o parse.o lexer.o
+gob2_DEPENDENCIES = 
+gob2_LDFLAGS = 
 LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
 LEXLIB = @LEXLIB@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
 LEXLIB = @LEXLIB@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -125,8 +128,8 @@ DIST_COMMON =  Makefile.am Makefile.in lexer.c parse.c
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
 
 GZIP_ENV = --best
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
 
 GZIP_ENV = --best
-SOURCES = $(gob_SOURCES)
-OBJECTS = $(gob_OBJECTS)
+SOURCES = $(gob2_SOURCES)
+OBJECTS = $(gob2_OBJECTS)
 
 all: all-redirect
 .SUFFIXES:
 
 all: all-redirect
 .SUFFIXES:
@@ -192,9 +195,9 @@ distclean-compile:
 
 maintainer-clean-compile:
 
 
 maintainer-clean-compile:
 
-gob: $(gob_OBJECTS) $(gob_DEPENDENCIES)
-       @rm -f gob
-       $(LINK) $(gob_LDFLAGS) $(gob_OBJECTS) $(gob_LDADD) $(LIBS)
+gob2: $(gob2_OBJECTS) $(gob2_DEPENDENCIES)
+       @rm -f gob2
+       $(LINK) $(gob2_LDFLAGS) $(gob2_OBJECTS) $(gob2_LDADD) $(LIBS)
 .l.c:
        $(LEX) $(AM_LFLAGS) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@
 .y.c:
 .l.c:
        $(LEX) $(AM_LFLAGS) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@
 .y.c:
@@ -302,7 +305,7 @@ distdir: $(DISTFILES)
        @for file in $(DISTFILES); do \
          d=$(srcdir); \
          if test -d $$d/$$file; then \
        @for file in $(DISTFILES); do \
          d=$(srcdir); \
          if test -d $$d/$$file; then \
-           cp -pr $$/$$file $(distdir)/$$file; \
+           cp -pr $$d/$$file $(distdir)/$$file; \
          else \
            test -f $(distdir)/$$file \
            || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
          else \
            test -f $(distdir)/$$file \
            || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
@@ -319,14 +322,6 @@ distdir: $(DISTFILES)
              || exit 1; \
          fi; \
        done
              || exit 1; \
          fi; \
        done
-checks.o: checks.c ../config.h treefuncs.h main.h util.h checks.h
-lexer.o: lexer.c ../config.h treefuncs.h parse.h main.h util.h
-main.o: main.c ../config.h treefuncs.h parse.h out.h util.h checks.h \
-       main.h
-out.o: out.c main.h out.h
-parse.o: parse.c ../config.h treefuncs.h main.h util.h
-treefuncs.o: treefuncs.c treefuncs.h
-util.o: util.c ../config.h treefuncs.h main.h util.h
 
 info-am:
 info: info-recursive
 
 info-am:
 info: info-recursive
@@ -417,19 +412,19 @@ parse.h parse.c: parse.y
        test -f y.tab.c && mv -f y.tab.c parse.c
        test -f y.tab.h && mv -f y.tab.h parse.h
 
        test -f y.tab.c && mv -f y.tab.c parse.c
        test -f y.tab.h && mv -f y.tab.h parse.h
 
-test: gtk-weird-button.c gtk-weird-button.h
-       $(CC) -g -Wall `gtk-config --cflags` -c gtk-weird-button.c
+test: test-object.c test-object.h
+       $(CC) -g -Wall `pkg-config --cflags gobject-2.0` -c test-object.c
 
 
-gtk-weird-button.c gtk-weird-button.h: test.gob gob
-       ./gob test.gob
+test-object.c test-object.h: test.gob gob2
+       ./gob2 test.gob
 
 # can't depend on the header file as that would break the above rule
 # since it's just for testing, who cares
 
 # can't depend on the header file as that would break the above rule
 # since it's just for testing, who cares
-testcpp: gtk-weird-button.cc
-       g++ -g -Wall `gtk-config --cflags` -c gtk-weird-button.cc
+testcpp: test-object.cc
+       g++ -g -Wall `pkg-config --cflags gobject-2.0` -c test-object.cc
 
 
-gtk-weird-button.cc: test.gob gob
-       ./gob --for-cpp test.gob
+test-object.cc: test.gob gob2
+       ./gob2 --for-cpp test.gob
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index 062d6357c2e11521ed3cbe1cbdb4dcc5967ea2fb..b30d0f8122c8cf9a292b0078f9b76ba957f0ab2b 100644 (file)
@@ -1,6 +1,7 @@
 /* GOB C Preprocessor
  * Copyright (C) 1999-2000 the Free Software Foundation.
  * Copyright (C) 2000 Eazel, Inc.
 /* GOB C Preprocessor
  * Copyright (C) 1999-2000 the Free Software Foundation.
  * Copyright (C) 2000 Eazel, Inc.
+ * Copyright (C) 2001 George Lebl
  *
  * Author: George Lebl
  *
  *
  * Author: George Lebl
  *
 #include "checks.h"
 
 static void
 #include "checks.h"
 
 static void
-check_duplicate(Class *c, Node *node, const char *id, int line_no,
-               gboolean underscore)
+check_duplicate (Class *c, Node *node, const char *id, int line_no)
 {
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                const char *nid;
                int nline_no;
                const char *nid;
                int nline_no;
-               gboolean here_underscore = FALSE;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
 
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
 
@@ -48,11 +47,8 @@ check_duplicate(Class *c, Node *node, const char *id, int line_no,
                        if(m->method == OVERRIDE_METHOD)
                                continue;
 
                        if(m->method == OVERRIDE_METHOD)
                                continue;
 
-                       nid = get_real_id(m->id);
+                       nid = m->id;
                        nline_no = m->line_no;
                        nline_no = m->line_no;
-
-                       if(m->id[0] == '_' && m->id[1] != '\0')
-                               here_underscore = TRUE;
                } else if(n->type == VARIABLE_NODE) {
                        Variable *v = (Variable *)n;
                        nid = v->id;
                } else if(n->type == VARIABLE_NODE) {
                        Variable *v = (Variable *)n;
                        nid = v->id;
@@ -64,52 +60,40 @@ check_duplicate(Class *c, Node *node, const char *id, int line_no,
                   n->type != node->type ||
                   strcmp(nid, id) != 0)
                        continue;
                   n->type != node->type ||
                   strcmp(nid, id) != 0)
                        continue;
-               /* this can only happen if the things were methods and
-                * one had an underscore and the other one didn't */
-               if( ! no_kill_underscores && underscore != here_underscore)
-                       error_printf(GOB_ERROR, nline_no,
-                                    "symbol '%s' ('_%s') redefined, "
-                                    "first defined on line %d. "
-                                    "Note that '%s' and '_%s' are "
-                                    "eqivalent.",
-                                    id, id, line_no, id, id);
-               else
-                       error_printf(GOB_ERROR, nline_no,
-                                    "symbol '%s' redefined, "
-                                    "first defined on line %d",
-                                    id, line_no);
+
+               error_printf (GOB_ERROR, nline_no,
+                             "symbol '%s' redefined, "
+                             "first defined on line %d",
+                             id, line_no);
        }
 }
 
 void
        }
 }
 
 void
-check_duplicate_symbols(Class *c)
+check_duplicate_symbols (Class *c)
 {
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
-               if(n->type == METHOD_NODE) {
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+
+               if (n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        Method *m = (Method *)n;
-                       gboolean underscore = FALSE;
                        /* override methods are checked separately */
                        /* override methods are checked separately */
-                       if(m->method == OVERRIDE_METHOD)
-                               continue;
-                       if(m->id[0] == '_' && m->id[1] != '\0')
-                               underscore = TRUE;
-                       check_duplicate(c, n, get_real_id(m->id), m->line_no,
-                                       underscore);
-               } else if(n->type == VARIABLE_NODE) {
+                       if (m->method != OVERRIDE_METHOD) {
+                               check_duplicate (c, n, m->id, m->line_no);
+                       }
+               } else if (n->type == VARIABLE_NODE) {
                        Variable *v = (Variable *)n;
                        Variable *v = (Variable *)n;
-                       check_duplicate(c, n, v->id, v->line_no, FALSE);
+                       check_duplicate (c, n, v->id, v->line_no);
                }
        }
 }
 
 static void
                }
        }
 }
 
 static void
-check_duplicate_override(Class *c, Method *method)
+check_duplicate_override (Class *c, Method *method)
 {
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                Method *m = (Method *)n;
                if(n->type != METHOD_NODE ||
                   m->method != OVERRIDE_METHOD)
                Method *m = (Method *)n;
                if(n->type != METHOD_NODE ||
                   m->method != OVERRIDE_METHOD)
@@ -117,22 +101,22 @@ check_duplicate_override(Class *c, Method *method)
 
                if(method == m ||
                   method->line_no > m->line_no ||
 
                if(method == m ||
                   method->line_no > m->line_no ||
-                  strcmp(get_real_id(m->id), get_real_id(method->id)) != 0 ||
+                  strcmp(m->id, method->id) != 0 ||
                   strcmp(m->otype, method->otype) != 0)
                        continue;
                error_printf(GOB_ERROR, m->line_no,
                             "override '%s(%s)' redefined, "
                             "first defined on line %d",
                   strcmp(m->otype, method->otype) != 0)
                        continue;
                error_printf(GOB_ERROR, m->line_no,
                             "override '%s(%s)' redefined, "
                             "first defined on line %d",
-                            get_real_id(m->id), m->otype, method->line_no);
+                            m->id, m->otype, method->line_no);
        }
 }
 
 void
 check_duplicate_overrides(Class *c)
 {
        }
 }
 
 void
 check_duplicate_overrides(Class *c)
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                Method *m = (Method *)n;
                if(n->type != METHOD_NODE ||
                   m->method != OVERRIDE_METHOD)
                Method *m = (Method *)n;
                if(n->type != METHOD_NODE ||
                   m->method != OVERRIDE_METHOD)
@@ -144,15 +128,16 @@ check_duplicate_overrides(Class *c)
 void
 check_bad_symbols(Class *c)
 {
 void
 check_bad_symbols(Class *c)
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if((m->method == SIGNAL_LAST_METHOD ||
                            m->method == SIGNAL_FIRST_METHOD ||
                            m->method == VIRTUAL_METHOD) &&
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if((m->method == SIGNAL_LAST_METHOD ||
                            m->method == SIGNAL_FIRST_METHOD ||
                            m->method == VIRTUAL_METHOD) &&
-                          (strcmp(m->id, "__parent__")==0 ||
+                          (strcmp(m->id, "_epv")==0 ||
+                           strcmp(m->id, "__parent__")==0 ||
                            strcmp(m->id, "___parent__")==0)) {
                                error_printf(GOB_ERROR, m->line_no,
                                             "'%s' not allowed as an "
                            strcmp(m->id, "___parent__")==0)) {
                                error_printf(GOB_ERROR, m->line_no,
                                             "'%s' not allowed as an "
@@ -162,8 +147,8 @@ check_bad_symbols(Class *c)
                        }
                        if(m->method != INIT_METHOD &&
                           m->method != CLASS_INIT_METHOD &&
                        }
                        if(m->method != INIT_METHOD &&
                           m->method != CLASS_INIT_METHOD &&
-                          (strcmp(get_real_id(m->id), "init")==0 ||
-                           strcmp(get_real_id(m->id), "class_init")==0)) {
+                          (strcmp(m->id, "init")==0 ||
+                           strcmp(m->id, "class_init")==0)) {
                                error_print(GOB_ERROR, m->line_no,
                                            "init, or class_init not "
                                            "allowed as an "
                                error_print(GOB_ERROR, m->line_no,
                                            "init, or class_init not "
                                            "allowed as an "
@@ -183,54 +168,63 @@ check_bad_symbols(Class *c)
 }
 
 static void
 }
 
 static void
-check_duplicate_named(Class *c, Node *node, const char *id, int line_no)
+check_duplicate_named (Class *c, Node *node, const char *id, int line_no)
 {
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                const char *nid;
                int nline_no;
                const char *nid;
                int nline_no;
-               if(n->type == METHOD_NODE) {
+               if (n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        Method *m = (Method *)n;
-                       if(m->method == SIGNAL_LAST_METHOD ||
-                          m->method == SIGNAL_FIRST_METHOD) {
-                               nid = get_real_id(m->id);
+                       if (m->method == SIGNAL_LAST_METHOD ||
+                           m->method == SIGNAL_FIRST_METHOD) {
+                               nid = m->id;
                                nline_no = m->line_no;
                                nline_no = m->line_no;
-                       } else
+                       } else {
                                continue;
                                continue;
-               } else if(n->type == ARGUMENT_NODE) {
+                       }
+               } else if (n->type == ARGUMENT_NODE) {
                        Argument *a = (Argument *)n;
                        nid = a->name;
                        nline_no = a->line_no;
                        Argument *a = (Argument *)n;
                        nid = a->name;
                        nline_no = a->line_no;
-               } else
+               } else if (n->type == PROPERTY_NODE) {
+                       Property *p = (Property *)n;
+                       nid = p->name;
+                       nline_no = p->line_no;
+               } else {
                        continue;
                        continue;
-               if(n == node ||
-                  line_no >= nline_no ||
-                  g_strcasecmp(nid, id)!=0)
+               }
+               if (n == node ||
+                   line_no >= nline_no ||
+                   g_strcasecmp (nid, id) != 0)
                        continue;
                        continue;
-               error_printf(GOB_ERROR, nline_no,
-                            "named symbol (argument or signal) '%s' "
-                            "redefined, first defined on line %d "
-                            "(case insensitive)",
-                            id, line_no);
+               error_printf (GOB_ERROR, nline_no,
+                             "named symbol (argument or signal) '%s' "
+                             "redefined, first defined on line %d "
+                             "(case insensitive)",
+                             id, line_no);
        }
 }
 
 void
        }
 }
 
 void
-check_duplicate_signals_args(Class *c)
+check_duplicate_signals_args (Class *c)
 {
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
-               if(n->type == METHOD_NODE) {
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               if (n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->method == SIGNAL_LAST_METHOD ||
                           m->method == SIGNAL_FIRST_METHOD)
                        Method *m = (Method *)n;
                        if(m->method == SIGNAL_LAST_METHOD ||
                           m->method == SIGNAL_FIRST_METHOD)
-                               check_duplicate_named(c, n, get_real_id(m->id),
-                                                     m->line_no);
-               } else if(n->type == ARGUMENT_NODE) {
+                               check_duplicate_named (c, n, m->id,
+                                                      m->line_no);
+               } else if (n->type == PROPERTY_NODE) {
+                       Property *p = (Property *)n;
+                       check_duplicate_named (c, n, p->name, p->line_no);
+               } else if (n->type == ARGUMENT_NODE) {
                        Argument *a = (Argument *)n;
                        Argument *a = (Argument *)n;
-                       check_duplicate_named(c, n, a->name, a->line_no);
+                       check_duplicate_named (c, n, a->name, a->line_no);
                }
        }
 }
                }
        }
 }
@@ -238,12 +232,12 @@ check_duplicate_signals_args(Class *c)
 void
 check_public_new(Class *c)
 {
 void
 check_public_new(Class *c)
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
-                       if((strcmp(get_real_id(m->id), "new")==0) &&
+                       if((strcmp(m->id, "new")==0) &&
                           (m->method != REGULAR_METHOD ||
                            m->scope != PUBLIC_SCOPE))
                                error_print(GOB_WARN, m->line_no,
                           (m->method != REGULAR_METHOD ||
                            m->scope != PUBLIC_SCOPE))
                                error_print(GOB_WARN, m->line_no,
@@ -256,9 +250,9 @@ check_public_new(Class *c)
 void
 check_vararg(Class *c)
 {
 void
 check_vararg(Class *c)
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if( ! m->vararg)
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if( ! m->vararg)
@@ -279,9 +273,9 @@ check_vararg(Class *c)
 void
 check_firstarg(Class *c)
 {
 void
 check_firstarg(Class *c)
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->args)
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->args)
@@ -302,7 +296,7 @@ void
 check_nonvoidempty(Class *c)
 {
        GList *li;
 check_nonvoidempty(Class *c)
 {
        GList *li;
-       for(li = c->nodes; li != NULL; li = g_list_next(li)) {
+       for(li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
@@ -327,10 +321,10 @@ check_nonvoidempty(Class *c)
 }
 
 void
 }
 
 void
-check_signal_args(Class *c)
+check_signal_args (Class *c)
 {
        GList *li;
 {
        GList *li;
-       for(li = c->nodes; li != NULL; li = g_list_next(li)) {
+       for (li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
@@ -339,39 +333,54 @@ check_signal_args(Class *c)
                           m->method != SIGNAL_FIRST_METHOD)
                                continue;
 
                           m->method != SIGNAL_FIRST_METHOD)
                                continue;
 
-                       for(l=m->gtktypes;l;l=l->next) {
-                               if(get_cast(l->data, FALSE))
+                       for (l = m->gtktypes; l != NULL; l = l->next) {
+                               if (get_cast (l->data, FALSE))
                                        continue;
                                        continue;
-                               error_printf(GOB_ERROR, m->line_no,
-                                            "Unknown GTK+ type '%s' "
-                                            "among signal types",
-                                            (char *)l->data);
+                               error_printf (GOB_ERROR, m->line_no,
+                                             "Unknown GTK+ type '%s' "
+                                             "among signal types",
+                                             (char *)l->data);
                        }
                }
        }
 }
 
 void
                        }
                }
        }
 }
 
 void
-check_argument_types(Class *c)
+check_argument_types (Class *c)
 {
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == ARGUMENT_NODE) {
                        Argument *a = (Argument *)n;
                        if(get_cast(a->gtktype, FALSE))
                                continue;
                if(n->type == ARGUMENT_NODE) {
                        Argument *a = (Argument *)n;
                        if(get_cast(a->gtktype, FALSE))
                                continue;
-                       /* this could perhaps be a warning, but
-                          can there really be a type beyond the
-                          fundementals? */
                        error_printf(GOB_ERROR, a->line_no,
                        error_printf(GOB_ERROR, a->line_no,
-                                    "Unknown GTK+ type '%s' "
+                                    "Unknown GLib type '%s' "
                                     "as argument type",
                                     a->gtktype);
                }
        }
 }
 
                                     "as argument type",
                                     a->gtktype);
                }
        }
 }
 
+void
+check_property_types (Class *c)
+{
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               if (n->type == PROPERTY_NODE) {
+                       Property *p = (Property *)n;
+                       if (get_cast (p->gtktype, FALSE))
+                               continue;
+                       error_printf (GOB_ERROR, p->line_no,
+                                     "Unknown GLib type '%s' "
+                                     "as property type",
+                                     p->gtktype);
+               }
+       }
+}
+
 static void
 check_func_arg_check_func_arg(Method *m, FuncArg *fa)
 {
 static void
 check_func_arg_check_func_arg(Method *m, FuncArg *fa)
 {
@@ -388,7 +397,7 @@ check_func_arg_check_func_arg(Method *m, FuncArg *fa)
                return;
        }
        
                return;
        }
        
-       for(li = fa->checks; li; li = g_list_next(li)) {
+       for(li = fa->checks; li; li = li->next) {
                Check *ch = li->data;
                if(ch->chtype == TYPE_CHECK) {
                        char *p;
                Check *ch = li->data;
                if(ch->chtype == TYPE_CHECK) {
                        char *p;
@@ -437,7 +446,7 @@ static void
 check_func_arg_check_method(Method *m)
 {
        GList *li;
 check_func_arg_check_method(Method *m)
 {
        GList *li;
-       for(li = m->args; li; li = g_list_next(li)) {
+       for(li = m->args; li; li = li->next) {
                FuncArg *fa = li->data;
                check_func_arg_check_func_arg(m, fa);
        }
                FuncArg *fa = li->data;
                check_func_arg_check_func_arg(m, fa);
        }
@@ -447,7 +456,7 @@ void
 check_func_arg_checks(Class *c)
 {
        GList *li;
 check_func_arg_checks(Class *c)
 {
        GList *li;
-       for(li = c->nodes; li != NULL; li = g_list_next(li)) {
+       for(li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
@@ -460,9 +469,9 @@ int
 count_signals(Class *c)
 {
        int num = 0;
 count_signals(Class *c)
 {
        int num = 0;
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->method == SIGNAL_LAST_METHOD ||
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->method == SIGNAL_LAST_METHOD ||
@@ -473,12 +482,43 @@ count_signals(Class *c)
        return num;
 }
 
        return num;
 }
 
+int
+count_set_properties (Class *c)
+{
+       int num = 0;
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               Property *p = li->data;
+               if (n->type == PROPERTY_NODE &&
+                   p->set != NULL)
+                       num ++;
+       }
+       return num;
+}
+
+int
+count_get_properties (Class *c)
+{
+       int num = 0;
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               Property *p = li->data;
+               if (n->type == PROPERTY_NODE &&
+                   p->get != NULL)
+                       num ++;
+       }
+       return num;
+}
+
+
 int
 count_set_arguments(Class *c)
 {
        int num = 0;
        GList *li;
 int
 count_set_arguments(Class *c)
 {
        int num = 0;
        GList *li;
-       for(li = c->nodes; li != NULL; li = g_list_next(li)) {
+       for(li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
                Argument *a = li->data;
                if(n->type == ARGUMENT_NODE &&
                Node *n = li->data;
                Argument *a = li->data;
                if(n->type == ARGUMENT_NODE &&
@@ -493,7 +533,7 @@ count_get_arguments(Class *c)
 {
        int num = 0;
        GList *li;
 {
        int num = 0;
        GList *li;
-       for(li = c->nodes; li != NULL; li = g_list_next(li)) {
+       for(li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
                Argument *a = li->data;
                if(n->type == ARGUMENT_NODE &&
                Node *n = li->data;
                Argument *a = li->data;
                if(n->type == ARGUMENT_NODE &&
@@ -507,9 +547,9 @@ int
 count_overrides(Class *c)
 {
        int num = 0;
 count_overrides(Class *c)
 {
        int num = 0;
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->method == OVERRIDE_METHOD)
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->method == OVERRIDE_METHOD)
@@ -523,9 +563,9 @@ int
 count_privates(Class *c)
 {
        int num = 0;
 count_privates(Class *c)
 {
        int num = 0;
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == VARIABLE_NODE) {
                        Variable *v = (Variable *)n;
                        if(v->scope == PRIVATE_SCOPE)
                if(n->type == VARIABLE_NODE) {
                        Variable *v = (Variable *)n;
                        if(v->scope == PRIVATE_SCOPE)
@@ -536,12 +576,12 @@ count_privates(Class *c)
 }
 
 int
 }
 
 int
-count_protecteds(Class *c)
+count_protecteds (Class *c)
 {
        int num = 0;
 {
        int num = 0;
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->scope == PROTECTED_SCOPE)
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->scope == PROTECTED_SCOPE)
@@ -552,15 +592,16 @@ count_protecteds(Class *c)
 }
 
 int
 }
 
 int
-count_destructors(Class *c)
+count_unreftors (Class *c)
 {
        int num = 0;
 {
        int num = 0;
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
-               if(n->type == VARIABLE_NODE) {
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               if (n->type == VARIABLE_NODE) {
                        Variable *v = (Variable *)n;
                        Variable *v = (Variable *)n;
-                       if(v->destructor)
+                       if (v->destructor != NULL &&
+                           v->destructor_unref)
                                num++;
                }
        }
                                num++;
                }
        }
@@ -568,15 +609,32 @@ count_destructors(Class *c)
 }
 
 int
 }
 
 int
-count_initializers(Class *c)
+count_destructors (Class *c)
 {
        int num = 0;
 {
        int num = 0;
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
-               if(n->type == VARIABLE_NODE) {
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               if (n->type == VARIABLE_NODE) {
+                       Variable *v = (Variable *)n;
+                       if (v->destructor != NULL &&
+                           ! v->destructor_unref)
+                               num++;
+               }
+       }
+       return num;
+}
+
+int
+count_initializers (Class *c)
+{
+       int num = 0;
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               if (n->type == VARIABLE_NODE) {
                        Variable *v = (Variable *)n;
                        Variable *v = (Variable *)n;
-                       if(v->initializer)
+                       if (v->initializer != NULL)
                                num++;
                }
        }
                                num++;
                }
        }
@@ -586,12 +644,12 @@ count_initializers(Class *c)
 gboolean
 find_get_type (Class *c)
 {
 gboolean
 find_get_type (Class *c)
 {
-       GList *l;
-       for(l = c->nodes; l != NULL; l = g_list_next(l)) {
-               Node *n = l->data;
+       GList *li;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                Method *m = (Method *)n;
                Method *m = (Method *)n;
-               if(n->type == METHOD_NODE &&
-                  strcmp (m->id, "get_type") == 0) {
+               if (n->type == METHOD_NODE &&
+                   strcmp (m->id, "get_type") == 0) {
                        if (m->method != REGULAR_METHOD ||
                            m->scope != PUBLIC_SCOPE ||
                            m->args != NULL) {
                        if (m->method != REGULAR_METHOD ||
                            m->scope != PUBLIC_SCOPE ||
                            m->args != NULL) {
index 7966f17cebf6ce690b10932556fbe2b5e54651a9..4d12b38e38232edb5836d5980de5959dd8b5e0ce 100644 (file)
@@ -1,6 +1,7 @@
 /* GOB C Preprocessor
  * Copyright (C) 1999-2000 the Free Software Foundation.
  * Copyright (C) 2000 Eazel, Inc.
 /* GOB C Preprocessor
  * Copyright (C) 1999-2000 the Free Software Foundation.
  * Copyright (C) 2000 Eazel, Inc.
+ * Copyright (C) 2001 George Lebl
  *
  * Author: George Lebl
  *
  *
  * Author: George Lebl
  *
  * USA.
  */
 
  * USA.
  */
 
-#ifndef _CHECKS_H_
-#define _CHECKS_H_
+#ifndef CHECKS_H
+#define CHECKS_H
 
 
-void check_duplicate_symbols(Class *c);
-void check_duplicate_overrides(Class *c);
-void check_bad_symbols(Class *c);
-void check_duplicate_signals_args(Class *c);
-void check_public_new(Class *c);
-void check_vararg(Class *c);
-void check_firstarg(Class *c);
-void check_nonvoidempty(Class *c);
-void check_signal_args(Class *c);
-void check_argument_types(Class *c);
-void check_func_arg_checks(Class *c);
+void           check_duplicate_symbols         (Class *c);
+void           check_duplicate_overrides       (Class *c);
+void           check_bad_symbols               (Class *c);
+void           check_duplicate_signals_args    (Class *c);
+void           check_public_new                (Class *c);
+void           check_vararg                    (Class *c);
+void           check_firstarg                  (Class *c);
+void           check_nonvoidempty              (Class *c);
+void           check_signal_args               (Class *c);
+void           check_argument_types            (Class *c);
+void           check_property_types            (Class *c);
+void           check_func_arg_checks           (Class *c);
 
 
-int count_signals(Class *c);
-int count_set_arguments(Class *c);
-int count_get_arguments(Class *c);
-int count_overrides(Class *c);
-int count_privates(Class *c);
-int count_protecteds(Class *c);
-int count_destructors(Class *c);
-int count_initializers(Class *c);
-gboolean find_get_type (Class *c);
+int            count_signals                   (Class *c);
+int            count_set_properties            (Class *c);
+int            count_get_properties            (Class *c);
+int            count_set_arguments             (Class *c);
+int            count_get_arguments             (Class *c);
+int            count_overrides                 (Class *c);
+int            count_privates                  (Class *c);
+int            count_protecteds                (Class *c);
+int            count_unreftors                 (Class *c);
+int            count_destructors               (Class *c);
+int            count_initializers              (Class *c);
+gboolean       find_get_type                   (Class *c);
 
 #endif
 
 #endif
index de6c4b6832819fa2dc9c69642f769eeb2cb548f6..31d9151beb0106c18e3f99ea2b1dbd1b53b19b7c 100755 (executable)
@@ -1,8 +1,8 @@
 #!/usr/bin/perl -w
 
 #!/usr/bin/perl -w
 
-open(FILE, "treefuncs.def") || die("Can't open treefuncs.def");
-open(OUTC, ">treefuncs.c") || die("Can't open treefuncs.c");
-open(OUTH, ">treefuncs.h") || die("Can't open treefuncs.h");
+open (FILE, "treefuncs.def") || die ("Can't open treefuncs.def");
+open (OUTC, ">treefuncs.c") || die ("Can't open treefuncs.c");
+open (OUTH, ">treefuncs.h") || die ("Can't open treefuncs.h");
 
 print OUTC  "/* Generated by generate_treefuncs.pl from treefuncs.def!\n";
 print OUTC " * Do not edit by hand! */\n\n";
 
 print OUTC  "/* Generated by generate_treefuncs.pl from treefuncs.def!\n";
 print OUTC " * Do not edit by hand! */\n\n";
@@ -14,37 +14,36 @@ $typeenums = "enum {\n";
 
 $typename = "";
 %typestruct = ();
 
 $typename = "";
 %typestruct = ();
-%newfunc = ();
-%newfunc_prot = ();
 %freefunc = ();
 %freefunc_prot = ();
 %copyfunc = ();
 %copyfunc_prot = ();
 %freefunc = ();
 %freefunc_prot = ();
 %copyfunc = ();
 %copyfunc_prot = ();
+%setfunc = ();
+%setfunc_prot = ();
+
+$quarks = "static gboolean quarks_set_up = FALSE;\n" .
+       "static GHashTable *quark_ht;\n" .
+       "enum {\n\tQUARK_0,\n";
+$setupquarks = "static void\nensure_quarks (void)\n{\n" .
+               "\tif (quarks_set_up)\n\t\treturn;\n" .
+               "\tquark_ht = g_hash_table_new (g_str_hash, g_str_equal);\n" .
+               "\tquarks_set_up = TRUE;\n";
+%got_quarks = ();
 
 $var = "";
 $type = "";
 $copy = "";
 $free = "";
 
 $var = "";
 $type = "";
 $copy = "";
 $free = "";
+$steal = 0;
 
 $headercode = "";
 
 $inheadercode = 0;
 
 
 $headercode = "";
 
 $inheadercode = 0;
 
-$vars = 0;
-
 sub end_var {
        $typestruct{$typename} .= "\t$type $var;\n";
 
 sub end_var {
        $typestruct{$typename} .= "\t$type $var;\n";
 
-       if($vars == 0) {
-               $newfunc_prot{$typename} .= "$type $var";
-       } else {
-               $newfunc_prot{$typename} .= ", $type $var";
-       }
-       $vars++;
-
-       $newfunc{$typename} .= "\tself->$var = $var;\n";
-
-       if($copy ne "") {
+       if ($copy ne "") {
                $tmp = $copy;
                $tmp =~ s/__VAL__/self->$var/g;
                $tmp =~ s/__LVAL__/new->$var/g;
                $tmp = $copy;
                $tmp =~ s/__VAL__/self->$var/g;
                $tmp =~ s/__LVAL__/new->$var/g;
@@ -52,16 +51,58 @@ sub end_var {
        } else {
                $copyfunc{$typename} .= "\tnew->$var = self->$var;\n";
        }
        } else {
                $copyfunc{$typename} .= "\tnew->$var = self->$var;\n";
        }
-       if($free ne "") {
+       if ($free ne "") {
                $tmp = $free;
                $tmp =~ s/__VAL__/self->$var/g;
                $freefunc{$typename} .= "\t$tmp\n";
        }
                $tmp = $free;
                $tmp =~ s/__VAL__/self->$var/g;
                $freefunc{$typename} .= "\t$tmp\n";
        }
+
+       if ( ! $got_quarks{$var}) {
+               $quarks .= "\tQUARK_$var,\n";
+               $setupquarks .= "\tg_hash_table_insert (quark_ht, \"$var\", " .
+                       "GINT_TO_POINTER (QUARK_$var));\n";
+               $got_quarks{$var} = 1;
+       }
+       if ($steal && ! $got_quarks{$var . ":steal"}) {
+               $quarks .= "\tQUARK_$var" . "_STEAL,\n";
+               $setupquarks .= "\tg_hash_table_insert (quark_ht, \"$var" .
+                       ":steal\", " .
+                       "GINT_TO_POINTER (QUARK_$var" . "_STEAL));\n";
+               $got_quarks{$var . ":steal"} = 1;
+       }
+
+       $setfunc{$typename} .= "\t\tcase QUARK_$var: {\n";
+       $setfunc{$typename} .= "\t\t\t$type $var = va_arg (__ap, $type);\n";
+       if ($free ne "") {
+               $setfunc{$typename} .= "\t\t\t$type __old_value = self->$var;\n";
+       }
+
+       if ($copy ne "") {
+               $tmp = $copy;
+               $tmp =~ s/__VAL__/$var/g;
+               $tmp =~ s/__LVAL__/self->$var/g;
+               $setfunc{$typename} .= "\t\t\t$tmp\n";
+       } else {
+               $setfunc{$typename} .= "\t\t\tself->$var = $var;\n";
+       }
+       if ($free ne "") {
+               $tmp = $free;
+               $tmp =~ s/__VAL__/__old_value/g;
+               $setfunc{$typename} .= "\t\t\t$tmp\n";
+       }
+       $setfunc{$typename} .= "\t\t\tbreak;\n\t\t}\n";
+
+       if ($steal) {
+               $setfunc{$typename} .= "\t\tcase QUARK_$var" . "_STEAL: {\n";
+               $setfunc{$typename} .= "\t\t\t$type $var = va_arg (__ap, $type);\n";
+               $setfunc{$typename} .= "\t\t\tself->$var = $var;\n";
+               $setfunc{$typename} .= "\t\t\tbreak;\n\t\t}\n";
+       }
 }
 
 }
 
-while(<FILE>) {
-       if($inheadercode) {
-               if(/^ENDHEADER$/) {
+while (<FILE>) {
+       if ($inheadercode) {
+               if (/^ENDHEADER$/) {
                        $inheadercode = 0;
                        next;
                }
                        $inheadercode = 0;
                        next;
                }
@@ -71,117 +112,132 @@ while(<FILE>) {
                
        s/#.*$//;
 
                
        s/#.*$//;
 
-       if(/^[ \t]*HEADER[ \t]*$/) {
+       if (/^[ \t]*HEADER[ \t]*$/) {
                $inheadercode = 1;
                next;
        }
 
                $inheadercode = 1;
                next;
        }
 
-       if(/^[ \t]*CLASS[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
+       if (/^[ \t]*CLASS[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
                $typename = $1;
                $lct = lc $typename;
                $uct = uc $typename;
 
                $typename = $1;
                $lct = lc $typename;
                $uct = uc $typename;
 
-               $vars = 0;
-
                $typeenums .= "\t$uct"."_NODE,\n";
 
                $typedefs .= "typedef struct _$typename $typename;\n";
 
                $typeenums .= "\t$uct"."_NODE,\n";
 
                $typedefs .= "typedef struct _$typename $typename;\n";
 
-               $typestruct{$typename} = "struct _$typename {\n\tint type;\n";
-               $newfunc_prot{$typename} = "Node * new_$lct (";
-               $copyfunc_prot{$typename} = "$typename * copy_$lct ($typename * self)";
-               $freefunc_prot{$typename} = "void free_$lct ($typename * self)";
-
-               $newfunc{$typename} = "{\n" .
-                                       "\t$typename * self = g_new0($typename, 1);\n" .
-                                       "\tself->type = $uct"."_NODE;\n";
+               $typestruct{$typename} = "struct _$typename {\n\tNodeType type;\n";
+               $copyfunc_prot{$typename} = "static $typename *\ncopy_$lct ($typename * self)";
+               $setfunc_prot{$typename} = "static void\nsetv_$lct ($typename * self, va_list __ap)";
+               $freefunc_prot{$typename} = "void\nfree_$lct ($typename * self)";
+
+               $setfunc{$typename} = "{\n" .
+                       "\tint quark;\n" .
+                       "\tconst char *arg;\n" .
+                       "\tensure_quarks ();\n" .
+                       "\twhile ((arg = va_arg (__ap, char *)) != NULL) {\n" .
+                       "\t\tquark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));\n" .
+                       "\t\tswitch (quark) {\n";
                $copyfunc{$typename} = "{\n" .
                                        "\t$typename * new;\n" .
                $copyfunc{$typename} = "{\n" .
                                        "\t$typename * new;\n" .
-                                       "\tg_return_val_if_fail(self != NULL, NULL);\n" .
-                                       "\tg_return_val_if_fail(self->type == $uct"."_NODE, NULL);\n" .
+                                       "\tg_return_val_if_fail (self != NULL, NULL);\n" .
+                                       "\tg_return_val_if_fail (self->type == $uct"."_NODE, NULL);\n" .
                                        "\tnew = g_new0($typename, 1);\n" .
                                        "\tnew->type = $uct"."_NODE;\n";
                                        "\tnew = g_new0($typename, 1);\n" .
                                        "\tnew->type = $uct"."_NODE;\n";
-               $freefunc{$typename} = "{\n\tg_return_if_fail(self != NULL);\n" .
-                                       "\tg_return_if_fail(self->type == $uct"."_NODE);\n";
+               $freefunc{$typename} = "{\n\tg_return_if_fail (self != NULL);\n" .
+                                       "\tg_return_if_fail (self->type == $uct"."_NODE);\n";
 
                next;
        }
 
        #ignore everything until we get some typename
 
                next;
        }
 
        #ignore everything until we get some typename
-       if($typename eq "") {
+       if ($typename eq "") {
                next;
        }
        
        #some predefined VARIABLE types
                next;
        }
        
        #some predefined VARIABLE types
-       if(/^[ \t]*INT[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
+       if (/^[ \t]*INT[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
                $var = $1;
                $type = "int";
                $copy = "__LVAL__ = __VAL__;";
                $free = "";
                $var = $1;
                $type = "int";
                $copy = "__LVAL__ = __VAL__;";
                $free = "";
+               $steal = 0;
                end_var;
                next;
                end_var;
                next;
-       } elsif(/^[ \t]*BOOL[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
+       } elsif (/^[ \t]*BOOL[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
                $var = $1;
                $type = "gboolean";
                $copy = "__LVAL__ = __VAL__;";
                $free = "";
                $var = $1;
                $type = "gboolean";
                $copy = "__LVAL__ = __VAL__;";
                $free = "";
+               $steal = 0;
                end_var;
                next;
                end_var;
                next;
-       } elsif(/^[ \t]*STRING[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
+       } elsif (/^[ \t]*STRING[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
                $var = $1;
                $type = "char *";
                $var = $1;
                $type = "char *";
-               $copy = "__LVAL__ = g_strdup(__VAL__);";
-               $free = "g_free(__VAL__);";
+               $copy = "__LVAL__ = g_strdup (__VAL__);";
+               $free = "g_free (__VAL__);";
+               $steal = 1;
                end_var;
                next;
                end_var;
                next;
-       } elsif(/^[ \t]*STRINGLIST[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
+       } elsif (/^[ \t]*STRINGLIST[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
                $var = $1;
                $type = "GList *";
                $var = $1;
                $type = "GList *";
-               $copy = "__LVAL__ = g_list_copy(__VAL__); COPY_LIST_VALS(__LVAL__, g_strdup);";
-               $free = "g_list_foreach(__VAL__, (GFunc)g_free, NULL); g_list_free(__VAL__);";
+               $copy = "__LVAL__ = g_list_copy (__VAL__); COPY_LIST_VALS(__LVAL__, g_strdup);";
+               $free = "g_list_foreach (__VAL__, (GFunc)g_free, NULL); g_list_free (__VAL__);";
+               $steal = 1;
                end_var;
                next;
                end_var;
                next;
-       } elsif(/^[ \t]*NODELIST[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
+       } elsif (/^[ \t]*NODELIST[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
                $var = $1;
                $type = "GList *";
                $var = $1;
                $type = "GList *";
-               $copy = "__LVAL__ = copy_node_list(__VAL__);";
-               $free = "free_node_list(__VAL__);";
+               $copy = "__LVAL__ = node_list_copy (__VAL__);";
+               $free = "node_list_free (__VAL__);";
+               $steal = 1;
                end_var;
                next;
        #We assume one of the classes we are creating is named Type
                end_var;
                next;
        #We assume one of the classes we are creating is named Type
-       } elsif(/^[ \t]*TYPE[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
+       } elsif (/^[ \t]*TYPE[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
                $var = $1;
                $type = "Type *";
                $var = $1;
                $type = "Type *";
-               $copy = "__LVAL__ = copy_type(__VAL__);";
-               $free = "free_type(__VAL__);";
+               $copy = "__LVAL__ = copy_type (__VAL__);";
+               $free = "free_type (__VAL__);";
+               $steal = 1;
                end_var;
                next;
        #generic variable type
                end_var;
                next;
        #generic variable type
-       } elsif(/^[ \t]*VAR[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
+       } elsif (/^[ \t]*VAR[ \t]+([_A-Za-z][A-Za-z_0-9]+)[ \t]*$/) {
                $var = $1;
                $type = "int";
                $copy = "__LVAL__ = __VAL__;";
                $free = "";
                $var = $1;
                $type = "int";
                $copy = "__LVAL__ = __VAL__;";
                $free = "";
+               $steal = 0;
                next;
                next;
-       } elsif(/^[ \t]*CTYPE[ \t]+(.+)[ \t]*$/) {
+       } elsif (/^[ \t]*CTYPE[ \t]+(.+)[ \t]*$/) {
                $type = $1;
                next;
                $type = $1;
                next;
-       } elsif(/^[ \t]*COPY[ \t]+(.+)$/) {
+       } elsif (/^[ \t]*COPY[ \t]+(.+)$/) {
                $copy = $1;
                $copy = $1;
+               $steal = 1;
                next;
                next;
-       } elsif(/^[ \t]*FREE[ \t]+(.+)$/) {
+       } elsif (/^[ \t]*FREE[ \t]+(.+)$/) {
                $free = $1;
                $free = $1;
+               $steal = 1;
                next;
                next;
-       } elsif(/^[ \t]*ENDVAR[ \t]*$/) {
+       } elsif (/^[ \t]*ENDVAR[ \t]*$/) {
                end_var;
                next;
                end_var;
                next;
-       } elsif(/^[ \t]*ENDCLASS[ \t]*$/) {
+       } elsif (/^[ \t]*ENDCLASS[ \t]*$/) {
                $typestruct{$typename} .= "};";
                $typestruct{$typename} .= "};";
-               $newfunc_prot{$typename} .= ")";
 
 
-               $newfunc{$typename} .= "\treturn (Node *)self;\n}";
                $copyfunc{$typename} .= "\treturn new;\n}";
                $copyfunc{$typename} .= "\treturn new;\n}";
-               $freefunc{$typename} .= "\tg_free(self);\n}";
+               $freefunc{$typename} .= "\tg_free (self);\n}";
+               $setfunc{$typename} .= "\t\tdefault:\n" .
+                       "\t\t\tg_warning (\"Argument named '" . $typename . "::\%s' does not exist\", arg);\n" .
+                       "\t\t\tbreak;\n" .
+                       "\t\t}\n" .
+                       "\t}\n" .
+                       "}";
                $typename = "";
                next;
        } else {
                $typename = "";
                next;
        } else {
@@ -191,10 +247,11 @@ while(<FILE>) {
 
 $typeenums .= "\tLAST_NODE_TYPE\n};";
 
 
 $typeenums .= "\tLAST_NODE_TYPE\n};";
 
-print OUTH "\n#ifndef _TREEFUNCS_H_\n";
-print OUTH "\n#define _TREEFUNCS_H_\n";
+print OUTH "\n#ifndef TREEFUNCS_H\n";
+print OUTH "#define TREEFUNCS_H\n";
 
 print OUTH "\n$headercode\n\n";
 
 print OUTH "\n$headercode\n\n";
+print OUTH "typedef long NodeType;\n";
 print OUTH "$typeenums\n\n";
 print OUTH "$typedefs\n\n";
 
 print OUTH "$typeenums\n\n";
 print OUTH "$typedefs\n\n";
 
@@ -202,11 +259,11 @@ foreach $t (sort keys %typestruct) {
        print OUTH "$typestruct{$t}\n\n";
 }
 
        print OUTH "$typestruct{$t}\n\n";
 }
 
-print OUTH "union _Node {\n\tint type;\n";
+print OUTH "union _Node {\n\tNodeType type;\n";
 
 foreach $t (sort keys %typestruct) {
        $foo = lc $t;
 
 foreach $t (sort keys %typestruct) {
        $foo = lc $t;
-       if($foo eq "type") {
+       if ($foo eq "type") {
                print OUTH "\t$t _type;\n";
        } else {
                print OUTH "\t$t $foo;\n";
                print OUTH "\t$t _type;\n";
        } else {
                print OUTH "\t$t $foo;\n";
@@ -214,39 +271,43 @@ foreach $t (sort keys %typestruct) {
 }
 print OUTH "};\n\n";
 
 }
 print OUTH "};\n\n";
 
+print OUTH "\n/* General copy/free functions */\n";
+print OUTH "Node * node_copy (Node *node);\n";
+print OUTH "void node_free (Node *node);\n\n";
+print OUTH "GList * node_list_copy (GList *nodes);\n";
+print OUTH "void node_list_free (GList *nodes);\n";
 
 
-print OUTH "/* New functions */\n";
+print OUTH "\n/* Node new/set functions */\n";
+print OUTH "Node * node_new (NodeType type, ...);\n";
+print OUTH "void node_set (Node *node, ...);\n\n";
 
 
-foreach $t (sort keys %newfunc_prot) {
-       print OUTH "$newfunc_prot{$t};\n";
-}
+print OUTH "\n#endif /* TREEFUNCS_H */\n";
 
 
-print OUTH "\n/* General copy/free functions */\n";
-print OUTH "Node * copy_node(Node *node);\n";
-print OUTH "void free_node(Node *node);\n\n";
-print OUTH "GList * copy_node_list(GList *nodes);\n";
-print OUTH "void free_node_list(GList *nodes);\n";
+close (OUTH);
+
+print OUTC "#include <glib.h>\n";
+print OUTC "#include <stdarg.h>\n";
+print OUTC "#include \"treefuncs.h\"\n\n";
+print OUTC "#define COPY_LIST_VALS(list,func) " .
+       "{ GList *li; for (li=(list);li;li=li->next) { li->data=func (li->data); } }\n\n";
 
 
-print OUTH "\n/* Copy functions */\n";
 foreach $t (sort keys %copyfunc_prot) {
 foreach $t (sort keys %copyfunc_prot) {
-       print OUTH "$copyfunc_prot{$t};\n";
+       print OUTC "$copyfunc_prot{$t};\n";
 }
 }
-print OUTH "\n/* Free functions */\n";
+print OUTC "\n";
+
 foreach $t (sort keys %freefunc_prot) {
 foreach $t (sort keys %freefunc_prot) {
-       print OUTH "$freefunc_prot{$t};\n";
+       print OUTC "$freefunc_prot{$t};\n";
 }
 }
+print OUTC "\n";
 
 
-print OUTH "\n#endif /*_TREEFUNCS_H_*/\n";
-
-close(OUTH);
-
-print OUTC "#include <glib.h>\n#include \"treefuncs.h\"\n\n";
-print OUTC "#define COPY_LIST_VALS(list,func) " .
-       "{ GList *li; for(li=(list);li;li=li->next) { li->data=func(li->data); } }\n\n";
-
-foreach $t (sort keys %newfunc_prot) {
-       print OUTC "$newfunc_prot{$t}\n$newfunc{$t}\n\n";
+foreach $t (sort keys %setfunc_prot) {
+       print OUTC "$setfunc_prot{$t};\n";
 }
 }
+print OUTC "\n";
+
+print OUTC $quarks . "\tQUARK_LAST\n};\n\n";
+print OUTC $setupquarks . "}\n\n";
 
 foreach $t (sort keys %copyfunc_prot) {
        print OUTC "$copyfunc_prot{$t}\n$copyfunc{$t}\n\n";
 
 foreach $t (sort keys %copyfunc_prot) {
        print OUTC "$copyfunc_prot{$t}\n$copyfunc{$t}\n\n";
@@ -256,43 +317,84 @@ foreach $t (sort keys %freefunc_prot) {
        print OUTC "$freefunc_prot{$t}\n$freefunc{$t}\n\n";
 }
 
        print OUTC "$freefunc_prot{$t}\n$freefunc{$t}\n\n";
 }
 
-print OUTC "Node * copy_node(Node *node)\n" .
+foreach $t (sort keys %setfunc_prot) {
+       print OUTC "$setfunc_prot{$t}\n$setfunc{$t}\n\n";
+}
+
+print OUTC "Node *\nnode_copy (Node *node)\n" .
           "{\n" .
           "{\n" .
-          "\tg_return_val_if_fail(node != NULL, NULL);\n" .
-          "\tg_return_val_if_fail(node->type >= 0 && node->type < LAST_NODE_TYPE, NULL);\n" .
-          "\tswitch(node->type) {\n";
+          "\tg_return_val_if_fail (node != NULL, NULL);\n" .
+          "\tg_return_val_if_fail (node->type >= 0 && node->type < LAST_NODE_TYPE, NULL);\n" .
+          "\tswitch (node->type) {\n";
 foreach $t (sort keys %typestruct) {
 foreach $t (sort keys %typestruct) {
-       print OUTC "\tcase " . uc($t) . "_NODE: return (Node *)copy_" . lc($t) . " (($t *)node);\n";
+       print OUTC "\tcase " . uc ($t) . "_NODE: return (Node *)copy_" . lc ($t) . " (($t *)node);\n";
 }
 print OUTC "\tdefault: return NULL;\n\t}\n}\n\n";
 
 }
 print OUTC "\tdefault: return NULL;\n\t}\n}\n\n";
 
-print OUTC "void free_node(Node *node)\n" .
+print OUTC "static void\nnode_setv (Node *node, va_list __ap)\n" .
+          "{\n" .
+          "\tg_return_if_fail (node != NULL);\n" .
+          "\tg_return_if_fail (node->type >= 0 && node->type < LAST_NODE_TYPE);\n" .
+          "\tswitch (node->type) {\n";
+foreach $t (sort keys %typestruct) {
+       print OUTC "\tcase " . uc ($t) . "_NODE: setv_" . lc ($t) . " (($t *)node, __ap); break;\n";
+}
+print OUTC "\tdefault: break;\n\t}\n}\n\n";
+
+print OUTC "void\nnode_set (Node *node, ...)\n" .
+          "{\n" .
+          "\tva_list __ap;\n" .
+          "\tva_start (__ap, node);\n" .
+          "\tnode_setv (node, __ap);\n" .
+          "\tva_end (__ap);\n" .
+          "}\n\n";
+
+print OUTC "Node *\nnode_new (NodeType type, ...)\n" .
+          "{\n" .
+          "\tva_list __ap;\n" .
+          "\tNode *node = NULL;\n" .
+          "\tva_start (__ap, type);\n" .
+          "\tg_return_val_if_fail (type >= 0 && type < LAST_NODE_TYPE, NULL);\n" .
+          "\tswitch (type) {\n";
+foreach $t (sort keys %typestruct) {
+       print OUTC "\tcase " . uc ($t) . "_NODE:\n" .
+               "\t\tnode = (Node *)g_new0 ($t, 1);\n" .
+               "\t\tnode->type = type;\n" .
+               "\t\tsetv_" . lc ($t) . " (($t *)node, __ap);\n" .
+               "\t\tbreak;\n";
+}
+print OUTC "\tdefault: break;\n\t}\n" .
+          "\tva_end (__ap);\n" .
+          "\treturn node;\n" .
+          "}\n\n";
+
+print OUTC "void\nnode_free (Node *node)\n" .
           "{\n" .
           "{\n" .
-          "\tg_return_if_fail(node != NULL);\n" .
-          "\tg_return_if_fail(node->type >= 0 && node->type < LAST_NODE_TYPE);\n" .
-          "\tswitch(node->type) {\n";
+          "\tg_return_if_fail (node != NULL);\n" .
+          "\tg_return_if_fail (node->type >= 0 && node->type < LAST_NODE_TYPE);\n" .
+          "\tswitch (node->type) {\n";
 foreach $t (sort keys %typestruct) {
 foreach $t (sort keys %typestruct) {
-       print OUTC "\tcase " . uc($t) . "_NODE: free_" . lc($t) . " (($t *)node); return;\n";
+       print OUTC "\tcase " . uc ($t) . "_NODE: free_" . lc ($t) . " (($t *)node); return;\n";
 }
 print OUTC "\tdefault: return;\n\t}\n}\n\n";
 
 }
 print OUTC "\tdefault: return;\n\t}\n}\n\n";
 
-print OUTC "GList * copy_node_list(GList *nodes)\n" .
+print OUTC "GList *\nnode_list_copy (GList *nodes)\n" .
           "{\n" .
           "\tGList *li;\n" .
           "{\n" .
           "\tGList *li;\n" .
-          "\tnodes = g_list_copy(nodes);\n" .
-          "\tfor(li = nodes; li != NULL; li = li->next) {\n" .
-          "\t\tli->data = copy_node(li->data);\n" .
+          "\tnodes = g_list_copy (nodes);\n" .
+          "\tfor (li = nodes; li != NULL; li = li->next) {\n" .
+          "\t\tli->data = node_copy (li->data);\n" .
           "\t}\n" .
           "\treturn nodes;\n" .
           "}\n\n";
 
           "\t}\n" .
           "\treturn nodes;\n" .
           "}\n\n";
 
-print OUTC "void free_node_list(GList *nodes)\n" .
+print OUTC "void\nnode_list_free (GList *nodes)\n" .
           "{\n" .
           "\tGList *li;\n" .
           "{\n" .
           "\tGList *li;\n" .
-          "\tfor(li = nodes; li != NULL; li = li->next) {\n" .
-          "\t\tfree_node(li->data);\n" .
+          "\tfor (li = nodes; li != NULL; li = li->next) {\n" .
+          "\t\tnode_free (li->data);\n" .
           "\t}\n" .
           "\t}\n" .
-          "\tg_list_free(nodes);\n" .
+          "\tg_list_free (nodes);\n" .
           "}\n\n";
 
           "}\n\n";
 
-close(OUTC);
+close (OUTC);
index fe904e563e84f8076d90e91a269aad709b447422..8c57c6e86e20c3f9c18844315a577333de746965 100644 (file)
@@ -284,97 +284,127 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 88
-#define YY_END_OF_BUFFER 89
-static yyconst short int yy_acclist[401] =
+#define YY_NUM_RULES 106
+#define YY_END_OF_BUFFER 107
+static yyconst short int yy_acclist[554] =
     {   0,
     {   0,
-       89,   86,   88,   85,   86,   88,    1,   87,   88,   86,
-       87,   88,   86,   88,   86,   88,   85,   86,   88,   86,
-       88,   86,   88,   26,   86,   88,    1,   27,   87,   88,
-       26,   86,   87,   88,   26,   86,   88,   26,   86,   88,
-       49,   86,   88,    1,   50,   87,   88,   49,   86,   87,
-       88,   42,   49,   86,   88,   49,   86,   88,   49,   86,
-       88,   49,   86,   88,   47,   49,   86,   88,   48,   49,
-       86,   88,   49,   86,   88,   49,   86,   88,   45,   86,
-       88,    1,   46,   87,   88,   45,   86,   87,   88,   44,
-       45,   86,   88,   45,   86,   88,   86,   88,   86,   88,
-
-       77,   86,   88,   77,   86,   88,   86,   88,   80,   86,
-       88,   80,   86,   88,   80,   86,   88,   80,   86,   88,
-       82,   86,   88,   86,   88,   86,   88,   86,   88,   80,
-       86,   88,   80,   86,   88,   80,   86,   88,   80,   86,
-       88,   80,   86,   88,   80,   86,   88,   80,   86,   88,
-       80,   86,   88,   80,   86,   88,   80,   86,   88,   80,
-       86,   88,   80,   86,   88,   83,   86,   88,   84,   86,
-       88,    9,   86,   88,    9,   86,   87,   88,    9,   86,
-       88,    9,   86,   88,    9,   86,   88,   14,   86,   88,
-       14,   86,   87,   88,   14,   86,   88,   14,   86,   88,
-
-       14,   86,   88,   17,   86,   88,   17,   86,   87,   88,
-       17,   86,   88,   21,   33,   25,   22,   41,   34,   43,
-       77,   23,   77,   77,   79,   80,   78,   80,   80,   80,
-       24,   81,   80,   80,   80,   80,   80,   80,   80,   80,
-       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
-        8,    6,   13,   10,   12,   11,   13,   16,   15,    3,
-       28,   32,   39,   35,   37,   18,   77,   19,   77,   77,
-       79,   79,   78,   80,   80,   80,   68,   20,   80,   80,
-       80,   80,   80,   80,   80,   63,   80,   80,   80,   80,
-       80,   80,   80,   80,   80,   80,   80,   80,   80,   11,
-
-       29,   30,   31,   40,   36,   38,   79,   80,   54,   80,
-       53,   80,    5,   80,   66,   80,   80,   80,   80,   58,
-       80,   80,   61,   80,   80,   80,   80,   80,   80,   80,
-       80,   80,   80,   80,   55,   80,    7,   51,   80,   53,
-       80,   67,   80,   80,   64,   80,   80,   80,   80,   80,
-       62,   80,   80,   80,   80,   57,   80,   80,   80,   80,
-       80,   65,   80,   80,   80,   80,   69,   80,   75,   80,
-       59,   80,   56,   80,   80,   80,   80,   80,   80,   70,
-       80,   80,   80,   74,   80,   73,   80,   80,   76,   80,
-       80,   60,   80,   72,   80,   71,   80,    2,    4,   52
-
+      107,  104,  106,  103,  104,  106,    1,  105,  106,  104,
+      105,  106,  104,  106,  104,  106,  103,  104,  106,  104,
+      106,  104,  106,   26,  104,  106,    1,   27,  105,  106,
+       26,  104,  105,  106,   26,  104,  106,   26,  104,  106,
+       50,  104,  106,    1,   51,  105,  106,   50,  104,  105,
+      106,   42,   50,  104,  106,   50,  104,  106,   50,  104,
+      106,   50,  104,  106,   48,   50,  104,  106,   49,   50,
+      104,  106,   50,  104,  106,   50,  104,  106,   46,  104,
+      106,    1,   47,  105,  106,   46,  104,  105,  106,   45,
+       46,  104,  106,   46,  104,  106,  104,  106,  104,  106,
+
+      104,  106,   94,  104,  106,   94,  104,  106,  104,  106,
+       97,  104,  106,   97,  104,  106,   97,  104,  106,   97,
+      104,  106,  100,  104,  106,  104,  106,  104,  106,  104,
+      106,   97,  104,  106,   97,  104,  106,   97,  104,  106,
+       97,  104,  106,   97,  104,  106,   97,  104,  106,   97,
+      104,  106,   97,  104,  106,   97,  104,  106,   97,  104,
+      106,   97,  104,  106,   97,  104,  106,  101,  104,  106,
+      102,  104,  106,   91,  104,  106,   43,  104,  106,   92,
+      104,  106,   93,  104,  106,   97,  104,  106,   97,  104,
+      106,   97,  104,  106,   97,  104,  106,   97,  104,  106,
+
+       97,  104,  106,   97,  104,  106,   97,  104,  106,   97,
+      104,  106,   97,  104,  106,   97,  104,  106,   97,  104,
+      106,    9,  104,  106,    9,  104,  105,  106,    9,  104,
+      106,    9,  104,  106,    9,  104,  106,   14,  104,  106,
+       14,  104,  105,  106,   14,  104,  106,   14,  104,  106,
+       14,  104,  106,   17,  104,  106,   17,  104,  105,  106,
+       17,  104,  106,   21,   33,   25,   22,   41,   34,   44,
+       94,   23,   94,   94,   96,   97,   95,   97,   97,   97,
+       24,   99,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,    8,    6,   13,   10,   12,   11,   13,   16,
+       15,    3,   28,   32,   39,   35,   37,   18,   98,   98,
+       94,   19,   94,   94,   96,   96,   95,   97,   97,   97,
+       69,   20,   97,   97,   97,   97,   97,   97,   97,   64,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   11,   29,   30,   31,   40,
+       36,   38,   96,   97,   55,   97,   54,   97,    5,   97,
+       67,   97,   97,   97,   97,   59,   97,   97,   62,   97,
+
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   56,   97,   97,   97,   97,   59,   97,   97,   97,
+       97,   79,   97,   97,   97,   97,   85,   97,    7,   52,
+       97,   54,   97,   68,   97,   97,   65,   97,   97,   97,
+       97,   97,   97,   63,   97,   97,   97,   97,   58,   97,
+       97,   97,   80,   97,   97,   97,   97,   84,   97,   97,
+       97,   97,   97,   97,   97,   66,   97,   97,   97,   97,
+       97,   70,   97,   76,   97,   60,   97,   57,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   71,   97,   97,   97,   97,   75,   97,   97,
+
+       97,   97,   97,   81,   97,   82,   97,   97,   97,   74,
+       97,   97,   77,   97,   78,   97,   97,   61,   97,   97,
+       97,   97,   97,   97,   97,   73,   97,   72,   97,   97,
+       97,   87,   97,   97,   97,   97,    2,   89,   97,   97,
+       86,   97,   97,   88,   97,    4,   97,   90,   97,   97,
+       83,   97,   53
     } ;
 
     } ;
 
-static yyconst short int yy_accept[359] =
+static yyconst short int yy_accept[472] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,
-        4,    7,   10,   13,   15,   17,   20,   22,   24,   27,
-       31,   35,   38,   41,   44,   48,   52,   56,   59,   62,
-       65,   69,   73,   76,   79,   82,   86,   90,   94,   97,
-       99,  101,  104,  107,  109,  112,  115,  118,  121,  124,
-      126,  128,  130,  133,  136,  139,  142,  145,  148,  151,
-      154,  157,  160,  163,  166,  169,  172,  175,  179,  182,
-      185,  188,  191,  195,  198,  201,  204,  207,  211,  214,
-      215,  215,  215,  215,  215,  215,  215,  215,  216,  216,
-
-      217,  217,  217,  217,  217,  217,  218,  218,  219,  219,
-      219,  220,  221,  222,  223,  223,  223,  224,  224,  224,
-      225,  226,  227,  228,  229,  230,  231,  231,  232,  232,
-      232,  232,  233,  234,  235,  236,  237,  238,  239,  240,
-      241,  242,  243,  244,  245,  246,  247,  248,  249,  250,
-      251,  252,  252,  252,  252,  253,  253,  254,  254,  254,
-      254,  255,  256,  256,  258,  259,  260,  260,  261,  261,
-      261,  261,  262,  262,  262,  263,  263,  263,  263,  263,
-      264,  264,  264,  264,  265,  266,  266,  267,  267,  268,
-      268,  269,  270,  271,  272,  273,  274,  275,  276,  277,
-
-      278,  278,  278,  279,  279,  279,  280,  281,  282,  283,
-      284,  285,  286,  288,  289,  290,  291,  292,  293,  294,
-      295,  296,  297,  298,  299,  300,  300,  301,  301,  301,
-      302,  302,  303,  304,  304,  304,  304,  305,  306,  307,
-      307,  308,  309,  311,  313,  313,  314,  315,  317,  318,
-      319,  320,  322,  323,  325,  326,  327,  328,  329,  330,
-      331,  332,  333,  334,  335,  337,  337,  338,  338,  338,
-      339,  339,  339,  339,  339,  339,  339,  340,  342,  344,
-      345,  347,  348,  349,  350,  351,  353,  354,  355,  356,
-      358,  359,  360,  360,  360,  360,  360,  360,  360,  361,
-
-      362,  364,  365,  366,  367,  369,  371,  373,  375,  376,
-      377,  377,  377,  377,  377,  377,  378,  379,  380,  382,
-      383,  384,  386,  386,  386,  386,  386,  386,  388,  389,
-      391,  392,  394,  394,  394,  394,  394,  394,  394,  396,
-      398,  398,  398,  398,  399,  399,  399,  399,  399,  400,
-      400,  400,  400,  400,  400,  400,  401,  401
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    2,    4,    7,   10,   13,   15,   17,
+       20,   22,   24,   27,   31,   35,   38,   41,   44,   48,
+       52,   56,   59,   62,   65,   69,   73,   76,   79,   82,
+       86,   90,   94,   97,   99,  101,  103,  106,  109,  111,
+      114,  117,  120,  123,  126,  128,  130,  132,  135,  138,
+      141,  144,  147,  150,  153,  156,  159,  162,  165,  168,
+      171,  174,  177,  180,  183,  186,  189,  192,  195,  198,
+      201,  204,  207,  210,  213,  216,  219,  222,  225,  229,
+
+      232,  235,  238,  241,  245,  248,  251,  254,  257,  261,
+      264,  265,  265,  265,  265,  265,  265,  265,  265,  266,
+      266,  267,  267,  267,  267,  267,  267,  268,  268,  269,
+      269,  269,  270,  271,  271,  271,  272,  273,  273,  273,
+      274,  274,  274,  275,  276,  277,  278,  279,  280,  281,
+      281,  282,  282,  282,  282,  283,  284,  285,  286,  287,
+      288,  289,  290,  291,  292,  293,  294,  295,  296,  297,
+      298,  299,  300,  301,  302,  303,  304,  305,  306,  307,
+      308,  309,  310,  311,  312,  313,  314,  314,  314,  314,
+      315,  315,  316,  316,  316,  316,  317,  318,  318,  320,
+
+      321,  322,  322,  323,  323,  323,  323,  324,  324,  324,
+      325,  325,  325,  325,  325,  326,  326,  326,  326,  327,
+      328,  328,  329,  329,  330,  330,  331,  332,  332,  333,
+      334,  335,  336,  337,  338,  339,  340,  341,  342,  342,
+      342,  343,  343,  343,  344,  345,  346,  347,  348,  349,
+      350,  352,  353,  354,  355,  356,  357,  358,  359,  360,
+      361,  362,  363,  364,  365,  366,  367,  368,  369,  370,
+      371,  372,  373,  374,  375,  376,  376,  377,  377,  377,
+      378,  378,  379,  380,  380,  380,  380,  381,  382,  383,
+      383,  384,  385,  387,  389,  389,  390,  391,  393,  394,
+
+      395,  396,  398,  399,  401,  402,  403,  404,  405,  406,
+      407,  408,  409,  410,  411,  412,  414,  415,  416,  417,
+      419,  420,  421,  422,  424,  425,  426,  427,  429,  429,
+      430,  430,  430,  431,  431,  431,  431,  431,  431,  431,
+      432,  434,  436,  437,  439,  440,  441,  442,  443,  444,
+      446,  447,  448,  449,  451,  452,  453,  455,  456,  457,
+      458,  460,  461,  462,  463,  464,  464,  464,  464,  464,
+      464,  464,  465,  466,  468,  469,  470,  471,  472,  474,
+      476,  478,  480,  481,  482,  483,  484,  485,  486,  487,
+      488,  489,  490,  490,  490,  490,  490,  490,  491,  492,
+
+      493,  495,  496,  497,  498,  500,  501,  502,  503,  504,
+      506,  508,  509,  510,  510,  510,  510,  510,  510,  512,
+      513,  515,  517,  518,  520,  521,  522,  523,  524,  525,
+      526,  526,  526,  526,  526,  526,  526,  528,  530,  531,
+      532,  534,  535,  536,  537,  537,  537,  537,  538,  538,
+      540,  541,  543,  544,  546,  546,  546,  546,  547,  548,
+      550,  550,  550,  551,  551,  551,  553,  553,  553,  554,
+      554
     } ;
 
 static yyconst int yy_ec[256] =
     } ;
 
 static yyconst int yy_ec[256] =
@@ -388,11 +418,11 @@ static yyconst int yy_ec[256] =
         1,   21,    1,    1,   22,   22,   22,   22,   23,   22,
        24,   24,   25,   24,   24,   24,   24,   24,   24,   24,
        24,   26,   27,   24,   24,   24,   24,   24,   24,   24,
         1,   21,    1,    1,   22,   22,   22,   22,   23,   22,
        24,   24,   25,   24,   24,   24,   24,   24,   24,   24,
        24,   26,   27,   24,   24,   24,   24,   24,   24,   24,
-       28,   29,   30,    1,   24,    1,   31,   32,   33,   34,
+       28,   29,   30,    1,   31,    1,   32,   33,   34,   35,
 
 
-       35,   36,   37,   38,   39,   24,   24,   40,   41,   42,
-       43,   44,   45,   46,   47,   48,   49,   50,   51,   52,
-       24,   24,   53,    1,   54,    1,    1,    1,    1,    1,
+       36,   37,   38,   39,   40,   41,   42,   43,   44,   45,
+       46,   47,   48,   49,   50,   51,   52,   53,   54,   55,
+       56,   24,   57,    1,   58,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -409,314 +439,394 @@ static yyconst int yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
         1,    1,    1,    1,    1
     } ;
 
-static yyconst int yy_meta[55] =
+static yyconst int yy_meta[59] =
     {   0,
         1,    2,    3,    1,    2,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    4,    4,    4,    4,    5,    1,
         1,    6,    6,    7,    7,    7,    7,    1,    1,    8,
     {   0,
         1,    2,    3,    1,    2,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    4,    4,    4,    4,    5,    1,
         1,    6,    6,    7,    7,    7,    7,    1,    1,    8,
-        6,    6,    6,    6,    6,    6,    7,    7,    7,    7,
+        7,    6,    6,    6,    6,    6,    6,    7,    7,    7,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
-        7,    7,    1,    1
+        7,    7,    7,    7,    7,    7,    1,    1
     } ;
 
     } ;
 
-static yyconst short int yy_base[384] =
+static yyconst short int yy_base[499] =
     {   0,
     {   0,
-        0,    4,    7,   13,   17,   69,   24,   36,  123,    0,
-      165,    0,   31,   52,   48,   77,   55,   81,  848,  849,
-      849,  849,  849,    1,  807,   42,   56,  811,  849,  849,
-      849,  831,  817,  849,  849,  849,  849,   57,   10,    0,
-      849,  849,   27,  789,  849,  849,  849,  849,    0,   86,
-       78,  168,   99,    0,  823,   22,   49,   80,  849,  174,
-       93,  206,   50,  187,   78,  161,  176,  169,  183,  163,
-      188,  209,  175,  210,  849,  849,  849,  849,  827,  230,
-      236,  849,  849,  826,  249,  253,  836,  835,  105,  849,
-      834,  805,  238,  800,  220,  211,  206,  849,  789,  849,
-
-        0,  824,  225,  823,  822,  849,  827,  849,  261,  787,
-      849,  849,  254,  849,  825,  259,  270,  276,    0,  286,
-      808,  807,  806,   17,  262,  243,  811,  811,  819,  280,
-      791,  792,  271,   30,  214,  287,  288,  290,  292,   26,
-      294,  293,  295,  178,  297,  296,  298,  302,  299,  303,
-      849,  318,  322,  345,  849,  349,  849,  341,  353,  357,
-      849,  361,  805,  849,  849,  849,  815,  849,  770,  776,
-      762,  849,  783,  760,  849,  759,  772,  761,  783,  849,
-      799,  798,  797,  849,  849,  802,  849,  771,  353,  800,
-      849,  357,    0,  783,  782,  781,  338,   72,  342,  849,
-
-      374,  796,  849,  768,  365,  359,  365,  367,  368,  300,
-      369,  371,  778,  372,  373,  374,  375,  377,  379,  378,
-      380,  384,  382,  385,  388,  429,  849,  749,  278,  849,
-      761,  849,  849,  744,  754,  767,  849,  849,  849,  751,
-      771,  381,  770,  769,  433,  849,  399,  768,  394,  397,
-      386,  767,  411,  766,  393,  418,  423,  424,  425,  431,
-       87,  427,  428,  432,  765,  450,  849,  465,  469,  849,
-      740,  747,  750,  734,    0,  730,  441,  435,  759,  442,
-      758,  456,  437,  445,  460,  757,  461,  463,  464,  756,
-      468,  469,  725,  715,  698,  710,  716,  686,  471,  470,
-
-      678,  472,  473,  475,  664,  651,  643,  580,  479,  477,
-      451,  563,  550,  586,  560,  483,  484,  486,  575,  492,
-      488,  574,  549,  553,  514,  508,  527,  570,  501,  559,
-      496,  549,  522,  519,  532,  523,  540,  522,  534,  516,
-      502,  546,  554,  849,  539,  423,  558,  546,  849,  371,
-      564,  234,  568,  585,  541,  849,  849,  603,  611,  619,
-      627,  635,  643,  651,  659,  667,  670,  674,  678,  686,
-      694,  702,  710,  715,  718,  722,  729,  734,  741,  745,
-      751,  758,  766
+        0,    4,    7,   12,   17,   73,   26,   36,  131,    0,
+      177,    0,   33,   34,  230,    0,   24,   47,   54,   91,
+       57,   60, 1099, 1100, 1100, 1100, 1100,   21, 1055,  190,
+       60, 1061, 1100, 1100, 1100, 1082, 1068, 1100, 1100, 1100,
+     1100,  190,   42,    0, 1100, 1100,   81, 1036, 1100, 1100,
+     1100, 1100,    0, 1064,   93,   86,  236,  107,    0, 1073,
+       54,   69,    6, 1100,  184,   92,   97,   70,  179,   59,
+      187,  185,  188,   82,  184,  207,  239,  197,  175, 1100,
+     1100, 1100, 1100, 1100, 1100,  226,  249,  265,  212,  219,
+      266,   22,  227,   97,  270,  236,  267, 1100, 1100, 1077,
+
+      291,  302, 1100, 1100, 1076,  310,  315, 1086, 1085,  247,
+     1100, 1084, 1054,  292, 1049,  257,  283,  284, 1100, 1036,
+     1100,    0, 1074,  293, 1073, 1072, 1100, 1077, 1100,  323,
+     1034, 1100, 1100, 1069, 1068,  320, 1100, 1073,  327,  339,
+      349,    0,  355, 1056, 1055, 1054,  307,  312,  313, 1059,
+     1059, 1067,  331, 1039, 1040,  340,  350,  355,  341,  191,
+      356,  357,  358,  360,  361,  364,  362,  365,  369,  366,
+      372,  370,  373,  371,  374,  377,  375,  398,  379,  380,
+      174,  283,  382,  383,  381, 1100,  430,  434,  438, 1100,
+      443, 1100,  445,  449,  453, 1100,  457, 1053, 1100, 1100,
+
+     1100, 1063, 1100, 1015, 1021, 1006, 1100, 1030, 1004, 1100,
+     1003, 1019, 1006, 1031, 1100, 1047, 1046, 1045, 1100, 1100,
+     1050, 1100, 1018, 1100, 1042, 1041,  449, 1046, 1100,  453,
+        0, 1029, 1028, 1027,  399,  434,  453, 1100,  471, 1042,
+     1100, 1014,  464,  456,  458,  464,  465,  387,  466,  467,
+     1024,  468,  469,  470,  473,  474,  472,  471,  476,  479,
+      482,  478,  477,  481,  397,  494,  483,  500,  492,  512,
+      514,  515,  516,  517,  518,  538, 1100,  992,  488, 1100,
+     1006, 1100, 1100,  987,  999, 1013, 1100, 1100, 1100,  994,
+     1017,  523, 1016, 1015,  544, 1100,  525, 1014,  531,  534,
+
+      536, 1013,  539, 1012,  540,  542,  541,  544,  546,  545,
+      551,  548,  547,  553,  549, 1011,  405,  559,  552,  557,
+      556,  565,  574, 1010,  576,  578,  579, 1009,  597, 1100,
+      609,  614, 1100,  981,  990,  993,  975,    0,  971,  584,
+      586, 1003,  588, 1002,  589,  594,  602,  604,  607, 1001,
+      606,  608,  611, 1000,  612,  614,  999,  613,  615,  616,
+      617,  618,  620,  623,  628,  970,  967,  964,  978,  990,
+      977,  631,  633,  992,  634,  635,  636,  637,  991,  990,
+      984,  976,  641,  642,  644,  645,  646,  647,  649,  656,
+      659,  660,  629,  944,  929,  963,  918,  662,  664,  665,
+
+      920,  663,  670,  672,  904,  673,  678,  675,  684,  890,
+      877,  685,  686,  842,  841,  710,  700,  718,  798,  689,
+      797,  791,  691,  790,  702,  695,  705,  708,  709,  711,
+      753,  756,  729,  735,  745,  737,  772,  761,  718,  740,
+      760,  745,  719,  748,  707,  758,  771, 1100,  762,  490,
+      750,  486,  758,  485,  391,  780,  764, 1100,  759,  311,
+      235,  786,  771,   77,  797,    3,  803,  730, 1100, 1100,
+      821,  829,  837,  845,  853,  861,  869,  877,  885,  893,
+      896,  900,  904,  912,  920,  928,  936,  944,  949,  952,
+      956,  963,  968,  975,  979,  985,  992, 1000
+
     } ;
 
     } ;
 
-static yyconst short int yy_def[384] =
+static yyconst short int yy_def[499] =
     {   0,
     {   0,
-      358,  358,  359,  359,  360,  360,  361,  361,  357,    9,
-        9,   11,  362,  362,  363,  363,  364,  364,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  365,
-      357,  357,  357,  357,  357,  357,  357,  357,  366,  357,
-      357,  357,  357,  367,  368,  368,  368,  368,  357,  357,
-      357,  369,  368,  368,  368,  368,  368,  368,  368,  368,
-      368,  368,  368,  368,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      370,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-
-      371,  357,  357,  357,  357,  357,  372,  357,  357,  357,
-      357,  357,  357,  357,  373,  357,  357,  357,  374,  357,
-      375,  368,  376,  368,  368,  368,  357,  357,  377,  357,
-      378,  357,  368,  368,  368,  368,  368,  368,  368,  368,
-      368,  368,  368,  368,  368,  368,  368,  368,  368,  368,
-      357,  357,  357,  357,  357,  379,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  370,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  372,  357,  357,  357,  373,
-      357,  357,  374,  375,  380,  376,  368,  368,  368,  357,
-
-      357,  377,  357,  378,  369,  368,  368,  368,  368,  368,
-      368,  368,  368,  368,  368,  368,  368,  368,  368,  368,
-      368,  368,  368,  368,  368,  381,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      380,  368,  368,  368,  357,  357,  368,  368,  368,  368,
-      368,  368,  368,  368,  368,  368,  368,  368,  368,  368,
-      368,  368,  368,  368,  368,  357,  357,  381,  357,  357,
-      357,  357,  357,  357,  382,  357,  368,  368,  368,  368,
-      368,  368,  368,  368,  368,  368,  368,  368,  368,  368,
-      368,  368,  357,  357,  357,  357,  357,  357,  368,  368,
-
-      368,  368,  368,  368,  368,  368,  368,  368,  368,  368,
-      357,  357,  357,  357,  357,  368,  368,  368,  368,  368,
-      368,  368,  357,  357,  357,  357,  357,  368,  368,  368,
-      368,  368,  357,  357,  357,  357,  357,  357,  368,  368,
-      357,  357,  357,  357,  383,  357,  357,  383,  357,  357,
-      357,  357,  357,  357,  357,  357,    0,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357
+      471,  471,  472,  472,  473,  473,  474,  474,  470,    9,
+        9,   11,    9,    9,    9,   15,  475,  475,  476,  476,
+      477,  477,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  478,  470,  470,  470,  470,  470,  470,
+      470,  470,  479,  480,  470,  470,  470,  470,  481,  482,
+      482,  482,  482,  470,  470,  470,  483,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  470,
+      470,  470,  470,  470,  470,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  470,  470,  470,
+
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  484,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  485,  470,  470,  470,  470,  470,  486,  470,  470,
+      470,  470,  470,  470,  487,  470,  470,  488,  470,  470,
+      470,  489,  470,  490,  482,  491,  482,  482,  482,  470,
+      470,  492,  470,  493,  470,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  470,  470,  470,  470,  470,
+      494,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+
+      470,  484,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      486,  470,  470,  470,  470,  470,  470,  488,  470,  470,
+      489,  490,  495,  491,  482,  482,  482,  470,  470,  492,
+      470,  493,  483,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  496,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      495,  482,  482,  482,  470,  470,  482,  482,  482,  482,
+
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  470,  470,
+      496,  470,  470,  470,  470,  470,  470,  497,  470,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  470,  470,  470,  470,  470,
+      470,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  470,  470,  470,  470,  470,  482,  482,  482,
+
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  470,  470,  470,  470,  470,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      470,  470,  470,  470,  470,  470,  482,  482,  482,  482,
+      482,  482,  482,  482,  470,  470,  470,  470,  498,  482,
+      482,  482,  482,  482,  470,  470,  498,  470,  482,  482,
+      470,  470,  482,  470,  470,  482,  470,  470,  470,    0,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470
+
     } ;
 
     } ;
 
-static yyconst short int yy_nxt[904] =
+static yyconst short int yy_nxt[1159] =
     {   0,
     {   0,
-      357,   21,   22,   23,   21,   26,   22,   23,   26,   30,
-       31,   27,   90,   24,   91,   30,   31,   24,   32,   35,
-       36,  106,   37,  107,   32,   38,   46,   47,  109,   48,
-       39,  109,   25,   22,   78,  123,   25,   33,   46,   47,
-      123,   48,   79,   93,  123,   40,   93,  197,  123,   28,
-       22,   83,   49,   80,   22,   78,   80,   22,   88,   84,
-      207,  124,  102,   81,   49,  110,   89,  123,  123,   41,
-       42,   35,   36,  213,   37,   43,   44,   38,   85,   22,
-       83,   85,   39,   22,   88,  103,   95,   94,   86,  114,
-      123,  115,   89,   96,  125,  133,  123,   40,  123,   97,
-
-      113,  113,  113,  113,  128,  123,  129,  165,   98,  104,
-      105,  116,  243,  120,  120,  120,  120,  126,  166,  289,
-      137,   41,   42,   20,   21,   22,   23,   21,   20,   20,
-       20,   20,   20,   20,   20,   50,   51,   52,   53,   53,
-       53,   54,   20,   20,   55,   55,   55,   55,   55,   55,
-       20,   20,   20,   55,   55,   56,   55,   55,   57,   55,
-       55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
-       58,   55,   55,   55,   55,   59,   20,   60,   61,  123,
-      116,  123,  117,  117,  117,  118,  127,  123,  113,  113,
-      113,  113,   62,  123,  123,   63,  123,   64,   65,   66,
-
-       67,  123,  138,   68,   69,  123,  123,   70,   71,  218,
-      140,   72,  142,   73,   74,  139,  148,   75,   76,  119,
-      130,  130,  130,  130,  134,  141,  135,  123,  123,  136,
-      181,  152,  123,  143,  152,  132,  144,  154,  155,   93,
-      156,  153,   93,  176,  208,  173,  145,  146,  149,  151,
-      158,  177,  150,  158,  160,  161,  147,  162,  174,  170,
-      159,  123,  109,  175,  163,  109,  164,  171,  189,  189,
-      189,  189,  172,  192,  192,  192,  192,  182,  183,  176,
-      123,  199,  116,   94,  117,  117,  117,  118,  116,  123,
-      118,  118,  118,  118,  130,  130,  130,  130,  116,  110,
-
-      120,  120,  120,  120,  198,  123,  123,  206,  123,  132,
-      123,  123,  123,  123,  123,  123,  123,  123,  123,  152,
-      123,  123,  152,  154,  155,  271,  156,  215,  209,  153,
-      172,  251,  220,  216,  212,  214,  210,  217,  211,  219,
-      222,  225,  158,  221,  224,  158,  154,  155,  223,  154,
-      154,  155,  159,  154,  160,  161,  123,  162,  160,  161,
-      123,  160,  160,  161,  163,  160,  227,  189,  189,  189,
-      189,  192,  192,  192,  192,  245,  246,  123,  245,  130,
-      130,  130,  130,  123,  242,  123,  123,  123,  244,  123,
-      123,  123,  123,  123,  132,  123,  123,  123,  123,  123,
-
-      123,  253,  123,  123,  123,  352,  123,  247,  254,  252,
-      248,  123,  123,  249,  250,  123,  258,  123,  255,  260,
-      263,  265,  257,  256,  259,  280,  262,  244,  261,  123,
-      266,  267,  264,  266,  245,  246,  123,  245,  282,  277,
-      278,  123,  123,  123,  279,  123,  123,  269,  283,  123,
-      123,  266,  267,  123,  266,  123,  350,  284,  281,  123,
-      123,  287,  285,  123,  291,  288,  266,  267,  290,  266,
-      266,  267,  286,  266,  123,  299,  301,  304,  123,  123,
-      292,  123,  123,  269,  303,  300,  123,  123,  123,  123,
-      123,  123,  305,  123,  302,  123,  307,  123,  323,  310,
-
-      306,  123,  123,  175,  123,  318,  123,  319,  317,  309,
-      123,  308,  316,  321,  123,  335,  322,  329,  335,  123,
-      330,  332,  320,  336,  337,  337,  331,  345,  338,  340,
-      328,  338,  346,  335,  123,  339,  335,  343,  343,  343,
-      343,  345,  355,  356,  349,  355,  342,  342,  342,  342,
-      344,  349,  123,  341,  343,  343,  343,  343,  347,  349,
-      342,  342,  342,  342,  344,  174,  349,  123,  343,  343,
-      343,  343,  351,  351,  351,  351,  353,  123,  351,  351,
-      351,  351,  354,  354,  354,  354,  355,  356,  123,  355,
-      334,  333,  123,  123,  327,  326,  325,  324,  123,  354,
-
-      354,  354,  354,   20,   20,   20,   20,   20,   20,   20,
-       20,   29,   29,   29,   29,   29,   29,   29,   29,   34,
-       34,   34,   34,   34,   34,   34,   34,   45,   45,   45,
-       45,   45,   45,   45,   45,   77,   77,   77,   77,   77,
-       77,   77,   77,   82,   82,   82,   82,   82,   82,   82,
-       82,   87,   87,   87,   87,   87,   87,   87,   87,  108,
-      108,  123,  108,  108,  108,  108,  108,  112,  112,  123,
-      112,  112,  112,  112,  112,  121,  121,  122,  122,  122,
-      122,  131,  123,  131,  131,  131,  167,  167,  167,  167,
-      167,  167,  167,  167,  179,  179,  123,  179,  179,  179,
-
-      179,  179,  186,  186,  186,  186,  186,  186,  186,  186,
-      190,  190,  190,  190,  190,  190,  190,  190,  193,  315,
-      193,  194,  194,  194,  194,  196,  196,  196,  196,  202,
-      202,  202,  202,  202,  202,  202,  202,  204,  314,  204,
-      204,  204,  226,  226,  313,  312,  226,  226,  241,  241,
-      241,  241,  268,  268,  268,  268,  268,  268,  297,  297,
-      311,  297,  297,  297,  297,  297,  348,  348,  171,  348,
-      348,  348,  348,  348,  123,  123,  123,  123,  298,  296,
-      295,  294,  293,  123,  123,  123,  123,  123,  123,  195,
-      276,  275,  274,  273,  272,  270,  123,  132,  203,  123,
-
-      195,  195,  191,  240,  187,  239,  238,  237,  236,  235,
-      234,  233,  232,  231,  230,  229,  228,  168,  227,  205,
-      132,  203,  201,  200,  123,  123,  195,  191,  188,  187,
-      185,  184,  180,  178,   99,  169,  168,  165,  165,  157,
-      151,  123,  111,  101,  100,   99,   92,  357,   19,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-
-      357,  357,  357
+      470,   25,   26,   27,   25,   30,   26,   27,   30,   34,
+       35,   31,  470,   28,   34,   35,  470,   28,   36,   39,
+       40,  146,   41,   36,  146,   42,   26,   99,   50,   51,
+       43,   52,  111,   29,  112,  100,   37,   29,   50,   51,
+      146,   52,   82,   82,  149,   44,   24,   24,  101,   26,
+       99,  101,   32,  127,   53,  128,   26,  104,  102,   26,
+      109,  181,   26,  109,   53,  105,   60,   60,  110,   60,
+       60,  110,  146,   45,   46,   39,   40,  146,   41,   47,
+       48,   42,  130,   60,   60,  130,   43,  146,  146,   24,
+       24,  116,  106,   26,  104,  106,  147,  137,  117,  138,
+
+      146,   44,  107,  151,  160,  152,  118,  136,  136,  136,
+      136,  153,  153,  153,  153,  146,  119,  148,  156,  139,
+      131,  143,  143,  143,  143,  211,  155,  164,  183,   45,
+       46,   24,   25,   26,   27,   25,   24,   24,   24,   54,
+       24,   24,   24,   55,   56,   57,   58,   58,   58,   59,
+       24,   24,   60,   60,   60,   60,   60,   60,   24,   24,
+       24,   60,   60,   60,   61,   60,   60,   62,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   63,   60,   60,   60,   60,   60,   64,   24,   65,
+       66,  114,  146,  146,  114,  123,  150,  146,  136,  136,
+
+      136,  136,  146,  146,   67,  146,  146,  271,   68,  146,
+       69,   70,   71,   72,  172,  146,   73,  157,  124,   74,
+      173,  158,   75,   76,  159,  146,   77,  162,   78,   79,
+      146,  161,  163,   80,   81,   83,  165,  146,  115,   84,
+       85,  171,  248,   24,  146,  146,  125,  126,  139,  200,
+      140,  140,  140,  141,  146,  166,  177,  146,  167,  182,
+      201,  178,   86,   87,   88,   89,   90,  146,  174,   73,
+      464,  175,   74,   91,   92,   93,   94,  168,  169,   95,
+       96,   78,   97,  146,  146,  146,   24,  157,  146,  170,
+      142,  185,  187,  114,  159,  187,  114,  179,  216,  205,
+
+      176,  146,  188,  189,  190,  180,  191,  206,  168,  184,
+      160,  193,  173,  207,  193,  186,  195,  196,  208,  197,
+      170,  194,  211,  272,  130,  146,  198,  130,  199,  146,
+      146,  146,  212,  209,  227,  227,  227,  227,  235,  210,
+      115,  230,  230,  230,  230,  153,  153,  153,  153,  217,
+      218,  139,  237,  140,  140,  140,  141,  236,  146,  146,
+      155,  139,  131,  141,  141,  141,  141,  139,  146,  143,
+      143,  143,  143,  146,  146,  146,  146,  244,  146,  146,
+      146,  245,  146,  146,  146,  247,  246,  146,  146,  146,
+      146,  146,  146,  146,  256,  146,  253,  146,  146,  146,
+
+      146,  146,  250,  254,  252,  146,  258,  249,  251,  255,
+      257,  260,  263,  266,  259,  146,  146,  146,  262,  301,
+      274,  261,  264,  146,  270,  461,  267,  275,  265,  268,
+      273,  187,  318,  269,  187,  189,  190,  357,  191,  189,
+      190,  188,  189,  250,  189,  190,  193,  189,  292,  193,
+      195,  196,  146,  197,  195,  196,  194,  195,  195,  196,
+      198,  195,  277,  227,  227,  227,  227,  230,  230,  230,
+      230,  146,  295,  296,  146,  295,  146,  293,  153,  153,
+      153,  153,  146,  146,  146,  146,  146,  146,  146,  146,
+      146,  146,  146,  155,  146,  146,  146,  146,  303,  146,
+
+      146,  146,  294,  146,  146,  304,  298,  297,  146,  302,
+      146,  316,  146,  299,  300,  311,  309,  305,  146,  307,
+      310,  314,  306,  308,  313,  319,  320,  312,  315,  317,
+      146,  322,  146,  146,  146,  146,  146,  321,  334,  329,
+      330,  146,  329,  146,  207,  295,  296,  326,  295,  146,
+      325,  323,  146,  328,  146,  324,  332,  146,  146,  146,
+      146,  327,  146,  146,  146,  146,  146,  146,  340,  146,
+      146,  146,  294,  346,  146,  146,  347,  146,  343,  348,
+      341,  353,  351,  146,  342,  349,  352,  360,  345,  344,
+      355,  354,  146,  358,  146,  350,  146,  146,  329,  330,
+
+      356,  329,  146,  359,  146,  361,  146,  146,  362,  364,
+      329,  330,  146,  329,  352,  329,  330,  363,  329,  372,
+      146,  365,  146,  374,  146,  146,  146,  332,  375,  146,
+      146,  146,  146,  146,  146,  146,  146,  378,  146,  373,
+      379,  146,  381,  385,  376,  384,  146,  388,  380,  146,
+      377,  146,  146,  146,  146,  146,  383,  386,  392,  146,
+      146,  382,  146,  146,  146,  146,  387,  146,  400,  389,
+      401,  390,  399,  391,  146,  398,  404,  146,  146,  414,
+      146,  146,  146,  146,  405,  210,  402,  403,  146,  412,
+      146,  146,  410,  146,  406,  407,  146,  409,  420,  411,
+
+      421,  408,  146,  146,  146,  423,  424,  146,  426,  146,
+      413,  433,  419,  146,  433,  434,  435,  435,  422,  436,
+      146,  427,  436,  146,  437,  438,  146,  146,  425,  146,
+      433,  468,  469,  433,  468,  429,  146,  146,  455,  428,
+      441,  430,  449,  446,  446,  446,  446,  440,  439,  447,
+      447,  447,  447,  450,  442,  448,  449,  444,  146,  447,
+      447,  447,  447,  146,  443,  453,  146,  458,  146,  458,
+      456,  451,  446,  446,  446,  446,  146,  146,  146,  146,
+      452,  448,  458,  454,  458,  447,  447,  447,  447,  146,
+      146,  445,  459,  460,  462,  462,  462,  462,  465,  209,
+
+      462,  462,  462,  462,  468,  469,  466,  468,  146,  146,
+      463,  467,  467,  467,  467,  146,  146,  467,  467,  467,
+      467,   24,   24,   24,   24,   24,   24,   24,   24,   33,
+       33,   33,   33,   33,   33,   33,   33,   38,   38,   38,
+       38,   38,   38,   38,   38,   49,   49,   49,   49,   49,
+       49,   49,   49,   98,   98,   98,   98,   98,   98,   98,
+       98,  103,  103,  103,  103,  103,  103,  103,  103,  108,
+      108,  108,  108,  108,  108,  108,  108,  129,  129,  432,
+      129,  129,  129,  129,  129,  133,  133,  431,  133,  133,
+      133,  133,  133,  134,  134,  146,  134,  134,  134,  134,
+
+      134,  144,  144,  145,  145,  145,  145,  154,  146,  154,
+      154,  154,  202,  202,  202,  202,  202,  202,  202,  202,
+      214,  214,  146,  214,  214,  214,  214,  214,  221,  221,
+      221,  221,  221,  221,  221,  221,  225,  225,  146,  225,
+      225,  225,  225,  225,  228,  228,  228,  228,  228,  228,
+      228,  228,  231,  418,  231,  232,  232,  232,  232,  234,
+      234,  234,  234,  240,  240,  240,  240,  240,  240,  240,
+      240,  242,  417,  242,  242,  242,  276,  276,  416,  415,
+      276,  276,  291,  291,  291,  291,  331,  331,  331,  331,
+      331,  331,  370,  370,  146,  370,  370,  370,  370,  370,
+
+      457,  457,  146,  457,  457,  457,  457,  457,  146,  146,
+      146,  397,  396,  395,  394,  393,  206,  146,  146,  146,
+      146,  146,  371,  369,  368,  367,  366,  146,  146,  146,
+      146,  146,  146,  146,  146,  233,  339,  338,  337,  336,
+      335,  333,  146,  155,  241,  146,  233,  233,  229,  224,
+      224,  290,  222,  289,  288,  287,  286,  285,  284,  283,
+      282,  281,  280,  279,  278,  203,  277,  243,  155,  241,
+      239,  238,  146,  146,  233,  229,  226,  224,  223,  222,
+      220,  219,  215,  213,  120,  204,  203,  200,  200,  192,
+      186,  146,  135,  132,  122,  121,  120,  113,  470,   23,
+
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470
     } ;
 
     } ;
 
-static yyconst short int yy_chk[904] =
+static yyconst short int yy_chk[1159] =
     {   0,
         0,    1,    1,    1,    1,    2,    2,    2,    2,    3,
     {   0,
         0,    1,    1,    1,    1,    2,    2,    2,    2,    3,
-        3,    2,   24,    1,   24,    4,    4,    2,    3,    5,
-        5,   39,    5,   39,    4,    5,    7,    7,   43,    7,
-        5,   43,    1,   13,   13,  124,    2,    4,    8,    8,
-       56,    8,   13,   26,  140,    5,   26,  124,  134,    2,
-       15,   15,    7,   14,   14,   14,   14,   17,   17,   15,
-      134,   56,   38,   14,    8,   43,   17,   57,   63,    5,
-        5,    6,    6,  140,    6,    6,    6,    6,   16,   16,
-       16,   16,    6,   18,   18,   38,   27,   26,   16,   51,
-      198,   51,   18,   27,   57,   63,   65,    6,   58,   27,
-
-       50,   50,   50,   50,   61,  261,   61,   89,   27,   38,
-       38,   53,  198,   53,   53,   53,   53,   58,   89,  261,
-       65,    6,    6,    9,    9,    9,    9,    9,    9,    9,
+        3,    2,    0,    1,    4,    4,    0,    2,    3,    5,
+        5,  466,    5,    4,   63,    5,   17,   17,    7,    7,
+        5,    7,   28,    1,   28,   17,    4,    2,    8,    8,
+       92,    8,   13,   14,   63,    5,   13,   14,   18,   18,
+       18,   18,    2,   43,    7,   43,   19,   19,   18,   21,
+       21,   92,   22,   22,    8,   19,   13,   14,   21,   13,
+       14,   22,   61,    5,    5,    6,    6,   70,    6,    6,
+        6,    6,   47,   13,   14,   47,    6,   62,   68,   13,
+       14,   31,   20,   20,   20,   20,   61,   56,   31,   56,
+
+       74,    6,   20,   66,   70,   66,   31,   55,   55,   55,
+       55,   67,   67,   67,   67,   94,   31,   62,   68,   58,
+       47,   58,   58,   58,   58,  464,   67,   74,   94,    6,
+        6,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
-        9,    9,    9,    9,    9,    9,    9,   11,   11,   66,
-       52,   70,   52,   52,   52,   52,   60,   68,   60,   60,
-       60,   60,   11,   73,   67,   11,  144,   11,   11,   11,
-
-       11,   69,   66,   11,   11,   64,   71,   11,   11,  144,
-       68,   11,   70,   11,   11,   67,   73,   11,   11,   52,
-       62,   62,   62,   62,   64,   69,   64,   72,   74,   64,
-      103,   80,  135,   71,   80,   62,   71,   81,   81,   93,
-       81,   80,   93,   97,  135,   96,   72,   72,   74,   81,
-       85,   97,   74,   85,   86,   86,   72,   86,   96,   95,
-       85,  126,  109,   96,   86,  109,   86,   95,  113,  113,
-      113,  113,   95,  116,  116,  116,  116,  103,  103,  352,
-      125,  126,  117,   93,  117,  117,  117,  117,  118,  133,
-      118,  118,  118,  118,  130,  130,  130,  130,  120,  109,
-
-      120,  120,  120,  120,  125,  136,  137,  133,  138,  130,
-      139,  142,  141,  143,  146,  145,  147,  149,  210,  152,
-      148,  150,  152,  153,  153,  229,  153,  142,  136,  152,
-      229,  210,  146,  143,  139,  141,  137,  143,  138,  145,
-      148,  150,  158,  147,  149,  158,  154,  154,  148,  154,
-      156,  156,  158,  156,  159,  159,  197,  159,  160,  160,
-      199,  160,  162,  162,  159,  162,  159,  189,  189,  189,
-      189,  192,  192,  192,  192,  201,  201,  206,  201,  205,
-      205,  205,  205,  207,  197,  208,  209,  211,  199,  212,
-      214,  215,  216,  217,  205,  218,  220,  219,  221,  242,
-
-      223,  212,  222,  224,  251,  350,  225,  206,  214,  211,
-      207,  255,  249,  208,  209,  250,  218,  247,  215,  220,
-      223,  225,  217,  216,  219,  251,  222,  242,  221,  253,
-      226,  226,  224,  226,  245,  245,  256,  245,  255,  247,
-      249,  257,  258,  259,  250,  262,  263,  226,  256,  260,
-      264,  266,  266,  278,  266,  283,  346,  257,  253,  277,
-      280,  260,  258,  284,  263,  260,  268,  268,  262,  268,
-      269,  269,  259,  269,  282,  277,  280,  284,  285,  287,
-      264,  288,  289,  268,  283,  278,  291,  292,  300,  299,
-      302,  303,  285,  304,  282,  310,  288,  309,  311,  292,
-
-      287,  316,  317,  311,  318,  302,  321,  303,  300,  291,
-      320,  289,  299,  309,  331,  325,  310,  317,  325,  329,
-      318,  321,  304,  326,  326,  326,  320,  338,  327,  331,
-      316,  327,  341,  335,  340,  329,  335,  336,  336,  336,
-      336,  338,  355,  355,  345,  355,  335,  335,  335,  335,
-      337,  348,  339,  334,  337,  337,  337,  337,  342,  345,
-      342,  342,  342,  342,  343,  333,  348,  332,  343,  343,
-      343,  343,  347,  347,  347,  347,  351,  330,  351,  351,
-      351,  351,  353,  353,  353,  353,  354,  354,  328,  354,
-      324,  323,  322,  319,  315,  314,  313,  312,  308,  354,
-
-      354,  354,  354,  358,  358,  358,  358,  358,  358,  358,
-      358,  359,  359,  359,  359,  359,  359,  359,  359,  360,
-      360,  360,  360,  360,  360,  360,  360,  361,  361,  361,
-      361,  361,  361,  361,  361,  362,  362,  362,  362,  362,
-      362,  362,  362,  363,  363,  363,  363,  363,  363,  363,
-      363,  364,  364,  364,  364,  364,  364,  364,  364,  365,
-      365,  307,  365,  365,  365,  365,  365,  366,  366,  306,
-      366,  366,  366,  366,  366,  367,  367,  368,  368,  368,
-      368,  369,  305,  369,  369,  369,  370,  370,  370,  370,
-      370,  370,  370,  370,  371,  371,  301,  371,  371,  371,
-
-      371,  371,  372,  372,  372,  372,  372,  372,  372,  372,
-      373,  373,  373,  373,  373,  373,  373,  373,  374,  298,
-      374,  375,  375,  375,  375,  376,  376,  376,  376,  377,
-      377,  377,  377,  377,  377,  377,  377,  378,  297,  378,
-      378,  378,  379,  379,  296,  295,  379,  379,  380,  380,
-      380,  380,  381,  381,  381,  381,  381,  381,  382,  382,
-      294,  382,  382,  382,  382,  382,  383,  383,  293,  383,
-      383,  383,  383,  383,  290,  286,  281,  279,  276,  274,
-      273,  272,  271,  265,  254,  252,  248,  244,  243,  241,
-      240,  236,  235,  234,  231,  228,  213,  204,  202,  196,
-
-      195,  194,  190,  188,  186,  183,  182,  181,  179,  178,
-      177,  176,  174,  173,  171,  170,  169,  167,  163,  132,
-      131,  129,  128,  127,  123,  122,  121,  115,  110,  107,
-      105,  104,  102,   99,   94,   92,   91,   88,   87,   84,
-       79,   55,   44,   33,   32,   28,   25,   19,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-
-      357,  357,  357
+        9,    9,    9,    9,    9,    9,    9,    9,    9,   11,
+       11,   30,  181,   79,   30,   42,   65,   69,   65,   65,
+
+       65,   65,   75,   72,   11,   71,   73,  181,   11,  160,
+       11,   11,   11,   11,   79,   78,   11,   69,   42,   11,
+       79,   69,   11,   11,   69,   76,   11,   72,   11,   11,
+       89,   71,   73,   11,   11,   15,   75,   90,   30,   15,
+       15,   78,  160,   15,   86,   93,   42,   42,   57,  110,
+       57,   57,   57,   57,   96,   76,   89,   77,   76,   93,
+      110,   90,   15,   15,   15,   15,   15,   87,   86,   15,
+      461,   86,   15,   15,   15,   15,   15,   77,   77,   15,
+       15,   15,   15,   88,   91,   97,   15,   87,   95,   77,
+       57,   96,  101,  114,   87,  101,  114,   91,  124,  116,
+
+       88,  182,  101,  102,  102,   91,  102,  116,   95,   95,
+       88,  106,   97,  116,  106,  102,  107,  107,  117,  107,
+       95,  106,  118,  182,  130,  147,  107,  130,  107,  460,
+      148,  149,  118,  117,  136,  136,  136,  136,  147,  117,
+      114,  139,  139,  139,  139,  153,  153,  153,  153,  124,
+      124,  140,  149,  140,  140,  140,  140,  148,  156,  159,
+      153,  141,  130,  141,  141,  141,  141,  143,  157,  143,
+      143,  143,  143,  158,  161,  162,  163,  156,  164,  165,
+      167,  157,  166,  168,  170,  159,  158,  169,  172,  174,
+      171,  173,  175,  177,  167,  176,  165,  179,  180,  185,
+
+      183,  184,  162,  166,  164,  248,  169,  161,  163,  166,
+      168,  171,  173,  176,  170,  265,  178,  235,  172,  248,
+      184,  171,  174,  317,  180,  455,  177,  185,  175,  178,
+      183,  187,  265,  179,  187,  188,  188,  317,  188,  189,
+      189,  187,  189,  178,  191,  191,  193,  191,  235,  193,
+      194,  194,  236,  194,  195,  195,  193,  195,  197,  197,
+      194,  197,  194,  227,  227,  227,  227,  230,  230,  230,
+      230,  237,  239,  239,  244,  239,  245,  236,  243,  243,
+      243,  243,  246,  247,  249,  250,  252,  253,  254,  258,
+      257,  255,  256,  243,  259,  263,  262,  260,  250,  264,
+
+      261,  267,  237,  454,  452,  252,  245,  244,  450,  249,
+      269,  263,  266,  246,  247,  258,  256,  253,  268,  255,
+      257,  261,  254,  255,  260,  266,  267,  259,  262,  264,
+      270,  269,  271,  272,  273,  274,  275,  268,  279,  276,
+      276,  292,  276,  297,  279,  295,  295,  273,  295,  299,
+      272,  270,  300,  275,  301,  271,  276,  303,  305,  307,
+      306,  274,  308,  310,  309,  313,  312,  315,  297,  311,
+      319,  314,  292,  306,  321,  320,  307,  318,  301,  308,
+      299,  312,  311,  322,  300,  309,  311,  320,  305,  303,
+      314,  313,  323,  318,  325,  310,  326,  327,  329,  329,
+
+      315,  329,  340,  319,  341,  321,  343,  345,  322,  325,
+      331,  331,  346,  331,  327,  332,  332,  323,  332,  340,
+      347,  326,  348,  343,  351,  349,  352,  331,  345,  353,
+      355,  358,  356,  359,  360,  361,  362,  348,  363,  341,
+      349,  364,  352,  358,  346,  356,  365,  361,  351,  372,
+      347,  373,  375,  376,  377,  378,  355,  359,  365,  383,
+      384,  353,  385,  386,  387,  388,  360,  389,  375,  362,
+      376,  363,  373,  364,  390,  372,  383,  391,  392,  393,
+      398,  402,  399,  400,  384,  393,  377,  378,  403,  391,
+      404,  406,  389,  408,  385,  386,  407,  388,  399,  390,
+
+      400,  387,  409,  412,  413,  403,  404,  420,  407,  423,
+      392,  416,  398,  426,  416,  417,  417,  417,  402,  418,
+      425,  408,  418,  427,  420,  423,  428,  429,  406,  430,
+      433,  468,  468,  433,  468,  412,  439,  443,  445,  409,
+      427,  413,  436,  433,  433,  433,  433,  426,  425,  434,
+      434,  434,  434,  439,  428,  435,  436,  430,  440,  435,
+      435,  435,  435,  442,  429,  443,  444,  449,  451,  457,
+      446,  440,  446,  446,  446,  446,  453,  459,  441,  438,
+      442,  447,  449,  444,  457,  447,  447,  447,  447,  463,
+      437,  432,  451,  453,  456,  456,  456,  456,  462,  431,
+
+      462,  462,  462,  462,  467,  467,  463,  467,  424,  422,
+      459,  465,  465,  465,  465,  421,  419,  467,  467,  467,
+      467,  471,  471,  471,  471,  471,  471,  471,  471,  472,
+      472,  472,  472,  472,  472,  472,  472,  473,  473,  473,
+      473,  473,  473,  473,  473,  474,  474,  474,  474,  474,
+      474,  474,  474,  475,  475,  475,  475,  475,  475,  475,
+      475,  476,  476,  476,  476,  476,  476,  476,  476,  477,
+      477,  477,  477,  477,  477,  477,  477,  478,  478,  415,
+      478,  478,  478,  478,  478,  479,  479,  414,  479,  479,
+      479,  479,  479,  480,  480,  411,  480,  480,  480,  480,
+
+      480,  481,  481,  482,  482,  482,  482,  483,  410,  483,
+      483,  483,  484,  484,  484,  484,  484,  484,  484,  484,
+      485,  485,  405,  485,  485,  485,  485,  485,  486,  486,
+      486,  486,  486,  486,  486,  486,  487,  487,  401,  487,
+      487,  487,  487,  487,  488,  488,  488,  488,  488,  488,
+      488,  488,  489,  397,  489,  490,  490,  490,  490,  491,
+      491,  491,  491,  492,  492,  492,  492,  492,  492,  492,
+      492,  493,  396,  493,  493,  493,  494,  494,  395,  394,
+      494,  494,  495,  495,  495,  495,  496,  496,  496,  496,
+      496,  496,  497,  497,  382,  497,  497,  497,  497,  497,
+
+      498,  498,  381,  498,  498,  498,  498,  498,  380,  379,
+      374,  371,  370,  369,  368,  367,  366,  357,  354,  350,
+      344,  342,  339,  337,  336,  335,  334,  328,  324,  316,
+      304,  302,  298,  294,  293,  291,  290,  286,  285,  284,
+      281,  278,  251,  242,  240,  234,  233,  232,  228,  226,
+      225,  223,  221,  218,  217,  216,  214,  213,  212,  211,
+      209,  208,  206,  205,  204,  202,  198,  155,  154,  152,
+      151,  150,  146,  145,  144,  138,  135,  134,  131,  128,
+      126,  125,  123,  120,  115,  113,  112,  109,  108,  105,
+      100,   60,   54,   48,   37,   36,   32,   29,   23,  470,
+
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  470,  470,  470,  470
     } ;
 
 static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
     } ;
 
 static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
@@ -770,6 +880,8 @@ static int parenth_depth = 0;
 static int before_comment = INITIAL;
 static gboolean class_after_c = FALSE;
 static int code_type = CCODE;
 static int before_comment = INITIAL;
 static gboolean class_after_c = FALSE;
 static int code_type = CCODE;
+static int before_string;
+static int property_paren_depth = 0;
 
 /* GTK+ doc stuff */
 static char *gtk_doc_func = NULL; /* current gtk-doc func */
 
 /* GTK+ doc stuff */
 static char *gtk_doc_func = NULL; /* current gtk-doc func */
@@ -827,19 +939,23 @@ int yylex(void);
 
 #define C_CODE 2
 
 
 #define C_CODE 2
 
-#define C_CODE_STRING 3
+#define CODE_STRING 3
 
 #define CLASS_CODE 4
 
 #define CLASS_CODE_I 5
 
 
 #define CLASS_CODE 4
 
 #define CLASS_CODE_I 5
 
-#define GTK_DOC_BEFORE_NAME 6
+#define PROPERTY_CODE 6
 
 
-#define GTK_DOC 7
+#define PROPERTY_CODE_I 7
 
 
-#define GTK_DOC_LINE 8
+#define GTK_DOC_BEFORE_NAME 8
 
 
-#line 843 "lex.yy.c"
+#define GTK_DOC 9
+
+#define GTK_DOC_LINE 10
+
+#line 959 "lex.yy.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -993,10 +1109,18 @@ YY_DECL
        register char *yy_cp = NULL, *yy_bp = NULL;
        register int yy_act;
 
        register char *yy_cp = NULL, *yy_bp = NULL;
        register int yy_act;
 
-#line 102 "lexer.l"
+#line 106 "lexer.l"
+
+
+
+/* Avoid warning from flex, cuz flex sucks */
+#ifdef FLEX_SCANNER
+yy_current_state = 0;
+#endif
+
 
 
 
 
-#line 1000 "lex.yy.c"
+#line 1124 "lex.yy.c"
 
        if ( yy_init )
                {
 
        if ( yy_init )
                {
@@ -1045,14 +1169,14 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 358 )
+                               if ( yy_current_state >= 471 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        *yy_state_ptr++ = yy_current_state;
                        ++yy_cp;
                        }
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        *yy_state_ptr++ = yy_current_state;
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 849 );
+               while ( yy_base[yy_current_state] != 1100 );
 
 yy_find_action:
                yy_current_state = *--yy_state_ptr;
 
 yy_find_action:
                yy_current_state = *--yy_state_ptr;
@@ -1083,7 +1207,7 @@ do_action:        /* This label is used only to access EOF actions. */
        { /* beginning of action switch */
 case 1:
 YY_RULE_SETUP
        { /* beginning of action switch */
 case 1:
 YY_RULE_SETUP
-#line 104 "lexer.l"
+#line 116 "lexer.l"
 { line_no++; REJECT; }
        YY_BREAK
 case 2:
 { line_no++; REJECT; }
        YY_BREAK
 case 2:
@@ -1091,7 +1215,7 @@ case 2:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 106 "lexer.l"
+#line 118 "lexer.l"
 {
 /* Thy evil easter egg */
 #define QQ(x) long x
 {
 /* Thy evil easter egg */
 #define QQ(x) long x
@@ -1119,12 +1243,12 @@ case 3:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 128 "lexer.l"
+#line 140 "lexer.l"
 { ; /*comment, ignore*/ }
        YY_BREAK
 case 4:
 YY_RULE_SETUP
 { ; /*comment, ignore*/ }
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 129 "lexer.l"
+#line 141 "lexer.l"
 {
        if(look_for_includes==1) {
                char *p;
 {
        if(look_for_includes==1) {
                char *p;
@@ -1147,7 +1271,7 @@ case 5:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 146 "lexer.l"
+#line 158 "lexer.l"
 {
                        /* eat out gtk doc stuff */
                        BEGIN(GTK_DOC_BEFORE_NAME);
 {
                        /* eat out gtk doc stuff */
                        BEGIN(GTK_DOC_BEFORE_NAME);
@@ -1159,7 +1283,7 @@ case 6:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 151 "lexer.l"
+#line 163 "lexer.l"
 {
                        /* empty doc lines */
                        ;
 {
                        /* empty doc lines */
                        ;
@@ -1170,7 +1294,7 @@ case 7:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 155 "lexer.l"
+#line 167 "lexer.l"
 {
                        char *p;
                        BEGIN(GTK_DOC);
 {
                        char *p;
                        BEGIN(GTK_DOC);
@@ -1184,14 +1308,14 @@ YY_RULE_SETUP
        YY_BREAK
 case 8:
 YY_RULE_SETUP
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 165 "lexer.l"
+#line 177 "lexer.l"
 {
                        BEGIN(CLASS_CODE_I);
                }
        YY_BREAK
 case 9:
 YY_RULE_SETUP
 {
                        BEGIN(CLASS_CODE_I);
                }
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 168 "lexer.l"
+#line 180 "lexer.l"
 {
                        BEGIN(COMMENT);
                        before_comment = CLASS_CODE_I;
 {
                        BEGIN(COMMENT);
                        before_comment = CLASS_CODE_I;
@@ -1202,7 +1326,7 @@ case 10:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 172 "lexer.l"
+#line 184 "lexer.l"
 {
                        /* empty doc lines */
                        add_to_cbuf(" *\n");
 {
                        /* empty doc lines */
                        add_to_cbuf(" *\n");
@@ -1210,7 +1334,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 11:
 YY_RULE_SETUP
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 176 "lexer.l"
+#line 188 "lexer.l"
 {
                        BEGIN(CLASS_CODE_I);
                        add_gtk_doc_func();
 {
                        BEGIN(CLASS_CODE_I);
                        add_gtk_doc_func();
@@ -1218,7 +1342,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 12:
 YY_RULE_SETUP
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 180 "lexer.l"
+#line 192 "lexer.l"
 {
                        fflush(stdout);
                        add_to_cbuf(" * ");
 {
                        fflush(stdout);
                        add_to_cbuf(" * ");
@@ -1227,14 +1351,14 @@ YY_RULE_SETUP
        YY_BREAK
 case 13:
 YY_RULE_SETUP
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 185 "lexer.l"
+#line 197 "lexer.l"
 {
                        BEGIN(CLASS_CODE_I);
                }
        YY_BREAK
 case 14:
 YY_RULE_SETUP
 {
                        BEGIN(CLASS_CODE_I);
                }
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 188 "lexer.l"
+#line 200 "lexer.l"
 {
                        BEGIN(COMMENT);
                        before_comment = CLASS_CODE_I;
 {
                        BEGIN(COMMENT);
                        before_comment = CLASS_CODE_I;
@@ -1242,7 +1366,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 192 "lexer.l"
+#line 204 "lexer.l"
 {
                        BEGIN(CLASS_CODE_I);
                        add_to_cbuf("\n");
 {
                        BEGIN(CLASS_CODE_I);
                        add_to_cbuf("\n");
@@ -1254,7 +1378,7 @@ case 16:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 197 "lexer.l"
+#line 209 "lexer.l"
 {
                        BEGIN(GTK_DOC);
                        add_to_cbuf(yytext);
 {
                        BEGIN(GTK_DOC);
                        add_to_cbuf(yytext);
@@ -1263,7 +1387,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 17:
 YY_RULE_SETUP
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 202 "lexer.l"
+#line 214 "lexer.l"
 {
                        fflush(stdout);
                        add_to_cbuf(yytext);
 {
                        fflush(stdout);
                        add_to_cbuf(yytext);
@@ -1274,7 +1398,7 @@ case 18:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 207 "lexer.l"
+#line 219 "lexer.l"
 { add_to_cbuf(yytext); /*comment, ignore*/ }
        YY_BREAK
 case 19:
 { add_to_cbuf(yytext); /*comment, ignore*/ }
        YY_BREAK
 case 19:
@@ -1282,7 +1406,7 @@ case 19:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 208 "lexer.l"
+#line 220 "lexer.l"
 { ; /*comment, ignore*/ }
        YY_BREAK
 case 20:
 { ; /*comment, ignore*/ }
        YY_BREAK
 case 20:
@@ -1290,17 +1414,17 @@ case 20:
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 209 "lexer.l"
+#line 221 "lexer.l"
 { ; /*comment, ignore*/ }
        YY_BREAK
 case 21:
 YY_RULE_SETUP
 { ; /*comment, ignore*/ }
        YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 210 "lexer.l"
+#line 222 "lexer.l"
 {BEGIN(COMMENT); before_comment = INITIAL; }
        YY_BREAK
 case 22:
 YY_RULE_SETUP
 {BEGIN(COMMENT); before_comment = INITIAL; }
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 211 "lexer.l"
+#line 223 "lexer.l"
 {
        add_to_cbuf(yytext);
        BEGIN(COMMENT);
 {
        add_to_cbuf(yytext);
        BEGIN(COMMENT);
@@ -1309,17 +1433,17 @@ YY_RULE_SETUP
        YY_BREAK
 case 23:
 YY_RULE_SETUP
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 216 "lexer.l"
+#line 228 "lexer.l"
 {BEGIN(COMMENT); before_comment = CLASS_CODE; }
        YY_BREAK
 case 24:
 YY_RULE_SETUP
 {BEGIN(COMMENT); before_comment = CLASS_CODE; }
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 217 "lexer.l"
+#line 229 "lexer.l"
 {BEGIN(COMMENT); before_comment = CLASS_CODE_I; }
        YY_BREAK
 case 25:
 YY_RULE_SETUP
 {BEGIN(COMMENT); before_comment = CLASS_CODE_I; }
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 218 "lexer.l"
+#line 230 "lexer.l"
 {
        if(before_comment == C_CODE) add_to_cbuf(yytext);
        BEGIN(before_comment);
 {
        if(before_comment == C_CODE) add_to_cbuf(yytext);
        BEGIN(before_comment);
@@ -1327,7 +1451,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 26:
 YY_RULE_SETUP
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 222 "lexer.l"
+#line 234 "lexer.l"
 {
        /* comment, ignore */
        if(before_comment == C_CODE) add_to_cbuf(yytext);
 {
        /* comment, ignore */
        if(before_comment == C_CODE) add_to_cbuf(yytext);
@@ -1335,7 +1459,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 27:
 YY_RULE_SETUP
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 226 "lexer.l"
+#line 238 "lexer.l"
 {
        /* comment, ignore */
        if(before_comment == C_CODE) add_to_cbuf(yytext);
 {
        /* comment, ignore */
        if(before_comment == C_CODE) add_to_cbuf(yytext);
@@ -1343,7 +1467,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 28:
 YY_RULE_SETUP
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 231 "lexer.l"
+#line 243 "lexer.l"
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
@@ -1355,7 +1479,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 29:
 YY_RULE_SETUP
        YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 239 "lexer.l"
+#line 251 "lexer.l"
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
@@ -1367,7 +1491,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 30:
 YY_RULE_SETUP
        YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 248 "lexer.l"
+#line 260 "lexer.l"
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
@@ -1379,7 +1503,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 31:
 YY_RULE_SETUP
        YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 256 "lexer.l"
+#line 268 "lexer.l"
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
@@ -1391,7 +1515,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 32:
 YY_RULE_SETUP
        YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 264 "lexer.l"
+#line 276 "lexer.l"
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
@@ -1403,7 +1527,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 33:
 YY_RULE_SETUP
        YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 272 "lexer.l"
+#line 284 "lexer.l"
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
 {
                        BEGIN(C_CODE);
                        parenth_depth = 1;
@@ -1417,7 +1541,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 34:
 YY_RULE_SETUP
        YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 282 "lexer.l"
+#line 294 "lexer.l"
 {
                        BEGIN(INITIAL);
                        yylval.cbuf = cbuf;
 {
                        BEGIN(INITIAL);
                        yylval.cbuf = cbuf;
@@ -1429,81 +1553,97 @@ YY_RULE_SETUP
        YY_BREAK
 case 35:
 YY_RULE_SETUP
        YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 291 "lexer.l"
+#line 303 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 36:
 YY_RULE_SETUP
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 292 "lexer.l"
+#line 304 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 37:
 YY_RULE_SETUP
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 293 "lexer.l"
+#line 305 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 38:
 YY_RULE_SETUP
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 294 "lexer.l"
+#line 306 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 39:
 YY_RULE_SETUP
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 295 "lexer.l"
+#line 307 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 40:
 YY_RULE_SETUP
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 296 "lexer.l"
+#line 308 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 41:
 YY_RULE_SETUP
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 298 "lexer.l"
+#line 310 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 42:
 YY_RULE_SETUP
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 299 "lexer.l"
+#line 313 "lexer.l"
 {
 {
-                       BEGIN(C_CODE_STRING);
+                       BEGIN(CODE_STRING);
+                       before_string = C_CODE;
                        add_to_cbuf(yytext);
                }
        YY_BREAK
 case 43:
 YY_RULE_SETUP
                        add_to_cbuf(yytext);
                }
        YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 303 "lexer.l"
-{ add_to_cbuf(yytext); }
+#line 318 "lexer.l"
+{
+                       BEGIN(CODE_STRING);
+                       before_string = PROPERTY_CODE_I;
+                       add_to_cbuf(yytext);
+               }
        YY_BREAK
 case 44:
 YY_RULE_SETUP
        YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 304 "lexer.l"
-{
-                               BEGIN(C_CODE);
-                               add_to_cbuf(yytext);
-                       }
+#line 323 "lexer.l"
+{ add_to_cbuf(yytext); }
        YY_BREAK
 case 45:
 YY_RULE_SETUP
        YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 308 "lexer.l"
-{ add_to_cbuf(yytext); }
+#line 324 "lexer.l"
+{
+                       BEGIN(before_string);
+                       add_to_cbuf(yytext);
+                       if (before_string == PROPERTY_CODE_I) {
+                               yylval.id = cbuf->str;
+                               g_string_free (cbuf, FALSE);
+                               cbuf = NULL;
+                               return STRING;
+                       }
+               }
        YY_BREAK
 case 46:
 YY_RULE_SETUP
        YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 309 "lexer.l"
+#line 334 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 47:
 YY_RULE_SETUP
 { add_to_cbuf(yytext); }
        YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 311 "lexer.l"
+#line 335 "lexer.l"
+{ add_to_cbuf(yytext); }
+       YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 337 "lexer.l"
 {
                        parenth_depth++;
                        add_to_cbuf(yytext);
                }
        YY_BREAK
 {
                        parenth_depth++;
                        add_to_cbuf(yytext);
                }
        YY_BREAK
-case 48:
+case 49:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 315 "lexer.l"
+#line 341 "lexer.l"
 {
                        parenth_depth--;
                        if(parenth_depth<0) {
 {
                        parenth_depth--;
                        if(parenth_depth<0) {
@@ -1517,19 +1657,19 @@ YY_RULE_SETUP
                        add_to_cbuf(yytext);
                }
        YY_BREAK
                        add_to_cbuf(yytext);
                }
        YY_BREAK
-case 49:
+case 50:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 328 "lexer.l"
+#line 354 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 { add_to_cbuf(yytext); }
        YY_BREAK
-case 50:
+case 51:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 329 "lexer.l"
+#line 355 "lexer.l"
 { add_to_cbuf(yytext); }
        YY_BREAK
 { add_to_cbuf(yytext); }
        YY_BREAK
-case 51:
+case 52:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 331 "lexer.l"
+#line 357 "lexer.l"
 {
                        static int found_classes = 0;
                        look_for_includes = 2;
 {
                        static int found_classes = 0;
                        look_for_includes = 2;
@@ -1543,36 +1683,56 @@ YY_RULE_SETUP
                        return CLASS;
                }
        YY_BREAK
                        return CLASS;
                }
        YY_BREAK
-case 52:
+case 53:
 *yy_cp = yy_hold_char; /* undo effects of setting up yytext */
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 *yy_cp = yy_hold_char; /* undo effects of setting up yytext */
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 344 "lexer.l"
+#line 370 "lexer.l"
 {
 {
-                       int maj = 0,min = 0,pl = 0;
-                       int rmaj = 0,rmin = 0,rpl = 0;
+                       int maj = 0, min = 0, pl = 0;
+                       int rmaj = 0, rmin = 0, rpl = 0;
+                       int effective_maj = 0;
+                       int effective_rmaj = 0;
                        char *p;
                        
                        char *p;
                        
-                       sscanf(VERSION,"%d.%d.%d",&rmaj,&rmin,&rpl);
-                       p = strchr(yytext,'r');
-                       g_assert(p); /* we MUST have found it */
-                       sscanf(p,"requires %d.%d.%d",&maj,&min,&pl);
+                       sscanf (VERSION, "%d.%d.%d", &rmaj, &rmin, &rpl);
+                       effective_rmaj = rmaj;
+                       if (rmin >= 90)
+                               effective_rmaj = rmaj + 1;
+
+                       p = strchr (yytext,'r');
+                       g_assert (p); /* we MUST have found it */
+                       sscanf (p, "requires %d.%d.%d", &maj, &min, &pl);
+                       effective_maj = maj;
+                       if (min >= 90)
+                               effective_maj = maj + 1;
+
                        if(rmaj < maj ||
                           (rmaj == maj && rmin < min) ||
                           (rmaj == maj && rmin == min && rpl < pl)) {
                        if(rmaj < maj ||
                           (rmaj == maj && rmin < min) ||
                           (rmaj == maj && rmin == min && rpl < pl)) {
+                               error_printf (GOB_ERROR, line_no,
+                                             "GOB version at least %d.%d.%d required "
+                                             "(this is %s)\n"
+                                             "To upgrade your gob, see: "
+                                             "http://www.5z.com/jirka/gob.html",
+                                             maj, min, pl, VERSION);
+                       }
+
+                       if(effective_rmaj != effective_maj) {
                                error_printf(GOB_ERROR, line_no,
                                error_printf(GOB_ERROR, line_no,
-                                            "GOB version %d.%d.%d required "
+                                            "GOB major version %d required "
                                             "(this is %s)\n"
                                             "To upgrade your gob, see: "
                                             "http://www.5z.com/jirka/gob.html",
                                             "(this is %s)\n"
                                             "To upgrade your gob, see: "
                                             "http://www.5z.com/jirka/gob.html",
-                                            maj, min, pl, VERSION);
+                                            maj, VERSION);
                        }
                        }
+
                }
        YY_BREAK
                }
        YY_BREAK
-case 53:
+case 54:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 365 "lexer.l"
+#line 411 "lexer.l"
 {
                        if(for_cpp) {
                                error_printf(GOB_WARN, line_no,
 {
                        if(for_cpp) {
                                error_printf(GOB_WARN, line_no,
@@ -1583,174 +1743,282 @@ YY_RULE_SETUP
                        REJECT;
                }
        YY_BREAK
                        REJECT;
                }
        YY_BREAK
-case 54:
+case 55:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 375 "lexer.l"
+#line 421 "lexer.l"
 {return FROM;}
        YY_BREAK
 {return FROM;}
        YY_BREAK
-case 55:
+case 56:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 377 "lexer.l"
+#line 423 "lexer.l"
 {return VOID;}
        YY_BREAK
 {return VOID;}
        YY_BREAK
-case 56:
+case 57:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 378 "lexer.l"
+#line 424 "lexer.l"
 {return STRUCT;}
        YY_BREAK
 {return STRUCT;}
        YY_BREAK
-case 57:
+case 58:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 379 "lexer.l"
+#line 425 "lexer.l"
 {return UNION;}
        YY_BREAK
 {return UNION;}
        YY_BREAK
-case 58:
+case 59:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 380 "lexer.l"
+#line 426 "lexer.l"
 {return ENUM;}
        YY_BREAK
 {return ENUM;}
        YY_BREAK
-case 59:
+case 60:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 381 "lexer.l"
+#line 427 "lexer.l"
 {return SIGNED;}
        YY_BREAK
 {return SIGNED;}
        YY_BREAK
-case 60:
+case 61:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 382 "lexer.l"
+#line 428 "lexer.l"
 {return UNSIGNED;}
        YY_BREAK
 {return UNSIGNED;}
        YY_BREAK
-case 61:
+case 62:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 383 "lexer.l"
+#line 429 "lexer.l"
 {return LONG;}
        YY_BREAK
 {return LONG;}
        YY_BREAK
-case 62:
+case 63:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 384 "lexer.l"
+#line 430 "lexer.l"
 {return SHORT;}
        YY_BREAK
 {return SHORT;}
        YY_BREAK
-case 63:
+case 64:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 385 "lexer.l"
+#line 431 "lexer.l"
 {return INT;}
        YY_BREAK
 {return INT;}
        YY_BREAK
-case 64:
+case 65:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 386 "lexer.l"
+#line 432 "lexer.l"
 {return FLOAT;}
        YY_BREAK
 {return FLOAT;}
        YY_BREAK
-case 65:
+case 66:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 387 "lexer.l"
+#line 433 "lexer.l"
 {return DOUBLE;}
        YY_BREAK
 {return DOUBLE;}
        YY_BREAK
-case 66:
+case 67:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 388 "lexer.l"
+#line 434 "lexer.l"
 {return CHAR;}
        YY_BREAK
 {return CHAR;}
        YY_BREAK
-case 67:
+case 68:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 389 "lexer.l"
+#line 435 "lexer.l"
 {return CONST;}
        YY_BREAK
 {return CONST;}
        YY_BREAK
-case 68:
+case 69:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 391 "lexer.l"
+#line 437 "lexer.l"
 {return THREEDOTS;}
        YY_BREAK
 {return THREEDOTS;}
        YY_BREAK
-case 69:
+case 70:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 393 "lexer.l"
+#line 439 "lexer.l"
 {yylval.line = line_no; return PUBLIC;}
        YY_BREAK
 {yylval.line = line_no; return PUBLIC;}
        YY_BREAK
-case 70:
+case 71:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 394 "lexer.l"
+#line 440 "lexer.l"
 {yylval.line = line_no; return PRIVATE;}
        YY_BREAK
 {yylval.line = line_no; return PRIVATE;}
        YY_BREAK
-case 71:
+case 72:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 395 "lexer.l"
+#line 441 "lexer.l"
 {yylval.line = line_no; return PROTECTED;}
        YY_BREAK
 {yylval.line = line_no; return PROTECTED;}
        YY_BREAK
-case 72:
+case 73:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 396 "lexer.l"
+#line 442 "lexer.l"
 {yylval.line = line_no; return CLASSWIDE;}
        YY_BREAK
 {yylval.line = line_no; return CLASSWIDE;}
        YY_BREAK
-case 73:
+case 74:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 397 "lexer.l"
+#line 443 "lexer.l"
 {yylval.line = line_no; return ARGUMENT;}
        YY_BREAK
 {yylval.line = line_no; return ARGUMENT;}
        YY_BREAK
-case 74:
+case 75:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 398 "lexer.l"
+#line 444 "lexer.l"
 {yylval.line = line_no; return VIRTUAL;}
        YY_BREAK
 {yylval.line = line_no; return VIRTUAL;}
        YY_BREAK
-case 75:
+case 76:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 399 "lexer.l"
+#line 445 "lexer.l"
 {yylval.line = line_no; return SIGNAL;}
        YY_BREAK
 {yylval.line = line_no; return SIGNAL;}
        YY_BREAK
-case 76:
+case 77:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 400 "lexer.l"
+#line 446 "lexer.l"
 {yylval.line = line_no; return OVERRIDE;}
        YY_BREAK
 {yylval.line = line_no; return OVERRIDE;}
        YY_BREAK
-case 77:
+case 78:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 401 "lexer.l"
+#line 447 "lexer.l"
+{
+                               yylval.line = line_no;
+                               BEGIN(PROPERTY_CODE);
+                               return PROPERTY;
+                       }
+       YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 452 "lexer.l"
+{ yylval.line = line_no; return NICK; }
+       YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 453 "lexer.l"
+{ yylval.line = line_no; return BLURB; }
+       YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 454 "lexer.l"
+{ yylval.line = line_no; return MAXIMUM; }
+       YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 455 "lexer.l"
+{ yylval.line = line_no; return MINIMUM; }
+       YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 456 "lexer.l"
+{ yylval.line = line_no; return DEFAULT_VALUE; }
+       YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 457 "lexer.l"
+{ yylval.line = line_no; return FLAGS; }
+       YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 458 "lexer.l"
+{ yylval.line = line_no; return TYPE; }
+       YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 459 "lexer.l"
+{ yylval.line = line_no; return FLAGS_TYPE; }
+       YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 460 "lexer.l"
+{ yylval.line = line_no; return ENUM_TYPE; }
+       YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 461 "lexer.l"
+{ yylval.line = line_no; return PARAM_TYPE; }
+       YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 462 "lexer.l"
+{ yylval.line = line_no; return BOXED_TYPE; }
+       YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 463 "lexer.l"
+{ yylval.line = line_no; return OBJECT_TYPE; }
+       YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 464 "lexer.l"
+{
+               yylval.line = line_no;
+               property_paren_depth = 1;
+               BEGIN(PROPERTY_CODE_I);
+               return '(';
+                       }
+       YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 470 "lexer.l"
+{
+               yylval.line = line_no;
+               property_paren_depth++;
+               return '(';
+                       }
+       YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 475 "lexer.l"
+{
+               yylval.line = line_no;
+               property_paren_depth--;
+               if (property_paren_depth == 0) {
+                       BEGIN(CLASS_CODE_I);
+               }
+               return ')';
+                       }
+       YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 484 "lexer.l"
 {
                        yylval.id = g_strdup(yytext);
                        return NUMBER;
                }
        YY_BREAK
 {
                        yylval.id = g_strdup(yytext);
                        return NUMBER;
                }
        YY_BREAK
-case 78:
+case 95:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 405 "lexer.l"
+#line 488 "lexer.l"
 {
                        /* this one is for a classname with a namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
                }
        YY_BREAK
 {
                        /* this one is for a classname with a namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
                }
        YY_BREAK
-case 79:
+case 96:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 410 "lexer.l"
+#line 493 "lexer.l"
 {
                        /* this is for a classname with an empty namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
                }
        YY_BREAK
 {
                        /* this is for a classname with an empty namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
                }
        YY_BREAK
-case 80:
+case 97:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 415 "lexer.l"
+#line 498 "lexer.l"
 {
                        yylval.id = g_strdup(yytext);
                        return TOKEN;
                }
        YY_BREAK
 {
                        yylval.id = g_strdup(yytext);
                        return TOKEN;
                }
        YY_BREAK
-case 81:
+case 98:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 420 "lexer.l"
+#line 502 "lexer.l"
+{
+                       yylval.id = g_strdup(yytext);
+                       return SINGLE_CHAR;
+               }
+       YY_BREAK
+case 99:
+YY_RULE_SETUP
+#line 507 "lexer.l"
 {
                        yylval.id = g_strdup(yytext);
                        return ARRAY_DIM;
                }
        YY_BREAK
 {
                        yylval.id = g_strdup(yytext);
                        return ARRAY_DIM;
                }
        YY_BREAK
-case 82:
+case 100:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 425 "lexer.l"
+#line 512 "lexer.l"
 {
                        BEGIN(CLASS_CODE_I);
                        return '{';
                }
        YY_BREAK
 {
                        BEGIN(CLASS_CODE_I);
                        return '{';
                }
        YY_BREAK
-case 83:
+case 101:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 429 "lexer.l"
+#line 516 "lexer.l"
 {
                        BEGIN(C_CODE);
                        parenth_depth=1;
 {
                        BEGIN(C_CODE);
                        parenth_depth=1;
@@ -1761,44 +2029,46 @@ YY_RULE_SETUP
                        return '{';
                }
        YY_BREAK
                        return '{';
                }
        YY_BREAK
-case 84:
+case 102:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 438 "lexer.l"
+#line 525 "lexer.l"
 {
                                BEGIN(INITIAL);
                                return '}';
                        }
        YY_BREAK
 {
                                BEGIN(INITIAL);
                                return '}';
                        }
        YY_BREAK
-case 85:
+case 103:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 443 "lexer.l"
+#line 530 "lexer.l"
 ;  /*ignore*/
        YY_BREAK
 ;  /*ignore*/
        YY_BREAK
-case 86:
+case 104:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 445 "lexer.l"
+#line 532 "lexer.l"
 {
                        yylval.line = line_no;
                        return yytext[0];
                }
        YY_BREAK
 {
                        yylval.line = line_no;
                        return yytext[0];
                }
        YY_BREAK
-case 87:
+case 105:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 450 "lexer.l"
+#line 537 "lexer.l"
 ;  /*ignore*/
        YY_BREAK
 ;  /*ignore*/
        YY_BREAK
-case 88:
+case 106:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 452 "lexer.l"
+#line 539 "lexer.l"
 ECHO;
        YY_BREAK
 ECHO;
        YY_BREAK
-#line 1796 "lex.yy.c"
+#line 2064 "lex.yy.c"
                        case YY_STATE_EOF(INITIAL):
                        case YY_STATE_EOF(COMMENT):
                        case YY_STATE_EOF(C_CODE):
                        case YY_STATE_EOF(INITIAL):
                        case YY_STATE_EOF(COMMENT):
                        case YY_STATE_EOF(C_CODE):
-                       case YY_STATE_EOF(C_CODE_STRING):
+                       case YY_STATE_EOF(CODE_STRING):
                        case YY_STATE_EOF(CLASS_CODE):
                        case YY_STATE_EOF(CLASS_CODE_I):
                        case YY_STATE_EOF(CLASS_CODE):
                        case YY_STATE_EOF(CLASS_CODE_I):
+                       case YY_STATE_EOF(PROPERTY_CODE):
+                       case YY_STATE_EOF(PROPERTY_CODE_I):
                        case YY_STATE_EOF(GTK_DOC_BEFORE_NAME):
                        case YY_STATE_EOF(GTK_DOC):
                        case YY_STATE_EOF(GTK_DOC_LINE):
                        case YY_STATE_EOF(GTK_DOC_BEFORE_NAME):
                        case YY_STATE_EOF(GTK_DOC):
                        case YY_STATE_EOF(GTK_DOC_LINE):
@@ -2090,7 +2360,7 @@ static yy_state_type yy_get_previous_state()
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 358 )
+                       if ( yy_current_state >= 471 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2120,11 +2390,11 @@ yy_state_type yy_current_state;
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 358 )
+               if ( yy_current_state >= 471 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 357);
+       yy_is_jam = (yy_current_state == 470);
        if ( ! yy_is_jam )
                *yy_state_ptr++ = yy_current_state;
 
        if ( ! yy_is_jam )
                *yy_state_ptr++ = yy_current_state;
 
@@ -2682,7 +2952,7 @@ int main()
        return 0;
        }
 #endif
        return 0;
        }
 #endif
-#line 452 "lexer.l"
+#line 539 "lexer.l"
 
 
 /* Ugly warning avoiding */
 
 
 /* Ugly warning avoiding */
index f45fcc5bc384f246e709a019bbce5d238921936f..e102286510e0a8c4c4d993e78f9b48ca69ba5d80 100644 (file)
@@ -33,6 +33,8 @@ static int parenth_depth = 0;
 static int before_comment = INITIAL;
 static gboolean class_after_c = FALSE;
 static int code_type = CCODE;
 static int before_comment = INITIAL;
 static gboolean class_after_c = FALSE;
 static int code_type = CCODE;
+static int before_string;
+static int property_paren_depth = 0;
 
 /* GTK+ doc stuff */
 static char *gtk_doc_func = NULL; /* current gtk-doc func */
 
 /* GTK+ doc stuff */
 static char *gtk_doc_func = NULL; /* current gtk-doc func */
@@ -90,9 +92,11 @@ int yylex(void);
 
 %x COMMENT
 %x C_CODE
 
 %x COMMENT
 %x C_CODE
-%x C_CODE_STRING
+%x CODE_STRING
 %x CLASS_CODE
 %x CLASS_CODE_I
 %x CLASS_CODE
 %x CLASS_CODE_I
+%x PROPERTY_CODE
+%x PROPERTY_CODE_I
 %x GTK_DOC_BEFORE_NAME
 %x GTK_DOC
 %x GTK_DOC_LINE
 %x GTK_DOC_BEFORE_NAME
 %x GTK_DOC
 %x GTK_DOC_LINE
@@ -101,6 +105,14 @@ int yylex(void);
 
 %%
 
 
 %%
 
+%{
+/* Avoid warning from flex, cuz flex sucks */
+#ifdef FLEX_SCANNER
+yy_current_state = 0;
+#endif
+%}
+
+
 <*>\n                  { line_no++; REJECT; }
 
 <COMMENT>^(I(S.RI).E\(([1-9][0-9]+|[2-9]))/(\))        {
 <*>\n                  { line_no++; REJECT; }
 
 <COMMENT>^(I(S.RI).E\(([1-9][0-9]+|[2-9]))/(\))        {
@@ -296,17 +308,31 @@ REJECT;
 <C_CODE>\'\\\"\'       { add_to_cbuf(yytext); }
        
 <C_CODE>\\.    { add_to_cbuf(yytext); }
 <C_CODE>\'\\\"\'       { add_to_cbuf(yytext); }
        
 <C_CODE>\\.    { add_to_cbuf(yytext); }
+
+
 <C_CODE>\"     {
 <C_CODE>\"     {
-                       BEGIN(C_CODE_STRING);
+                       BEGIN(CODE_STRING);
+                       before_string = C_CODE;
+                       add_to_cbuf(yytext);
+               }
+<PROPERTY_CODE_I>\"    {
+                       BEGIN(CODE_STRING);
+                       before_string = PROPERTY_CODE_I;
                        add_to_cbuf(yytext);
                }
                        add_to_cbuf(yytext);
                }
-<C_CODE_STRING>\\.     { add_to_cbuf(yytext); }
-<C_CODE_STRING>\"      {
-                               BEGIN(C_CODE);
-                               add_to_cbuf(yytext);
+<CODE_STRING>\\.       { add_to_cbuf(yytext); }
+<CODE_STRING>\"        {
+                       BEGIN(before_string);
+                       add_to_cbuf(yytext);
+                       if (before_string == PROPERTY_CODE_I) {
+                               yylval.id = cbuf->str;
+                               g_string_free (cbuf, FALSE);
+                               cbuf = NULL;
+                               return STRING;
                        }
                        }
-<C_CODE_STRING>.       { add_to_cbuf(yytext); }
-<C_CODE_STRING>\n      { add_to_cbuf(yytext); }
+               }
+<CODE_STRING>. { add_to_cbuf(yytext); }
+<CODE_STRING>\n        { add_to_cbuf(yytext); }
 
 <C_CODE>\{     {
                        parenth_depth++;
 
 <C_CODE>\{     {
                        parenth_depth++;
@@ -342,24 +368,44 @@ class             {
                }
 
 ^[ \t]*requires[ \t]+[0-9]+\.[0-9]+\.[0-9]+[\t ]*$     {
                }
 
 ^[ \t]*requires[ \t]+[0-9]+\.[0-9]+\.[0-9]+[\t ]*$     {
-                       int maj = 0,min = 0,pl = 0;
-                       int rmaj = 0,rmin = 0,rpl = 0;
+                       int maj = 0, min = 0, pl = 0;
+                       int rmaj = 0, rmin = 0, rpl = 0;
+                       int effective_maj = 0;
+                       int effective_rmaj = 0;
                        char *p;
                        
                        char *p;
                        
-                       sscanf(VERSION,"%d.%d.%d",&rmaj,&rmin,&rpl);
-                       p = strchr(yytext,'r');
-                       g_assert(p); /* we MUST have found it */
-                       sscanf(p,"requires %d.%d.%d",&maj,&min,&pl);
+                       sscanf (VERSION, "%d.%d.%d", &rmaj, &rmin, &rpl);
+                       effective_rmaj = rmaj;
+                       if (rmin >= 90)
+                               effective_rmaj = rmaj + 1;
+
+                       p = strchr (yytext,'r');
+                       g_assert (p); /* we MUST have found it */
+                       sscanf (p, "requires %d.%d.%d", &maj, &min, &pl);
+                       effective_maj = maj;
+                       if (min >= 90)
+                               effective_maj = maj + 1;
+
                        if(rmaj < maj ||
                           (rmaj == maj && rmin < min) ||
                           (rmaj == maj && rmin == min && rpl < pl)) {
                        if(rmaj < maj ||
                           (rmaj == maj && rmin < min) ||
                           (rmaj == maj && rmin == min && rpl < pl)) {
+                               error_printf (GOB_ERROR, line_no,
+                                             "GOB version at least %d.%d.%d required "
+                                             "(this is %s)\n"
+                                             "To upgrade your gob, see: "
+                                             "http://www.5z.com/jirka/gob.html",
+                                             maj, min, pl, VERSION);
+                       }
+
+                       if(effective_rmaj != effective_maj) {
                                error_printf(GOB_ERROR, line_no,
                                error_printf(GOB_ERROR, line_no,
-                                            "GOB version %d.%d.%d required "
+                                            "GOB major version %d required "
                                             "(this is %s)\n"
                                             "To upgrade your gob, see: "
                                             "http://www.5z.com/jirka/gob.html",
                                             "(this is %s)\n"
                                             "To upgrade your gob, see: "
                                             "http://www.5z.com/jirka/gob.html",
-                                            maj, min, pl, VERSION);
+                                            maj, VERSION);
                        }
                        }
+
                }
 
 <CLASS_CODE,CLASS_CODE_I>class|this    {
                }
 
 <CLASS_CODE,CLASS_CODE_I>class|this    {
@@ -374,19 +420,19 @@ class             {
 
 <CLASS_CODE>from       {return FROM;}
 
 
 <CLASS_CODE>from       {return FROM;}
 
-<CLASS_CODE_I>void     {return VOID;}
-<CLASS_CODE_I>struct   {return STRUCT;}
-<CLASS_CODE_I>union    {return UNION;}
-<CLASS_CODE_I>enum     {return ENUM;}
-<CLASS_CODE_I>signed   {return SIGNED;}
-<CLASS_CODE_I>unsigned {return UNSIGNED;}
-<CLASS_CODE_I>long     {return LONG;}
-<CLASS_CODE_I>short    {return SHORT;}
-<CLASS_CODE_I>int      {return INT;}
-<CLASS_CODE_I>float    {return FLOAT;}
-<CLASS_CODE_I>double   {return DOUBLE;}
-<CLASS_CODE_I>char     {return CHAR;}
-<CLASS_CODE_I>const    {return CONST;}
+<CLASS_CODE_I,PROPERTY_CODE_I>void     {return VOID;}
+<CLASS_CODE_I,PROPERTY_CODE_I>struct   {return STRUCT;}
+<CLASS_CODE_I,PROPERTY_CODE_I>union    {return UNION;}
+<CLASS_CODE_I,PROPERTY_CODE_I>enum     {return ENUM;}
+<CLASS_CODE_I,PROPERTY_CODE_I>signed   {return SIGNED;}
+<CLASS_CODE_I,PROPERTY_CODE_I>unsigned {return UNSIGNED;}
+<CLASS_CODE_I,PROPERTY_CODE_I>long     {return LONG;}
+<CLASS_CODE_I,PROPERTY_CODE_I>short    {return SHORT;}
+<CLASS_CODE_I,PROPERTY_CODE_I>int      {return INT;}
+<CLASS_CODE_I,PROPERTY_CODE_I>float    {return FLOAT;}
+<CLASS_CODE_I,PROPERTY_CODE_I>double   {return DOUBLE;}
+<CLASS_CODE_I,PROPERTY_CODE_I>char     {return CHAR;}
+<CLASS_CODE_I,PROPERTY_CODE_I>const    {return CONST;}
 
 <CLASS_CODE_I>\.\.\.   {return THREEDOTS;}
 
 
 <CLASS_CODE_I>\.\.\.   {return THREEDOTS;}
 
@@ -398,24 +444,65 @@ class             {
 <CLASS_CODE_I>virtual  {yylval.line = line_no; return VIRTUAL;}
 <CLASS_CODE_I>signal   {yylval.line = line_no; return SIGNAL;}
 <CLASS_CODE_I>override {yylval.line = line_no; return OVERRIDE;}
 <CLASS_CODE_I>virtual  {yylval.line = line_no; return VIRTUAL;}
 <CLASS_CODE_I>signal   {yylval.line = line_no; return SIGNAL;}
 <CLASS_CODE_I>override {yylval.line = line_no; return OVERRIDE;}
-<CLASS_CODE,CLASS_CODE_I>0|[1-9][0-9]*|0x[0-9a-fA-F]+|0[0-7]+|[0-9]*\.[0-9]+|\.[0-9][0-9]*     {
+<CLASS_CODE_I>property {
+                               yylval.line = line_no;
+                               BEGIN(PROPERTY_CODE);
+                               return PROPERTY;
+                       }
+<PROPERTY_CODE_I>nick  { yylval.line = line_no; return NICK; }
+<PROPERTY_CODE_I>blurb { yylval.line = line_no; return BLURB; }
+<PROPERTY_CODE_I>maximum       { yylval.line = line_no; return MAXIMUM; }
+<PROPERTY_CODE_I>minimum       { yylval.line = line_no; return MINIMUM; }
+<PROPERTY_CODE_I>default_value { yylval.line = line_no; return DEFAULT_VALUE; }
+<PROPERTY_CODE_I>flags { yylval.line = line_no; return FLAGS; }
+<PROPERTY_CODE_I>type  { yylval.line = line_no; return TYPE; }
+<PROPERTY_CODE_I>flags_type    { yylval.line = line_no; return FLAGS_TYPE; }
+<PROPERTY_CODE_I>enum_type     { yylval.line = line_no; return ENUM_TYPE; }
+<PROPERTY_CODE_I>param_type    { yylval.line = line_no; return PARAM_TYPE; }
+<PROPERTY_CODE_I>boxed_type    { yylval.line = line_no; return BOXED_TYPE; }
+<PROPERTY_CODE_I>object_type   { yylval.line = line_no; return OBJECT_TYPE; }
+<PROPERTY_CODE>[(]     {
+               yylval.line = line_no;
+               property_paren_depth = 1;
+               BEGIN(PROPERTY_CODE_I);
+               return '(';
+                       }
+<PROPERTY_CODE_I>[(]   {
+               yylval.line = line_no;
+               property_paren_depth++;
+               return '(';
+                       }
+<PROPERTY_CODE_I>[)]   {
+               yylval.line = line_no;
+               property_paren_depth--;
+               if (property_paren_depth == 0) {
+                       BEGIN(CLASS_CODE_I);
+               }
+               return ')';
+                       }
+
+<CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I>0|[1-9][0-9]*|0x[0-9a-fA-F]+|0[0-7]+|[0-9]*\.[0-9]+|\.[0-9][0-9]*       {
                        yylval.id = g_strdup(yytext);
                        return NUMBER;
                }
                        yylval.id = g_strdup(yytext);
                        return NUMBER;
                }
-<CLASS_CODE,CLASS_CODE_I>[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)+       {
+<CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I>[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)+ {
                        /* this one is for a classname with a namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
                }
                        /* this one is for a classname with a namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
                }
-<CLASS_CODE,CLASS_CODE_I>:[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)*      {
+<CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I>:[A-Za-z_][A-Za-z0-9_]*(:[A-Za-z0-9_]*)*        {
                        /* this is for a classname with an empty namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
                }
                        /* this is for a classname with an empty namespace */
                        yylval.id = g_strdup(yytext);
                        return TYPETOKEN;
                }
-<CLASS_CODE,CLASS_CODE_I>[A-Za-z_][A-Za-z0-9_]*        {
+<CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I>[A-Za-z_][A-Za-z0-9_]*  {
                        yylval.id = g_strdup(yytext);
                        return TOKEN;
                }
                        yylval.id = g_strdup(yytext);
                        return TOKEN;
                }
+<CLASS_CODE,CLASS_CODE_I,PROPERTY_CODE,PROPERTY_CODE_I>\'\\.\'|\'.\'   {
+                       yylval.id = g_strdup(yytext);
+                       return SINGLE_CHAR;
+               }
 
 <CLASS_CODE_I>(\[[0-9]*\]|\[[A-Za-z_][A-Za-z0-9_]*\])+ {
                        yylval.id = g_strdup(yytext);
 
 <CLASS_CODE_I>(\[[0-9]*\]|\[[A-Za-z_][A-Za-z0-9_]*\])+ {
                        yylval.id = g_strdup(yytext);
@@ -440,7 +527,7 @@ class               {
                                return '}';
                        }
 
                                return '}';
                        }
 
-<CLASS_CODE,CLASS_CODE_I,INITIAL>[\t ] ;  /*ignore*/
+<CLASS_CODE,CLASS_CODE_I,INITIAL,PROPERTY_CODE,PROPERTY_CODE_I>[\t ]   ;  /*ignore*/
 
 <*>.           {
                        yylval.line = line_no;
 
 <*>.           {
                        yylval.line = line_no;
index d94361a885aad4d5aec038557876ebc79178573f..fe74942e634ff0f2db725ca6e4261adfed2dfb07 100644 (file)
@@ -1,6 +1,7 @@
 /* GOB C Preprocessor
  * Copyright (C) 1999,2000 the Free Software Foundation.
  * Copyright (C) 2000 Eazel, Inc.
 /* GOB C Preprocessor
  * Copyright (C) 1999,2000 the Free Software Foundation.
  * Copyright (C) 2000 Eazel, Inc.
+ * Copyright (C) 2001 George Lebl
  *
  * Author: George Lebl
  *
  *
  * Author: George Lebl
  *
@@ -55,17 +56,20 @@ static char *funcbase;
 static char *pfuncbase;
 static char *macrobase;
 static char *macrois;
 static char *pfuncbase;
 static char *macrobase;
 static char *macrois;
+static char *pmacrois;
 static char *macrotype;
 static char *macrotype;
+static char *pmacrotype;
 static char *typebase;
 static char *ptypebase;
 
 static int signals = 0; /* number of signals */
 static char *typebase;
 static char *ptypebase;
 
 static int signals = 0; /* number of signals */
-static int set_arguments = 0; /* number of named (set) arguments */
-static int get_arguments = 0; /* number of named (get) arguments */
+static int set_properties = 0; /* number of named (set) properties */
+static int get_properties = 0; /* number of named (get) properties */
 static int overrides = 0; /* number of override methods */
 static int privates = 0; /* number of private data members */
 static int protecteds = 0; /* number of protected methods */
 static int overrides = 0; /* number of override methods */
 static int privates = 0; /* number of private data members */
 static int protecteds = 0; /* number of protected methods */
-static int destructors = 0; /* number of variable destructors */
+static int unreftors = 0; /* number of variable unreffing destructors */
+static int destructors = 0; /* number of variable non-unreffing destructors */
 static int initializers = 0; /* number of variable initializers */
 static gboolean overrode_get_type = FALSE; /* provided your won _get_type */
 
 static int initializers = 0; /* number of variable initializers */
 static gboolean overrode_get_type = FALSE; /* provided your won _get_type */
 
@@ -77,8 +81,8 @@ static gboolean made_aliases = FALSE;  /* if we made any shorthand aliases
 static gboolean special_array[SPECIAL_LAST] = {0};
 static gboolean any_special = FALSE;
 
 static gboolean special_array[SPECIAL_LAST] = {0};
 static gboolean any_special = FALSE;
 
-static gboolean need_destroy = FALSE;
-static Method * destroy_handler = NULL;
+static gboolean need_shutdown = FALSE;
+static Method * shutdown_handler = NULL;
 
 static gboolean need_finalize = FALSE;
 static Method * finalize_handler = NULL;
 
 static gboolean need_finalize = FALSE;
 static Method * finalize_handler = NULL;
@@ -94,41 +98,43 @@ gboolean no_gnu = FALSE;
 gboolean exit_on_warn = FALSE;
 gboolean exit_on_error = TRUE;
 gboolean got_error = FALSE;
 gboolean exit_on_warn = FALSE;
 gboolean exit_on_error = TRUE;
 gboolean got_error = FALSE;
-gint private_header = PRIVATE_HEADER_ALWAYS;
+gint private_header = PRIVATE_HEADER_ONDEMAND;
 gboolean no_extern_c = FALSE;
 gboolean no_write = FALSE;
 gboolean no_lines = FALSE;
 gboolean no_self_alias = FALSE;
 gboolean no_extern_c = FALSE;
 gboolean no_write = FALSE;
 gboolean no_lines = FALSE;
 gboolean no_self_alias = FALSE;
-gboolean no_kill_underscores = FALSE;
 gboolean always_private_struct = FALSE;
 
 int method_unique_id = 1;
 
 static void
 gboolean always_private_struct = FALSE;
 
 int method_unique_id = 1;
 
 static void
-make_bases(void)
+make_bases (void)
 {
 {
-       filebase = replace_sep(((Class *)class)->otype, '-');
-       g_strdown(filebase);
+       filebase = replace_sep (((Class *)class)->otype, '-');
+       g_strdown (filebase);
 
 
-       funcbase = replace_sep(((Class *)class)->otype, '_');
-       g_strdown(funcbase);
+       funcbase = replace_sep (((Class *)class)->otype, '_');
+       g_strdown (funcbase);
 
 
-       pfuncbase = replace_sep(((Class *)class)->ptype, '_');
-       g_strdown(pfuncbase);
+       pfuncbase = replace_sep (((Class *)class)->ptype, '_');
+       g_strdown (pfuncbase);
 
 
-       macrobase = replace_sep(((Class *)class)->otype, '_');
-       g_strup(macrobase);
+       macrobase = replace_sep (((Class *)class)->otype, '_');
+       g_strup (macrobase);
        
        
-       macrois = make_pre_macro(((Class *)class)->otype, "IS");
-       macrotype = make_pre_macro(((Class *)class)->otype, "TYPE");
+       macrois = make_pre_macro (((Class *)class)->otype, "IS");
+       pmacrois = make_pre_macro (((Class *)class)->ptype, "IS");
 
 
-       typebase = remove_sep(((Class *)class)->otype);
+       macrotype = make_pre_macro (((Class *)class)->otype, "TYPE");
+       pmacrotype = make_pre_macro (((Class *)class)->ptype, "TYPE");
 
 
-       ptypebase = remove_sep(((Class *)class)->ptype);
+       typebase = remove_sep (((Class *)class)->otype);
+
+       ptypebase = remove_sep (((Class *)class)->ptype);
 }
 
 static char *
 }
 
 static char *
-get_type(const Type *t, gboolean postfix_to_stars)
+get_type (const Type *t, gboolean postfix_to_stars)
 {
        char *s;
        int i;
 {
        char *s;
        int i;
@@ -140,31 +146,31 @@ get_type(const Type *t, gboolean postfix_to_stars)
        g_free(s);
 
        extra = 0;
        g_free(s);
 
        extra = 0;
-       if(postfix_to_stars) {
+       if (postfix_to_stars) {
                const char *p;
                /*XXX: this is ugly perhaps we can do this whole postfix thing
                  in a nicer way, we just count the number of '[' s and from
                  that we deduce the number of dimensions, so that we can print
                  that many stars */
                const char *p;
                /*XXX: this is ugly perhaps we can do this whole postfix thing
                  in a nicer way, we just count the number of '[' s and from
                  that we deduce the number of dimensions, so that we can print
                  that many stars */
-               for(p=t->postfix; p && *p; p++)
+               for (p = t->postfix; p && *p; p++)
                        if(*p == '[') extra++;
        }
        g_string_append_c(gs, ' ');
 
                        if(*p == '[') extra++;
        }
        g_string_append_c(gs, ' ');
 
-       if(t->pointer) {
-               g_string_append(gs, t->pointer);
-               for(i=0; i < extra; i++)
-                       g_string_append_c(gs, '*');
-               g_string_append_c(gs, ' ');
+       if (t->pointer != NULL) {
+               g_string_append (gs, t->pointer);
+               for (i=0; i < extra; i++)
+                       g_string_append_c (gs, '*');
+               g_string_append_c (gs, ' ');
        }
        
        s = gs->str;
        }
        
        s = gs->str;
-       g_string_free(gs, FALSE);
+       g_string_free (gs, FALSE);
        return s;
 }
 
 static char *
        return s;
 }
 
 static char *
-get_gtk_doc(const char *id)
+get_gtk_doc (const char *id)
 {
        char *val;
 
 {
        char *val;
 
@@ -174,11 +180,11 @@ get_gtk_doc(const char *id)
        val = g_hash_table_lookup(gtk_doc_hash, id);
        if(val)
                return g_strdup_printf("/**\n * %s_%s:\n%s **/\n",
        val = g_hash_table_lookup(gtk_doc_hash, id);
        if(val)
                return g_strdup_printf("/**\n * %s_%s:\n%s **/\n",
-                                      funcbase, get_real_id(id), val);
-       val = g_hash_table_lookup(gtk_doc_hash, get_real_id(id));
+                                      funcbase, id, val);
+       val = g_hash_table_lookup(gtk_doc_hash, id);
        if(val)
                return g_strdup_printf("/**\n * %s_%s:\n%s **/\n",
        if(val)
                return g_strdup_printf("/**\n * %s_%s:\n%s **/\n",
-                                      funcbase, get_real_id(id), val);
+                                      funcbase, id, val);
        return NULL;
 }
 
        return NULL;
 }
 
@@ -212,10 +218,7 @@ print_method (FILE *fp,
        out_printf(fp, "%s", typeprefix); 
        print_type(fp, m->mtype, TRUE);
 
        out_printf(fp, "%s", typeprefix); 
        print_type(fp, m->mtype, TRUE);
 
-       if(kill_underscore)
-               id = get_real_id(m->id);
-       else
-               id = m->id;
+       id = m->id;
 
        if(no_funcbase)
                out_printf(fp, "%s%s%s%s(",
 
        if(no_funcbase)
                out_printf(fp, "%s%s%s%s(",
@@ -286,18 +289,14 @@ make_method_gnu_aliases(Class *c)
                           m->method == OVERRIDE_METHOD)
                                continue;
 
                           m->method == OVERRIDE_METHOD)
                                continue;
 
-                       /* in C++ mode don't alias new */
-                       if(for_cpp && strcmp(m->id, "new")==0)
-                               continue;
-
                        if(m->args != NULL)
                        if(m->args != NULL)
-                               out_printf(out, "#define %s(args...) "
+                               out_printf(out, "#define self_%s(args...) "
                                           "%s_%s(args)\n", m->id,
                                           "%s_%s(args)\n", m->id,
-                                          funcbase, get_real_id(m->id));
+                                          funcbase, m->id);
                        else
                        else
-                               out_printf(out, "#define %s() "
+                               out_printf(out, "#define self_%s() "
                                           "%s_%s()\n", m->id,
                                           "%s_%s()\n", m->id,
-                                          funcbase, get_real_id(m->id));
+                                          funcbase, m->id);
                }
        }
 }
                }
        }
 }
@@ -319,18 +318,14 @@ make_method_nongnu_aliases(Class *c)
                           m->method == OVERRIDE_METHOD)
                                continue;
 
                           m->method == OVERRIDE_METHOD)
                                continue;
 
-                       /* in C++ mode don't alias new */
-                       if(for_cpp && strcmp(m->id, "new")==0)
-                               continue;
-
                        if( ! local_made_aliases)
                                out_printf(out, "\n/* Short form pointers */\n");
 
                        if( ! local_made_aliases)
                                out_printf(out, "\n/* Short form pointers */\n");
 
-                       print_method(out, "static ", "(* const ", "", ") ",
+                       print_method(out, "static ", "(* const self_", "", ") ",
                                     "", "",
                                     m, FALSE, TRUE, FALSE);
                        out_printf(out, " = %s_%s;\n", funcbase,
                                     "", "",
                                     m, FALSE, TRUE, FALSE);
                        out_printf(out, " = %s_%s;\n", funcbase,
-                                  get_real_id(m->id));
+                                  m->id);
 
                        local_made_aliases = TRUE;
                }
 
                        local_made_aliases = TRUE;
                }
@@ -361,6 +356,7 @@ add_bad_hack_to_avoid_unused_warnings(Class *c)
                   "static void\n"
                   "___%s_really_bad_hack_to_avoid_warnings(void)\n"
                   "{\n", funcbase);
                   "static void\n"
                   "___%s_really_bad_hack_to_avoid_warnings(void)\n"
                   "{\n", funcbase);
+       out_printf(out, "\t((void (*)(void))GET_NEW_VARG)();\n");
        for(li=c->nodes;li;li=g_list_next(li)) {
                Node *node = li->data;
                if(node->type == METHOD_NODE) {
        for(li=c->nodes;li;li=g_list_next(li)) {
                Node *node = li->data;
                if(node->type == METHOD_NODE) {
@@ -375,7 +371,7 @@ add_bad_hack_to_avoid_unused_warnings(Class *c)
                        if(for_cpp && strcmp(m->id, "new")==0)
                                continue;
 
                        if(for_cpp && strcmp(m->id, "new")==0)
                                continue;
 
-                       out_printf(out, "\t((void (*)(void))%s)();\n", m->id);
+                       out_printf(out, "\t((void (*)(void))self_%s)();\n", m->id);
                }
        }
        out_printf(out, "\t___%s_really_bad_hack_to_avoid_warnings();\n",
                }
        }
        out_printf(out, "\t___%s_really_bad_hack_to_avoid_warnings();\n",
@@ -439,15 +435,15 @@ put_signal_macro (const Method *m, gboolean gnu)
 
        if ( ! gnu) {
                out_printf (outh, "#define %s_SIGNAL_%s(func)\t"
 
        if ( ! gnu) {
                out_printf (outh, "#define %s_SIGNAL_%s(func)\t"
-                           "\"%s\",GTK_SIGNAL_FUNC(func)\n",
-                           macrobase, id, get_real_id (m->id));
+                           "\"%s\",(GCallback)(func)\n",
+                           macrobase, id, m->id);
        } else {
                out_printf (outh, "#define %s_SIGNAL_%s(func)\t"
        } else {
                out_printf (outh, "#define %s_SIGNAL_%s(func)\t"
-                           "\"%s\",GTK_SIGNAL_FUNC(({",
-                           macrobase, id, get_real_id (m->id));
+                           "\"%s\",(GCallback)(({",
+                           macrobase, id, m->id);
                print_method (outh, "", "(* ___", "", ") ", ", gpointer data ",
                              " = func; ", m, FALSE, TRUE, TRUE);
                print_method (outh, "", "(* ___", "", ") ", ", gpointer data ",
                              " = func; ", m, FALSE, TRUE, TRUE);
-               out_printf (outh, "___%s; }))\n", get_real_id (m->id));
+               out_printf (outh, "___%s; }))\n", m->id);
 
        }
        g_free (id);
 
        }
        g_free (id);
@@ -507,10 +503,11 @@ put_priv_method_prot(Method *m)
                g_free(s);
        } else if(m->scope == PRIVATE_SCOPE ||
                  m->method == INIT_METHOD ||
                g_free(s);
        } else if(m->scope == PRIVATE_SCOPE ||
                  m->method == INIT_METHOD ||
-                 m->method == CLASS_INIT_METHOD)
+                 m->method == CLASS_INIT_METHOD) {
                print_method(out, "static ", "", "", " ", "",
                             no_gnu?";\n":" G_GNUC_UNUSED;\n",
                             m, FALSE, FALSE, TRUE);
                print_method(out, "static ", "", "", " ", "",
                             no_gnu?";\n":" G_GNUC_UNUSED;\n",
                             m, FALSE, FALSE, TRUE);
+       }
 }
 
 static GList *
 }
 
 static GList *
@@ -525,8 +522,14 @@ make_func_arg(char *typename, int is_class, char *name)
        else
                tn = g_strdup(typename);
 
        else
                tn = g_strdup(typename);
 
-       type = new_type(tn, g_strdup("*"), NULL);
-       node = new_funcarg((Type *)type, name, NULL);
+       type = node_new (TYPE_NODE,
+                        "name:steal", tn,
+                        "pointer", "*",
+                        NULL);
+       node = node_new (FUNCARG_NODE,
+                        "atype:steal", (Type *)type,
+                        "name:steal", name,
+                        NULL);
        return g_list_prepend(NULL, node);
 }
 
        return g_list_prepend(NULL, node);
 }
 
@@ -553,52 +556,60 @@ make_inits(Class *cl)
                }
        }
        if(!got_class_init) {
                }
        }
        if(!got_class_init) {
-               node = new_method(NO_SCOPE, CLASS_INIT_METHOD,
-                                 (Type *)new_type(g_strdup("void"),
-                                                  NULL, NULL),
-                                 NULL, NULL, NULL, g_strdup("class_init"),
-                                 make_func_arg(cl->otype, TRUE, g_strdup("c")),
-                                 NULL, NULL, NULL, 0, 0, FALSE,
-                                 method_unique_id++);
+               Type *type = (Type *)node_new (TYPE_NODE,
+                                              "name", "void",
+                                              NULL);
+               node = node_new (METHOD_NODE,
+                                "scope", NO_SCOPE,
+                                "method", CLASS_INIT_METHOD,
+                                "mtype:steal", type,
+                                "id", "class_init",
+                                "args:steal", make_func_arg (cl->otype, TRUE, g_strdup("c")),
+                                "unique_id", method_unique_id++,
+                                NULL);
                cl->nodes = g_list_prepend(cl->nodes, node);
        }
        if(!got_init) {
                cl->nodes = g_list_prepend(cl->nodes, node);
        }
        if(!got_init) {
-               node = new_method(NO_SCOPE, INIT_METHOD,
-                                 (Type *)new_type(g_strdup("void"),
-                                                  NULL, NULL),
-                                 NULL, NULL, NULL, g_strdup("init"),
-                                 make_func_arg(cl->otype, FALSE, g_strdup("o")),
-                                 NULL, NULL, NULL, 0, 0, FALSE,
-                                 method_unique_id++);
+               Type *type = (Type *)node_new (TYPE_NODE,
+                                              "name", "void",
+                                              NULL);
+               node = node_new (METHOD_NODE,
+                                "scope", NO_SCOPE,
+                                "method", INIT_METHOD,
+                                "mtype:steal", type,
+                                "id", "init",
+                                "args:steal", make_func_arg (cl->otype, TRUE, g_strdup("o")),
+                                "unique_id", method_unique_id++,
+                                NULL);
                cl->nodes = g_list_prepend(cl->nodes, node);
        }
 }
 
 static void
                cl->nodes = g_list_prepend(cl->nodes, node);
        }
 }
 
 static void
-find_destroy(Class *cl)
+find_shutdown(Class *cl)
 {
        GList *li;
 
 {
        GList *li;
 
-       destroy_handler = NULL;
+       shutdown_handler = NULL;
        for(li=cl->nodes;li;li=g_list_next(li)) {
                Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->method == OVERRIDE_METHOD &&
        for(li=cl->nodes;li;li=g_list_next(li)) {
                Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        Method *m = (Method *)n;
                        if(m->method == OVERRIDE_METHOD &&
-                          strcmp(m->id, "destroy")==0) {
-                               if(strcmp(m->otype, "Gtk:Object") != 0) {
+                          strcmp(m->id, "shutdown")==0) {
+                               if(strcmp(m->otype, "G:Object") != 0) {
                                        error_print(GOB_ERROR, m->line_no,
                                        error_print(GOB_ERROR, m->line_no,
-                                                   "destroy method override "
+                                                   "shutdown method override "
                                                    "of class other then "
                                                    "of class other then "
-                                                   "Gtk:Object");
+                                                   "G:Object");
                                }
                                if(g_list_length(m->args) != 1) {
                                        error_print(GOB_ERROR, m->line_no,
                                }
                                if(g_list_length(m->args) != 1) {
                                        error_print(GOB_ERROR, m->line_no,
-                                                   "destroy method override "
+                                                   "shutdown method override "
                                                    "with more then one "
                                                    "parameter");
                                }
                                                    "with more then one "
                                                    "parameter");
                                }
-                               destroy_handler = m;
+                               shutdown_handler = m;
                                break;
                        }
                }
                                break;
                        }
                }
@@ -617,13 +628,11 @@ find_finalize(Class *cl)
                        Method *m = (Method *)n;
                        if(m->method == OVERRIDE_METHOD &&
                           strcmp(m->id, "finalize")==0) {
                        Method *m = (Method *)n;
                        if(m->method == OVERRIDE_METHOD &&
                           strcmp(m->id, "finalize")==0) {
-                               if(strcmp(m->otype, "Gtk:Object") != 0 &&
-                                  strcmp(m->otype, "G:Object") != 0) {
+                               if(strcmp(m->otype, "G:Object") != 0) {
                                        error_print(GOB_ERROR, m->line_no,
                                                    "finalize method override "
                                                    "of class other then "
                                        error_print(GOB_ERROR, m->line_no,
                                                    "finalize method override "
                                                    "of class other then "
-                                                   "Gtk:Object (or G:Object"
-                                                   "for GTK+ 2.0)");
+                                                   "G:Object");
                                }
                                if(g_list_length(m->args) != 1) {
                                        error_print(GOB_ERROR, m->line_no,
                                }
                                if(g_list_length(m->args) != 1) {
                                        error_print(GOB_ERROR, m->line_no,
@@ -675,25 +684,25 @@ find_same_type_signal(Method *m)
 }
 
 static void
 }
 
 static void
-print_signal_marsal_args(Method *m)
+print_signal_marsal_args (Method *m)
 {
 {
-       if(strcmp(m->gtktypes->next->data, "NONE")!=0) {
+       if (strcmp (m->gtktypes->next->data, "NONE") != 0) {
                GList *li;
                int i;
                GList *li;
                int i;
-               for(i=0, li=m->gtktypes->next;li;
-                   i++, li=g_list_next(li)) {
-                       if(!for_cpp)
-                               out_printf(out, ",\n\t\tGTK_VALUE_%s(args[%d])",
-                                          (char *)li->data, i);
-                       else {
-                               out_printf(out, ",\n\t\t(%s)"
-                                          "GTK_VALUE_%s(args[%d])",
-                                          get_cast(li->data, FALSE),
-                                          (char *)li->data, i);
-                       }
+               for (i = 0, li = m->gtktypes->next;
+                    li != NULL;
+                    i++, li = li->next) {
+                       char *get_func = g_strdup_printf
+                               ("g_value_get_%s", (char *)li->data);
+                       g_strdown (get_func);
+                       out_printf (out, ",\n\t\t(%s) "
+                                   "%s (param_values + %d)",
+                                   get_cast (li->data, FALSE),
+                                   get_func, i + 1);
+                       g_free (get_func);
                }
        }
                }
        }
-       out_printf(out, ",\n\t\tfunc_data);\n}\n\n");
+       out_printf (out, ",\n\t\tdata2);\n");
 }
 
 
 }
 
 
@@ -704,25 +713,37 @@ add_signal_prots(Method *m)
        static int sig = 1;
        char *s;
        Method *mm;
        static int sig = 1;
        char *s;
        Method *mm;
+       gboolean ret_none = FALSE;
+       gboolean arglist_none = FALSE;
+       const char *retcast;
        
        
-       if(m->method != SIGNAL_LAST_METHOD &&
-          m->method != SIGNAL_FIRST_METHOD)
+       if (m->method != SIGNAL_LAST_METHOD &&
+           m->method != SIGNAL_FIRST_METHOD)
                return;
 
                return;
 
-       if(!marsh)
+       if (marsh == NULL)
                marsh = g_hash_table_new(NULL, NULL);
                marsh = g_hash_table_new(NULL, NULL);
+
+       g_assert (m->gtktypes->next != NULL);
+
+       ret_none = strcmp(m->gtktypes->data, "NONE") == 0;
+       arglist_none = strcmp(m->gtktypes->next->data, "NONE") == 0;
        
        
-       if(strcmp(m->gtktypes->data, "NONE")==0 &&
-          strcmp(m->gtktypes->next->data, "NONE")==0)
+       if (ret_none && arglist_none)
                return;
 
        /* if we already did a signal prototype just use that */
                return;
 
        /* if we already did a signal prototype just use that */
-       mm = find_same_type_signal(m);
-       if(mm) {
-               s = g_hash_table_lookup(marsh, mm);
-               g_hash_table_insert(marsh, m, s);
+       mm = find_same_type_signal (m);
+       if (mm != NULL) {
+               s = g_hash_table_lookup (marsh, mm);
+               g_hash_table_insert (marsh, m, s);
                return;
        }
                return;
        }
+
+       if (ret_none)
+               retcast = NULL;
+       else
+               retcast = get_cast (m->gtktypes->data, FALSE);
        
        s = g_strdup_printf("Sig%d", sig++);
        
        
        s = g_strdup_printf("Sig%d", sig++);
        
@@ -733,36 +754,71 @@ add_signal_prots(Method *m)
        out_printf(out, "\ntypedef %s (*___%s) (%s *, ",
                   get_cast(m->gtktypes->data, FALSE), s, typebase);
        
        out_printf(out, "\ntypedef %s (*___%s) (%s *, ",
                   get_cast(m->gtktypes->data, FALSE), s, typebase);
        
-       if(strcmp(m->gtktypes->next->data, "NONE")!=0) {
-               for(li=m->gtktypes->next; li; li=g_list_next(li))
-                       out_printf(out, "%s, ", get_cast(li->data, FALSE));
+       if ( ! arglist_none) {
+               for (li = m->gtktypes->next; li != NULL; li = li->next)
+                       out_printf (out, "%s, ", get_cast (li->data, FALSE));
        }
        }
-       out_printf(out, "gpointer);\n"); 
+       out_printf (out, "gpointer);\n"); 
        
        
-       out_printf(out, "\nstatic void\n"
-               "___marshal_%s (GtkObject * object,\n"
-               "\tGtkSignalFunc func,\n"
-               "\tgpointer func_data,\n"
-               "\tGtkArg * args)\n"
-               "{\n", s);
+       out_printf (out, "\nstatic void\n"
+                   "___marshal_%s (GClosure *closure,\n"
+                   "\tGValue *return_value,\n"
+                   "\tguint n_param_values,\n"
+                   "\tconst GValue *param_values,\n"
+                   "\tgpointer invocation_hint,\n"
+                   "\tgpointer marshal_data)\n"
+                   "{\n", s);
+
+       if ( ! ret_none)
+               out_printf (out, "\t%s v_return;\n", retcast);
+
+       out_printf (out, "\tregister ___%s callback;\n"
+                   "\tregister GCClosure *cc = (GCClosure*) closure;\n"
+                   "\tregister gpointer data1, data2;\n\n",
+                   s);
+
+       out_printf (out, "\tg_return_if_fail (n_param_values == %d);\n\n",
+                   arglist_none ? 1 : g_list_length (m->gtktypes));
+
+       out_printf (out,
+                   "\tif (G_CCLOSURE_SWAP_DATA (closure)) {\n"
+                   "\t\tdata1 = closure->data;\n"
+                   "\t\tdata2 = g_value_peek_pointer (param_values + 0);\n"
+                   "\t} else {\n"
+                   "\t\tdata1 = g_value_peek_pointer (param_values + 0);\n"
+                   "\t\tdata2 = closure->data;\n"
+                   "\t}\n\n");
+
+       out_printf (out, "\tcallback = (___%s) "
+                   "(marshal_data != NULL ? marshal_data : cc->callback);"
+                   "\n\n", s);
        
        
-       if(strcmp(m->gtktypes->data, "NONE")==0) {
-               out_printf(out, "\t___%s rfunc;\n\n"
-                       "\trfunc = (___%s)func;\n\n"
-                       "\t(*rfunc)((%s *)object", s, s, typebase);
+       if (ret_none) {
+               out_printf (out, "\tcallback ((%s *)data1", typebase);
        } else {
        } else {
-               const char *retcast = get_cast(m->gtktypes->data, FALSE);
-               out_printf(out,
-                          "\t___%s rfunc;\n\t"
-                          "%s *retval;\n\n"
-                          "\trfunc = (___%s)func;\n\n"
-                          "\tretval = GTK_RETLOC_%s(args[%d]);\n\n"
-                          "\t*retval = (*rfunc)((%s *)object",
-                          s, retcast, s, (char *)m->gtktypes->data,
-                          g_list_length(m->gtktypes)-1, typebase);
+               out_printf (out, "\tv_return = callback ((%s *)data1",
+                           typebase);
        }
        }
-       print_signal_marsal_args(m);
 
 
+       print_signal_marsal_args (m);
+
+       if ( ! ret_none) {
+               /* FIXME: This code is so fucking ugly it hurts */
+               gboolean take_ownership = 
+                       (strcmp ((char *)m->gtktypes->data, "STRING") == 0 ||
+                        strcmp ((char *)m->gtktypes->data, "BOXED") == 0);
+               char *set_func = g_strdup_printf ("g_value_set_%s%s",
+                                                 (char *)m->gtktypes->data,
+                                                 take_ownership ?
+                                                   "_take_ownership" : ""); 
+               g_strdown (set_func);
+
+               out_printf (out, "\n\t%s (return_value, v_return);\n",
+                           set_func);
+
+               g_free (set_func);
+       }
+       out_printf (out, "}\n\n");
 }
 
 static void
 }
 
 static void
@@ -778,7 +834,7 @@ add_enums(Class *c)
                                Method *m = (Method *)n;
                                if(m->method == SIGNAL_LAST_METHOD ||
                                   m->method == SIGNAL_FIRST_METHOD) {
                                Method *m = (Method *)n;
                                if(m->method == SIGNAL_LAST_METHOD ||
                                   m->method == SIGNAL_FIRST_METHOD) {
-                                       char *s = g_strdup(get_real_id(m->id));
+                                       char *s = g_strdup(m->id);
                                        g_strup(s);
                                        out_printf(out, "\t%s_SIGNAL,\n", s);
                                        g_free(s);
                                        g_strup(s);
                                        out_printf(out, "\t%s_SIGNAL,\n", s);
                                        g_free(s);
@@ -787,22 +843,29 @@ add_enums(Class *c)
                }
                out_printf(out, "\tLAST_SIGNAL\n};\n\n");
        }
                }
                out_printf(out, "\tLAST_SIGNAL\n};\n\n");
        }
-       if(set_arguments > 0 || get_arguments > 0) {
-               out_printf(out, "enum {\n\tARG_0");
+       if (set_properties > 0 ||
+           get_properties > 0) {
+               out_printf(out, "enum {\n\tPROP_0");
                for(li=c->nodes;li;li=g_list_next(li)) {
                        Node *n = li->data;
                for(li=c->nodes;li;li=g_list_next(li)) {
                        Node *n = li->data;
-                       if(n->type == ARGUMENT_NODE) {
+                       if (n->type == PROPERTY_NODE) {
+                               Property *p = (Property *)n;
+                               char *s = g_strdup (p->name);
+                               g_strup (s);
+                               out_printf (out, ",\n\tPROP_%s", s);
+                               g_free(s);
+                       } else if (n->type == ARGUMENT_NODE) {
                                Argument *a = (Argument *)n;
                                char *s = g_strdup(a->name);
                                g_strup(s);
                                Argument *a = (Argument *)n;
                                char *s = g_strdup(a->name);
                                g_strup(s);
-                               out_printf(out, ",\n\tARG_%s", s);
+                               out_printf(out, ",\n\tPROP_%s", s);
                                g_free(s);
                        }
                }
                out_printf(out, "\n};\n\n");
        }
 
                                g_free(s);
                        }
                }
                out_printf(out, "\n};\n\n");
        }
 
-       if(signals>0)
+       if (signals > 0)
                out_printf(out,
                           "static guint object_signals[LAST_SIGNAL] = {0};\n\n");
 
                out_printf(out,
                           "static guint object_signals[LAST_SIGNAL] = {0};\n\n");
 
@@ -813,7 +876,51 @@ add_enums(Class *c)
 static void
 add_get_type(void)
 {
 static void
 add_get_type(void)
 {
-       char *chunk_size = ((Class*)class)->chunk_size;
+       /*char *chunk_size = ((Class*)class)->chunk_size;*/
+       
+       out_printf(out,
+                  "GType\n"
+                  "%s_get_type (void)\n"
+                  "{\n"
+                  "\tstatic GType type = 0;\n\n"
+                  "\tif (type == 0) {\n"
+                  "\t\tstatic const GTypeInfo info = {\n"
+                  "\t\t\tsizeof (%sClass),\n"
+                  "\t\t\t(GBaseInitFunc) NULL,\n"
+                  "\t\t\t(GBaseFinalizeFunc) NULL,\n"
+                  "\t\t\t(GClassInitFunc) %s_class_init,\n"
+                  "\t\t\t(GClassFinalizeFunc) NULL,\n"
+                  "\t\t\tNULL /* class_data */,\n"
+                  "\t\t\tsizeof (%s),\n"
+                  "\t\t\t0 /* n_preallocs */,\n"
+                  "\t\t\t(GInstanceInitFunc) %s_init,\n"
+                  "\t\t};\n\n"
+                  "\t\ttype = g_type_register_static (%s, \"%s\", &info, (GTypeFlags)0);\n",
+                  funcbase, typebase, funcbase, typebase, funcbase,
+                  pmacrotype, typebase);
+       /*
+       if(chunk_size)  {
+               out_printf(out,
+                          "#if %s > 0\n"
+                          "\t\tgtk_type_set_chunk_alloc(type, %s);\n"
+                          "#endif\n", 
+                          chunk_size, chunk_size);
+       }
+       */
+       out_printf(out,
+                  "\t}\n\n"
+                  "\treturn type;\n"
+                  "}\n\n");
+}
+
+static void
+add_bonobo_x_get_type (void)
+{
+       /* char *chunk_size = ((Class*)class)->chunk_size; */
+
+       out_printf(out,
+                  "\n#error \"BonoboX isn't ported to glib 2.0 and "
+                  "gob2 doesn't support it yet\"");
        
        out_printf(out,
                   "GtkType\n"
        
        out_printf(out,
                   "GtkType\n"
@@ -831,16 +938,22 @@ add_get_type(void)
                   "\t\t\t/* reserved_2 */ NULL,\n"
                   "\t\t\t(GtkClassInitFunc) NULL\n"
                   "\t\t};\n\n"
                   "\t\t\t/* reserved_2 */ NULL,\n"
                   "\t\t\t(GtkClassInitFunc) NULL\n"
                   "\t\t};\n\n"
-                  "\t\ttype = gtk_type_unique (%s_get_type(), &info);\n",
+                  "\t\ttype = bonobo_x_type_unique\n"
+                  "\t\t\t(%s_get_type (),\n"
+                  "\t\t\tPOA_%s__init, NULL,\n"
+                  "\t\t\tGTK_STRUCT_OFFSET (%sClass, _epv),\n"
+                  "\t\t\t&info);\n",
                   funcbase, typebase, typebase, typebase,
                   funcbase, typebase, typebase, typebase,
-                  funcbase, funcbase, pfuncbase);
-       if(chunk_size)  {
+                  funcbase, funcbase, pfuncbase,
+                  ((Class*)class)->bonobo_x_class,
+                  typebase);
+       /*if(chunk_size)  {
                out_printf(out,
                           "#if %s > 0\n"
                           "\t\tgtk_type_set_chunk_alloc(type, %s);\n"
                           "#endif\n", 
                           chunk_size, chunk_size);
                out_printf(out,
                           "#if %s > 0\n"
                           "\t\tgtk_type_set_chunk_alloc(type, %s);\n"
                           "#endif\n", 
                           chunk_size, chunk_size);
-       }
+       }*/
        out_printf(out,
                   "\t}\n\n"
                   "\treturn type;\n"
        out_printf(out,
                   "\t}\n\n"
                   "\treturn type;\n"
@@ -848,20 +961,19 @@ add_get_type(void)
 }
 
 static void
 }
 
 static void
-add_overrides(Class *c, const char *oname, gboolean did_base_obj)
+add_overrides(Class *c, const char *oname,
+             gboolean did_base_obj)
 {
        GList *li;
        GHashTable *done;
        char *s;
        
 {
        GList *li;
        GHashTable *done;
        char *s;
        
-       done = g_hash_table_new(g_str_hash, g_str_equal);
-       if(did_base_obj) {
-               s = g_strdup("GtkObject"); /* This was already done */
-               g_hash_table_insert(done, s, s);
-               s = g_strdup("GObject"); /* This was probably already done as well (if using Gtk/Glib 1.3/2.0) */
-               g_hash_table_insert(done, s, s);
+       done = g_hash_table_new (g_str_hash, g_str_equal);
+       if (did_base_obj) {
+               s = g_strdup ("GObject");
+               g_hash_table_insert (done, s, s);
        }
        }
-       for(li=c->nodes; li; li=g_list_next(li)) {
+       for (li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
                char *f;
                Method *m = (Method *)n;
                Node *n = li->data;
                char *f;
                Method *m = (Method *)n;
@@ -885,8 +997,8 @@ add_overrides(Class *c, const char *oname, gboolean did_base_obj)
                
                g_free(f);
        }
                
                g_free(f);
        }
-       g_hash_table_foreach(done, (GHFunc)g_free, NULL);
-       g_hash_table_destroy(done);
+       g_hash_table_foreach (done, (GHFunc)g_free, NULL);
+       g_hash_table_destroy (done);
 }
 
 static char *
 }
 
 static char *
@@ -895,10 +1007,11 @@ make_run_signal_flags(Method *m, gboolean last)
        GList *li;
        GString *gs;
        char *flags[] = {
        GList *li;
        GString *gs;
        char *flags[] = {
-               "FIRST",
-               "LAST",
-               "BOTH",
+               "RUN_FIRST",
+               "RUN_LAST",
+               "RUN_CLEANUP",
                "NO_RECURSE",
                "NO_RECURSE",
+               "DETAILED",
                "ACTION",
                "NO_HOOKS",
                NULL
                "ACTION",
                "NO_HOOKS",
                NULL
@@ -907,12 +1020,12 @@ make_run_signal_flags(Method *m, gboolean last)
        gs = g_string_new(NULL);
 
        if(last)
        gs = g_string_new(NULL);
 
        if(last)
-               g_string_assign(gs, "GTK_RUN_LAST");
+               g_string_assign(gs, "G_SIGNAL_RUN_LAST");
        else
        else
-               g_string_assign(gs, "GTK_RUN_FIRST");
+               g_string_assign(gs, "G_SIGNAL_RUN_FIRST");
 
        if(m->scope == PUBLIC_SCOPE)
 
        if(m->scope == PUBLIC_SCOPE)
-               g_string_append(gs, " | GTK_RUN_ACTION");
+               g_string_append(gs, " | G_SIGNAL_ACTION");
 
        for(li = m->flags; li; li = li->next) {
                char *flag = li->data;
 
        for(li = m->flags; li; li = li->next) {
                char *flag = li->data;
@@ -928,7 +1041,7 @@ make_run_signal_flags(Method *m, gboolean last)
                                     "perhaps it was misspelled",
                                     flag);
                }
                                     "perhaps it was misspelled",
                                     flag);
                }
-               g_string_sprintfa(gs, " | GTK_RUN_%s", flag);
+               g_string_sprintfa(gs, " | G_SIGNAL_%s", flag);
        }
 
        {
        }
 
        {
@@ -966,25 +1079,26 @@ add_signals(Class *c)
                                          (char *)g_hash_table_lookup(marsh, m),
                                          NULL);
                else
                                          (char *)g_hash_table_lookup(marsh, m),
                                          NULL);
                else
-                       mar = g_strdup("gtk_signal_default_marshaller");
+                       mar = g_strdup("g_cclosure_marshal_VOID__VOID");
                
                is_none = (strcmp(m->gtktypes->next->data, "NONE")==0);
 
                
                is_none = (strcmp(m->gtktypes->next->data, "NONE")==0);
 
-               sig = g_strdup(get_real_id(m->id));
-               g_strup(sig);
-               flags = make_run_signal_flags(m, last);
-               out_printf(out, "\tobject_signals[%s_SIGNAL] =\n"
-                       "\t\tgtk_signal_new (\"%s\",\n"
-                       "\t\t\t(GtkSignalRunType)(%s),\n"
-                       "\t\t\tGTK_CLASS_TYPE(gtk_object_class),\n"
-                       "\t\t\tGTK_SIGNAL_OFFSET (%sClass, %s),\n"
-                       "\t\t\t%s,\n"
-                       "\t\t\tGTK_TYPE_%s, %d",
-                       sig, get_real_id(m->id),
-                       flags,
-                       typebase, get_real_id(m->id), mar,
-                       (char *)m->gtktypes->data,
-                       is_none ? 0 : g_list_length(m->gtktypes->next));
+               sig = g_strdup (m->id);
+               g_strup (sig);
+               flags = make_run_signal_flags (m, last);
+               out_printf (out, "\tobject_signals[%s_SIGNAL] =\n"
+                           "\t\tg_signal_new (\"%s\",\n"
+                           "\t\t\tG_TYPE_FROM_CLASS (g_object_class),\n"
+                           "\t\t\t(GSignalFlags)(%s),\n"
+                           "\t\t\tG_STRUCT_OFFSET (%sClass, %s),\n"
+                           "\t\t\tNULL, NULL,\n"
+                           "\t\t\t%s,\n"
+                           "\t\t\tG_TYPE_%s, %d",
+                           sig, m->id,
+                           flags,
+                           typebase, m->id, mar,
+                           (char *)m->gtktypes->data,
+                           is_none ? 0 : g_list_length(m->gtktypes->next));
                g_free(mar);
                g_free(sig);
                g_free(flags);
                g_free(mar);
                g_free(sig);
                g_free(flags);
@@ -992,7 +1106,7 @@ add_signals(Class *c)
                if( ! is_none) {
                        GList *l;
                        for(l = m->gtktypes->next; l != NULL; l = l->next)
                if( ! is_none) {
                        GList *l;
                        for(l = m->gtktypes->next; l != NULL; l = l->next)
-                               out_printf(out, ",\n\t\t\tGTK_TYPE_%s",
+                               out_printf(out, ",\n\t\t\tG_TYPE_%s",
                                        (char *)l->data);
                }
 
                                        (char *)l->data);
                }
 
@@ -1035,12 +1149,10 @@ add_signals(Class *c)
                                   "\t\tg_error(\"%s line %d: Type mismatch "
                                   "of \\\"%s\\\" signal signature\");\n"
                                   "\t}\n",
                                   "\t\tg_error(\"%s line %d: Type mismatch "
                                   "of \\\"%s\\\" signal signature\");\n"
                                   "\t}\n",
-                                  filename, m->line_no, get_real_id(m->id));
+                                  filename, m->line_no, m->id);
 
                }
        }
 
                }
        }
-       out_printf(out, "\tgtk_object_class_add_signals (gtk_object_class,\n"
-               "\t\tobject_signals, LAST_SIGNAL);\n\n");
 }
 
 static void
 }
 
 static void
@@ -1070,41 +1182,37 @@ set_def_handlers(Class *c, const char *oname)
                }
 
 
                }
 
 
-               if(m->method == OVERRIDE_METHOD) {
+               if (m->method == OVERRIDE_METHOD) {
                        char *s;
                        char *s;
-                       s = replace_sep(m->otype, '_');
-                       g_strdown(s);
-
-                       if(need_destroy &&
-                          destroy_handler &&
-                          strcmp(get_real_id(m->id), "destroy") == 0)
-                               out_printf(out, "\tgtk_object_class->destroy "
-                                          "= ___destroy;\n");
-                       else if(need_finalize &&
+                       s = replace_sep (m->otype, '_');
+                       g_strdown (s);
+
+                       if (need_shutdown &&
+                           shutdown_handler != NULL &&
+                           strcmp (m->id, "shutdown") == 0)
+                               out_printf (out, "\tg_object_class->shutdown "
+                                           "= ___shutdown;\n");
+                       else if (need_finalize &&
                                finalize_handler &&
                                finalize_handler &&
-                               strcmp(get_real_id(m->id), "finalize") == 0)
+                               strcmp(m->id, "finalize") == 0)
                                out_printf(out,
                                out_printf(out,
-                                          "#ifdef G_OBJECT_CLASS\n"
-                                          "\tg_object_class->finalize = ___finalize;\n"
-                                          "#else /* !G_OBJECT_CLASS */\n"
-                                          "\tgtk_object_class->finalize = ___finalize;\n"
-                                          "#endif /* G_OBJECT_CLASS */\n");
-                       else if(m->cbuf)
+                                          "\tg_object_class->finalize = ___finalize;\n");
+                       else if (m->cbuf != NULL)
                                out_printf(out,
                                           "\t%s_class->%s = ___%x_%s_%s;\n",
                                out_printf(out,
                                           "\t%s_class->%s = ___%x_%s_%s;\n",
-                                          s, get_real_id(m->id), (guint)m->unique_id,
-                                          funcbase, get_real_id(m->id));
+                                          s, m->id, (guint)m->unique_id,
+                                          funcbase, m->id);
                        else
                                out_printf(out, "\t%s_class->%s = NULL;\n",
                        else
                                out_printf(out, "\t%s_class->%s = NULL;\n",
-                                          s, get_real_id(m->id));
+                                          s, m->id);
                } else {
                        if(m->cbuf)
                                out_printf(out, "\t%s->%s = ___real_%s_%s;\n",
                } else {
                        if(m->cbuf)
                                out_printf(out, "\t%s->%s = ___real_%s_%s;\n",
-                                          oname, get_real_id(m->id),
-                                          funcbase, get_real_id(m->id));
+                                          oname, m->id,
+                                          funcbase, m->id);
                        else
                                out_printf(out, "\t%s->%s = NULL;\n",
                        else
                                out_printf(out, "\t%s->%s = NULL;\n",
-                                          oname, get_real_id(m->id));
+                                          oname, m->id);
                }
        }
        if(set_line)
                }
        }
        if(set_line)
@@ -1112,9 +1220,11 @@ set_def_handlers(Class *c, const char *oname)
 }
 
 static void
 }
 
 static void
-make_arguments(Class *c)
+make_argument (Argument *a)
 {
 {
-       GList *li;
+       GString *flags;
+       GList *l;
+       char *s;
        char *argflags[] = {
                "CONSTRUCT",
                "CONSTRUCT_ONLY",
        char *argflags[] = {
                "CONSTRUCT",
                "CONSTRUCT_ONLY",
@@ -1123,68 +1233,482 @@ make_arguments(Class *c)
                NULL
        };
 
                NULL
        };
 
-       out_printf(out, "\n");
-       for(li=c->nodes;li;li=g_list_next(li)) {
-               Node *n = li->data;
-               Argument *a;
-               GString *flags;
-               GList *l;
-               char *s;
-               if(n->type != ARGUMENT_NODE)
+       flags = g_string_new ("(GParamFlags)(");
+
+       if(a->get && a->set)
+               g_string_append (flags, "G_PARAM_READABLE | G_PARAM_WRITABLE");
+       else if(a->get)
+               g_string_append (flags, "G_PARAM_READABLE");
+       else
+               g_string_append (flags, "G_PARAM_WRITABLE");
+
+       g_assert(a->get || a->set);
+
+       for (l = a->flags; l != NULL; l = l->next) {
+               char *flag = l->data;
+               int i;
+               if(strcmp (flag, "READABLE") == 0 ||
+                  strcmp (flag, "WRITABLE") == 0) {
+                       error_print(GOB_WARN, a->line_no,
+                                   "READABLE and "
+                                   "WRITABLE argument flags are "
+                                   "set automatically");
                        continue;
                        continue;
+               }
+               for(i = 0; argflags[i]; i++) {
+                       if(strcmp(argflags[i], flag)==0)
+                               break;
+               }
+               /* if we haven't found it in our list */
+               if( ! argflags[i]) {
+                       error_printf(GOB_WARN, a->line_no,
+                                    "Unknown flag '%s' used, "
+                                    "perhaps it was misspelled", flag);
+               }
+               g_string_sprintfa(flags, " | G_PARAM_%s", flag);
+       }
 
 
-               a = (Argument *)n;
-               
-               if(a->get && a->set)
-                       flags = g_string_new("GTK_ARG_READWRITE");
-               else if(a->get)
-                       flags = g_string_new("GTK_ARG_READABLE");
-               else
-                       flags = g_string_new("GTK_ARG_WRITABLE");
+       g_string_append (flags, ")");
 
 
-               g_assert(a->get || a->set);
-               
-               for(l=a->flags;l;l=g_list_next(l)) {
-                       char *flag = l->data;
-                       int i;
-                       if(strcmp(flag, "READWRITE")==0 ||
-                          strcmp(flag, "READABLE")==0 ||
-                          strcmp(flag, "WRITABLE")==0) {
-                               error_print(GOB_WARN, a->line_no,
-                                           "READWRITE, READABLE and "
-                                           "WRITABLE argument flags are "
-                                           "set automatically");
-                               continue;
-                       }
-                       for(i = 0; argflags[i]; i++) {
-                               if(strcmp(argflags[i], flag)==0)
-                                       break;
-                       }
-                       /* if we haven't found it in our list */
-                       if( ! argflags[i]) {
-                               error_printf(GOB_WARN, a->line_no,
-                                            "Unknown flag '%s' used, "
-                                            "perhaps it was misspelled", flag);
-                       }
-                       g_string_sprintfa(flags, " | GTK_ARG_%s", flag);
+       s = g_strdup(a->name);
+       g_strup(s);
+       if (!strcmp (a->gtktype, "ENUM"))
+               out_printf(out, "\tparam_spec = g_param_spec_enum (\"%s\", NULL, NULL,\n"
+                          "\t\tG_TYPE_ENUM, 0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       if (!strcmp (a->gtktype, "FLAGS"))
+               out_printf(out, "\tparam_spec = g_param_spec_flags (\"%s\", NULL, NULL,\n"
+                          "\t\tG_TYPE_FLAGS, 0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "OBJECT"))
+               out_printf(out, "\tparam_spec = g_param_spec_object (\"%s\", NULL, NULL,\n"
+                          "\t\tG_TYPE_OBJECT,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "STRING"))
+               out_printf(out, "\tparam_spec = g_param_spec_string (\"%s\", NULL, NULL,\n"
+                          "\t\tNULL,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "INT"))
+               out_printf(out, "\tparam_spec = g_param_spec_int (\"%s\", NULL, NULL,\n"
+                          "\t\tG_MININT, G_MAXINT,\n"
+                          "\t\t0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "UINT"))
+               out_printf(out, "\tparam_spec = g_param_spec_uint (\"%s\", NULL, NULL,\n"
+                          "\t\t0, G_MAXUINT,\n"
+                          "\t\t0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "INT"))
+               out_printf(out, "\tparam_spec = g_param_spec_int (\"%s\", NULL, NULL,\n"
+                          "\t\tG_MININT, G_MAXINT,\n"
+                          "\t\t0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "CHAR"))
+               out_printf(out, "\tparam_spec = g_param_spec_char (\"%s\", NULL, NULL,\n"
+                          "\t\t-128, 127,\n"
+                          "\t\t0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "UCHAR"))
+               out_printf(out, "\tparam_spec = g_param_spec_uchar (\"%s\", NULL, NULL,\n"
+                          "\t\t0, 0xFF,\n"
+                          "\t\t0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "BOOL") ||
+                !strcmp (a->gtktype, "BOOLEAN"))
+               out_printf(out, "\tparam_spec = g_param_spec_boolean (\"%s\", NULL, NULL,\n"
+                          "\t\tFALSE,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "LONG"))
+               out_printf(out, "\tparam_spec = g_param_spec_long (\"%s\", NULL, NULL,\n"
+                          "\t\tG_MINLONG, G_MAXLONG,\n"
+                          "\t\t0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "ULONG"))
+               out_printf(out, "\tparam_spec = g_param_spec_ulong (\"%s\", NULL, NULL,\n"
+                          "\t\t0, G_MAXULONG,\n"
+                          "\t\t0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "FLOAT"))
+               out_printf(out, "\tparam_spec = g_param_spec_float (\"%s\", NULL, NULL,\n"
+                          "\t\tG_MINFLOAT, G_MAXFLOAT,\n"
+                          "\t\t0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "DOUBLE"))
+               out_printf(out, "\tparam_spec = g_param_spec_double (\"%s\", NULL, NULL,\n"
+                          "\t\tG_MINDOUBLE, G_MAXDOUBLE,\n"
+                          "\t\t0,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else if (!strcmp (a->gtktype, "POINTER"))
+               out_printf(out, "\tparam_spec = g_param_spec_pointer (\"%s\", NULL, NULL,\n"
+                          "\t\t%s);\n",
+                          a->name, flags->str);
+       else
+               error_printf (GOB_ERROR, a->line_no,
+                             "%s type is not supported for arguments, try using properties",
+                             a->gtktype);
+
+       out_printf(out, "\tg_object_class_install_property (g_object_class,\n"
+                  "\t\tPROP_%s, param_spec);\n", s);
+
+
+       g_free(s);
+       g_string_free(flags, TRUE);
+}
+
+#define value_for_print(str, alt) (str != NULL ? str : alt)
+
+static void
+make_property (Property *p)
+{
+       GString *flags;
+       GList *l;
+       char *s;
+       char *argflags[] = {
+               "CONSTRUCT",
+               "CONSTRUCT_ONLY",
+               "CHILD_ARG",
+               "MASK",
+               NULL
+       };
+
+       flags = g_string_new ("(GParamFlags)(");
+
+       if (p->get != NULL && p->set != NULL)
+               g_string_append (flags, "G_PARAM_READABLE | G_PARAM_WRITABLE");
+       else if (p->get != NULL)
+               g_string_append (flags, "G_PARAM_READABLE");
+       else
+               g_string_append (flags, "G_PARAM_WRITABLE");
+
+       if (p->get == NULL && p->set == NULL) {
+               error_print (GOB_ERROR, p->line_no,
+                            "Property has no getter nor setter");
+       }
+
+       for (l = p->flags; l != NULL; l = l->next) {
+               char *flag = l->data;
+               int i;
+               if(strcmp (flag, "READABLE") == 0 ||
+                  strcmp (flag, "WRITABLE") == 0) {
+                       error_print(GOB_WARN, p->line_no,
+                                   "READABLE and "
+                                   "WRITABLE argument flags are "
+                                   "set automatically");
+                       continue;
+               }
+               for(i = 0; argflags[i]; i++) {
+                       if(strcmp(argflags[i], flag)==0)
+                               break;
                }
                }
+               /* if we haven't found it in our list */
+               if( ! argflags[i]) {
+                       error_printf(GOB_WARN, p->line_no,
+                                    "Unknown flag '%s' used, "
+                                    "perhaps it was misspelled", flag);
+               }
+               g_string_sprintfa(flags, " | G_PARAM_%s", flag);
+       }
+
+       g_string_append (flags, ")");
+
+       if (strcmp (p->gtktype, "CHAR") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_char\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* minimum */,\n"
+                           "\t\t %s /* maximum */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->minimum, "-128"),
+                           value_for_print (p->maximum, "127"),
+                           value_for_print (p->default_value, "0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "UCHAR") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_uchar\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* minimum */,\n"
+                           "\t\t %s /* maximum */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->minimum, "0"),
+                           value_for_print (p->maximum, "0xFF"),
+                           value_for_print (p->default_value, "0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "BOOLEAN") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_boolean\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->default_value, "FALSE"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "INT") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_int\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* minimum */,\n"
+                           "\t\t %s /* maximum */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->minimum, "G_MININT"),
+                           value_for_print (p->maximum, "G_MAXINT"),
+                           value_for_print (p->default_value, "0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "UINT") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_uint\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* minimum */,\n"
+                           "\t\t %s /* maximum */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->minimum, "0"),
+                           value_for_print (p->maximum, "G_MAXUINT"),
+                           value_for_print (p->default_value, "0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "LONG") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_long\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* minimum */,\n"
+                           "\t\t %s /* maximum */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->minimum, "G_MINLONG"),
+                           value_for_print (p->maximum, "G_MAXLONG"),
+                           value_for_print (p->default_value, "0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "ULONG") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_ulong\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* minimum */,\n"
+                           "\t\t %s /* maximum */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->minimum, "0"),
+                           value_for_print (p->maximum, "G_MAXULONG"),
+                           value_for_print (p->default_value, "0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "UNICHAR") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_unichar\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->default_value, "0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "ENUM") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_enum\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* enum_type */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->extra_gtktype, "G_TYPE_ENUM"),
+                           value_for_print (p->default_value, "0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "FLAGS") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_flags\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* flags_type */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->extra_gtktype, "G_TYPE_FLAGS"),
+                           value_for_print (p->default_value, "0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "FLOAT") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_float\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* minimum */,\n"
+                           "\t\t %s /* maximum */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->minimum, "G_MINFLOAT"),
+                           value_for_print (p->maximum, "G_MAXFLOAT"),
+                           value_for_print (p->default_value, "0.0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "DOUBLE") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_double\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* minimum */,\n"
+                           "\t\t %s /* maximum */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->minimum, "G_MINDOUBLE"),
+                           value_for_print (p->maximum, "G_MAXDOUBLE"),
+                           value_for_print (p->default_value, "0.0"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "STRING") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_string\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* default_value */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->default_value, "NULL"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "PARAM") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_param\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* param_type */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->extra_gtktype, "G_TYPE_PARAM"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "BOXED") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_boxed\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* boxed_type */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->extra_gtktype, "G_TYPE_BOXED"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "POINTER") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_pointer\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           flags->str);
+       /* FIXME: VALUE_ARRAY */
+       else if (strcmp (p->gtktype, "CLOSURE") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_pointer\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           flags->str);
+       else if (strcmp (p->gtktype, "OBJECT") == 0)
+               out_printf (out, "\tparam_spec = g_param_spec_object\n"
+                           "\t\t(\"%s\" /* name */,\n"
+                           "\t\t %s /* nick */,\n"
+                           "\t\t %s /* blurb */,\n"
+                           "\t\t %s /* object_type */,\n"
+                           "\t\t %s);\n",
+                           p->name,
+                           value_for_print (p->nick, "NULL"),
+                           value_for_print (p->blurb, "NULL"),
+                           value_for_print (p->extra_gtktype, "G_TYPE_OBJECT"),
+                           flags->str);
+       else
+               error_printf (GOB_ERROR, p->line_no,
+                             "%s type is not supported by properties",
+                             p->gtktype);
+
+       s = g_strdup (p->name);
+       g_strup (s);
+       out_printf (out, "\tg_object_class_install_property (g_object_class,\n"
+                   "\t\tPROP_%s,\n"
+                   "\t\tparam_spec);\n", s);
+       g_free (s);
+
+       g_string_free (flags, TRUE);
+}
 
 
-               s = g_strdup(a->name);
-               g_strup(s);
-               out_printf(out, "\tgtk_object_add_arg_type(\"%s::%s\",\n"
-                       "\t\tGTK_TYPE_%s,\n"
-                       "\t\t%s,\n"
-                       "\t\tARG_%s);\n",
-                       typebase, a->name, a->gtktype, flags->str, s);
-               g_free(s);
-               g_string_free(flags, TRUE);
+static void
+make_arguments(Class *c)
+{
+       GList *li;
+       out_printf (out, "    {\n"
+                   "\tGParamSpec   *param_spec;\n\n");
+
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               if (n->type == PROPERTY_NODE)
+                       make_property ((Property *)n);
+               else if (n->type == ARGUMENT_NODE)
+                       make_argument ((Argument *)n);
        }
        }
+       out_printf(out, "    }\n");
        
        
-       out_printf(out, "\n");
-       if(get_arguments > 0)
-               out_printf(out, "\tgtk_object_class->get_arg = ___object_get_arg;\n");
-       if(set_arguments > 0)
-               out_printf(out, "\tgtk_object_class->set_arg = ___object_set_arg;\n");
+       if (get_properties > 0)
+               out_printf(out, "\tg_object_class->get_property = ___object_get_property;\n");
+       if (set_properties > 0)
+               out_printf(out, "\tg_object_class->set_property = ___object_set_property;\n");
 }
 
 static void
 }
 
 static void
@@ -1214,7 +1738,7 @@ print_initializer(Method *m, Variable *v)
 }
 
 static void
 }
 
 static void
-print_destructor(Variable *v)
+print_destructor (Variable *v)
 {
        char *root;
 
 {
        char *root;
 
@@ -1239,7 +1763,8 @@ print_destructor(Variable *v)
                if(v->destructor_line > 0)
                        out_addline_outfile(out);
        } else {
                if(v->destructor_line > 0)
                        out_addline_outfile(out);
        } else {
-               out_printf(out, "#define VAR (%s->%s)\n", root, v->id);
+               out_printf(out, "#define %s (%s->%s)\n", v->id, root, v->id);
+               out_printf(out, "#define VAR %s\n", v->id);
                out_printf(out, "\t{\n");
                if(v->destructor_line > 0)
                        out_addline_infile(out, v->destructor_line);
                out_printf(out, "\t{\n");
                if(v->destructor_line > 0)
                        out_addline_infile(out, v->destructor_line);
@@ -1248,80 +1773,80 @@ print_destructor(Variable *v)
 
                if(v->destructor_line > 0)
                        out_addline_outfile(out);
 
                if(v->destructor_line > 0)
                        out_addline_outfile(out);
-               out_printf(out, "\tmemset(&VAR, 0, sizeof(VAR));\n");
+               out_printf(out, "\tmemset(&%s, 0, sizeof(%s));\n",
+                          v->id, v->id);
                out_printf(out, "#undef VAR\n");
                out_printf(out, "#undef VAR\n");
+               out_printf(out, "#undef %s\n", v->id);
        }
 }
 
 static void
        }
 }
 
 static void
-add_destroy(Class *c)
+add_shutdown (Class *c)
 {
        out_printf(out, "\nstatic void\n"
 {
        out_printf(out, "\nstatic void\n"
-                  "___destroy(GtkObject *obj_self)\n"
+                  "___shutdown (GObject *obj_self)\n"
                   "{\n");
        out_printf(out,
                   "{\n");
        out_printf(out,
-                  "#define __GOB_FUNCTION__ \"%s::destroy\"\n",
+                  "#define __GOB_FUNCTION__ \"%s::shutdown\"\n",
                   c->otype);
 
                   c->otype);
 
-       if(destructors > 0) {
-               out_printf(out, "\t%s *self = %s (obj_self);\n",
-                          typebase, macrobase);
+       if (unreftors > 0) {
+               out_printf (out, "\t%s *self = %s (obj_self);\n",
+                           typebase, macrobase);
        }
 
        }
 
-       if(destroy_handler) {
+       if (shutdown_handler != NULL) {
                /* so we get possible bad argument warning */
                /* so we get possible bad argument warning */
-               if(destroy_handler->line_no > 0)
-                       out_addline_infile(out, destroy_handler->line_no);
-               out_printf(out, "\t___%x_%s_destroy(obj_self);\n",
-                          (guint)destroy_handler->unique_id, funcbase);
-               if(destroy_handler->line_no > 0)
-                       out_addline_outfile(out);
+               if (shutdown_handler->line_no > 0)
+                       out_addline_infile (out, shutdown_handler->line_no);
+               out_printf (out, "\t___%x_%s_shutdown(obj_self);\n",
+                           (guint)shutdown_handler->unique_id, funcbase);
+               if (shutdown_handler->line_no > 0)
+                       out_addline_outfile (out);
        } else {
        } else {
-               out_printf(out,
-                          "\tif(GTK_OBJECT_CLASS(parent_class)->destroy) \\\n"
-                          "\t\t(* GTK_OBJECT_CLASS(parent_class)->destroy)(obj_self);\n");
+               out_printf (out,
+                           "\tif (G_OBJECT_CLASS (parent_class)->shutdown) \\\n"
+                           "\t\t(* G_OBJECT_CLASS (parent_class)->shutdown) (obj_self);\n");
        }
 
        }
 
-       if(destructors > 0) {
+       if (unreftors > 0) {
                GList *li;
                for(li = ((Class *)class)->nodes;
                    li != NULL;
                    li = li->next) {
                        Node *n = li->data;
                        Variable *v = (Variable *)n;
                GList *li;
                for(li = ((Class *)class)->nodes;
                    li != NULL;
                    li = li->next) {
                        Node *n = li->data;
                        Variable *v = (Variable *)n;
-                       if(n->type == VARIABLE_NODE &&
-                          v->scope != CLASS_SCOPE)
-                               print_destructor(v);
+                       if (n->type == VARIABLE_NODE &&
+                           v->scope != CLASS_SCOPE &&
+                           v->destructor_unref)
+                               print_destructor (v);
                }
        }
 
                }
        }
 
-       out_printf(out, "\treturn;\n");
-       if(destructors > 0)
+       out_printf (out, "\treturn;\n");
+       if (unreftors > 0)
                out_printf(out, "\tself = NULL;\n");
        out_printf(out, "}\n"
                   "#undef __GOB_FUNCTION__\n\n");
 }
 
 static void
                out_printf(out, "\tself = NULL;\n");
        out_printf(out, "}\n"
                   "#undef __GOB_FUNCTION__\n\n");
 }
 
 static void
-add_finalize(Class *c)
+add_finalize (Class *c)
 {
 {
-       /* Sort of a hack to make it work with gtk+ 1.3/2.0 */
        out_printf(out,
        out_printf(out,
-                  "\n#ifdef G_OBJECT_CLASS\n"
-                  "static void\n"
+                  "\nstatic void\n"
                   "___finalize(GObject *obj_self)\n"
                   "___finalize(GObject *obj_self)\n"
-                  "#else /* !G_OBJECT_CLASS */\n"
-                  "static void\n"
-                  "___finalize(GtkObject *obj_self)\n"
-                  "#endif /* G_OBJECT_CLASS */\n"
                   "{\n");
        out_printf(out,
                   "#define __GOB_FUNCTION__ \"%s::finalize\"\n",
                   c->otype);
 
                   "{\n");
        out_printf(out,
                   "#define __GOB_FUNCTION__ \"%s::finalize\"\n",
                   c->otype);
 
-       if(privates > 0) {
+       if (privates > 0 ||
+           destructors > 0) {
                out_printf(out, "\t%s *self = %s (obj_self);\n",
                           typebase, macrobase);
                out_printf(out, "\t%s *self = %s (obj_self);\n",
                           typebase, macrobase);
+       }
+       if (privates > 0) {
                out_printf(out, "\tgpointer priv = self->_priv;\n");
        }
 
                out_printf(out, "\tgpointer priv = self->_priv;\n");
        }
 
@@ -1334,25 +1859,67 @@ add_finalize(Class *c)
                if(finalize_handler->line_no > 0)
                        out_addline_outfile(out);
        } else {
                if(finalize_handler->line_no > 0)
                        out_addline_outfile(out);
        } else {
-               /* Sort of a hack to make it work with gtk+ 1.3/2.0 */
                out_printf(out,
                out_printf(out,
-                          "#ifdef G_OBJECT_CLASS\n"
                           "\tif(G_OBJECT_CLASS(parent_class)->finalize) \\\n"
                           "\tif(G_OBJECT_CLASS(parent_class)->finalize) \\\n"
-                          "\t\t(* G_OBJECT_CLASS(parent_class)->finalize)(obj_self);\n"
-                          "#else /* !G_OBJECT_CLASS */\n"
-                          "\tif(GTK_OBJECT_CLASS(parent_class)->finalize) \\\n"
-                          "\t\t(* GTK_OBJECT_CLASS(parent_class)->finalize)(obj_self);\n"
-                          "#endif /* G_OBJECT_CLASS */\n");
+                          "\t\t(* G_OBJECT_CLASS(parent_class)->finalize)(obj_self);\n");
+       }
+
+       if (destructors > 0) {
+               GList *li;
+               for (li = ((Class *)class)->nodes;
+                    li != NULL;
+                    li = li->next) {
+                       Node *n = li->data;
+                       Variable *v = (Variable *)n;
+                       if (n->type == VARIABLE_NODE &&
+                           v->scope != CLASS_SCOPE &&
+                           ! v->destructor_unref)
+                               print_destructor (v);
+               }
        }
 
        }
 
-       if(privates > 0) {
-               out_printf(out, "\tg_free(priv);\n");
+       if (privates > 0) {
+               out_printf(out, "\tg_free (priv);\n");
        }
        }
+       out_printf (out, "\treturn;\n");
+       if (destructors > 0 ||
+           privates > 0)
+               out_printf (out, "\tself = NULL;\n");
 
        out_printf(out, "}\n"
                   "#undef __GOB_FUNCTION__\n\n");
 }
 
 
        out_printf(out, "}\n"
                   "#undef __GOB_FUNCTION__\n\n");
 }
 
+static void
+make_bonobo_x_epv (Class *c, const char *classname)
+{
+       GList *li;
+       gboolean added_line = FALSE;
+
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               Method *m = (Method *)n;
+               if(n->type != METHOD_NODE ||
+                  m->method == OVERRIDE_METHOD)
+                       continue;
+
+               if (m->bonobo_x_func) {
+                       if(m->line_no > 0) {
+                               out_addline_infile(out, m->line_no);
+                               added_line = TRUE;
+                       } else if (m->line_no == 0 &&
+                                  added_line) {
+                               out_addline_outfile(out);
+                               added_line = FALSE;
+                       }
+                       out_printf (out, "\t%s->_epv.%s = %s;\n",
+                                   classname, m->id, m->id);
+               }
+       }
+       if (added_line)
+               out_addline_outfile(out);
+}
+
 static void
 add_inits(Class *c)
 {
 static void
 add_inits(Class *c)
 {
@@ -1410,33 +1977,26 @@ add_inits(Class *c)
                        out_printf(out, "{\n"
                                   "#define __GOB_FUNCTION__ \"%s::class_init\"\n",
                                   c->otype);
                        out_printf(out, "{\n"
                                   "#define __GOB_FUNCTION__ \"%s::class_init\"\n",
                                   c->otype);
-                       if(signals > 0 ||
-                          set_arguments > 0 ||
-                          get_arguments > 0 ||
-                          need_destroy ||
-                          need_finalize) {
-                               add_unused_class = TRUE;
+                       if (set_properties > 0 ||
+                           get_properties > 0 ||
+                           signals > 0 ||
+                           need_shutdown ||
+                           need_finalize) {
                                out_printf(out,
                                out_printf(out,
-                                          "\tGtkObjectClass *"
-                                          "gtk_object_class = "
-                                          "(GtkObjectClass*) %s;\n",
-                                          ((FuncArg *)m->args->data)->name);
-                               out_printf(out,
-                                          "#ifdef G_OBJECT_CLASS\n"
                                           "\tGObjectClass *"
                                           "g_object_class = "
                                           "\tGObjectClass *"
                                           "g_object_class = "
-                                          "(GObjectClass*) %s;\n"
-                                          "#endif /* G_OBJECT_CLASS */\n",
+                                          "(GObjectClass*) %s;\n",
                                           ((FuncArg *)m->args->data)->name);
                                           ((FuncArg *)m->args->data)->name);
+                               add_unused_class = TRUE;
                                did_base_obj = TRUE;
                        }
 
                                did_base_obj = TRUE;
                        }
 
-                       if(overrides > 0)
-                               add_overrides(c,
-                                             ((FuncArg *)m->args->data)->name,
-                                             did_base_obj);
+                       if (overrides > 0)
+                               add_overrides (c,
+                                              ((FuncArg *)m->args->data)->name,
+                                              did_base_obj);
 
 
-                       if(initializers > 0) {
+                       if (initializers > 0) {
                                GList *li;
                                for(li = ((Class *)class)->nodes;
                                    li != NULL;
                                GList *li;
                                for(li = ((Class *)class)->nodes;
                                    li != NULL;
@@ -1452,8 +2012,8 @@ add_inits(Class *c)
                        out_printf(out, "\n\tparent_class = ");
                        if(for_cpp)
                                out_printf(out, "(%sClass *)", ptypebase);
                        out_printf(out, "\n\tparent_class = ");
                        if(for_cpp)
                                out_printf(out, "(%sClass *)", ptypebase);
-                       out_printf(out, "gtk_type_class (%s_get_type ());\n",
-                                  pfuncbase);
+                       out_printf(out, "g_type_class_ref (%s);\n",
+                                  pmacrotype);
 
                        if(signals > 0)
                                add_signals(c);
 
                        if(signals > 0)
                                add_signals(c);
@@ -1462,20 +2022,19 @@ add_inits(Class *c)
 
                        /* if there are no handlers for these things, we
                         * need to set them up here */
 
                        /* if there are no handlers for these things, we
                         * need to set them up here */
-                       if(need_destroy && !destroy_handler)
-                               out_printf(out, "\tgtk_object_class->destroy "
-                                          "= ___destroy;\n");
+                       if(need_shutdown && !shutdown_handler)
+                               out_printf(out, "\tg_object_class->shutdown "
+                                          "= ___shutdown;\n");
                        if(need_finalize && !finalize_handler)
                        if(need_finalize && !finalize_handler)
-                               out_printf(out,
-                                          "#ifdef G_OBJECT_CLASS\n"
-                                          "\tg_object_class->finalize = ___finalize;\n"
-                                          "#else /* !G_OBJECT_CLASS */\n"
-                                          "\tgtk_object_class->finalize = ___finalize;\n"
-                                          "#endif /* G_OBJECT_CLASS */\n");
+                               out_printf(out, "\tg_object_class->finalize = "
+                                          "___finalize;\n");
                        
                        
-                       if(get_arguments > 0 || set_arguments > 0)
+                       if(get_properties > 0 || set_properties > 0)
                                make_arguments(c);
 
                                make_arguments(c);
 
+                       if (c->bonobo_x_class != NULL) {
+                               make_bonobo_x_epv (c, ((FuncArg *)m->args->data)->name);
+                       }
                } else
                        continue;
 
                } else
                        continue;
 
@@ -1491,110 +2050,169 @@ add_inits(Class *c)
                           "\t%s = NULL;\n",
                           ((FuncArg *)m->args->data)->name);
                if(add_unused_class) {
                           "\t%s = NULL;\n",
                           ((FuncArg *)m->args->data)->name);
                if(add_unused_class) {
-                       out_printf(out,
-                                  "\tgtk_object_class = NULL;\n"
-                                  "#ifdef G_OBJECT_CLASS\n"
-                                  "\tg_object_class = NULL;\n"
-                                  "#endif /* G_OBJECT_CLASS */\n");
+                       out_printf (out, "\tg_object_class = NULL;\n");
                }
                out_printf(out, "}\n"
                           "#undef __GOB_FUNCTION__\n");
        }
 }
 
                }
                out_printf(out, "}\n"
                           "#undef __GOB_FUNCTION__\n");
        }
 }
 
+static void
+add_argument (Argument *a, gboolean is_set)
+{
+       char *s;
+       char *cbuf;
+       char *the_type_lower;
+       int line_no;
+
+       if(is_set) {
+               cbuf = a->set;
+               line_no = a->set_line;
+       } else {
+               cbuf = a->get;
+               line_no = a->get_line;
+       }
+       if (cbuf == NULL)
+               return;
+       s = g_strdup(a->name);
+       g_strup(s);
+       out_printf(out, "\tcase PROP_%s:\n\t{", s);
+
+       the_type_lower = g_strdup (a->gtktype);
+       g_strdown (the_type_lower);
+
+       if (is_set) {
+               char *cast;
+
+               if (a->atype != NULL)
+                       cast = get_type (a->atype, TRUE);
+               else
+                       cast = g_strdup (get_cast (a->gtktype, FALSE));
+
+               out_printf (out, "\t%s ARG = (%s) g_value_get_%s (VAL);\n",
+                           cast, cast, the_type_lower);
+
+               g_free (cast);
+       } else if ( ! is_set) {
+               char *cast;
+
+               if (a->atype != NULL)
+                       cast = get_type (a->atype, TRUE);
+               else
+                       cast = g_strdup (get_cast (a->gtktype, FALSE));
+               out_printf (out, "\t%s ARG;\n"
+                           "\tmemset (&ARG, 0, sizeof (%s));\n",
+                           cast, cast);
+
+               g_free(cast);
+       }
+       g_free (s);
+       out_printf(out, "\t\t{\n");
+       if (line_no > 0)
+               out_addline_infile (out, line_no);
+       out_printf (out, "%s\n", cbuf);
+       if (line_no > 0)
+               out_addline_outfile (out);
+       out_printf (out, "\t\t}\n");
+       if ( ! is_set) {
+               if (strcmp (a->gtktype, "OBJECT") == 0)
+                       out_printf (out, "\t\tg_value_set_%s (VAL, G_OBJECT (ARG))\n",
+                                   the_type_lower);
+               else
+                       out_printf (out, "\t\t"
+                                   "g_value_set_%s (VAL, ARG);\n",
+                                   the_type_lower);
+       }
+       g_free (the_type_lower);
+
+       if (is_set) {
+               out_printf (out, "\t\tif (&ARG) ;\n");
+       }
+
+       out_printf (out, "\t\tbreak;\n");
+
+       out_printf (out, "\t}\n");
+}
+
+static void
+add_property (Property *p, gboolean is_set)
+{
+       const char *cbuf;
+       char *the_type_lower;
+       char *name_upper;
+       int line_no;
+
+       if (is_set) {
+               cbuf = p->set;
+               line_no = p->set_line;
+       } else {
+               cbuf = p->get;
+               line_no = p->get_line;
+       }
+       if (cbuf == NULL)
+               return;
+
+       name_upper = g_strdup (p->name);
+       g_strup (name_upper);
+       the_type_lower = g_strdup (p->gtktype);
+       g_strdown (the_type_lower);
+
+       out_printf (out, "\tcase PROP_%s:\n", name_upper);
+
+       out_printf(out, "\t\t{\n");
+       if (line_no > 0)
+               out_addline_infile (out, line_no);
+       out_printf (out, "%s\n", cbuf);
+       if (line_no > 0)
+               out_addline_outfile (out);
+       out_printf (out, "\t\t}\n");
+
+       g_free (name_upper);
+       g_free (the_type_lower);
+
+       out_printf (out, "\t\tbreak;\n");
+}
+
 static void
 add_getset_arg(Class *c, gboolean is_set)
 {
        GList *li;
        out_printf(out, "\nstatic void\n"
 static void
 add_getset_arg(Class *c, gboolean is_set)
 {
        GList *li;
        out_printf(out, "\nstatic void\n"
-                  "___object_%s_arg (GtkObject *object,\n"
-                  "\tGtkArg *arg,\n"
-                  "\tguint arg_id)\n"
-                  "#define __GOB_FUNCTION__ \"%s::%s_arg\"\n"
+                  "___object_%s_property (GObject *object,\n"
+                  "\tguint property_id,\n"
+                  "\t%sGValue *VAL,\n"
+                  "\tGParamSpec *pspec)\n"
+                  "#define __GOB_FUNCTION__ \"%s::%s_property\"\n"
                   "{\n"
                   "\t%s *self;\n\n"
                   "\tself = %s (object);\n\n"
                   "{\n"
                   "\t%s *self;\n\n"
                   "\tself = %s (object);\n\n"
-                  "\tswitch (arg_id) {\n",
+                  "\tswitch (property_id) {\n",
                   is_set ? "set" : "get",
                   is_set ? "set" : "get",
+                  is_set ? "const " : "",
                   c->otype, is_set ? "set" : "get",
                   typebase, macrobase);
 
                   c->otype, is_set ? "set" : "get",
                   typebase, macrobase);
 
-       for(li=c->nodes;li;li=g_list_next(li)) {
+       for (li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
                Node *n = li->data;
-               Argument *a;
-               char *s;
-               char *cbuf;
-               int line_no;
-               if(n->type != ARGUMENT_NODE)
-                       continue;
-               a = (Argument *)n;
-               if(is_set) {
-                       cbuf = a->set;
-                       line_no = a->set_line;
-               } else {
-                       cbuf = a->get;
-                       line_no = a->get_line;
-               }
-               if(!cbuf)
-                       continue;
-               s = g_strdup(a->name);
-               g_strup(s);
-               out_printf(out, "\tcase ARG_%s:\n", s);
-               if(is_set && a->atype) {
-                       char *cast = get_type(a->atype, TRUE);
-                       if(no_gnu || for_cpp) {
-                               out_printf(out, "#define ARG "
-                                          "((%s)GTK_VALUE_%s(*arg))\n",
-                                          cast, a->gtktype);
-                       } else {
-                               out_printf(out, "#if defined(__GNUC__) && !defined(__STRICT_ANSI__)\n");
-                               if(strcmp(a->gtktype, "OBJECT")==0) {
-                                       out_printf(out, "#define ARG "
-                                                  "({%s foo = "
-                                                  "GTK_VALUE_POINTER(*arg); "
-                                                  "foo; })\n",
-                                                  cast);
-                               } else {
-                                       out_printf(out, "#define ARG "
-                                                  "({%s foo = "
-                                                  "GTK_VALUE_%s(*arg); "
-                                                  "foo; })\n",
-                                                  cast, a->gtktype);
-                               }
-                               out_printf(out, "#else /* __GNUC__ && !__STRICT_ANSI__ */\n");
-                               out_printf(out, "#define ARG "
-                                          "((%s)GTK_VALUE_%s(*arg))\n",
-                                          cast, a->gtktype);
-                               out_printf(out, "#endif /* __GNUC__ && !__STRICT_ANSI__ */\n\n");
-                       }
-                       out_printf(out, "\t\t{\n");
-                       g_free(cast);
-               } else if(!is_set && strcmp(a->gtktype, "OBJECT")==0) {
-                       out_printf(out,
-                                  "#define ARG (GTK_VALUE_POINTER(*arg))\n"
-                                  "\t\t{\n");
-               } else {
-                       out_printf(out,
-                                  "#define ARG (GTK_VALUE_%s(*arg))\n"
-                                  "\t\t{\n",
-                                  a->gtktype);
-               }
-               g_free(s);
-               if(line_no > 0)
-                       out_addline_infile(out, line_no);
-               out_printf(out, "%s\n", cbuf);
-               if(line_no > 0)
-                       out_addline_outfile(out);
-               out_printf(out, "\t\t}\n\t\tbreak;\n"
-                       "#undef ARG\n");
-       }
-       out_printf(out, "\tdefault:\n\t\tbreak;\n\t}\n"
-                  "\treturn;\n\tself = NULL;\n\targ = NULL;\n}\n"
-                  "#undef __GOB_FUNCTION__\n");
+               if (n->type == PROPERTY_NODE)
+                       add_property ((Property *)n, is_set);
+               else if (n->type == ARGUMENT_NODE)
+                       add_argument ((Argument *)n, is_set);
+       }
+       out_printf (out, "\tdefault:\n"
+                   "/* Apparently in g++ this is needed, glib is b0rk */\n"
+                   "#ifndef __PRETTY_FUNCTION__\n"
+                   "#  undef G_STRLOC\n"
+                   "#  define G_STRLOC __FILE__ \":\" G_STRINGIFY (__LINE__)\n"
+                   "#endif\n"
+                   "\t\tG_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);\n"
+                   "\t\tbreak;\n\t}\n"
+                   "\treturn;\n\tself = NULL;\n\tVAL = NULL;\n\tpspec = NULL;\n}\n"
+                   "#undef __GOB_FUNCTION__\n");
 }
 
 static void
 }
 
 static void
-print_checks(Method *m, FuncArg *fa)
+print_checks (Method *m, FuncArg *fa)
 {
        GList *li;
        gboolean is_void;
 {
        GList *li;
        gboolean is_void;
@@ -1602,7 +2220,7 @@ print_checks(Method *m, FuncArg *fa)
        is_void = (strcmp(m->mtype->name, "void")==0 &&
                   m->mtype->pointer == NULL);
        
        is_void = (strcmp(m->mtype->name, "void")==0 &&
                   m->mtype->pointer == NULL);
        
-       for(li = fa->checks; li; li = g_list_next(li)) {
+       for(li = fa->checks; li != NULL; li = li->next) {
                Check *ch = li->data;
                char *s;
                /* point to the method prot in .gob for failed checks */
                Check *ch = li->data;
                char *s;
                /* point to the method prot in .gob for failed checks */
@@ -1674,10 +2292,12 @@ print_preconditions(Method *m)
 static void
 print_method_body(Method *m, int pre)
 {
 static void
 print_method_body(Method *m, int pre)
 {
+       if (m->line_no > 0)
+               out_addline_outfile(out);
        out_printf(out, "{\n"
                   "#define __GOB_FUNCTION__ \"%s::%s\"\n",
                   ((Class *)class)->otype,
        out_printf(out, "{\n"
                   "#define __GOB_FUNCTION__ \"%s::%s\"\n",
                   ((Class *)class)->otype,
-                  get_real_id(m->id));
+                  m->id);
        if(pre)
                print_preconditions(m);
 
        if(pre)
                print_preconditions(m);
 
@@ -1704,21 +2324,27 @@ print_method_body(Method *m, int pre)
 }
 
 static void
 }
 
 static void
-put_signal_args(Method *m)
+put_signal_args (Method *m)
 {
        GList *li;
        GList *ali;
 {
        GList *li;
        GList *ali;
-       for(ali = m->gtktypes->next, li=m->args->next;
-           li && ali;
-           li=li->next, ali=ali->next) {
+       for (ali = m->gtktypes->next, li=m->args->next;
+            li != NULL && ali != NULL;
+            li = li->next, ali = ali->next) {
                FuncArg *fa = li->data;
                FuncArg *fa = li->data;
-               const char *cast = get_cast(ali->data, FALSE);
+               char *cast = g_strdup (get_cast (ali->data, FALSE));
+
+               if (cast == NULL) {
+                       cast = get_type (fa->atype, TRUE);
+               }
                /* we should have already proved before that
                   the we know all the types */
                /* we should have already proved before that
                   the we know all the types */
-               g_assert(cast);
+               g_assert (cast != NULL);
+
+               out_printf (out, ",\n\t\t(%s)%s", cast,
+                           fa->name);
 
 
-               out_printf(out, ",\n\t\t(%s)%s", cast,
-                          fa->name);
+               g_free (cast);
        }
 }
 
        }
 }
 
@@ -1779,16 +2405,16 @@ put_method(Method *m)
                                     m, FALSE, FALSE, TRUE);
                out_addline_outfile(out);
                out_printf(out, "{\n");
                                     m, FALSE, FALSE, TRUE);
                out_addline_outfile(out);
                out_printf(out, "{\n");
-               s = g_strdup(get_real_id(m->id));
+               s = g_strdup(m->id);
                g_strup(s);
                if(strcmp(m->mtype->name, "void") == 0 &&
                   m->mtype->pointer == NULL) {
                        print_preconditions(m);
                        if(((FuncArg *)m->args->data)->name)
                g_strup(s);
                if(strcmp(m->mtype->name, "void") == 0 &&
                   m->mtype->pointer == NULL) {
                        print_preconditions(m);
                        if(((FuncArg *)m->args->data)->name)
-                       out_printf(out, "\tgtk_signal_emit (GTK_OBJECT (%s),\n"
-                               "\t\tobject_signals[%s_SIGNAL]",
+                       out_printf(out, "\tg_signal_emit (G_OBJECT (%s),\n"
+                               "\t\tobject_signals[%s_SIGNAL], 0",
                                ((FuncArg *)m->args->data)->name, s);
                                ((FuncArg *)m->args->data)->name, s);
-                       put_signal_args(m);
+                       put_signal_args (m);
                        out_printf(out, ");\n}\n");
                } else {
                        out_printf(out, "\t");
                        out_printf(out, ");\n}\n");
                } else {
                        out_printf(out, "\t");
@@ -1802,8 +2428,8 @@ put_method(Method *m)
                        else
                                out_printf(out, ")(0);\n");
                        print_preconditions(m);
                        else
                                out_printf(out, ")(0);\n");
                        print_preconditions(m);
-                       out_printf(out, "\tgtk_signal_emit (GTK_OBJECT (%s),\n"
-                               "\t\tobject_signals[%s_SIGNAL]",
+                       out_printf(out, "\tg_signal_emit (G_OBJECT (%s),\n"
+                               "\t\tobject_signals[%s_SIGNAL], 0",
                                ((FuncArg *)m->args->data)->name, s);
                        put_signal_args(m);
                        out_printf(out, ",\n\t\t&return_val);\n"
                                ((FuncArg *)m->args->data)->name, s);
                        put_signal_args(m);
                        out_printf(out, ",\n\t\t&return_val);\n"
@@ -1835,12 +2461,12 @@ put_method(Method *m)
                out_printf(out, "\tklass = %s_GET_CLASS(%s);\n\n"
                        "\tif(klass->%s)\n",
                        macrobase, ((FuncArg *)m->args->data)->name,
                out_printf(out, "\tklass = %s_GET_CLASS(%s);\n\n"
                        "\tif(klass->%s)\n",
                        macrobase, ((FuncArg *)m->args->data)->name,
-                       get_real_id(m->id));
+                       m->id);
                if(strcmp(m->mtype->name, "void") == 0 &&
                   m->mtype->pointer == NULL) {
                        GList *li;
                        out_printf(out, "\t\t(*klass->%s)(%s",
                if(strcmp(m->mtype->name, "void") == 0 &&
                   m->mtype->pointer == NULL) {
                        GList *li;
                        out_printf(out, "\t\t(*klass->%s)(%s",
-                                  get_real_id(m->id),
+                                  m->id,
                                   ((FuncArg *)m->args->data)->name);
                        for(li=m->args->next;li;li=g_list_next(li)) {
                                FuncArg *fa = li->data;
                                   ((FuncArg *)m->args->data)->name);
                        for(li=m->args->next;li;li=g_list_next(li)) {
                                FuncArg *fa = li->data;
@@ -1850,7 +2476,7 @@ put_method(Method *m)
                } else {
                        GList *li;
                        out_printf(out, "\t\treturn (*klass->%s)(%s",
                } else {
                        GList *li;
                        out_printf(out, "\t\treturn (*klass->%s)(%s",
-                                  get_real_id(m->id),
+                                  m->id,
                                   ((FuncArg *)m->args->data)->name);
                        for(li=m->args->next;li;li=g_list_next(li)) {
                                FuncArg *fa = li->data;
                                   ((FuncArg *)m->args->data)->name);
                        for(li=m->args->next;li;li=g_list_next(li)) {
                                FuncArg *fa = li->data;
@@ -1894,13 +2520,13 @@ put_method(Method *m)
                        out_printf(out, "#define PARENT_HANDLER(%s) \\\n"
                                   "\t{ if(%s_CLASS(parent_class)->%s) \\\n"
                                   "\t\t(* %s_CLASS(parent_class)->%s)(%s); }\n",
                        out_printf(out, "#define PARENT_HANDLER(%s) \\\n"
                                   "\t{ if(%s_CLASS(parent_class)->%s) \\\n"
                                   "\t\t(* %s_CLASS(parent_class)->%s)(%s); }\n",
-                                  args, s, get_real_id(m->id), s, get_real_id(m->id), args);
+                                  args, s, m->id, s, m->id, args);
                } else {
                        out_printf(out, "#define PARENT_HANDLER(%s) \\\n"
                                   "\t((%s_CLASS(parent_class)->%s)? \\\n"
                                   "\t\t(* %s_CLASS(parent_class)->%s)(%s): \\\n"
                                   "\t\t(",
                } else {
                        out_printf(out, "#define PARENT_HANDLER(%s) \\\n"
                                   "\t((%s_CLASS(parent_class)->%s)? \\\n"
                                   "\t\t(* %s_CLASS(parent_class)->%s)(%s): \\\n"
                                   "\t\t(",
-                                  args, s, get_real_id(m->id), s, get_real_id(m->id), args);
+                                  args, s, m->id, s, m->id, args);
                        out_printf(out, "(");
                        print_type(out, m->mtype, TRUE);
                        out_printf(out, ")%s))\n",
                        out_printf(out, "(");
                        print_type(out, m->mtype, TRUE);
                        out_printf(out, ")%s))\n",
@@ -1922,93 +2548,110 @@ open_files(void)
 {
        char *outfile, *outfileh, *outfileph;
 
 {
        char *outfile, *outfileh, *outfileph;
 
-       if(!for_cpp)
-               outfile = g_strconcat(filebase, ".c", NULL);
+       if ( ! for_cpp)
+               outfile = g_strconcat (filebase, ".c", NULL);
        else
        else
-               outfile = g_strconcat(filebase, ".cc", NULL);
-       if(no_touch_headers)
-               outfileh = g_strconcat("#gob#", filebase, ".h#gob#", NULL);
+               outfile = g_strconcat (filebase, ".cc", NULL);
+       if (no_touch_headers)
+               outfileh = g_strconcat ("#gob#", filebase, ".h#gob#", NULL);
        else
        else
-               outfileh = g_strconcat(filebase, ".h", NULL);
+               outfileh = g_strconcat (filebase, ".h", NULL);
 
 
-       if((privates > 0 || protecteds > 0 ||
-           private_header == PRIVATE_HEADER_ALWAYS) &&
-          private_header != PRIVATE_HEADER_NEVER)
-               outfileph = g_strconcat(filebase, "-private.h", NULL);
+       if ((privates > 0 || protecteds > 0 ||
+            private_header == PRIVATE_HEADER_ALWAYS) &&
+           private_header != PRIVATE_HEADER_NEVER)
+               outfileph = g_strconcat (filebase, "-private.h", NULL);
        else
                outfileph = NULL;
 
        
        else
                outfileph = NULL;
 
        
-       if(no_write) {
-               devnull = fopen("/dev/null", "w");
-               if(!devnull)
-                       g_error("Cannot open null device");
+       if (no_write) {
+               devnull = fopen ("/dev/null", "w");
+               if (devnull == NULL)
+                       g_error ("Cannot open null device");
                out = devnull;
                outh = devnull;
                out = devnull;
                outh = devnull;
-               if(outfileph)
+               if (outfileph != NULL)
                        outph = devnull;
        } else {
                        outph = devnull;
        } else {
-               out = fopen(outfile, "w");
-               if(!out) {
-                       g_error("Cannot open outfile: %s", outfile);
+               out = fopen (outfile, "w");
+               if (out == NULL) {
+                       g_error ("Cannot open outfile: %s", outfile);
                }
                }
-               outh = fopen(outfileh, "w");
-               if(!outh)
-                       g_error("Cannot open outfile: %s", outfileh);
-               if(outfileph) {
-                       outph = fopen(outfileph, "w");
-                       if(!outph)
-                               g_error("Cannot open outfile: %s", outfileh);
+               outh = fopen (outfileh, "w");
+               if (outh == NULL)
+                       g_error ("Cannot open outfile: %s", outfileh);
+               if (outfileph != NULL) {
+                       outph = fopen (outfileph, "w");
+                       if (outph == NULL)
+                               g_error ("Cannot open outfile: %s", outfileh);
                }
        }
 }
 
 static void
                }
        }
 }
 
 static void
-put_argument_nongnu_wrappers(Class *c)
+put_argument_nongnu_wrappers (Class *c)
 {
        GList *li;
 
 {
        GList *li;
 
-       if(get_arguments < 0 && set_arguments < 0)
+       if (get_properties < 0 && set_properties < 0)
                return;
 
                return;
 
-       for(li=c->nodes;li;li=g_list_next(li)) {
+       for (li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
                Node *n = li->data;
-               Argument *a = (Argument *)n;
+               const char *name, *gtktype;
+               gboolean get, set;
+               Type *atype;
                char *aname;
                char *cast;
 
                char *aname;
                char *cast;
 
-               if(n->type != ARGUMENT_NODE)
+               if (n->type == ARGUMENT_NODE) {
+                       Argument *a = (Argument *)n;
+                       name = a->name;
+                       gtktype = a->gtktype;
+                       atype = a->atype;
+                       get = a->get != NULL;
+                       set = a->set != NULL;
+               } else if (n->type == PROPERTY_NODE) {
+                       Property *p = (Property *)n;
+                       name = p->name;
+                       gtktype = p->gtktype;
+                       atype = p->ptype;
+                       get = p->get != NULL;
+                       set = p->set != NULL;
+               } else {
                        continue;
                        continue;
+               }
 
 
-               aname = g_strdup(a->name);
-               g_strup(aname);
+               aname = g_strdup (name);
+               g_strup (aname);
 
 
-               if(a->atype)
-                       cast = get_type(a->atype, TRUE);
+               if (atype != NULL)
+                       cast = get_type (atype, TRUE);
                else
                else
-                       cast = g_strdup(get_cast(a->gtktype, TRUE));
-
-               if(cast) {
-                       if(a->set)
-                               out_printf(outh, "#define %s_ARG_%s(arg)    \t"
-                                          "\"%s\",(%s)(arg)\n",
-                                          macrobase, aname, a->name, cast);
-                       if(a->get)
-                               out_printf(outh, "#define %s_GET_ARG_%s(arg)\t"
-                                          "\"%s\",(%s*)(arg)\n",
-                                          macrobase, aname, a->name, cast);
+                       cast = g_strdup (get_cast (gtktype, TRUE));
+
+               if (cast != NULL) {
+                       if (set)
+                               out_printf (outh, "#define %s_PROP_%s(arg)    \t"
+                                           "\"%s\",(%s)(arg)\n",
+                                           macrobase, aname, name, cast);
+                       if (get)
+                               out_printf (outh, "#define %s_GET_PROP_%s(arg)\t"
+                                           "\"%s\",(%s*)(arg)\n",
+                                           macrobase, aname, name, cast);
                } else {
                } else {
-                       if(a->set)
-                               out_printf(outh, "#define %s_ARG_%s(arg)    \t"
-                                          "\"%s\",(arg)\n",
-                                          macrobase, aname, a->name);
-                       if(a->get)
-                               out_printf(outh, "#define %s_GET_ARG_%s(arg)\t"
-                                          "\"%s\",(arg)\n",
-                                          macrobase, aname, a->name);
+                       if(set)
+                               out_printf (outh, "#define %s_PROP_%s(arg)    \t"
+                                           "\"%s\",(arg)\n",
+                                           macrobase, aname, name);
+                       if(get)
+                               out_printf (outh, "#define %s_GET_PROP_%s(arg)\t"
+                                           "\"%s\",(arg)\n",
+                                           macrobase, aname, name);
                }
                }
-               g_free(cast);
-               g_free(aname);
+               g_free (cast);
+               g_free (aname);
        }
 }
 
        }
 }
 
@@ -2017,43 +2660,64 @@ put_argument_gnu_wrappers(Class *c)
 {
        GList *li;
 
 {
        GList *li;
 
-       if(get_arguments < 0 && set_arguments < 0)
+       if(get_properties < 0 && set_properties < 0)
                return;
 
                return;
 
-       for(li=c->nodes;li;li=g_list_next(li)) {
+       for (li = c->nodes; li != NULL; li = li->next) {
                Node *n = li->data;
                Node *n = li->data;
-               Argument *a = (Argument *)n;
-               char *s;
+               const char *name, *gtktype;
+               gboolean get, set;
+               Type *atype;
+               char *aname;
                char *cast;
                char *cast;
-               if(n->type != ARGUMENT_NODE)
+
+               if (n->type == ARGUMENT_NODE) {
+                       Argument *a = (Argument *)n;
+                       name = a->name;
+                       gtktype = a->gtktype;
+                       atype = a->atype;
+                       get = a->get != NULL;
+                       set = a->set != NULL;
+               } else if (n->type == PROPERTY_NODE) {
+                       Property *p = (Property *)n;
+                       name = p->name;
+                       gtktype = p->gtktype;
+                       atype = p->ptype;
+                       get = p->get != NULL;
+                       set = p->set != NULL;
+               } else {
                        continue;
                        continue;
-               s = g_strdup(a->name);
-               g_strup(s);
-               if(a->atype)
-                       cast = get_type(a->atype, TRUE);
+               }
+
+               aname = g_strdup (name);
+               g_strup (aname);
+
+               if (atype != NULL)
+                       cast = get_type (atype, TRUE);
                else
                else
-                       cast = g_strdup(get_cast(a->gtktype, TRUE));
-               if(cast) {
-                       if(a->set)
-                               out_printf(outh, "#define %s_ARG_%s(arg)    \t"
+                       cast = g_strdup (get_cast (gtktype, TRUE));
+
+               if (cast != NULL) {
+                       if (set)
+                               out_printf (outh, "#define %s_PROP_%s(arg)    \t"
                                           "\"%s\",({%sz = (arg); z;})\n",
                                           "\"%s\",({%sz = (arg); z;})\n",
-                                          macrobase, s, a->name, cast);
-                       if(a->get)
-                               out_printf(outh, "#define %s_GET_ARG_%s(arg)\t"
+                                          macrobase, aname, name, cast);
+                       if (get)
+                               out_printf (outh, "#define %s_GET_PROP_%s(arg)\t"
                                           "\"%s\",({%s*z = (arg); z;})\n",
                                           "\"%s\",({%s*z = (arg); z;})\n",
-                                          macrobase, s, a->name, cast);
+                                          macrobase, aname, name, cast);
                } else {
                } else {
-                       if(a->set)
-                               out_printf(outh, "#define %s_ARG_%s(arg)    \t"
+                       if (set)
+                               out_printf (outh, "#define %s_PROP_%s(arg)    \t"
                                           "\"%s\",(arg)\n",
                                           "\"%s\",(arg)\n",
-                                          macrobase, s, a->name);
-                       if(a->get)
-                               out_printf(outh, "#define %s_GET_ARG_%s(arg)\t"
+                                          macrobase, aname, name);
+                       if (get)
+                               out_printf (outh, "#define %s_GET_PROP_%s(arg)\t"
                                           "\"%s\",(arg)\n",
                                           "\"%s\",(arg)\n",
-                                          macrobase, s, a->name);
+                                          macrobase, aname, name);
                }
                }
-               g_free(cast);
-               g_free(s);
+               g_free (cast);
+               g_free (aname);
        }
 }
 
        }
 }
 
@@ -2111,7 +2775,7 @@ print_ccode_block(CCode *cc)
 static void
 print_class_block(Class *c)
 {
 static void
 print_class_block(Class *c)
 {
-       GList *l;
+       GList *li;
        char *s;
        gboolean printed_private = FALSE;
 
        char *s;
        gboolean printed_private = FALSE;
 
@@ -2140,32 +2804,28 @@ print_class_block(Class *c)
                   "(%s_get_type())\n",
                   macrotype, funcbase);
        out_printf(outh, "#define %s(obj)\t"
                   "(%s_get_type())\n",
                   macrotype, funcbase);
        out_printf(outh, "#define %s(obj)\t"
-                  "GTK_CHECK_CAST((obj), %s_get_type(), %s)\n",
+                  "G_TYPE_CHECK_INSTANCE_CAST((obj), %s_get_type(), %s)\n",
                   macrobase, funcbase, typebase);
        out_printf(outh, "#define %s_CONST(obj)\t"
                   macrobase, funcbase, typebase);
        out_printf(outh, "#define %s_CONST(obj)\t"
-                  "GTK_CHECK_CAST((obj), %s_get_type(), %s const)\n",
+                  "G_TYPE_CHECK_INSTANCE_CAST((obj), %s_get_type(), %s const)\n",
                   macrobase, funcbase, typebase); 
        out_printf(outh, "#define %s_CLASS(klass)\t"
                   macrobase, funcbase, typebase); 
        out_printf(outh, "#define %s_CLASS(klass)\t"
-                  "GTK_CHECK_CLASS_CAST((klass), %s_get_type(), %sClass)\n",
+                  "G_TYPE_CHECK_CLASS_CAST((klass), %s_get_type(), %sClass)\n",
                   macrobase, funcbase, typebase);
        out_printf(outh, "#define %s(obj)\t"
                   macrobase, funcbase, typebase);
        out_printf(outh, "#define %s(obj)\t"
-                  "GTK_CHECK_TYPE((obj), %s_get_type ())\n\n",
+                  "G_TYPE_CHECK_INSTANCE_TYPE((obj), %s_get_type ())\n\n",
                   macrois, funcbase);
                   macrois, funcbase);
-       out_printf(outh, "#ifdef GTK_CHECK_GET_CLASS\n"
+       out_printf(outh,
                   "#define %s_GET_CLASS(obj)\t"
                   "#define %s_GET_CLASS(obj)\t"
-                  "GTK_CHECK_GET_CLASS((obj), %s_get_type(), %sClass)\n",
+                  "G_TYPE_INSTANCE_GET_CLASS((obj), %s_get_type(), %sClass)\n",
                   macrobase, funcbase, typebase);
                   macrobase, funcbase, typebase);
-       out_printf(outh, "#else /* !GTK_CHECK_GET_CLASS */\n"
-                  "#define %s_GET_CLASS(obj)\t"
-                  "((%sClass *)GTK_OBJECT(obj)->klass)\n"
-                  "#endif /* GTK_CHECK_GET_CLASS */\n",
-                  macrobase, typebase);
 
 
-       if( ! no_self_alias) {
+       if ( ! no_self_alias) {
                out_printf(out, "/* self casting macros */\n");
                out_printf(out, "#define SELF(x) %s(x)\n", macrobase);
                out_printf(out, "#define SELF_CONST(x) %s_CONST(x)\n", macrobase);
                out_printf(out, "#define IS_SELF(x) %s(x)\n", macrois);
                out_printf(out, "/* self casting macros */\n");
                out_printf(out, "#define SELF(x) %s(x)\n", macrobase);
                out_printf(out, "#define SELF_CONST(x) %s_CONST(x)\n", macrobase);
                out_printf(out, "#define IS_SELF(x) %s(x)\n", macrois);
+               out_printf(out, "#define TYPE_SELF %s\n", macrotype);
                out_printf(out, "#define SELF_CLASS(x) %s_CLASS(x)\n\n",
                           macrobase);
                out_printf(out, "#define SELF_GET_CLASS(x) %s_GET_CLASS(x)\n\n",
                out_printf(out, "#define SELF_CLASS(x) %s_CLASS(x)\n\n",
                           macrobase);
                out_printf(out, "#define SELF_GET_CLASS(x) %s_GET_CLASS(x)\n\n",
@@ -2176,36 +2836,31 @@ print_class_block(Class *c)
                out_printf(out, "typedef %sClass SelfClass;\n\n", typebase);
        }
 
                out_printf(out, "typedef %sClass SelfClass;\n\n", typebase);
        }
 
-       out_printf(out, "/* GTK_CLASS_TYPE for 1.2<->1.3/2.0 GTK+ compatibility */\n");
-       out_printf(out,
-                  "#ifndef GTK_CLASS_TYPE\n"
-                  "#define GTK_CLASS_TYPE(x) (GTK_OBJECT_CLASS(x)->type)\n"
-                  "#endif /* GTK_CLASS_TYPE */\n\n");
-
-       if(privates > 0 || always_private_struct) {
-               out_printf(outh, "\n/* Private structure type */\n");
-               out_printf(outh, "typedef struct _%sPrivate %sPrivate;\n",
+       if (privates > 0 ||
+           always_private_struct) {
+               out_printf (outh, "\n/* Private structure type */\n");
+               out_printf (outh, "typedef struct _%sPrivate %sPrivate;\n",
                           typebase, typebase);
                           typebase, typebase);
-               if(privates == 0)
-                       out_printf(outh, "/* There are no privates, this "
-                                  "structure is thus never defined */\n");
-       }
-
-       out_printf(outh, "\n/*\n"
-                  " * Main object structure\n"
-                  " */\n");
-       s = replace_sep(c->otype, '_');
-       g_strup(s);
-       out_printf(outh, "#ifndef __TYPEDEF_%s__\n"
-                  "#define __TYPEDEF_%s__\n", s, s);
-       g_free(s);
-       out_printf(outh, "typedef struct _%s %s;\n"
-                  "#endif\n", typebase, typebase);
-       out_printf(outh, "struct _%s {\n\t%s __parent__;\n",
-                  typebase, ptypebase);
-       for(l=c->nodes; l; l=g_list_next(l)) {
+               if (privates == 0)
+                       out_printf (outh, "/* There are no privates, this "
+                                   "structure is thus never defined */\n");
+       }
+
+       out_printf (outh, "\n/*\n"
+                   " * Main object structure\n"
+                   " */\n");
+       s = replace_sep (c->otype, '_');
+       g_strup (s);
+       out_printf (outh, "#ifndef __TYPEDEF_%s__\n"
+                   "#define __TYPEDEF_%s__\n", s, s);
+       g_free (s);
+       out_printf (outh, "typedef struct _%s %s;\n"
+                   "#endif\n", typebase, typebase);
+       out_printf (outh, "struct _%s {\n\t%s __parent__;\n",
+                   typebase, ptypebase);
+       for (li = c->nodes; li; li=li->next) {
                static gboolean printed_public = FALSE;
                static gboolean printed_public = FALSE;
-               Node *n = l->data;
+               Node *n = li->data;
                Variable *v = (Variable *)n;
                if(n->type == VARIABLE_NODE &&
                   v->scope == PUBLIC_SCOPE) {
                Variable *v = (Variable *)n;
                if(n->type == VARIABLE_NODE &&
                   v->scope == PUBLIC_SCOPE) {
@@ -2217,40 +2872,41 @@ print_class_block(Class *c)
                }
        }
        /* put protecteds always AFTER publics */
                }
        }
        /* put protecteds always AFTER publics */
-       for(l=c->nodes; l; l=g_list_next(l)) {
-               Node *n = l->data;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                Variable *v = (Variable *)n;
                Variable *v = (Variable *)n;
-               if(n->type == VARIABLE_NODE &&
-                  v->scope == PROTECTED_SCOPE) {
-                       if( ! printed_private) {
-                               out_printf(outh, "\t/*< private >*/\n");
+               if (n->type == VARIABLE_NODE &&
+                   v->scope == PROTECTED_SCOPE) {
+                       if ( ! printed_private) {
+                               out_printf (outh, "\t/*< private >*/\n");
                                printed_private = TRUE;
                        }
                                printed_private = TRUE;
                        }
-                       put_variable((Variable *)n, outh);
+                       put_variable ((Variable *)n, outh);
                }
        }
                }
        }
-       if(privates > 0 || always_private_struct) {
-               if( ! printed_private)
-                       out_printf(outh, "\t/*< private >*/\n");
-               out_printf(outh, "\t%sPrivate *_priv;\n", typebase);
+       if (privates > 0 ||
+           always_private_struct) {
+               if ( ! printed_private)
+                       out_printf (outh, "\t/*< private >*/\n");
+               out_printf (outh, "\t%sPrivate *_priv;\n", typebase);
        }
        }
-       out_printf(outh, "};\n");
+       out_printf (outh, "};\n");
 
 
-       if(privates > 0) {
+       if (privates > 0) {
                FILE *outfp;
 
                /* if we are to stick this into the private
                   header, if not stick it directly into the
                   C file */
                FILE *outfp;
 
                /* if we are to stick this into the private
                   header, if not stick it directly into the
                   C file */
-               if(outph
+               if (outph != NULL
                        outfp = outph;
                else
                        outfp = out;
 
                        outfp = outph;
                else
                        outfp = out;
 
-               out_printf(outfp, "struct _%sPrivate {\n",
-                          typebase);
-               for(l=c->nodes; l; l=l->next) {
-                       Node *n = l->data;
+               out_printf (outfp, "struct _%sPrivate {\n",
+                           typebase);
+               for(li=c->nodes; li; li=li->next) {
+                       Node *n = li->data;
                        Variable *v = (Variable *)n;
                        if(n->type == VARIABLE_NODE &&
                           v->scope == PRIVATE_SCOPE) {
                        Variable *v = (Variable *)n;
                        if(n->type == VARIABLE_NODE &&
                           v->scope == PRIVATE_SCOPE) {
@@ -2270,46 +2926,55 @@ print_class_block(Class *c)
        out_printf(outh,
                   "struct _%sClass {\n\t%sClass __parent__;\n",
                   typebase, ptypebase);
        out_printf(outh,
                   "struct _%sClass {\n\t%sClass __parent__;\n",
                   typebase, ptypebase);
-       for(l = c->nodes; l != NULL; l = l->next) {
-               Node *n = l->data;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE)
                        put_vs_method((Method *)n);
        }
                if(n->type == METHOD_NODE)
                        put_vs_method((Method *)n);
        }
+       /* If BonoboX type class put down the epv */
+       if (c->bonobo_x_class != NULL) {
+               out_printf (outh,
+                           "\t/* Bonobo object epv */\n"
+                           "\tPOA_%s__epv _epv;\n",
+                           c->bonobo_x_class);
+       }
        /* put class scope variables */
        /* put class scope variables */
-       for(l = c->nodes; l != NULL; l = l->next) {
-               Node *n = l->data;
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                Variable *v = (Variable *)n;
                Variable *v = (Variable *)n;
-               if(n->type == VARIABLE_NODE &&
-                  v->scope == CLASS_SCOPE)
-                       put_variable((Variable *)n, outh);
+               if (n->type == VARIABLE_NODE &&
+                   v->scope == CLASS_SCOPE)
+                       put_variable ((Variable *)n, outh);
        }
        }
-       out_printf(outh, "};\n\n");
+       out_printf (outh, "};\n\n");
 
 
-       out_printf(out, "/* here are local prototypes */\n");
-       if(set_arguments > 0) {
-               out_printf(out, "static void ___object_set_arg "
-                          "(GtkObject *object, GtkArg *arg, "
-                          "guint arg_id);\n");
+       out_printf (out, "/* here are local prototypes */\n");
+       if (set_properties > 0) {
+               out_printf (out, "static void ___object_set_property "
+                           "(GObject *object, guint property_id, "
+                           "const GValue *value, GParamSpec *pspec);\n");
        }
        }
-       if(get_arguments > 0) {
-               out_printf(out, "static void ___object_get_arg "
-                          "(GtkObject *object, GtkArg *arg, "
-                          "guint arg_id);\n");
+       if (get_properties > 0) {
+               out_printf (out, "static void ___object_get_property "
+                           "(GObject *object, guint property_id, "
+                           "GValue *value, GParamSpec *pspec);\n");
        }
 
        }
 
-       out_printf(outh, "\n/*\n"
-                  " * Public methods\n"
-                  " */\n");
+       out_printf (outh, "\n/*\n"
+                   " * Public methods\n"
+                   " */\n");
 
 
-       out_printf(outh, "GtkType\t%s_get_type\t(void)", funcbase);
-       if ( ! no_gnu) {
-               out_printf(outh, " G_GNUC_CONST;\n");
-       } else {
-               out_printf(outh, ";\n");
+       if ( ! overrode_get_type) {
+               out_printf (outh, "GType\t%s_get_type\t(void)", funcbase);
+               if ( ! no_gnu) {
+                       out_printf (outh, " G_GNUC_CONST;\n");
+               } else {
+                       out_printf (outh, ";\n");
+               }
        }
 
        }
 
-       for(l = c->nodes; l != NULL; l = l->next) {
-               Node *n = l->data;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE) {
                        put_pub_method((Method *)n);
                        put_prot_method((Method *)n);
                if(n->type == METHOD_NODE) {
                        put_pub_method((Method *)n);
                        put_prot_method((Method *)n);
@@ -2334,7 +2999,7 @@ print_class_block(Class *c)
        }
 
        /* argument wrapping macros */
        }
 
        /* argument wrapping macros */
-       if(get_arguments > 0 || set_arguments > 0) {
+       if(get_properties > 0 || set_properties > 0) {
                out_printf(outh, "\n/*\n"
                           " * Argument wrapping macros\n"
                           " */\n");
                out_printf(outh, "\n/*\n"
                           " * Argument wrapping macros\n"
                           " */\n");
@@ -2350,8 +3015,8 @@ print_class_block(Class *c)
        }
 
        if(signals > 0) {
        }
 
        if(signals > 0) {
-               for(l = c->nodes; l != NULL; l = l->next) {
-                       Node *n = l->data;
+               for(li = c->nodes; li != NULL; li = li->next) {
+                       Node *n = li->data;
                        if(n->type == METHOD_NODE)
                                add_signal_prots((Method *)n);
                }
                        if(n->type == METHOD_NODE)
                                add_signal_prots((Method *)n);
                }
@@ -2359,8 +3024,12 @@ print_class_block(Class *c)
 
        add_enums(c);
 
 
        add_enums(c);
 
-       if ( ! overrode_get_type)
-               add_get_type();
+       if ( ! overrode_get_type) {
+               if (c->bonobo_x_class != NULL)
+                       add_bonobo_x_get_type ();
+               else
+                       add_get_type ();
+       }
 
        if(any_method_to_alias(c)) {
                if( ! no_gnu) {
 
        if(any_method_to_alias(c)) {
                if( ! no_gnu) {
@@ -2372,29 +3041,44 @@ print_class_block(Class *c)
                make_method_nongnu_aliases(c);
        }
 
                make_method_nongnu_aliases(c);
        }
 
-       out_printf(out, "/* a macro for creating a new object of our type */\n");
-       out_printf(out,
-                  "#define GET_NEW ((%s *)gtk_type_new(%s_get_type()))\n\n",
-                  typebase, funcbase);
-
-       if(need_destroy)
-               add_destroy(c);
-
-       if(need_finalize)
-               add_finalize(c);
+       out_printf (out, "/* a macro for creating a new object of our type */\n");
+       out_printf (out,
+                   "#define GET_NEW ((%s *)g_object_new(%s_get_type(), NULL))\n\n",
+                   typebase, funcbase);
+
+       out_printf (out, "/* a function for creating a new object of our type */\n");
+       out_printf (out, "#include <stdarg.h>\n");
+       out_printf (out,
+                   "static %s * GET_NEW_VARG (const char *first, ...)%s;\n"
+                   "static %s *\nGET_NEW_VARG (const char *first, ...)\n"
+                   "{\n\t%s *ret;\n\tva_list ap;\n"
+                   "\tva_start (ap, first);\n"
+                   "\tret = (%s *)g_object_new_valist (%s_get_type (), "
+                   "first, ap);\n"
+                   "\tva_end (ap);\n"
+                   "\treturn ret;\n}\n\n",
+                   typebase,
+                   no_gnu ? "" : " G_GNUC_UNUSED",
+                   typebase, typebase, typebase, funcbase);
+
+       if (need_shutdown)
+               add_shutdown (c);
+
+       if (need_finalize)
+               add_finalize (c);
 
        add_inits(c);
 
 
        add_inits(c);
 
-       if(set_arguments > 0) {
+       if(set_properties > 0) {
                add_getset_arg(c, TRUE);
        }
 
                add_getset_arg(c, TRUE);
        }
 
-       if(get_arguments > 0) {
+       if(get_properties > 0) {
                add_getset_arg(c, FALSE);
        }
 
                add_getset_arg(c, FALSE);
        }
 
-       for(l = c->nodes; l != NULL; l = l->next) {
-               Node *n = l->data;
+       for(li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
                if(n->type == METHOD_NODE)
                        put_method((Method *)n);
        }
                if(n->type == METHOD_NODE)
                        put_method((Method *)n);
        }
@@ -2403,14 +3087,20 @@ print_class_block(Class *c)
 }
 
 static void
 }
 
 static void
-print_version_macros(void)
+print_useful_macros(void)
 {
 {
-       int major=0, minor=0, pl=0;
-       sscanf(VERSION, "%d.%d.%d", &major, &minor, &pl);
-
-       out_printf(out, "#define GOB_VERSION_MAJOR %d\n", major);
-       out_printf(out, "#define GOB_VERSION_MINOR %d\n", minor);
-       out_printf(out, "#define GOB_VERSION_PATCHLEVEL %d\n\n", pl);
+       int major = 0, minor = 0, pl = 0;
+
+       /* Version stuff */
+       sscanf (VERSION, "%d.%d.%d", &major, &minor, &pl);
+       out_printf (out, "#define GOB_VERSION_MAJOR %d\n", major);
+       out_printf (out, "#define GOB_VERSION_MINOR %d\n", minor);
+       out_printf (out, "#define GOB_VERSION_PATCHLEVEL %d\n\n", pl);
+
+       /* Useful priv macro thingie */
+       /* FIXME: this should be done the same way that priv is, as a var,
+        * not a define */
+       out_printf (out, "#define selfp (self->_priv)\n\n");
 }
 
 static void
 }
 
 static void
@@ -2535,11 +3225,16 @@ print_header_top(void)
 {
        GList *li;
 
 {
        GList *li;
 
-       /* mandatory include */
-       out_printf(outh, "#include <gtk/gtk.h>\n\n");
+       /* mandatory includes */
+       out_printf(outh, "#include <glib.h>\n");
+       out_printf(outh, "#include <gobject/gobject.h>\n");
+       out_printf(outh, "#include <gobject/gvaluetypes.h>\n");
+       out_printf(outh, "#include <gobject/genums.h>\n");
+       out_printf(outh, "#include <gobject/gboxed.h>\n");
+       out_printf(outh, "#include <gobject/gparamspecs.h>\n\n");
 
        /* print the HT_CCODE blocks */
 
        /* print the HT_CCODE blocks */
-       for(li=nodes;li;li=g_list_next(li)) {
+       for (li = nodes; li != NULL; li = li->next) {
                Node *node = li->data;
                if(node->type == CCODE_NODE) {
                        CCode *cc = (CCode *)node;
                Node *node = li->data;
                if(node->type == CCODE_NODE) {
                        CCode *cc = (CCode *)node;
@@ -2562,7 +3257,7 @@ generate_outfiles(void)
 
        print_header_prefixes();
 
 
        print_header_prefixes();
 
-       print_version_macros();
+       print_useful_macros();
 
        print_includes();
 
 
        print_includes();
 
@@ -2616,9 +3311,7 @@ print_help(void)
                "\t--no-lines              Don't print '#line' to output\n"
                "\t--no-self-alias         Don't create self type and macro "
                                          "aliases\n"
                "\t--no-lines              Don't print '#line' to output\n"
                "\t--no-self-alias         Don't create self type and macro "
                                          "aliases\n"
-               "\t--no-kill-underscores   Don't remove the leading underscore "
-                                         "from\n"
-               "\t                        short id names\n");
+               "\t--no-kill-underscores   Ignored for compatibility\n");
 }
 
 static void
 }
 
 static void
@@ -2672,7 +3365,7 @@ parse_options(int argc, char *argv[])
                } else if(strcmp(argv[i], "--no-self-alias")==0) {
                        no_self_alias = TRUE;
                } else if(strcmp(argv[i], "--no-kill-underscores")==0) {
                } else if(strcmp(argv[i], "--no-self-alias")==0) {
                        no_self_alias = TRUE;
                } else if(strcmp(argv[i], "--no-kill-underscores")==0) {
-                       no_kill_underscores = TRUE;
+                       /* no op */;
                } else if(strcmp(argv[i], "--always-private-struct")==0) {
                        always_private_struct = TRUE;
                } else if(strcmp(argv[i], "--")==0) {
                } else if(strcmp(argv[i], "--always-private-struct")==0) {
                        always_private_struct = TRUE;
                } else if(strcmp(argv[i], "--")==0) {
@@ -2767,61 +3460,66 @@ main(int argc, char *argv[])
 
        exit_on_error = FALSE;
 
 
        exit_on_error = FALSE;
 
-       signals = count_signals((Class *)class);
-       set_arguments = count_set_arguments((Class *)class);
-       get_arguments = count_get_arguments((Class *)class);
-       overrides = count_overrides((Class *)class);
-       privates = count_privates((Class *)class);
-       protecteds = count_protecteds((Class *)class);
-       destructors = count_destructors((Class *)class);
-       initializers = count_initializers((Class *)class);
-       overrode_get_type = find_get_type((Class *)class);
-
-       make_bases();
-       make_inits((Class *)class);
-       if(destructors > 0) {
-               need_destroy = TRUE;
-               find_destroy((Class *)class);
-       }
-       if(privates > 0) {
+       signals = count_signals ((Class *)class);
+       set_properties = count_set_properties ((Class *)class) +
+               count_set_arguments ((Class *)class);
+       get_properties = count_get_properties ((Class *)class) +
+               count_get_arguments ((Class *)class);
+       overrides = count_overrides ((Class *)class);
+       privates = count_privates ((Class *)class);
+       protecteds = count_protecteds ((Class *)class);
+       unreftors = count_unreftors ((Class *)class);
+       destructors = count_destructors ((Class *)class);
+       initializers = count_initializers ((Class *)class);
+       overrode_get_type = find_get_type ((Class *)class);
+
+       make_bases ();
+       make_inits ((Class *)class);
+       if(unreftors > 0) {
+               need_shutdown = TRUE;
+               find_shutdown ((Class *)class);
+       }
+       if (destructors > 0 ||
+           privates > 0) {
                need_finalize = TRUE;
                need_finalize = TRUE;
-               find_finalize((Class *)class);
-       }
-       check_bad_symbols((Class *)class);
-       check_duplicate_symbols((Class *)class);
-       check_duplicate_overrides((Class *)class);
-       check_duplicate_signals_args((Class *)class);
-       check_public_new((Class *)class);
-       check_vararg((Class *)class);
-       check_firstarg((Class *)class);
-       check_nonvoidempty((Class *)class);
-       check_signal_args((Class *)class);
-       check_argument_types((Class *)class);
-       check_func_arg_checks((Class *)class);
+               find_finalize ((Class *)class);
+       }
+       check_bad_symbols ((Class *)class);
+       check_duplicate_symbols ((Class *)class);
+       check_duplicate_overrides ((Class *)class);
+       check_duplicate_signals_args ((Class *)class);
+       check_public_new ((Class *)class);
+       check_vararg ((Class *)class);
+       check_firstarg ((Class *)class);
+       check_nonvoidempty ((Class *)class);
+       check_signal_args ((Class *)class);
+       check_property_types ((Class *)class);
+       check_argument_types ((Class *)class);
+       check_func_arg_checks ((Class *)class);
 
        exit_on_error = TRUE;
        
 
        exit_on_error = TRUE;
        
-       if(got_error)
-               exit(1);
+       if (got_error)
+               exit (1);
 
 
-       any_special = setup_special_array((Class *)class, special_array);
+       any_special = setup_special_array ((Class *)class, special_array);
 
 
-       open_files();
+       open_files ();
        
        
-       generate_outfiles();
+       generate_outfiles ();
 
 
-       if(devnull)
-               fclose(devnull);
-       else {
-               fclose(out);
-               fclose(outh);
-               if(outph)
-                       fclose(outph);
+       if (devnull) {
+               fclose (devnull);
+       else {
+               fclose (out);
+               fclose (outh);
+               if (outph)
+                       fclose (outph);
        }
 
        }
 
-       if(no_touch_headers &&
-          ! no_write)
-               compare_and_move_header();
+       if (no_touch_headers &&
+           ! no_write)
+               compare_and_move_header ();
        
        return 0;
 }
        
        return 0;
 }
index 9fdfed3c50279b80f71c3af2fb7679d09900901a..8a806d818b80921f2fd543ce093fc141c820f7d3 100644 (file)
 #define        NUMBER  274
 #define        TYPETOKEN       275
 #define        ARRAY_DIM       276
 #define        NUMBER  274
 #define        TYPETOKEN       275
 #define        ARRAY_DIM       276
-#define        CCODE   277
-#define        HTCODE  278
-#define        PHCODE  279
-#define        HCODE   280
-#define        ACODE   281
-#define        ATCODE  282
-#define        PUBLIC  283
-#define        PRIVATE 284
-#define        PROTECTED       285
-#define        CLASSWIDE       286
-#define        ARGUMENT        287
-#define        VIRTUAL 288
-#define        SIGNAL  289
-#define        OVERRIDE        290
-
-#line 21 "parse.y"
+#define        SINGLE_CHAR     277
+#define        CCODE   278
+#define        HTCODE  279
+#define        PHCODE  280
+#define        HCODE   281
+#define        ACODE   282
+#define        ATCODE  283
+#define        STRING  284
+#define        PUBLIC  285
+#define        PRIVATE 286
+#define        PROTECTED       287
+#define        CLASSWIDE       288
+#define        PROPERTY        289
+#define        ARGUMENT        290
+#define        VIRTUAL 291
+#define        SIGNAL  292
+#define        OVERRIDE        293
+#define        NICK    294
+#define        BLURB   295
+#define        MAXIMUM 296
+#define        MINIMUM 297
+#define        DEFAULT_VALUE   298
+#define        FLAGS   299
+#define        TYPE    300
+#define        FLAGS_TYPE      301
+#define        ENUM_TYPE       302
+#define        PARAM_TYPE      303
+#define        BOXED_TYPE      304
+#define        OBJECT_TYPE     305
+
+#line 22 "parse.y"
 
 
 #include "config.h"
 
 
 #include "config.h"
@@ -58,15 +73,18 @@ GList *nodes = NULL;
 
 static GList *class_nodes = NULL;
 Node *class = NULL;
 
 static GList *class_nodes = NULL;
 Node *class = NULL;
-char *chunk_size = NULL;
 
 
+static char *chunk_size = NULL;
+static char *bonobo_x_class = NULL;
 static GList *typestack = NULL;
 static GList *funcargs = NULL;
 static GList *checks = NULL;
 static int has_self = FALSE;
 static int vararg = FALSE;
 static GList *typestack = NULL;
 static GList *funcargs = NULL;
 static GList *checks = NULL;
 static int has_self = FALSE;
 static int vararg = FALSE;
+static Method *last_added_method = NULL;
 
 /* destructor and initializer for variables */
 
 /* destructor and initializer for variables */
+static gboolean destructor_unref = FALSE;
 static char *destructor = NULL;
 static int destructor_line = 0;
 static gboolean destructor_simple = TRUE;
 static char *destructor = NULL;
 static int destructor_line = 0;
 static gboolean destructor_simple = TRUE;
@@ -78,6 +96,8 @@ static char *defreturn = NULL;
 
 static GList *gtktypes = NULL;
 
 
 static GList *gtktypes = NULL;
 
+static Property *property = NULL;
+
 /* this can be a global as we will only do one function at a time
    anyway */
 static int the_scope = NO_SCOPE;
 /* this can be a global as we will only do one function at a time
    anyway */
 static int the_scope = NO_SCOPE;
@@ -124,24 +144,32 @@ pop_type(void)
 }
 
 static void
 }
 
 static void
-push_variable(char *name, int scope, int line_no, char *postfix)
+push_variable (char *name, int scope, int line_no, char *postfix)
 {
        Node *var;
 {
        Node *var;
-       Type *type = pop_type();
+       Type *type = pop_type ();
 
        type->postfix = postfix;
        
 
        type->postfix = postfix;
        
-       var = new_variable(scope, type, name, line_no,
-                          destructor, destructor_line,
-                          destructor_simple,
-                          initializer, initializer_line);
+       var = node_new (VARIABLE_NODE,
+                       "scope", scope,
+                       "vtype:steal", type,
+                       "id:steal", name,
+                       "line_no", line_no,
+                       "destructor_unref", destructor_unref,
+                       "destructor:steal", destructor,
+                       "destructor_line", destructor_line,
+                       "destructor_simple", destructor_simple,
+                       "initializer:steal", initializer,
+                       "initializer_line", initializer_line,
+                       NULL);
        class_nodes = g_list_append(class_nodes, var);
 }
 
 static void
        class_nodes = g_list_append(class_nodes, var);
 }
 
 static void
-push_function(int scope, int method, char *oid, char *id,
-             GString *cbuf, int line_no, int ccode_line,
-             gboolean vararg, GList *flags)
+push_function (int scope, int method, char *oid, char *id,
+              GString *cbuf, int line_no, int ccode_line,
+              gboolean vararg, GList *flags)
 {
        Node *node;
        Type *type;
 {
        Node *node;
        Type *type;
@@ -150,7 +178,9 @@ push_function(int scope, int method, char *oid, char *id,
        g_assert(scope != CLASS_SCOPE);
        
        if(method == INIT_METHOD || method == CLASS_INIT_METHOD) {
        g_assert(scope != CLASS_SCOPE);
        
        if(method == INIT_METHOD || method == CLASS_INIT_METHOD) {
-               type = (Type *)new_type(g_strdup("void"), NULL, NULL);
+               type = (Type *)node_new (TYPE_NODE,
+                                        "name", "void",
+                                        NULL);
        } else {
                type = pop_type();
        }
        } else {
                type = pop_type();
        }
@@ -188,9 +218,25 @@ push_function(int scope, int method, char *oid, char *id,
        } else
                c_cbuf = NULL;
 
        } else
                c_cbuf = NULL;
 
-       node = new_method(scope, method, type, oid, gtktypes, flags,
-                         id, funcargs, onerror, defreturn, c_cbuf, line_no,
-                         ccode_line, vararg, method_unique_id++);
+       node = node_new (METHOD_NODE,
+                        "scope", scope,
+                        "method", method,
+                        "mtype:steal", type,
+                        "otype:steal", oid,
+                        "gtktypes:steal", gtktypes,
+                        "flags:steal", flags,
+                        "id:steal", id,
+                        "args:steal", funcargs,
+                        "onerror:steal", onerror,
+                        "defreturn:steal", defreturn,
+                        "cbuf:steal", c_cbuf,
+                        "line_no", line_no,
+                        "ccode_line", ccode_line,
+                        "vararg", vararg,
+                        "unique_id", method_unique_id++,
+                        NULL);
+
+       last_added_method = (Method *)node;
 
        if(cbuf)
                g_string_free(cbuf,
 
        if(cbuf)
                g_string_free(cbuf,
@@ -221,7 +267,7 @@ free_all_global_state(void)
        g_list_free(gtktypes);
        gtktypes = NULL;
 
        g_list_free(gtktypes);
        gtktypes = NULL;
 
-       free_node_list(funcargs);
+       node_list_free (funcargs);
        funcargs = NULL;
 }
 
        funcargs = NULL;
 }
 
@@ -233,7 +279,11 @@ push_funcarg(char *name, char *postfix)
 
        type->postfix = postfix;
        
 
        type->postfix = postfix;
        
-       node = new_funcarg(type, name, checks);
+       node = node_new (FUNCARG_NODE,
+                        "atype:steal", type,
+                        "name:steal", name,
+                        "checks:steal", checks,
+                        NULL);
        checks = NULL;
        
        funcargs = g_list_append(funcargs, node);
        checks = NULL;
        
        funcargs = g_list_append(funcargs, node);
@@ -251,8 +301,14 @@ push_init_arg(char *name, int is_class)
        else
                tn = g_strdup(((Class *)class)->otype);
 
        else
                tn = g_strdup(((Class *)class)->otype);
 
-       type = new_type(tn, g_strdup("*"), NULL);
-       node = new_funcarg((Type *)type,name,NULL);
+       type = node_new (TYPE_NODE,
+                        "name:steal", tn,
+                        "pointer", "*",
+                        NULL);
+       node = node_new (FUNCARG_NODE,
+                        "atype:steal", (Type *)type,
+                        "name:steal", name,
+                        NULL);
        funcargs = g_list_prepend(funcargs, node);
 }
 
        funcargs = g_list_prepend(funcargs, node);
 }
 
@@ -262,11 +318,21 @@ push_self(char *id, gboolean constant)
        Node *node;
        Node *type;
        GList *ch = NULL;
        Node *node;
        Node *type;
        GList *ch = NULL;
-       type = new_type(g_strdup(((Class *)class)->otype),
-                       g_strdup(constant ? "const *" : "*"), NULL);
-       ch = g_list_append(ch,new_check(NULL_CHECK,NULL));
-       ch = g_list_append(ch,new_check(TYPE_CHECK,NULL));
-       node = new_funcarg((Type *)type,id,ch);
+       type = node_new (TYPE_NODE,
+                        "name", ((Class *)class)->otype,
+                        "pointer", constant ? "const *" : "*",
+                        NULL);
+       ch = g_list_append (ch, node_new (CHECK_NODE,
+                                         "chtype", NULL_CHECK,
+                                         NULL));
+       ch = g_list_append (ch, node_new (CHECK_NODE,
+                                         "chtype", TYPE_CHECK,
+                                         NULL));
+       node = node_new (FUNCARG_NODE,
+                        "atype:steal", (Type *)type,
+                        "name:steal", id,
+                        "checks:steal", ch,
+                        NULL);
        funcargs = g_list_prepend(funcargs, node);
 }
 
        funcargs = g_list_prepend(funcargs, node);
 }
 
@@ -310,8 +376,233 @@ set_return_value(char *type, char *val)
        return FALSE;
 }
 
        return FALSE;
 }
 
+static void
+export_accessors (const char *var_name,
+                 gboolean do_get,
+                 gboolean do_set,
+                 int get_lineno,
+                 int set_lineno,
+                 Type *type,
+                 const char *gtktype,
+                 int lineno)
+{      
+       Type *the_type;
+
+       if (type != NULL)
+               the_type = (Type *)node_copy ((Node *)type);
+       else
+               the_type = get_tree_type (gtktype, TRUE);
+
+       if (the_type == NULL) {
+               error_print (GOB_ERROR, line_no,
+                            _("Cannot determine type of property or argument"));
+               return;
+       }
+
+       if (do_get) {
+               char *get_id = g_strdup_printf ("get_%s", var_name);
+               GString *get_cbuf = g_string_new (NULL);
+               Node *node1 = node_new (TYPE_NODE,
+                                       "name", the_type->name,
+                                       "pointer", the_type->pointer,
+                                       "postfix", the_type->postfix,
+                                       NULL);
+               Node *node3 = node_new (TYPE_NODE,
+                                       "name", class->class.otype,
+                                       "pointer", "*",
+                                       NULL);
+
+               g_string_sprintf (get_cbuf,
+                                 "\t%s%s val; "
+                                 "g_object_get (G_OBJECT (self), \"%s\", "
+                                 "&val, NULL); "
+                                 "return val;\n",
+                                 the_type->name, 
+                                 the_type->pointer ? the_type->pointer : "",
+                                 var_name);
+               
+               typestack = g_list_prepend (typestack, node1);
+               typestack = g_list_prepend (typestack, node3);
+               
+               push_funcarg ("self", FALSE);
+               
+               push_function (PUBLIC_SCOPE, REGULAR_METHOD, NULL,
+                              get_id, get_cbuf, get_lineno,
+                              lineno, FALSE, NULL);
+       }
+       
+       if (do_set) {
+               char *set_id = g_strdup_printf ("set_%s", var_name);
+               GString *set_cbuf = g_string_new (NULL);
+               Node *node1 = node_new (TYPE_NODE, 
+                                       "name", the_type->name,
+                                       "pointer", the_type->pointer,
+                                       "postfix", the_type->postfix,
+                                       NULL);
+               Node *node2 = node_new (TYPE_NODE, 
+                                       "name", "void",
+                                       NULL);
+               Node *node3 = node_new (TYPE_NODE, 
+                                       "name", class->class.otype,
+                                       "pointer", "*",
+                                       NULL);
+
+               g_string_sprintf (set_cbuf,
+                                 "\tg_object_set (G_OBJECT (self), "
+                                 "\"%s\", val, NULL);\n",
+                                 var_name);
+
+               typestack = g_list_prepend (typestack, node2);
+               typestack = g_list_prepend (typestack, node1);
+               typestack = g_list_prepend (typestack, node3);
+               
+               push_funcarg ("self", FALSE);
+               push_funcarg ("val", FALSE);
+       
+               typestack = g_list_prepend (typestack, node2);
+               push_function (PUBLIC_SCOPE, REGULAR_METHOD, NULL,
+                              set_id, set_cbuf, set_lineno,
+                              lineno, FALSE, NULL);
+       }
+
+       node_free ((Node *)the_type);
+}
+
+static void
+property_link_and_export (Node *node)
+{
+       Property *prop = (Property *)node;
+
+       if (prop->link) {
+               const char *root;
+               char *get = NULL, *set = NULL;
+               Variable *var;
+
+               if (prop->set != NULL ||
+                   prop->get != NULL) {        
+                       error_print (GOB_ERROR, prop->line_no,
+                                    _("Property linking requested, but "
+                                      "getters and setters exist"));
+               }
 
 
-#line 293 "parse.y"
+               var = find_var_or_die (prop->name, prop->line_no);
+               if(var->scope == PRIVATE_SCOPE) {
+                       root = "self->_priv";
+               } else if (var->scope == CLASS_SCOPE) {
+                       root = "SELF_GET_CLASS(self)";
+                       if (no_self_alias)
+                               error_print (GOB_ERROR, prop->line_no,
+                                            _("Self aliases needed when autolinking to a classwide member"));
+               } else {
+                       root = "self";
+               }
+
+               if (strcmp (prop->gtktype, "STRING") == 0) {
+                       set = g_strdup_printf("g_free (%s->%s); "
+                                             "%s->%s = g_value_dup_string (VAL);",
+                                             root, prop->name,
+                                             root, prop->name);
+                       get = g_strdup_printf("g_value_set_string (VAL, %s->%s);",
+                                             root, prop->name);
+               } else if (strcmp (prop->gtktype, "OBJECT") == 0) {
+                       set = g_strdup_printf("{ GtkObject *___old = (GtkObject *)%s->%s; "
+                                             "GtkObject *___new = (GtkObject *)gtk_value_get_object (VAL); "
+                                             "if (___new != NULL) { "
+                                               "gtk_object_ref (GTK_OBJECT (___new)); "
+                                               "%s->%s = GTK_OBJECT (___new); "
+                                             "} else { "
+                                               "%s->%s = NULL; "
+                                             "} "
+                                             "if (___old != NULL) { "
+                                               "gtk_object_unref (GTK_OBJECT (___old)); "
+                                             "} "
+                                             "}",
+                                             root, prop->name,
+                                             root, prop->name,
+                                             root, prop->name);
+                       get = g_strdup_printf("g_value_set_object (VAL, %s->%s);",
+                                             root, prop->name);
+               } else if (strcmp (prop->gtktype, "BOXED") == 0) {
+                       if (prop->extra_gtktype == NULL) {
+                               error_print (GOB_ERROR, prop->line_no,
+                                            _("Property linking requested for BOXED, but "
+                                              "boxed_type not set"));
+                       }
+                       set = g_strdup_printf("{ gpointer ___old = (gpointer)%s->%s; "
+                                             "gpointer ___new = (gpointer)gtk_value_get_boxed (VAL); "
+                                             "if (___new != ___old) { "
+                                               "if (___old != NULL) g_boxed_free (%s, ___old); "
+                                               "if (___new != NULL) %s->%s = g_boxed_copy (%s, ___new); "
+                                               "else %s->%s = NULL;"
+                                             "} "
+                                             "}",
+                                             root, prop->name,
+                                             prop->extra_gtktype,
+                                             root, prop->name,
+                                             prop->extra_gtktype,
+                                             root, prop->name);
+                       get = g_strdup_printf("g_value_set_object (VAL, %s->%s);",
+                                             root, prop->name);
+               } else {
+                       char *set_func;
+                       char *get_func;
+                       set_func = g_strdup_printf ("g_value_set_%s", prop->gtktype);
+                       g_strdown (set_func);
+                       get_func = g_strdup_printf ("g_value_get_%s", prop->gtktype);
+                       g_strdown (get_func);
+
+                       set = g_strdup_printf("%s->%s = %s (VAL);",
+                                             root, prop->name,
+                                             get_func);
+                       get = g_strdup_printf("%s (VAL, %s->%s);",
+                                             set_func,
+                                             root, prop->name);
+
+                       g_free (get_func);
+                       g_free (set_func);
+               }
+
+               node_set (node,
+                         "get:steal", get,
+                         "get_line", prop->line_no,
+                         "set:steal", set,
+                         "set_line", prop->line_no,
+                         NULL);
+       }
+
+       if (prop->export) {
+               export_accessors (prop->name,
+                                 prop->get != NULL, prop->get_line,
+                                 prop->set != NULL,  prop->get_line,
+                                 prop->ptype,
+                                 prop->gtktype,
+                                 prop->line_no);
+       } 
+}
+
+
+static char *
+debool (char *s)
+{
+       if (strcmp (s, "BOOL") == 0) {
+               error_print (GOB_WARN, line_no,
+                           _("BOOL type is deprecated, please use BOOLEAN"));
+               g_free (s);
+               return g_strdup ("BOOLEAN");
+       } else {
+               return s;
+       }
+}
+
+static void
+ensure_property (void)
+{
+       if (property == NULL)
+               property = (Property *)node_new (PROPERTY_NODE, NULL);
+}
+
+
+#line 570 "parse.y"
 typedef union {
        char *id;
        GString *cbuf;
 typedef union {
        char *id;
        GString *cbuf;
@@ -333,26 +624,26 @@ typedef union {
 
 
 
 
 
 
-#define        YYFINAL         263
+#define        YYFINAL         340
 #define        YYFLAG          -32768
 #define        YYFLAG          -32768
-#define        YYNTBASE        50
+#define        YYNTBASE        65
 
 
-#define YYTRANSLATE(x) ((unsigned)(x) <= 290 ? yytranslate[x] : 88)
+#define YYTRANSLATE(x) ((unsigned)(x) <= 305 ? yytranslate[x] : 110)
 
 static const char yytranslate[] = {     0,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
 
 static const char yytranslate[] = {     0,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-     2,     2,    48,     2,     2,     2,     2,     2,     2,    39,
-    40,    44,     2,    45,    49,     2,     2,     2,     2,     2,
-     2,     2,     2,     2,     2,     2,     2,     2,    41,    47,
-    42,    46,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,    63,     2,     2,     2,     2,     2,     2,    54,
+    55,    60,     2,    58,    64,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,    56,    62,
+    57,    61,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-     2,     2,    37,    43,    38,     2,     2,     2,     2,     2,
+     2,     2,    52,    59,    53,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -368,95 +659,114 @@ static const char yytranslate[] = {     0,
      2,     2,     2,     2,     2,     1,     3,     4,     5,     6,
      7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
     17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
      2,     2,     2,     2,     2,     1,     3,     4,     5,     6,
      7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
     17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-    27,    28,    29,    30,    31,    32,    33,    34,    35,    36
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+    47,    48,    49,    50,    51
 };
 
 #if YYDEBUG != 0
 static const short yyprhs[] = {     0,
      0,     4,     7,    10,    12,    14,    16,    18,    20,    22,
 };
 
 #if YYDEBUG != 0
 static const short yyprhs[] = {     0,
      0,     4,     7,    10,    12,    14,    16,    18,    20,    22,
-    24,    27,    29,    34,    38,    44,    45,    50,    55,    58,
-    60,    62,    64,    66,    68,    70,    72,    74,    76,    79,
-    83,    86,    90,    93,    96,    98,   100,   101,   107,   114,
-   126,   135,   141,   147,   149,   153,   154,   158,   160,   163,
-   165,   167,   169,   172,   175,   178,   182,   186,   189,   192,
-   195,   197,   200,   202,   205,   207,   209,   211,   213,   215,
-   217,   219,   221,   223,   225,   227,   229,   231,   234,   237,
-   241,   244,   246,   250,   254,   257,   259,   264,   268,   270,
-   273,   275,   286,   298,   308,   318,   327,   339,   348,   354,
-   357,   362,   363,   365,   368,   370,   372,   375,   378,   382,
-   387,   392,   394,   398,   400,   404,   406,   409,   413,   420,
-   428,   431,   433,   435,   438,   441,   445,   449,   453,   457,
-   459,   462
+    24,    27,    29,    34,    38,    44,    45,    51,    57,    60,
+    62,    64,    67,    69,    71,    73,    75,    77,    79,    81,
+    83,    86,    90,    93,    97,   100,   103,   105,   107,   108,
+   114,   121,   134,   144,   151,   155,   156,   168,   177,   183,
+   187,   188,   192,   194,   196,   201,   203,   205,   209,   213,
+   217,   221,   225,   229,   233,   237,   241,   245,   249,   253,
+   255,   261,   263,   267,   268,   272,   274,   277,   279,   281,
+   283,   286,   289,   292,   296,   300,   303,   306,   309,   311,
+   314,   316,   319,   321,   323,   325,   327,   329,   331,   333,
+   335,   337,   339,   341,   343,   345,   348,   351,   355,   358,
+   360,   364,   368,   371,   373,   378,   382,   384,   387,   389,
+   400,   412,   422,   432,   441,   453,   462,   468,   471,   476,
+   477,   479,   482,   484,   486,   489,   492,   496,   501,   506,
+   508,   512,   514,   518,   520,   523,   527,   534,   542,   545,
+   547,   549,   552,   555,   559,   563,   567,   571,   573,   576,
+   578
 };
 
 };
 
-static const short yyrhs[] = {    52,
-    53,    52,     0,    53,    52,     0,    52,    53,     0,    53,
-     0,    23,     0,    26,     0,    24,     0,    25,     0,    27,
-     0,    28,     0,    52,    51,     0,    51,     0,    54,    37,
-    56,    38,     0,    54,    37,    38,     0,     3,    21,     4,
-    21,    55,     0,     0,    39,    19,    19,    40,     0,    39,
-    19,    20,    40,     0,    56,    57,     0,    57,     0,    78,
-     0,    62,     0,    63,     0,    41,     0,    29,     0,    30,
-     0,    31,     0,    32,     0,    19,    19,     0,    19,    37,
-    23,     0,    42,    87,     0,    42,    37,    23,     0,    59,
-    60,     0,    60,    59,     0,    60,     0,    59,     0,     0,
-    58,    67,    19,    61,    41,     0,    58,    67,    19,    22,
-    61,    41,     0,    33,    65,    64,    19,    19,    37,    23,
-    19,    37,    23,    41,     0,    33,    65,    64,    19,    19,
-    37,    23,    41,     0,    33,    65,    64,    19,    19,     0,
-    19,    39,    19,    67,    40,     0,    19,     0,    39,    66,
-    40,     0,     0,    19,    43,    66,     0,    19,     0,    68,
-    72,     0,    68,     0,    69,     0,    19,     0,     5,    19,
-     0,    19,     5,     0,    71,    19,     0,     5,    71,    19,
-     0,    71,    19,     5,     0,    70,    69,     0,    21,    69,
-     0,     5,    69,     0,    21,     0,    21,     5,     0,    70,
-     0,    70,     5,     0,     6,     0,    18,     0,    14,     0,
-    15,     0,    13,     0,    16,     0,    17,     0,    11,     0,
-    12,     0,     7,     0,     8,     0,     9,     0,    44,     0,
-    44,     5,     0,    44,    72,     0,    44,     5,    72,     0,
-    19,    75,     0,    75,     0,    58,    19,    75,     0,    19,
-    58,    75,     0,    58,    75,     0,    73,     0,    19,    39,
-    76,    40,     0,    76,    45,    19,     0,    19,     0,    37,
-    23,     0,    41,     0,    35,    65,    74,    67,    19,    39,
-    81,    40,    79,    77,     0,    58,    35,    65,    73,    67,
-    19,    39,    81,    40,    79,    77,     0,    34,    58,    67,
-    19,    39,    81,    40,    79,    77,     0,    58,    34,    67,
-    19,    39,    81,    40,    79,    77,     0,    34,    67,    19,
-    39,    81,    40,    79,    77,     0,    36,    39,    21,    40,
-    67,    19,    39,    81,    40,    79,    77,     0,    58,    67,
-    19,    39,    81,    40,    79,    77,     0,    19,    39,    19,
-    40,    77,     0,    19,    80,     0,    19,    80,    19,    80,
-     0,     0,    87,     0,    37,    23,     0,     6,     0,    19,
-     0,    19,     5,     0,     5,    19,     0,    19,    45,    82,
-     0,    19,     5,    45,    82,     0,     5,    19,    45,    82,
-     0,    82,     0,    83,    45,    10,     0,    83,     0,    83,
-    45,    84,     0,    84,     0,    67,    19,     0,    67,    19,
-    22,     0,    67,    19,    39,    19,    85,    40,     0,    67,
-    19,    22,    39,    19,    85,    40,     0,    85,    86,     0,
-    86,     0,    19,     0,    46,    87,     0,    47,    87,     0,
-    46,    42,    87,     0,    47,    42,    87,     0,    42,    42,
-    87,     0,    48,    42,    87,     0,    20,     0,    49,    20,
-     0,    19,     0
+static const short yyrhs[] = {    67,
+    68,    67,     0,    68,    67,     0,    67,    68,     0,    68,
+     0,    24,     0,    27,     0,    25,     0,    26,     0,    28,
+     0,    29,     0,    67,    66,     0,    66,     0,    69,    52,
+    71,    53,     0,    69,    52,    53,     0,     3,    21,     4,
+    21,    70,     0,     0,    54,    19,    19,    55,    70,     0,
+    54,    19,    20,    55,    70,     0,    71,    72,     0,    72,
+     0,   100,     0,    19,   100,     0,    77,     0,    78,     0,
+    80,     0,    56,     0,    31,     0,    32,     0,    33,     0,
+    34,     0,    19,    19,     0,    19,    52,    24,     0,    57,
+   109,     0,    57,    52,    24,     0,    74,    75,     0,    75,
+    74,     0,    75,     0,    74,     0,     0,    73,    89,    19,
+    76,    56,     0,    73,    89,    19,    22,    76,    56,     0,
+    36,    87,    86,    19,    79,    19,    52,    24,    19,    52,
+    24,    56,     0,    36,    87,    86,    19,    79,    19,    52,
+    24,    56,     0,    36,    87,    86,    19,    79,    19,     0,
+    54,    19,    55,     0,     0,    35,    19,    19,    81,    19,
+    52,    24,    19,    52,    24,    56,     0,    35,    19,    19,
+    81,    19,    52,    24,    56,     0,    35,    19,    19,    81,
+    56,     0,    54,    82,    55,     0,     0,    82,    58,    85,
+     0,    85,     0,    30,     0,    19,    54,    30,    55,     0,
+   109,     0,    83,     0,    40,    57,    83,     0,    41,    57,
+    83,     0,    42,    57,   109,     0,    43,    57,   109,     0,
+    44,    57,    84,     0,    45,    57,    88,     0,    46,    57,
+    89,     0,    47,    57,    19,     0,    48,    57,    19,     0,
+    49,    57,    19,     0,    50,    57,    19,     0,    51,    57,
+    19,     0,    19,     0,    19,    54,    19,    89,    55,     0,
+    19,     0,    54,    88,    55,     0,     0,    19,    59,    88,
+     0,    19,     0,    90,    94,     0,    90,     0,    91,     0,
+    19,     0,     5,    19,     0,    19,     5,     0,    93,    19,
+     0,     5,    93,    19,     0,    93,    19,     5,     0,    92,
+    91,     0,    21,    91,     0,     5,    91,     0,    21,     0,
+    21,     5,     0,    92,     0,    92,     5,     0,     6,     0,
+    18,     0,    14,     0,    15,     0,    13,     0,    16,     0,
+    17,     0,    11,     0,    12,     0,     7,     0,     8,     0,
+     9,     0,    60,     0,    60,     5,     0,    60,    94,     0,
+    60,     5,    94,     0,    19,    97,     0,    97,     0,    73,
+    19,    97,     0,    19,    73,    97,     0,    73,    97,     0,
+    95,     0,    19,    54,    98,    55,     0,    98,    58,    19,
+     0,    19,     0,    52,    24,     0,    56,     0,    38,    87,
+    96,    89,    19,    54,   103,    55,   101,    99,     0,    73,
+    38,    87,    95,    89,    19,    54,   103,    55,   101,    99,
+     0,    37,    73,    89,    19,    54,   103,    55,   101,    99,
+     0,    73,    37,    89,    19,    54,   103,    55,   101,    99,
+     0,    37,    89,    19,    54,   103,    55,   101,    99,     0,
+    39,    54,    21,    55,    89,    19,    54,   103,    55,   101,
+    99,     0,    73,    89,    19,    54,   103,    55,   101,    99,
+     0,    19,    54,    19,    55,    99,     0,    19,   102,     0,
+    19,   102,    19,   102,     0,     0,   109,     0,    52,    24,
+     0,     6,     0,    19,     0,    19,     5,     0,     5,    19,
+     0,    19,    58,   104,     0,    19,     5,    58,   104,     0,
+     5,    19,    58,   104,     0,   104,     0,   105,    58,    10,
+     0,   105,     0,   105,    58,   106,     0,   106,     0,    89,
+    19,     0,    89,    19,    22,     0,    89,    19,    54,    19,
+   107,    55,     0,    89,    19,    22,    54,    19,   107,    55,
+     0,   107,   108,     0,   108,     0,    19,     0,    61,   109,
+     0,    62,   109,     0,    61,    57,   109,     0,    62,    57,
+   109,     0,    57,    57,   109,     0,    63,    57,   109,     0,
+    20,     0,    64,    20,     0,    23,     0,    19,     0
 };
 
 #endif
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
 };
 
 #endif
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
-   311,   312,   313,   314,   317,   323,   329,   335,   341,   347,
-   355,   356,   359,   364,   371,   376,   377,   385,   396,   397,
-   400,   401,   402,   403,   406,   407,   408,   409,   412,   425,
-   441,   445,   453,   454,   455,   456,   457,   463,   466,   470,
-   506,   535,   609,   618,   624,   625,   628,   631,   637,   641,
-   648,   651,   654,   658,   662,   666,   671,   679,   683,   688,
-   692,   695,   699,   702,   707,   708,   709,   710,   711,   712,
-   713,   714,   715,   718,   719,   720,   723,   724,   725,   729,
-   736,   748,   754,   766,   778,   781,   787,   792,   795,   800,
-   801,   805,   821,   837,   853,   869,   880,   886,   896,   919,
-   930,   949,   955,   956,   962,   963,   974,   985,   996,  1006,
-  1016,  1026,  1029,  1030,  1033,  1034,  1037,  1040,  1043,  1051,
-  1061,  1062,  1065,  1078,  1082,  1086,  1090,  1094,  1098,  1104,
-  1105,  1109
+   591,   592,   593,   594,   597,   606,   615,   624,   633,   642,
+   653,   654,   657,   662,   669,   679,   680,   692,   706,   707,
+   710,   711,   719,   720,   721,   722,   725,   726,   727,   728,
+   731,   751,   775,   779,   787,   788,   789,   790,   791,   797,
+   800,   805,   873,   927,  1015,  1023,  1028,  1076,  1112,  1128,
+  1129,  1132,  1133,  1136,  1137,  1149,  1150,  1153,  1159,  1165,
+  1171,  1177,  1183,  1189,  1196,  1202,  1208,  1214,  1220,  1226,
+  1246,  1255,  1261,  1262,  1265,  1268,  1274,  1281,  1290,  1293,
+  1296,  1300,  1304,  1308,  1313,  1321,  1325,  1330,  1334,  1337,
+  1341,  1344,  1349,  1350,  1351,  1352,  1353,  1354,  1355,  1356,
+  1357,  1360,  1361,  1362,  1365,  1366,  1367,  1371,  1378,  1390,
+  1396,  1408,  1420,  1423,  1429,  1434,  1437,  1442,  1443,  1447,
+  1463,  1479,  1495,  1511,  1522,  1528,  1538,  1561,  1572,  1591,
+  1597,  1598,  1604,  1605,  1616,  1627,  1638,  1648,  1658,  1668,
+  1671,  1672,  1675,  1676,  1679,  1682,  1685,  1693,  1703,  1704,
+  1707,  1724,  1731,  1738,  1745,  1752,  1759,  1768,  1769,  1773,
+  1774
 };
 #endif
 
 };
 #endif
 
@@ -466,11 +776,14 @@ static const short yyrline[] = { 0,
 static const char * const yytname[] = {   "$","error","$undefined.","CLASS",
 "FROM","CONST","VOID","STRUCT","UNION","ENUM","THREEDOTS","SIGNED","UNSIGNED",
 "LONG","SHORT","INT","FLOAT","DOUBLE","CHAR","TOKEN","NUMBER","TYPETOKEN","ARRAY_DIM",
 static const char * const yytname[] = {   "$","error","$undefined.","CLASS",
 "FROM","CONST","VOID","STRUCT","UNION","ENUM","THREEDOTS","SIGNED","UNSIGNED",
 "LONG","SHORT","INT","FLOAT","DOUBLE","CHAR","TOKEN","NUMBER","TYPETOKEN","ARRAY_DIM",
-"CCODE","HTCODE","PHCODE","HCODE","ACODE","ATCODE","PUBLIC","PRIVATE","PROTECTED",
-"CLASSWIDE","ARGUMENT","VIRTUAL","SIGNAL","OVERRIDE","'{'","'}'","'('","')'",
-"';'","'='","'|'","'*'","','","'>'","'<'","'!'","'-'","prog","ccode","ccodes",
-"class","classdec","chunk","classcode","thing","scope","destructor","initializer",
-"varoptions","variable","argument","argtype","flags","flaglist","type","specifier_list",
+"SINGLE_CHAR","CCODE","HTCODE","PHCODE","HCODE","ACODE","ATCODE","STRING","PUBLIC",
+"PRIVATE","PROTECTED","CLASSWIDE","PROPERTY","ARGUMENT","VIRTUAL","SIGNAL","OVERRIDE",
+"NICK","BLURB","MAXIMUM","MINIMUM","DEFAULT_VALUE","FLAGS","TYPE","FLAGS_TYPE",
+"ENUM_TYPE","PARAM_TYPE","BOXED_TYPE","OBJECT_TYPE","'{'","'}'","'('","')'",
+"';'","'='","','","'|'","'*'","'>'","'<'","'!'","'-'","prog","ccode","ccodes",
+"class","classdec","classflags","classcode","thing","scope","destructor","initializer",
+"varoptions","variable","argument","export","property","param_spec","param_spec_list",
+"string","anyval","param_spec_value","argtype","flags","flaglist","type","specifier_list",
 "spec_list","specifier","strunionenum","pointer","simplesigtype","fullsigtype",
 "sigtype","tokenlist","codenocode","method","returnvals","retcode","funcargs",
 "arglist","arglist1","arg","checklist","check","numtok", NULL
 "spec_list","specifier","strunionenum","pointer","simplesigtype","fullsigtype",
 "sigtype","tokenlist","codenocode","method","returnvals","retcode","funcargs",
 "arglist","arglist1","arg","checklist","check","numtok", NULL
@@ -478,205 +791,243 @@ static const char * const yytname[] = {   "$","error","$undefined.","CLASS",
 #endif
 
 static const short yyr1[] = {     0,
 #endif
 
 static const short yyr1[] = {     0,
-    50,    50,    50,    50,    51,    51,    51,    51,    51,    51,
-    52,    52,    53,    53,    54,    55,    55,    55,    56,    56,
-    57,    57,    57,    57,    58,    58,    58,    58,    59,    59,
-    60,    60,    61,    61,    61,    61,    61,    62,    62,    63,
-    63,    63,    64,    64,    65,    65,    66,    66,    67,    67,
-    68,    68,    68,    68,    68,    68,    68,    69,    69,    69,
-    69,    69,    69,    69,    70,    70,    70,    70,    70,    70,
-    70,    70,    70,    71,    71,    71,    72,    72,    72,    72,
-    73,    73,    74,    74,    74,    74,    75,    76,    76,    77,
-    77,    78,    78,    78,    78,    78,    78,    78,    78,    79,
-    79,    79,    80,    80,    81,    81,    81,    81,    81,    81,
-    81,    81,    82,    82,    83,    83,    84,    84,    84,    84,
-    85,    85,    86,    86,    86,    86,    86,    86,    86,    87,
-    87,    87
+    65,    65,    65,    65,    66,    66,    66,    66,    66,    66,
+    67,    67,    68,    68,    69,    70,    70,    70,    71,    71,
+    72,    72,    72,    72,    72,    72,    73,    73,    73,    73,
+    74,    74,    75,    75,    76,    76,    76,    76,    76,    77,
+    77,    78,    78,    78,    79,    79,    80,    80,    80,    81,
+    81,    82,    82,    83,    83,    84,    84,    85,    85,    85,
+    85,    85,    85,    85,    85,    85,    85,    85,    85,    85,
+    86,    86,    87,    87,    88,    88,    89,    89,    90,    90,
+    90,    90,    90,    90,    90,    91,    91,    91,    91,    91,
+    91,    91,    92,    92,    92,    92,    92,    92,    92,    92,
+    92,    93,    93,    93,    94,    94,    94,    94,    95,    95,
+    96,    96,    96,    96,    97,    98,    98,    99,    99,   100,
+   100,   100,   100,   100,   100,   100,   100,   101,   101,   101,
+   102,   102,   103,   103,   103,   103,   103,   103,   103,   103,
+   104,   104,   105,   105,   106,   106,   106,   106,   107,   107,
+   108,   108,   108,   108,   108,   108,   108,   109,   109,   109,
+   109
 };
 
 static const short yyr2[] = {     0,
      3,     2,     2,     1,     1,     1,     1,     1,     1,     1,
 };
 
 static const short yyr2[] = {     0,
      3,     2,     2,     1,     1,     1,     1,     1,     1,     1,
-     2,     1,     4,     3,     5,     0,     4,     4,     2,     1,
-     1,     1,     1,     1,     1,     1,     1,     1,     2,     3,
-     2,     3,     2,     2,     1,     1,     0,     5,     6,    11,
-     8,     5,     5,     1,     3,     0,     3,     1,     2,     1,
-     1,     1,     2,     2,     2,     3,     3,     2,     2,     2,
-     1,     2,     1,     2,     1,     1,     1,     1,     1,     1,
-     1,     1,     1,     1,     1,     1,     1,     2,     2,     3,
-     2,     1,     3,     3,     2,     1,     4,     3,     1,     2,
-     1,    10,    11,     9,     9,     8,    11,     8,     5,     2,
-     4,     0,     1,     2,     1,     1,     2,     2,     3,     4,
-     4,     1,     3,     1,     3,     1,     2,     3,     6,     7,
-     2,     1,     1,     2,     2,     3,     3,     3,     3,     1,
-     2,     1
+     2,     1,     4,     3,     5,     0,     5,     5,     2,     1,
+     1,     2,     1,     1,     1,     1,     1,     1,     1,     1,
+     2,     3,     2,     3,     2,     2,     1,     1,     0,     5,
+     6,    12,     9,     6,     3,     0,    11,     8,     5,     3,
+     0,     3,     1,     1,     4,     1,     1,     3,     3,     3,
+     3,     3,     3,     3,     3,     3,     3,     3,     3,     1,
+     5,     1,     3,     0,     3,     1,     2,     1,     1,     1,
+     2,     2,     2,     3,     3,     2,     2,     2,     1,     2,
+     1,     2,     1,     1,     1,     1,     1,     1,     1,     1,
+     1,     1,     1,     1,     1,     2,     2,     3,     2,     1,
+     3,     3,     2,     1,     4,     3,     1,     2,     1,    10,
+    11,     9,     9,     8,    11,     8,     5,     2,     4,     0,
+     1,     2,     1,     1,     2,     2,     3,     4,     4,     1,
+     3,     1,     3,     1,     2,     3,     6,     7,     2,     1,
+     1,     2,     2,     3,     3,     3,     3,     1,     2,     1,
+     1
 };
 
 static const short yydefact[] = {     0,
      0,     5,     7,     8,     6,     9,    10,    12,     0,     4,
 };
 
 static const short yydefact[] = {     0,
      0,     5,     7,     8,     6,     9,    10,    12,     0,     4,
-     0,     0,    11,     3,     2,     0,     0,     1,     0,    25,
-    26,    27,    28,    46,     0,    46,     0,    14,    24,     0,
-    20,     0,    22,    23,    21,    16,     0,     0,     0,     0,
-    65,    74,    75,    76,    72,    73,    69,    67,    68,    70,
-    71,    66,    52,    61,     0,     0,    50,    51,    63,     0,
-     0,     0,    13,    19,     0,    46,     0,     0,    15,     0,
-    48,     0,    44,     0,     0,    53,    60,     0,    54,    62,
-    59,     0,     0,    77,    49,    64,    58,    55,     0,     0,
-    86,     0,    82,     0,     0,     0,    37,     0,     0,     0,
-    45,     0,     0,    56,     0,     0,    78,    79,    57,     0,
-     0,     0,    81,     0,    85,     0,     0,     0,     0,     0,
-     0,    37,     0,     0,    36,    35,     0,     0,     0,     0,
-    91,    99,    47,     0,    42,     0,     0,    65,    52,     0,
-     0,   112,   114,   116,    80,    89,     0,    84,    83,     0,
-     0,     0,     0,    29,     0,     0,     0,   132,   130,     0,
-     0,    31,    33,    34,    38,    17,    18,    90,     0,     0,
-     0,    53,    54,     0,   117,   102,     0,    87,     0,     0,
-     0,     0,     0,    30,    39,   102,    32,   131,    43,     0,
-   102,     0,     0,   109,   118,     0,     0,     0,   113,   115,
-    88,     0,     0,   102,     0,     0,     0,    41,     0,   111,
-   110,     0,     0,     0,   100,   103,    96,   102,     0,     0,
-     0,    98,     0,    94,     0,   123,     0,     0,     0,     0,
-     0,   122,   104,     0,     0,   102,    95,   102,     0,     0,
-     0,     0,   124,     0,   125,     0,   119,   121,   101,    92,
-     0,     0,    40,   120,   128,   126,   127,   129,    97,    93,
-     0,     0,     0
+     0,     0,    11,     3,     2,     0,     0,     1,     0,    27,
+    28,    29,    30,     0,    74,     0,    74,     0,    14,    26,
+     0,    20,     0,    23,    24,    25,    21,    16,     0,     0,
+     0,    22,     0,     0,     0,     0,    93,   102,   103,   104,
+   100,   101,    97,    95,    96,    98,    99,    94,    80,    89,
+     0,     0,    78,    79,    91,     0,     0,     0,    13,    19,
+     0,    74,     0,     0,    15,     0,     0,    51,    76,     0,
+    72,     0,     0,    81,    88,     0,    82,    90,    87,     0,
+     0,   105,    77,    92,    86,    83,     0,     0,   114,     0,
+   110,     0,     0,     0,    39,     0,     0,     0,     0,     0,
+     0,    73,     0,    46,    84,     0,     0,   106,   107,    85,
+     0,     0,     0,   109,     0,   113,     0,     0,     0,     0,
+     0,     0,    39,     0,     0,    38,    37,     0,     0,     0,
+     0,   119,   127,    70,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,    53,     0,    49,
+    75,     0,     0,     0,     0,     0,    93,    80,     0,     0,
+   140,   142,   144,   108,   117,     0,   112,   111,     0,     0,
+     0,     0,    31,     0,     0,     0,   161,   158,   160,     0,
+     0,    33,    35,    36,    40,    16,    16,   118,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    50,     0,     0,     0,     0,    44,     0,    81,    82,     0,
+   145,   130,     0,   115,     0,     0,     0,     0,     0,    32,
+    41,   130,    34,   159,    17,    18,     0,    54,    58,    59,
+    60,    61,   161,    57,    62,    56,    63,    64,    65,    66,
+    67,    68,    69,    52,     0,    71,    45,     0,   130,     0,
+     0,   137,   146,     0,     0,     0,   141,   143,   116,     0,
+     0,   130,     0,     0,     0,     0,    48,     0,     0,   139,
+   138,     0,     0,     0,   128,   131,   124,   130,     0,     0,
+     0,   126,     0,     0,     0,    43,   122,     0,   151,     0,
+     0,     0,     0,     0,   150,   132,     0,     0,   130,   123,
+   130,    55,     0,     0,     0,     0,     0,   152,     0,   153,
+     0,   147,   149,   129,   120,     0,     0,    47,     0,   148,
+   156,   154,   155,   157,   125,   121,    42,     0,     0,     0
 };
 
 };
 
-static const short yydefgoto[] = {   261,
-     8,     9,    10,    11,    69,    30,    31,    32,   125,   126,
-   127,    33,    34,    74,    39,    72,   140,    57,    58,    59,
-    60,    85,    91,    92,    93,   147,   132,    35,   198,   215,
-   141,   142,   143,   144,   231,   232,   216
+static const short yydefgoto[] = {   338,
+     8,     9,    10,    11,    75,    31,    32,    33,   136,   137,
+   138,    34,    35,   164,    36,   110,   157,   239,   245,   158,
+    82,    45,    80,   169,    63,    64,    65,    66,    93,    99,
+   100,   101,   176,   143,    37,   266,   285,   170,   171,   172,
+   173,   304,   305,   286
 };
 
 };
 
-static const short yypact[] = {    88,
-   -12,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    88,   347,
-   -15,    15,-32768,   347,   347,   157,    18,   347,     7,-32768,
--32768,-32768,-32768,    25,   153,    25,    36,-32768,-32768,   175,
--32768,   118,-32768,-32768,-32768,    67,   102,   122,   135,   245,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,    22,   313,   262,   144,   131,-32768,   327,   160,
-   198,   159,-32768,-32768,   262,    25,   162,   180,-32768,   161,
-   171,   178,   164,   181,   341,-32768,-32768,   183,-32768,   341,
--32768,   196,   182,     8,-32768,   341,-32768,   214,   193,   201,
--32768,   262,-32768,   186,   212,   229,    48,    62,    57,   122,
--32768,   236,   246,-32768,   233,   279,   131,-32768,-32768,   243,
-   270,   280,-32768,    50,-32768,   287,   262,   277,    50,   262,
-    -1,     9,   279,    -5,   278,   302,   281,   283,   295,   314,
--32768,-32768,-32768,   262,   299,   279,   296,   309,     0,   331,
-   311,-32768,   316,-32768,-32768,-32768,    98,-32768,-32768,   324,
-   345,   279,   346,-32768,   344,   335,   328,-32768,-32768,   354,
-   358,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   339,   357,
-   342,   104,   105,   262,    38,   362,   228,-32768,   364,   279,
-   348,   349,   352,-32768,-32768,   362,-32768,-32768,-32768,    16,
-   362,   262,   262,-32768,   353,   365,    10,    57,-32768,-32768,
--32768,   350,   279,   362,   279,    57,   356,-32768,    57,-32768,
--32768,   366,   109,   363,   369,-32768,-32768,   362,   355,    57,
-   359,-32768,   371,-32768,   109,-32768,   360,    43,    53,   361,
-    61,-32768,-32768,    10,    57,   362,-32768,   362,   367,   100,
-     6,     6,-32768,     6,-32768,     6,-32768,-32768,-32768,-32768,
-    57,    57,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
-   396,   397,-32768
+static const short yypact[] = {   144,
+    -7,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   144,   407,
+   -21,    40,-32768,   407,   407,   121,    71,   407,   166,-32768,
+-32768,-32768,-32768,    78,    45,   266,    45,    54,-32768,-32768,
+   156,-32768,   216,-32768,-32768,-32768,-32768,    92,    94,    97,
+   216,-32768,   157,   159,   160,   313,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   158,   381,
+   330,   164,   136,-32768,   395,   183,   257,   185,-32768,-32768,
+   330,    45,   200,   207,-32768,   184,   221,   187,   188,   189,
+   192,   223,   409,-32768,-32768,   229,-32768,   409,-32768,   230,
+   197,     1,-32768,   409,-32768,   247,   182,   236,-32768,   330,
+-32768,   201,   238,   239,    68,    10,    61,   232,   219,    22,
+   159,-32768,   273,   240,-32768,   241,   347,   136,-32768,-32768,
+   242,   274,   297,-32768,    -4,-32768,   304,   330,   279,    -4,
+   330,    60,    -9,   347,     0,   283,   331,   301,   312,   319,
+   360,-32768,-32768,-32768,   332,   333,   334,   346,   348,   361,
+   362,   371,   372,   380,   382,   383,   106,-32768,   336,-32768,
+-32768,   330,   385,   398,   347,   364,   386,     7,   419,   387,
+-32768,   388,-32768,-32768,-32768,   107,-32768,-32768,   389,   425,
+   347,   426,-32768,   423,   392,   394,-32768,-32768,-32768,   427,
+   430,-32768,-32768,-32768,-32768,    92,    92,-32768,    13,    13,
+    37,    37,     5,   159,   330,   433,   434,   435,   436,   437,
+-32768,   219,   438,   402,   403,   408,   404,   152,   153,   330,
+    66,   442,   296,-32768,   444,   347,   410,   411,   413,-32768,
+-32768,   442,-32768,-32768,-32768,-32768,   414,-32768,-32768,-32768,
+-32768,-32768,   414,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,    39,-32768,-32768,   441,   442,   330,
+   330,-32768,   415,   451,    19,    61,-32768,-32768,-32768,   416,
+   347,   442,   347,    61,   443,   420,-32768,    53,    61,-32768,
+-32768,   455,    88,   452,   456,-32768,-32768,   442,   422,    61,
+   424,-32768,   428,   454,   429,-32768,-32768,    88,-32768,   431,
+    57,    62,   432,    72,-32768,-32768,    19,    61,   442,-32768,
+   442,-32768,   439,   458,    81,    37,    37,-32768,    37,-32768,
+    37,-32768,-32768,-32768,-32768,    61,    61,-32768,   440,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,   480,   484,-32768
 };
 
 static const short yypgoto[] = {-32768,
 };
 
 static const short yypgoto[] = {-32768,
-   351,   163,   389,-32768,-32768,-32768,   370,   -18,   275,   282,
-   284,-32768,-32768,-32768,   -16,   304,   -24,-32768,   -38,-32768,
-   -37,   -10,   315,-32768,   -36,-32768,  -186,-32768,  -180,   176,
-  -119,     4,-32768,   232,   187,  -152,  -124
+    87,   118,   476,-32768,   -66,-32768,   459,    -8,   349,   351,
+   358,-32768,-32768,-32768,-32768,-32768,-32768,   -85,-32768,   280,
+-32768,   -18,  -106,   -25,-32768,   -43,-32768,   -42,   -65,   390,
+-32768,   120,-32768,  -253,   474,  -225,   190,  -132,  -150,-32768,
+   275,   202,  -211,  -135
 };
 
 
 };
 
 
-#define        YYLAST          412
-
-
-static const short yytable[] = {   162,
-    56,    77,    78,   157,   173,   206,    55,    67,    12,    61,
-   209,   217,   107,   158,   159,    81,   171,   154,    17,   222,
-    87,    16,   224,   220,   158,   159,    79,   121,   158,   159,
-    82,   160,   182,   237,   207,   155,    77,   235,    36,  -106,
-    95,    77,    90,   161,   174,    37,   214,    77,   250,    96,
-   124,    84,   113,   115,   161,   251,   208,   252,   161,   195,
-   202,   158,   159,    38,   259,   260,   121,   116,   110,   122,
-   112,   158,   159,   108,    62,   148,   196,   149,   248,   226,
-   128,   129,   113,   219,   242,   221,   123,   248,   111,   124,
-     1,   161,   151,   130,   244,   153,   145,   131,    77,    78,
-   247,   161,   227,   243,   245,    68,   228,   229,   230,   169,
-     2,     3,     4,     5,     6,     7,   255,   256,   226,   257,
-    70,   258,    40,    41,    42,    43,    44,   226,    45,    46,
-    47,    48,    49,    50,    51,    52,    53,   178,    54,   254,
-    71,   227,   179,  -108,  -107,   228,   229,   230,   192,   193,
-   227,    65,    66,    73,   228,   229,   230,    40,    41,    42,
-    43,    44,    83,    45,    46,    47,    48,    49,    50,    51,
-    52,    53,    15,    54,    84,    19,    18,   194,    88,    94,
-    97,    20,    21,    22,    23,    20,    21,    22,    23,    24,
-    25,    26,    27,    19,    28,   210,   211,    29,    98,   103,
-    99,   104,   102,    20,    21,    22,    23,    24,    25,    26,
-    27,   110,    63,   100,   105,    29,    89,   101,   109,   114,
-   106,    20,    21,    22,    23,   117,    20,    21,    22,    23,
-   118,   111,    40,    41,    42,    43,    44,   199,    45,    46,
-    47,    48,    49,    50,    51,    52,    53,   119,    54,    75,
-    41,    42,    43,    44,   134,    45,    46,    47,    48,    49,
-    50,    51,    52,    76,   135,    54,    40,    41,    42,    43,
-    44,   136,    45,    46,    47,    48,    49,    50,    51,    52,
-    53,   111,    54,   137,   138,    42,    43,    44,   146,    45,
-    46,    47,    48,    49,    50,    51,    52,   139,   110,    54,
-    75,    41,    42,    43,    44,   150,    45,    46,    47,    48,
-    49,    50,    51,    52,   172,   152,    54,    80,    41,   124,
-   121,   165,   166,    45,    46,    47,    48,    49,    50,    51,
-    52,    86,    41,    54,   167,   170,   168,    45,    46,    47,
-    48,    49,    50,    51,    52,    75,    41,    54,  -105,   175,
-   176,    45,    46,    47,    48,    49,    50,    51,    52,    13,
-   177,    54,   180,   181,   183,    13,   184,   186,    13,     2,
-     3,     4,     5,     6,     7,   185,   187,   188,   189,   190,
-   197,   191,   201,   213,   225,   233,   203,   234,   204,   218,
-   205,   212,   223,   239,   236,   262,   263,    14,   238,    64,
-   164,   241,   246,   133,     0,   156,   163,   253,   200,   249,
-   120,   240
+#define        YYLAST          500
+
+
+static const short yytable[] = {   192,
+    62,   186,    85,    86,   161,   118,   274,    73,    67,   132,
+    41,   219,   287,    12,   121,    77,    89,    61,   187,   188,
+   292,    95,   189,   243,   188,   297,   119,   189,   139,   140,
+    16,   237,   217,   279,   238,    90,   310,   187,   188,    85,
+   159,   189,   238,    17,    85,   103,   290,   135,   228,   122,
+    85,   190,   174,   104,   325,   187,   188,   276,    98,   189,
+    92,  -134,   308,   191,   220,   241,   242,   246,   191,   262,
+   284,   295,   335,   336,   127,   187,   188,   160,   183,   189,
+   187,   188,   191,   326,   189,   327,   132,   263,   123,   133,
+   299,    38,   323,   270,   277,    13,    43,   247,    44,   299,
+   191,    13,   180,   323,    13,   182,   299,    68,   296,   280,
+   281,   184,   141,   317,   240,    76,   142,   244,   319,   264,
+   191,   134,    85,    86,   135,   191,   322,    15,   300,   235,
+   236,    18,   301,   302,   303,   330,   214,   300,   289,    19,
+   291,   301,   302,   303,   300,    74,     1,    40,   301,   302,
+   303,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+   211,   224,    87,   212,   225,   318,   320,     2,     3,     4,
+     5,     6,     7,    29,    19,    78,    30,    79,    81,   248,
+   331,   332,    91,   333,    39,   334,    20,    21,    22,    23,
+    24,    25,    26,    27,    28,    92,    20,    21,    22,    23,
+   121,    96,    26,    27,    28,   102,  -136,  -135,    69,   260,
+   261,    30,    20,    21,    22,    23,   124,   126,   105,    40,
+    46,    47,    48,    49,    50,   106,    51,    52,    53,    54,
+    55,    56,    57,    58,    59,   122,    60,   144,   107,   108,
+   109,   114,   177,   112,   178,   113,   111,   115,   116,   124,
+   117,   120,    71,    72,   125,   128,   129,   130,   145,   146,
+   147,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+    46,    47,    48,    49,    50,    97,    51,    52,    53,    54,
+    55,    56,    57,    58,    59,   134,    60,    20,    21,    22,
+    23,   162,   175,   163,   165,   122,    20,    21,    22,    23,
+    46,    47,    48,    49,    50,   267,    51,    52,    53,    54,
+    55,    56,    57,    58,    59,   121,    60,    83,    47,    48,
+    49,    50,   179,    51,    52,    53,    54,    55,    56,    57,
+    58,    84,   181,    60,    46,    47,    48,    49,    50,   135,
+    51,    52,    53,    54,    55,    56,    57,    58,    59,   132,
+    60,   166,   167,    48,    49,    50,   195,    51,    52,    53,
+    54,    55,    56,    57,    58,   168,   196,    60,    83,    47,
+    48,    49,    50,   197,    51,    52,    53,    54,    55,    56,
+    57,    58,   218,   198,    60,    88,    47,   213,   199,   200,
+   201,    51,    52,    53,    54,    55,    56,    57,    58,    94,
+    47,    60,   202,   215,   203,    51,    52,    53,    54,    55,
+    56,    57,    58,    83,    47,    60,   216,   204,   205,    51,
+    52,    53,    54,    55,    56,    57,    58,   206,   207,    60,
+     2,     3,     4,     5,     6,     7,   208,   221,   209,   210,
+  -133,   222,   226,   227,   229,   223,   230,   231,   232,   234,
+   233,   249,   250,   251,   252,   253,   256,   257,   259,   258,
+   265,   255,   269,   271,   278,   272,   273,   275,   282,   283,
+   288,   294,   293,   298,   307,   306,   309,   313,   311,   339,
+   314,   329,   312,   340,    14,   194,   193,   316,   321,    70,
+   185,   254,    42,   131,   328,   337,   324,   268,     0,   315
 };
 
 };
 
-static const short yycheck[] = {   124,
-    25,    40,    40,   123,     5,   186,    25,    32,    21,    26,
-   191,   198,     5,    19,    20,    54,   136,    19,     4,   206,
-    59,    37,   209,   204,    19,    20,     5,    19,    19,    20,
-    55,    37,   152,   220,    19,    37,    75,   218,    21,    40,
-    65,    80,    61,    49,    45,    39,    37,    86,   235,    66,
-    42,    44,    89,    90,    49,   236,    41,   238,    49,    22,
-   180,    19,    20,    39,   251,   252,    19,    92,    19,    22,
-    89,    19,    20,    84,    39,   112,    39,   114,   231,    19,
-    19,    20,   119,   203,    42,   205,    39,   240,    39,    42,
-     3,    49,   117,    37,    42,   120,   107,    41,   137,   137,
-    40,    49,    42,   228,   229,    39,    46,    47,    48,   134,
-    23,    24,    25,    26,    27,    28,   241,   242,    19,   244,
-    19,   246,     5,     6,     7,     8,     9,    19,    11,    12,
-    13,    14,    15,    16,    17,    18,    19,    40,    21,    40,
-    19,    42,    45,    40,    40,    46,    47,    48,    45,    45,
-    42,    34,    35,    19,    46,    47,    48,     5,     6,     7,
-     8,     9,    19,    11,    12,    13,    14,    15,    16,    17,
-    18,    19,    10,    21,    44,    19,    14,   174,    19,    21,
-    19,    29,    30,    31,    32,    29,    30,    31,    32,    33,
-    34,    35,    36,    19,    38,   192,   193,    41,    19,    19,
-    40,    19,    39,    29,    30,    31,    32,    33,    34,    35,
-    36,    19,    38,    43,    19,    41,    19,    40,     5,    19,
-    39,    29,    30,    31,    32,    40,    29,    30,    31,    32,
-    19,    39,     5,     6,     7,     8,     9,    10,    11,    12,
-    13,    14,    15,    16,    17,    18,    19,    19,    21,     5,
-     6,     7,     8,     9,    19,    11,    12,    13,    14,    15,
-    16,    17,    18,    19,    19,    21,     5,     6,     7,     8,
-     9,    39,    11,    12,    13,    14,    15,    16,    17,    18,
-    19,    39,    21,     5,     6,     7,     8,     9,    19,    11,
-    12,    13,    14,    15,    16,    17,    18,    19,    19,    21,
+static const short yycheck[] = {   135,
+    26,   134,    46,    46,   111,     5,   232,    33,    27,    19,
+    19,     5,   266,    21,    19,    41,    60,    26,    19,    20,
+   274,    65,    23,    19,    20,   279,    92,    23,    19,    20,
+    52,    19,   165,   259,    30,    61,   290,    19,    20,    83,
+    19,    23,    30,     4,    88,    71,   272,    57,   181,    54,
+    94,    52,   118,    72,   308,    19,    20,    19,    67,    23,
+    60,    55,   288,    64,    58,   201,   202,   203,    64,   220,
+    52,    19,   326,   327,   100,    19,    20,    56,    19,    23,
+    19,    20,    64,   309,    23,   311,    19,    22,    97,    22,
+    19,    21,   304,   226,    56,     9,    19,   204,    54,    19,
+    64,    15,   128,   315,    18,   131,    19,    54,    56,   260,
+   261,    52,    52,    57,   200,    19,    56,   203,    57,    54,
+    64,    54,   166,   166,    57,    64,    55,    10,    57,   196,
+   197,    14,    61,    62,    63,    55,   162,    57,   271,    19,
+   273,    61,    62,    63,    57,    54,     3,    54,    61,    62,
+    63,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    55,    55,     5,    58,    58,   301,   302,    24,    25,    26,
+    27,    28,    29,    53,    19,    19,    56,    19,    19,   205,
+   316,   317,    19,   319,    19,   321,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    60,    31,    32,    33,    34,
+    19,    19,    37,    38,    39,    21,    55,    55,    53,    58,
+    58,    56,    31,    32,    33,    34,    97,    98,    19,    54,
+     5,     6,     7,     8,     9,    19,    11,    12,    13,    14,
+    15,    16,    17,    18,    19,    54,    21,    19,    55,    19,
+    54,    19,   123,    55,   125,    54,    59,    19,    19,   130,
+    54,     5,    37,    38,    19,    55,    19,    19,    40,    41,
+    42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
      5,     6,     7,     8,     9,    19,    11,    12,    13,    14,
      5,     6,     7,     8,     9,    19,    11,    12,    13,    14,
-    15,    16,    17,    18,    19,    39,    21,     5,     6,    42,
-    19,    41,    40,    11,    12,    13,    14,    15,    16,    17,
-    18,     5,     6,    21,    40,    37,    23,    11,    12,    13,
-    14,    15,    16,    17,    18,     5,     6,    21,    40,    19,
-    40,    11,    12,    13,    14,    15,    16,    17,    18,     9,
-    45,    21,    39,    19,    19,    15,    23,    40,    18,    23,
-    24,    25,    26,    27,    28,    41,    23,    20,    40,    23,
-    19,    40,    19,    19,    19,    23,    39,    19,    40,    40,
-    39,    39,    37,    23,    40,     0,     0,     9,    40,    30,
-   126,    42,    42,   100,    -1,   122,   125,    41,   177,   234,
-    96,   225
+    15,    16,    17,    18,    19,    54,    21,    31,    32,    33,
+    34,    19,    19,    54,    54,    54,    31,    32,    33,    34,
+     5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+    15,    16,    17,    18,    19,    19,    21,     5,     6,     7,
+     8,     9,    19,    11,    12,    13,    14,    15,    16,    17,
+    18,    19,    54,    21,     5,     6,     7,     8,     9,    57,
+    11,    12,    13,    14,    15,    16,    17,    18,    19,    19,
+    21,     5,     6,     7,     8,     9,    56,    11,    12,    13,
+    14,    15,    16,    17,    18,    19,    55,    21,     5,     6,
+     7,     8,     9,    55,    11,    12,    13,    14,    15,    16,
+    17,    18,    19,    24,    21,     5,     6,    52,    57,    57,
+    57,    11,    12,    13,    14,    15,    16,    17,    18,     5,
+     6,    21,    57,    19,    57,    11,    12,    13,    14,    15,
+    16,    17,    18,     5,     6,    21,    19,    57,    57,    11,
+    12,    13,    14,    15,    16,    17,    18,    57,    57,    21,
+    24,    25,    26,    27,    28,    29,    57,    19,    57,    57,
+    55,    55,    54,    19,    19,    58,    24,    56,    55,    20,
+    24,    19,    19,    19,    19,    19,    55,    55,    55,    52,
+    19,    24,    19,    54,    24,    55,    54,    54,    54,    19,
+    55,    52,    30,    19,    19,    24,    55,    24,    55,     0,
+    52,    24,    55,     0,     9,   137,   136,    57,    57,    31,
+   133,   212,    19,   104,    56,    56,   307,   223,    -1,   298
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 #line 3 "/usr/lib/bison.simple"
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 #line 3 "/usr/lib/bison.simple"
@@ -1222,85 +1573,103 @@ yyreduce:
   switch (yyn) {
 
 case 1:
   switch (yyn) {
 
 case 1:
-#line 311 "parse.y"
+#line 591 "parse.y"
 { ; ;
     break;}
 case 2:
 { ; ;
     break;}
 case 2:
-#line 312 "parse.y"
+#line 592 "parse.y"
 { ; ;
     break;}
 case 3:
 { ; ;
     break;}
 case 3:
-#line 313 "parse.y"
+#line 593 "parse.y"
 { ; ;
     break;}
 case 4:
 { ; ;
     break;}
 case 4:
-#line 314 "parse.y"
+#line 594 "parse.y"
 { ; ;
     break;}
 case 5:
 { ; ;
     break;}
 case 5:
-#line 317 "parse.y"
+#line 597 "parse.y"
 {
 {
-                       Node *node = new_ccode(C_CCODE,(yyvsp[0].cbuf)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", C_CCODE,
+                                              "cbuf:steal", (yyvsp[0].cbuf)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 6:
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 6:
-#line 323 "parse.y"
+#line 606 "parse.y"
 {
 {
-                       Node *node = new_ccode(H_CCODE,(yyvsp[0].cbuf)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", H_CCODE,
+                                              "cbuf:steal", (yyvsp[0].cbuf)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 7:
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 7:
-#line 329 "parse.y"
+#line 615 "parse.y"
 {
 {
-                       Node *node = new_ccode(HT_CCODE,(yyvsp[0].cbuf)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", HT_CCODE,
+                                              "cbuf:steal", (yyvsp[0].cbuf)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 8:
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 8:
-#line 335 "parse.y"
+#line 624 "parse.y"
 {
 {
-                       Node *node = new_ccode(PH_CCODE,(yyvsp[0].cbuf)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", PH_CCODE,
+                                              "cbuf:steal", (yyvsp[0].cbuf)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 9:
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 9:
-#line 341 "parse.y"
+#line 633 "parse.y"
 {
 {
-                       Node *node = new_ccode(A_CCODE,(yyvsp[0].cbuf)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", A_CCODE,
+                                              "cbuf:steal", (yyvsp[0].cbuf)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 10:
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 10:
-#line 347 "parse.y"
+#line 642 "parse.y"
 {
 {
-                       Node *node = new_ccode(AT_CCODE,(yyvsp[0].cbuf)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", AT_CCODE,
+                                              "cbuf:steal", (yyvsp[0].cbuf)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 11:
                        nodes = g_list_append(nodes,node);
                        g_string_free(yyvsp[0].cbuf,FALSE);
                                        ;
     break;}
 case 11:
-#line 355 "parse.y"
+#line 653 "parse.y"
 { ; ;
     break;}
 case 12:
 { ; ;
     break;}
 case 12:
-#line 356 "parse.y"
+#line 654 "parse.y"
 { ; ;
     break;}
 case 13:
 { ; ;
     break;}
 case 13:
-#line 359 "parse.y"
+#line 657 "parse.y"
 {
                        ((Class *)class)->nodes = class_nodes;
                        class_nodes = NULL;
 {
                        ((Class *)class)->nodes = class_nodes;
                        class_nodes = NULL;
@@ -1308,7 +1677,7 @@ case 13:
                                                ;
     break;}
 case 14:
                                                ;
     break;}
 case 14:
-#line 364 "parse.y"
+#line 662 "parse.y"
 {
                        ((Class *)class)->nodes = NULL;
                        class_nodes = NULL;
 {
                        ((Class *)class)->nodes = NULL;
                        class_nodes = NULL;
@@ -1316,16 +1685,25 @@ case 14:
                                                ;
     break;}
 case 15:
                                                ;
     break;}
 case 15:
-#line 371 "parse.y"
-{
-                       class = new_class(yyvsp[-3].id,yyvsp[-1].id,chunk_size,NULL);
+#line 669 "parse.y"
+{
+                       class = node_new (CLASS_NODE,
+                                         "otype:steal", yyvsp[-3].id,
+                                         "ptype:steal", yyvsp[-1].id,
+                                         "bonobo_x_class:steal", bonobo_x_class,
+                                         "chunk_size:steal", chunk_size,
+                                         NULL);
                                                ;
     break;}
 case 17:
                                                ;
     break;}
 case 17:
-#line 377 "parse.y"
-{
-                       if(strcmp(yyvsp[-2].id,"chunks") == 0) {
-                                       chunk_size = g_strdup(yyvsp[0].id);
+#line 680 "parse.y"
+{
+                       if(strcmp(yyvsp[-3].id,"chunks") == 0) {
+                               g_free (chunk_size);
+                               chunk_size = g_strdup(yyvsp[-2].id);
+                       } else if(strcmp(yyvsp[-3].id,"BonoboX") == 0) {
+                               g_free (bonobo_x_class);
+                               bonobo_x_class = g_strdup(yyvsp[-2].id);
                        } else {
                                yyerror(_("parse error"));
                                YYERROR;
                        } else {
                                yyerror(_("parse error"));
                                YYERROR;
@@ -1333,11 +1711,14 @@ case 17:
                ;
     break;}
 case 18:
                ;
     break;}
 case 18:
-#line 385 "parse.y"
+#line 692 "parse.y"
 {
 {
-                       if(strcmp(yyvsp[-2].id,"chunks") == 0) {
-                               if(atoi(yyvsp[0].id) != 0)
-                                       chunk_size = g_strdup(yyvsp[0].id);
+                       if(strcmp(yyvsp[-3].id,"chunks") == 0) {
+                               g_free (chunk_size);
+                               if(atoi(yyvsp[-2].id) != 0)
+                                       chunk_size = g_strdup(yyvsp[-2].id);
+                               else
+                                       chunk_size = NULL;
                        } else {
                                yyerror(_("parse error"));
                                YYERROR;
                        } else {
                                yyerror(_("parse error"));
                                YYERROR;
@@ -1345,201 +1726,288 @@ case 18:
                ;
     break;}
 case 19:
                ;
     break;}
 case 19:
-#line 396 "parse.y"
+#line 706 "parse.y"
 { ; ;
     break;}
 case 20:
 { ; ;
     break;}
 case 20:
-#line 397 "parse.y"
+#line 707 "parse.y"
 { ; ;
     break;}
 case 21:
 { ; ;
     break;}
 case 21:
-#line 400 "parse.y"
+#line 710 "parse.y"
 { ; ;
     break;}
 case 22:
 { ; ;
     break;}
 case 22:
-#line 401 "parse.y"
-{ ; ;
+#line 711 "parse.y"
+{
+                       if (strcmp (yyvsp[-1].id, "BonoboX") != 0) {
+                               g_free(yyvsp[-1].id);
+                               yyerror(_("parse error"));
+                               YYERROR;
+                       }
+                       last_added_method->bonobo_x_func = TRUE;
+                                               ;
     break;}
 case 23:
     break;}
 case 23:
-#line 402 "parse.y"
+#line 719 "parse.y"
 { ; ;
     break;}
 case 24:
 { ; ;
     break;}
 case 24:
-#line 403 "parse.y"
+#line 720 "parse.y"
 { ; ;
     break;}
 case 25:
 { ; ;
     break;}
 case 25:
-#line 406 "parse.y"
-{ the_scope = PUBLIC_SCOPE; ;
+#line 721 "parse.y"
+{ ; ;
     break;}
 case 26:
     break;}
 case 26:
-#line 407 "parse.y"
-{ the_scope = PRIVATE_SCOPE; ;
+#line 722 "parse.y"
+{ ; ;
     break;}
 case 27:
     break;}
 case 27:
-#line 408 "parse.y"
-{ the_scope = PROTECTED_SCOPE; ;
+#line 725 "parse.y"
+{ the_scope = PUBLIC_SCOPE; ;
     break;}
 case 28:
     break;}
 case 28:
-#line 409 "parse.y"
-{ the_scope = CLASS_SCOPE; ;
+#line 726 "parse.y"
+{ the_scope = PRIVATE_SCOPE; ;
     break;}
 case 29:
     break;}
 case 29:
-#line 412 "parse.y"
+#line 727 "parse.y"
+{ the_scope = PROTECTED_SCOPE; ;
+    break;}
+case 30:
+#line 728 "parse.y"
+{ the_scope = CLASS_SCOPE; ;
+    break;}
+case 31:
+#line 731 "parse.y"
 {
 {
-                       if(strcmp(yyvsp[-1].id, "destroywith")==0) {
-                               g_free(yyvsp[-1].id);
+                       if (strcmp (yyvsp[-1].id, "destroywith") == 0) {
+                               g_free (yyvsp[-1].id);
+                               destructor_unref = FALSE;
+                               destructor = yyvsp[0].id;
+                               destructor_line = line_no;
+                               destructor_simple = TRUE;
+                       } else if (strcmp (yyvsp[-1].id, "unrefwith") == 0) {
+                               g_free (yyvsp[-1].id);
+                               destructor_unref = TRUE;
                                destructor = yyvsp[0].id;
                                destructor_line = line_no;
                                destructor_simple = TRUE;
                        } else {
                                destructor = yyvsp[0].id;
                                destructor_line = line_no;
                                destructor_simple = TRUE;
                        } else {
-                               g_free(yyvsp[-1].id);
-                               g_free(yyvsp[0].id);
-                               yyerror(_("parse error"));
+                               g_free (yyvsp[-1].id);
+                               g_free (yyvsp[0].id);
+                               yyerror (_("parse error"));
                                YYERROR;
                        }
                                ;
     break;}
                                YYERROR;
                        }
                                ;
     break;}
-case 30:
-#line 425 "parse.y"
+case 32:
+#line 751 "parse.y"
 {
 {
-                       if(strcmp(yyvsp[-2].id, "destroy")==0) {
+                       if (strcmp (yyvsp[-2].id, "destroy") == 0) {
                                g_free(yyvsp[-2].id);
                                g_free(yyvsp[-2].id);
+                               destructor_unref = FALSE;
                                destructor = (yyvsp[0].cbuf)->str;
                                g_string_free(yyvsp[0].cbuf, FALSE);
                                destructor_line = ccode_line;
                                destructor_simple = FALSE;
                                destructor = (yyvsp[0].cbuf)->str;
                                g_string_free(yyvsp[0].cbuf, FALSE);
                                destructor_line = ccode_line;
                                destructor_simple = FALSE;
+                       } else if (strcmp (yyvsp[-2].id, "unref") == 0) {
+                               g_free (yyvsp[-2].id);
+                               destructor_unref = TRUE;
+                               destructor = (yyvsp[0].cbuf)->str;
+                               g_string_free (yyvsp[0].cbuf, FALSE);
+                               destructor_line = ccode_line;
+                               destructor_simple = FALSE;
                        } else {
                        } else {
-                               g_free(yyvsp[-2].id);
-                               g_string_free(yyvsp[0].cbuf, TRUE);
-                               yyerror(_("parse error"));
+                               g_free (yyvsp[-2].id);
+                               g_string_free (yyvsp[0].cbuf, TRUE);
+                               yyerror (_("parse error"));
                                YYERROR;
                        }
                                        ;
     break;}
                                YYERROR;
                        }
                                        ;
     break;}
-case 31:
-#line 441 "parse.y"
+case 33:
+#line 775 "parse.y"
 {
                        initializer = yyvsp[0].id;
                        initializer_line = ccode_line;
                                ;
     break;}
 {
                        initializer = yyvsp[0].id;
                        initializer_line = ccode_line;
                                ;
     break;}
-case 32:
-#line 445 "parse.y"
+case 34:
+#line 779 "parse.y"
 {
                        initializer = (yyvsp[0].cbuf)->str;
                        initializer_line = ccode_line;
                        g_string_free(yyvsp[0].cbuf, FALSE);
                                ;
     break;}
 {
                        initializer = (yyvsp[0].cbuf)->str;
                        initializer_line = ccode_line;
                        g_string_free(yyvsp[0].cbuf, FALSE);
                                ;
     break;}
-case 33:
-#line 453 "parse.y"
+case 35:
+#line 787 "parse.y"
 { ; ;
     break;}
 { ; ;
     break;}
-case 34:
-#line 454 "parse.y"
+case 36:
+#line 788 "parse.y"
 { ; ;
     break;}
 { ; ;
     break;}
-case 35:
-#line 455 "parse.y"
+case 37:
+#line 789 "parse.y"
 { destructor = NULL; ;
     break;}
 { destructor = NULL; ;
     break;}
-case 36:
-#line 456 "parse.y"
+case 38:
+#line 790 "parse.y"
 { initializer = NULL; ;
     break;}
 { initializer = NULL; ;
     break;}
-case 37:
-#line 457 "parse.y"
+case 39:
+#line 791 "parse.y"
 {
                        destructor = NULL;
                        initializer = NULL;
                                        ;
     break;}
 {
                        destructor = NULL;
                        initializer = NULL;
                                        ;
     break;}
-case 38:
-#line 463 "parse.y"
+case 40:
+#line 797 "parse.y"
 {
                        push_variable(yyvsp[-2].id, the_scope,yyvsp[-4].line, NULL);
                                                ;
     break;}
 {
                        push_variable(yyvsp[-2].id, the_scope,yyvsp[-4].line, NULL);
                                                ;
     break;}
-case 39:
-#line 466 "parse.y"
+case 41:
+#line 800 "parse.y"
 {
                        push_variable(yyvsp[-3].id, the_scope, yyvsp[-5].line, yyvsp[-2].id);
                                                ;
     break;}
 {
                        push_variable(yyvsp[-3].id, the_scope, yyvsp[-5].line, yyvsp[-2].id);
                                                ;
     break;}
-case 40:
-#line 470 "parse.y"
+case 42:
+#line 805 "parse.y"
 {
 {
+                       Node *node = NULL;
                        if(strcmp(yyvsp[-6].id,"get")==0 &&
                           strcmp(yyvsp[-3].id,"set")==0) {
                        if(strcmp(yyvsp[-6].id,"get")==0 &&
                           strcmp(yyvsp[-3].id,"set")==0) {
-                               Node *node;
                                Type *type = pop_type();
                                Type *type = pop_type();
-                               g_free(yyvsp[-6].id); g_free(yyvsp[-3].id);
-                               node = new_argument(yyvsp[-8].id,type,yyvsp[-9].list,yyvsp[-7].id,
-                                                   (yyvsp[-4].cbuf)->str,yyvsp[-5].line,
-                                                   (yyvsp[-1].cbuf)->str,yyvsp[-2].line,
-                                                   yyvsp[-10].line);
-                               g_string_free(yyvsp[-4].cbuf,FALSE);
-                               g_string_free(yyvsp[-1].cbuf,FALSE);
+                               g_free (yyvsp[-6].id); 
+                               g_free (yyvsp[-3].id);
+                               node = node_new (ARGUMENT_NODE,
+                                                "gtktype:steal", yyvsp[-9].id,
+                                                "atype:steal", type,
+                                                "flags:steal", yyvsp[-10].list,
+                                                "name:steal", yyvsp[-8].id,
+                                                "get:steal", (yyvsp[-4].cbuf)->str,
+                                                "get_line", yyvsp[-5].line,
+                                                "set:steal", (yyvsp[-1].cbuf)->str,
+                                                "set_line", yyvsp[-2].line,
+                                                "line_no", yyvsp[-11].line,
+                                                NULL);
+
                                class_nodes = g_list_append(class_nodes,node);
                                class_nodes = g_list_append(class_nodes,node);
+
+                               g_string_free (yyvsp[-4].cbuf, FALSE);
+                               g_string_free (yyvsp[-1].cbuf, FALSE);
+
                        } else if(strcmp(yyvsp[-6].id,"set")==0 &&
                                strcmp(yyvsp[-3].id,"get")==0) {
                        } else if(strcmp(yyvsp[-6].id,"set")==0 &&
                                strcmp(yyvsp[-3].id,"get")==0) {
-                               Node *node;
                                Type *type = pop_type();
                                Type *type = pop_type();
-                               g_free(yyvsp[-6].id); g_free(yyvsp[-3].id);
-                               node = new_argument(yyvsp[-8].id,type,yyvsp[-9].list,yyvsp[-7].id,
-                                                   (yyvsp[-1].cbuf)->str,yyvsp[-2].line,
-                                                   (yyvsp[-4].cbuf)->str,yyvsp[-5].line,
-                                                   yyvsp[-10].line);
-                               g_string_free(yyvsp[-1].cbuf,FALSE);
-                               g_string_free(yyvsp[-4].cbuf,FALSE);
+                               g_free (yyvsp[-6].id); 
+                               g_free (yyvsp[-3].id);
+                               node = node_new (ARGUMENT_NODE,
+                                                "gtktype:steal", yyvsp[-9].id,
+                                                "atype:steal", type,
+                                                "flags:steal", yyvsp[-10].list,
+                                                "name:steal", yyvsp[-8].id,
+                                                "get:steal", (yyvsp[-1].cbuf)->str,
+                                                "get_line", yyvsp[-2].line,
+                                                "set:steal", (yyvsp[-4].cbuf)->str,
+                                                "set_line", yyvsp[-5].line,
+                                                "line_no", yyvsp[-11].line,
+                                                NULL);
+                               g_string_free (yyvsp[-1].cbuf, FALSE);
+                               g_string_free (yyvsp[-4].cbuf, FALSE);
                                class_nodes = g_list_append(class_nodes,node);
                        } else {
                                class_nodes = g_list_append(class_nodes,node);
                        } else {
-                               g_free(yyvsp[-8].id); g_free(yyvsp[-7].id);
-                               g_free(yyvsp[-6].id); g_free(yyvsp[-3].id);
-                               g_list_foreach(yyvsp[-9].list,(GFunc)g_free,NULL);
-                               g_list_free(yyvsp[-9].list);
-                               g_string_free(yyvsp[-1].cbuf,TRUE);
-                               g_string_free(yyvsp[-4].cbuf,TRUE);
-                               yyerror(_("parse error"));
+                               g_free (yyvsp[-9].id); 
+                               g_free (yyvsp[-8].id);
+                               g_free (yyvsp[-6].id); 
+                               g_free (yyvsp[-3].id);
+                               g_list_foreach (yyvsp[-10].list, (GFunc)g_free, NULL);
+                               g_list_free (yyvsp[-10].list);
+                               g_string_free (yyvsp[-1].cbuf, TRUE);
+                               g_string_free (yyvsp[-4].cbuf, TRUE);
+                               yyerror (_("parse error"));
                                YYERROR;
                        }
                                YYERROR;
                        }
+
+                       if (yyvsp[-7].id != NULL) {
+                               Argument *arg = (Argument *)node;
+                               export_accessors (arg->name,
+                                                 arg->get != NULL, arg->get_line,
+                                                 arg->set != NULL, arg->set_line,
+                                                 arg->atype,
+                                                 arg->gtktype,
+                                                 arg->line_no);
+                               g_free (yyvsp[-7].id);
+                       } 
+
                                                ;
     break;}
                                                ;
     break;}
-case 41:
-#line 506 "parse.y"
+case 43:
+#line 873 "parse.y"
 {
 {
+                       Node *node = NULL;
                        if(strcmp(yyvsp[-3].id, "get") == 0) {
                        if(strcmp(yyvsp[-3].id, "get") == 0) {
-                               Node *node;
                                Type *type = pop_type();
                                Type *type = pop_type();
-                               g_free(yyvsp[-3].id);
-                               node = new_argument(yyvsp[-5].id, type, yyvsp[-6].list, yyvsp[-4].id,
-                                                   (yyvsp[-1].cbuf)->str, yyvsp[-2].line,
-                                                   NULL, 0, yyvsp[-7].line);
-                               g_string_free(yyvsp[-1].cbuf, FALSE);
+                               g_free (yyvsp[-3].id);
+                               node = node_new (ARGUMENT_NODE,
+                                                "gtktype:steal", yyvsp[-6].id,
+                                                "atype:steal", type,
+                                                "flags:steal", yyvsp[-7].list,
+                                                "name:steal", yyvsp[-5].id,
+                                                "get:steal", (yyvsp[-1].cbuf)->str,
+                                                "get_line", yyvsp[-2].line,
+                                                "line_no", yyvsp[-8].line,
+                                                NULL);
+
+                               g_string_free (yyvsp[-1].cbuf, FALSE);
                                class_nodes = g_list_append(class_nodes, node);
                        } else if(strcmp(yyvsp[-3].id, "set") == 0) {
                                class_nodes = g_list_append(class_nodes, node);
                        } else if(strcmp(yyvsp[-3].id, "set") == 0) {
-                               Node *node;
                                Type *type = pop_type();
                                Type *type = pop_type();
-                               g_free(yyvsp[-3].id);
-                               node = new_argument(yyvsp[-5].id, type, yyvsp[-6].list, yyvsp[-4].id,
-                                                   NULL, 0, (yyvsp[-1].cbuf)->str,
-                                                   yyvsp[-2].line, yyvsp[-7].line);
-                               g_string_free(yyvsp[-1].cbuf, FALSE);
-                               class_nodes = g_list_append(class_nodes, node);
+                               g_free (yyvsp[-3].id);
+                               node = node_new (ARGUMENT_NODE,
+                                                "gtktype:steal", yyvsp[-6].id,
+                                                "atype:steal", type,
+                                                "flags:steal", yyvsp[-7].list,
+                                                "name:steal", yyvsp[-5].id,
+                                                "set:steal", (yyvsp[-1].cbuf)->str,
+                                                "set_line", yyvsp[-2].line,
+                                                "line_no", yyvsp[-8].line,
+                                                NULL);
+
+                               g_string_free (yyvsp[-1].cbuf, FALSE);
+                               class_nodes = g_list_append (class_nodes, node);
                        } else {
                        } else {
-                               g_free(yyvsp[-3].id); g_free(yyvsp[-5].id);
-                               g_free(yyvsp[-4].id);
-                               g_list_foreach(yyvsp[-6].list, (GFunc)g_free, NULL);
-                               g_list_free(yyvsp[-6].list);
-                               g_string_free(yyvsp[-1].cbuf, TRUE);
+                               g_free (yyvsp[-3].id); 
+                               g_free (yyvsp[-6].id);
+                               g_free (yyvsp[-5].id);
+                               g_list_foreach (yyvsp[-7].list, (GFunc)g_free, NULL);
+                               g_list_free (yyvsp[-7].list);
+                               g_string_free (yyvsp[-1].cbuf, TRUE);
                                yyerror(_("parse error"));
                                YYERROR;
                        }
                                yyerror(_("parse error"));
                                YYERROR;
                        }
+
+                       if (yyvsp[-4].id != NULL) {
+                               Argument *arg = (Argument *)node;
+                               export_accessors (arg->name,
+                                                 arg->get != NULL, arg->get_line,
+                                                 arg->set != NULL, arg->set_line,
+                                                 arg->atype,
+                                                 arg->gtktype,
+                                                 arg->line_no);
+                               g_free (yyvsp[-4].id);
+                       } 
                                                ;
     break;}
                                                ;
     break;}
-case 42:
-#line 535 "parse.y"
+case 44:
+#line 927 "parse.y"
 {
                        Node *node;
                        char *get, *set = NULL;
 {
                        Node *node;
                        char *get, *set = NULL;
@@ -1548,73 +2016,382 @@ case 42:
                        char *root;
                        
                        if(strcmp(yyvsp[0].id, "link")!=0 &&
                        char *root;
                        
                        if(strcmp(yyvsp[0].id, "link")!=0 &&
-                          strcmp(yyvsp[0].id, "stringlink")!=0 &&
+                          strcmp(yyvsp[0].id, "stringlink")!=0 && 
                           strcmp(yyvsp[0].id, "objectlink")!=0) {
                           strcmp(yyvsp[0].id, "objectlink")!=0) {
-                               g_free(yyvsp[0].id); g_free(yyvsp[-2].id);
-                               g_free(yyvsp[-1].id);
-                               g_list_foreach(yyvsp[-3].list,(GFunc)g_free,NULL);
-                               g_list_free(yyvsp[-3].list);
+                               g_free(yyvsp[0].id); 
+                               g_free(yyvsp[-3].id);
+                               g_free(yyvsp[-2].id);
+                               g_list_foreach(yyvsp[-4].list,(GFunc)g_free,NULL);
+                               g_list_free(yyvsp[-4].list);
                                yyerror(_("parse error"));
                                YYERROR;
                        }
 
                        type = pop_type();
 
                                yyerror(_("parse error"));
                                YYERROR;
                        }
 
                        type = pop_type();
 
-                       var = find_var_or_die(yyvsp[-1].id, yyvsp[-4].line);
+                       var = find_var_or_die(yyvsp[-2].id, yyvsp[-5].line);
                        if(var->scope == PRIVATE_SCOPE)
                                root = "self->_priv";
                        else if(var->scope == CLASS_SCOPE) {
                                root = "SELF_GET_CLASS(self)";
                                if(no_self_alias)
                        if(var->scope == PRIVATE_SCOPE)
                                root = "self->_priv";
                        else if(var->scope == CLASS_SCOPE) {
                                root = "SELF_GET_CLASS(self)";
                                if(no_self_alias)
-                                       error_print(GOB_ERROR, yyvsp[-4].line,
+                                       error_print(GOB_ERROR, yyvsp[-5].line,
                                                    _("Self aliases needed when autolinking to a classwide member"));
                        } else
                                root = "self";
 
                        if(strcmp(yyvsp[0].id, "link")==0) {
                                set = g_strdup_printf("%s->%s = ARG;",
                                                    _("Self aliases needed when autolinking to a classwide member"));
                        } else
                                root = "self";
 
                        if(strcmp(yyvsp[0].id, "link")==0) {
                                set = g_strdup_printf("%s->%s = ARG;",
-                                                     root, yyvsp[-1].id);
+                                                     root, yyvsp[-2].id);
                        } else if(strcmp(yyvsp[0].id, "stringlink")==0) {
                        } else if(strcmp(yyvsp[0].id, "stringlink")==0) {
-                               set = g_strdup_printf("g_free(%s->%s); "
-                                                     "%s->%s = g_strdup(ARG);",
-                                                     root, yyvsp[-1].id,
-                                                     root, yyvsp[-1].id);
+                               set = g_strdup_printf("g_free (%s->%s); "
+                                                     "%s->%s = g_strdup (ARG);",
+                                                     root, yyvsp[-2].id,
+                                                     root, yyvsp[-2].id);
                        } else if(strcmp(yyvsp[0].id, "objectlink")==0) {
                                set = g_strdup_printf(
                        } else if(strcmp(yyvsp[0].id, "objectlink")==0) {
                                set = g_strdup_printf(
-                                 "if(%s->%s) "
-                                  "gtk_object_unref(GTK_OBJECT(%s->%s)); "
-                                 "%s->%s = ARG; "
-                                 "if(%s->%s) "
-                                  "gtk_object_ref(GTK_OBJECT(%s->%s));",
-                                 root, yyvsp[-1].id,
-                                 root, yyvsp[-1].id,
-                                 root, yyvsp[-1].id,
-                                 root, yyvsp[-1].id,
-                                 root, yyvsp[-1].id);
+                                 "if (ARG != NULL) "
+                                  "g_object_ref (G_OBJECT (ARG)); "
+                                 "if (%s->%s != NULL) "
+                                  "g_object_unref (G_OBJECT (%s->%s)); "
+                                 "%s->%s = ARG;",
+                                 root, yyvsp[-2].id,
+                                 root, yyvsp[-2].id,
+                                 root, yyvsp[-2].id);
                        } else {
                                g_assert_not_reached();
                        }
 
                        } else {
                                g_assert_not_reached();
                        }
 
-                       if(strcmp(yyvsp[0].id, "stringlink")==0) {
-                               get = g_strdup_printf("ARG = g_strdup(%s->%s);", root, yyvsp[-1].id);
-                       } else
-                               /* For everything else, get is just straight assignment */
-                               get = g_strdup_printf("ARG = %s->%s;", root, yyvsp[-1].id);
-
-                       g_free(yyvsp[0].id);
-
-
-                       if(!type)
-                               type = copy_type(var->vtype);
-
-                       node = new_argument(yyvsp[-2].id, type, yyvsp[-3].list,
-                                           yyvsp[-1].id, get, yyvsp[-4].line,
-                                           set, yyvsp[-4].line, yyvsp[-4].line);
-                       class_nodes = g_list_append(class_nodes,node);
+                       get = g_strdup_printf("ARG = %s->%s;", root, yyvsp[-2].id);
+  
+                       g_free (yyvsp[0].id);
+
+                       if (type == NULL)
+                               type = (Type *)node_copy ((Node *)var->vtype);
+
+                       node = node_new (ARGUMENT_NODE,
+                                        "gtktype:steal", yyvsp[-3].id,
+                                        "atype:steal", type,
+                                        "flags:steal", yyvsp[-4].list,
+                                        "name:steal", yyvsp[-2].id,
+                                        "get:steal", get,
+                                        "get_line", yyvsp[-5].line,
+                                        "set:steal", set,
+                                        "set_line", yyvsp[-5].line,
+                                        "line_no", yyvsp[-5].line,
+                                        NULL);
+
+                       if (yyvsp[-1].id != NULL) {
+                               Argument *arg = (Argument *)node;
+                               export_accessors (arg->name,
+                                                 arg->get != NULL, arg->get_line,
+                                                 arg->set != NULL, arg->set_line,
+                                                 arg->atype,
+                                                 arg->gtktype,
+                                                 arg->line_no);
+                               g_free (yyvsp[-1].id);
+                       } 
+
+                       class_nodes = g_list_append (class_nodes, node);
                                                ;
     break;}
                                                ;
     break;}
-case 43:
-#line 609 "parse.y"
+case 45:
+#line 1015 "parse.y"
+{
+                       if (strcmp (yyvsp[-1].id, "export")!=0) {
+                               g_free (yyvsp[-1].id); 
+                               yyerror (_("parse error"));
+                               YYERROR;
+                       }
+                       yyval.id = yyvsp[-1].id;
+                                               ;
+    break;}
+case 46:
+#line 1023 "parse.y"
+{
+                       yyval.id = NULL;
+                                               ;
+    break;}
+case 47:
+#line 1028 "parse.y"
+{
+                       ensure_property ();
+                       node_set ((Node *)property,
+                                 "line_no", yyvsp[-10].line,
+                                 "gtktype:steal", debool (yyvsp[-9].id),
+                                 "name:steal", yyvsp[-8].id,
+                                 NULL);
+                       if (strcmp (yyvsp[-6].id, "get") == 0 &&
+                           strcmp (yyvsp[-3].id, "set") == 0) {
+                               node_set ((Node *)property,
+                                         "get:steal", (yyvsp[-4].cbuf)->str,
+                                         "get_line", yyvsp[-5].line,
+                                         "set:steal", (yyvsp[-1].cbuf)->str,
+                                         "set_line", yyvsp[-2].line,
+                                         NULL);
+                               g_string_free (yyvsp[-4].cbuf, FALSE);
+                               g_string_free (yyvsp[-1].cbuf, FALSE);
+                               g_free (yyvsp[-6].id); 
+                               g_free (yyvsp[-3].id);
+                       } else if (strcmp (yyvsp[-6].id, "set") == 0 &&
+                                  strcmp (yyvsp[-3].id, "get") == 0) {
+                               node_set ((Node *)property,
+                                         "get:steal", (yyvsp[-1].cbuf)->str,
+                                         "get_line", yyvsp[-2].line,
+                                         "set:steal", (yyvsp[-4].cbuf)->str,
+                                         "set_line", yyvsp[-5].line,
+                                         NULL);
+                               g_string_free (yyvsp[-4].cbuf, FALSE);
+                               g_string_free (yyvsp[-1].cbuf, FALSE);
+                               g_free (yyvsp[-6].id); 
+                               g_free (yyvsp[-3].id);
+                       } else {
+                               g_string_free (yyvsp[-4].cbuf, TRUE);
+                               g_string_free (yyvsp[-1].cbuf, TRUE);
+                               g_free (yyvsp[-6].id); 
+                               g_free (yyvsp[-3].id);
+                               node_free ((Node *)property);
+                               property = NULL;
+                               yyerror (_("parse error"));
+                               YYERROR;
+                       }
+                       property_link_and_export ((Node *)property);
+                       if (property != NULL) {
+                               class_nodes = g_list_append (class_nodes,
+                                                            property);
+                               property = NULL;
+                       }
+               ;
+    break;}
+case 48:
+#line 1076 "parse.y"
+{
+                       ensure_property ();
+                       node_set ((Node *)property,
+                                 "line_no", yyvsp[-7].line,
+                                 "gtktype:steal", debool (yyvsp[-6].id),
+                                 "name:steal", yyvsp[-5].id,
+                                 NULL);
+                       if (strcmp (yyvsp[-3].id, "get") == 0) {
+                               node_set ((Node *)property,
+                                         "get:steal", (yyvsp[-1].cbuf)->str,
+                                         "get_line", yyvsp[-2].line,
+                                         NULL);
+                               g_string_free (yyvsp[-1].cbuf, FALSE);
+                               g_free (yyvsp[-3].id); 
+                       } else if (strcmp (yyvsp[-3].id, "set") == 0) {
+                               node_set ((Node *)property,
+                                         "set:steal", (yyvsp[-1].cbuf)->str,
+                                         "set_line", yyvsp[-2].line,
+                                         NULL);
+                               g_string_free (yyvsp[-1].cbuf, FALSE);
+                               g_free (yyvsp[-3].id); 
+                       } else {
+                               g_string_free (yyvsp[-1].cbuf, TRUE);
+                               g_free (yyvsp[-3].id); 
+                               node_free ((Node *)property);
+                               property = NULL;
+                               yyerror (_("parse error"));
+                               YYERROR;
+                       }
+                       property_link_and_export ((Node *)property);
+                       if (property != NULL) {
+                               class_nodes = g_list_append (class_nodes,
+                                                            property);
+                               property = NULL;
+                       }
+               ;
+    break;}
+case 49:
+#line 1112 "parse.y"
+{
+                       ensure_property ();
+                       node_set ((Node *)property,
+                                 "line_no", yyvsp[-4].line,
+                                 "gtktype:steal", debool (yyvsp[-3].id),
+                                 "name:steal", yyvsp[-2].id,
+                                 NULL);
+                       property_link_and_export ((Node *)property);
+                       if (property != NULL) {
+                               class_nodes = g_list_append (class_nodes,
+                                                            property);
+                               property = NULL;
+                       }
+               ;
+    break;}
+case 50:
+#line 1128 "parse.y"
+{ ; ;
+    break;}
+case 51:
+#line 1129 "parse.y"
+{ ; ;
+    break;}
+case 52:
+#line 1132 "parse.y"
+{ ; ;
+    break;}
+case 53:
+#line 1133 "parse.y"
+{ ; ;
+    break;}
+case 54:
+#line 1136 "parse.y"
+{ yyval.id = yyvsp[0].id; ;
+    break;}
+case 55:
+#line 1137 "parse.y"
+{
+                       if (strcmp (yyvsp[-3].id, "_") != 0) {
+                               g_free (yyvsp[-3].id);
+                               yyerror(_("parse error"));
+                               YYERROR;
+                       }
+                       g_free (yyvsp[-3].id);
+                       yyval.id = g_strconcat ("_(", yyvsp[-1].id, ")", NULL);
+                       g_free (yyvsp[-1].id);
+               ;
+    break;}
+case 56:
+#line 1149 "parse.y"
+{ yyval.id = yyvsp[0].id; ;
+    break;}
+case 57:
+#line 1150 "parse.y"
+{ yyval.id = yyvsp[0].id; ;
+    break;}
+case 58:
+#line 1153 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "nick:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 59:
+#line 1159 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "blurb:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 60:
+#line 1165 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "maximum:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 61:
+#line 1171 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "minimum:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 62:
+#line 1177 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "default_value:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 63:
+#line 1183 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "flags:steal", yyvsp[0].list,
+                         NULL);
+                 ;
+    break;}
+case 64:
+#line 1189 "parse.y"
+{
+               Type *type = pop_type ();
+               ensure_property ();
+               node_set ((Node *)property,
+                         "ptype:steal", type,
+                         NULL);
+                 ;
+    break;}
+case 65:
+#line 1196 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 66:
+#line 1202 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 67:
+#line 1208 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 68:
+#line 1214 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 69:
+#line 1220 "parse.y"
+{
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", yyvsp[0].id,
+                         NULL);
+                 ;
+    break;}
+case 70:
+#line 1226 "parse.y"
+{
+               ensure_property ();
+               if (strcmp (yyvsp[0].id, "link") == 0) {
+                       g_free(yyvsp[0].id);
+                       node_set ((Node *)property,
+                                 "link", TRUE,
+                                 NULL);
+               } else if (strcmp (yyvsp[0].id, "export") == 0) {
+                       g_free(yyvsp[0].id);
+                       node_set ((Node *)property,
+                                 "export", TRUE,
+                                 NULL);
+               } else {
+                       g_free(yyvsp[0].id);
+                       yyerror(_("parse error"));
+                       YYERROR;
+               }
+                 ;
+    break;}
+case 71:
+#line 1246 "parse.y"
 {
                        if(strcmp(yyvsp[-2].id,"type")!=0) {
                                g_free(yyvsp[-4].id);
 {
                        if(strcmp(yyvsp[-2].id,"type")!=0) {
                                g_free(yyvsp[-4].id);
@@ -1622,218 +2399,223 @@ case 43:
                                yyerror(_("parse error"));
                                YYERROR;
                        }
                                yyerror(_("parse error"));
                                YYERROR;
                        }
-                       yyval.id = yyvsp[-4].id;
+                       yyval.id = debool (yyvsp[-4].id);
                                                ;
     break;}
                                                ;
     break;}
-case 44:
-#line 618 "parse.y"
+case 72:
+#line 1255 "parse.y"
 {
 {
-                       yyval.id = yyvsp[0].id;
+                       yyval.id = debool (yyvsp[0].id);
                        typestack = g_list_prepend(typestack,NULL);
                                                ;
     break;}
                        typestack = g_list_prepend(typestack,NULL);
                                                ;
     break;}
-case 45:
-#line 624 "parse.y"
+case 73:
+#line 1261 "parse.y"
 { yyval.list = yyvsp[-1].list; ;
     break;}
 { yyval.list = yyvsp[-1].list; ;
     break;}
-case 46:
-#line 625 "parse.y"
+case 74:
+#line 1262 "parse.y"
 { yyval.list = NULL; ;
     break;}
 { yyval.list = NULL; ;
     break;}
-case 47:
-#line 628 "parse.y"
+case 75:
+#line 1265 "parse.y"
 {
                        yyval.list = g_list_append(yyvsp[0].list,yyvsp[-2].id);
                                                ;
     break;}
 {
                        yyval.list = g_list_append(yyvsp[0].list,yyvsp[-2].id);
                                                ;
     break;}
-case 48:
-#line 631 "parse.y"
+case 76:
+#line 1268 "parse.y"
 {
                        yyval.list = g_list_append(NULL,yyvsp[0].id);
                                                ;
     break;}
 {
                        yyval.list = g_list_append(NULL,yyvsp[0].id);
                                                ;
     break;}
-case 49:
-#line 637 "parse.y"
+case 77:
+#line 1274 "parse.y"
 {
 {
-                       Node *node = new_type(yyvsp[-1].id, yyvsp[0].id, NULL);
+                       Node *node = node_new (TYPE_NODE, 
+                                              "name:steal", yyvsp[-1].id,
+                                              "pointer:steal", yyvsp[0].id,
+                                              NULL);
                        typestack = g_list_prepend(typestack,node);
                                                        ;
     break;}
                        typestack = g_list_prepend(typestack,node);
                                                        ;
     break;}
-case 50:
-#line 641 "parse.y"
+case 78:
+#line 1281 "parse.y"
 {
 {
-                       Node *node = new_type(yyvsp[0].id, NULL, NULL);
+                       Node *node = node_new (TYPE_NODE, 
+                                              "name:steal", yyvsp[0].id,
+                                              NULL);
                        typestack = g_list_prepend(typestack,node);
                                                        ;
     break;}
                        typestack = g_list_prepend(typestack,node);
                                                        ;
     break;}
-case 51:
-#line 648 "parse.y"
+case 79:
+#line 1290 "parse.y"
 {
                        yyval.id = yyvsp[0].id;
                                                        ;
     break;}
 {
                        yyval.id = yyvsp[0].id;
                                                        ;
     break;}
-case 52:
-#line 651 "parse.y"
+case 80:
+#line 1293 "parse.y"
 {
                        yyval.id = yyvsp[0].id;
                                                        ;
     break;}
 {
                        yyval.id = yyvsp[0].id;
                                                        ;
     break;}
-case 53:
-#line 654 "parse.y"
+case 81:
+#line 1296 "parse.y"
 {
                        yyval.id = g_strconcat("const ", yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat("const ", yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
-case 54:
-#line 658 "parse.y"
+case 82:
+#line 1300 "parse.y"
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " const", NULL);
                        g_free(yyvsp[-1].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " const", NULL);
                        g_free(yyvsp[-1].id);
                                                        ;
     break;}
-case 55:
-#line 662 "parse.y"
+case 83:
+#line 1304 "parse.y"
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " ", yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " ", yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
-case 56:
-#line 666 "parse.y"
+case 84:
+#line 1308 "parse.y"
 {
                        yyval.id = g_strconcat("const ", yyvsp[-1].id, " ",
                                             yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat("const ", yyvsp[-1].id, " ",
                                             yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
-case 57:
-#line 671 "parse.y"
+case 85:
+#line 1313 "parse.y"
 {
                        yyval.id = g_strconcat(yyvsp[-2].id, " ",
                                             yyvsp[-1].id, " const", NULL);
                        g_free(yyvsp[-1].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat(yyvsp[-2].id, " ",
                                             yyvsp[-1].id, " const", NULL);
                        g_free(yyvsp[-1].id);
                                                        ;
     break;}
-case 58:
-#line 679 "parse.y"
+case 86:
+#line 1321 "parse.y"
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " ", yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " ", yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
-case 59:
-#line 683 "parse.y"
+case 87:
+#line 1325 "parse.y"
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " ", yyvsp[0].id, NULL);
                        g_free(yyvsp[-1].id);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " ", yyvsp[0].id, NULL);
                        g_free(yyvsp[-1].id);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
-case 60:
-#line 688 "parse.y"
+case 88:
+#line 1330 "parse.y"
 {
                        yyval.id = g_strconcat("const ", yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat("const ", yyvsp[0].id, NULL);
                        g_free(yyvsp[0].id);
                                                        ;
     break;}
-case 61:
-#line 692 "parse.y"
+case 89:
+#line 1334 "parse.y"
 {
                        yyval.id = yyvsp[0].id;
                                                        ;
     break;}
 {
                        yyval.id = yyvsp[0].id;
                                                        ;
     break;}
-case 62:
-#line 695 "parse.y"
+case 90:
+#line 1337 "parse.y"
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " const", NULL);
                        g_free(yyvsp[-1].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " const", NULL);
                        g_free(yyvsp[-1].id);
                                                        ;
     break;}
-case 63:
-#line 699 "parse.y"
+case 91:
+#line 1341 "parse.y"
 {
                        yyval.id = g_strdup(yyvsp[0].id);
                                                        ;
     break;}
 {
                        yyval.id = g_strdup(yyvsp[0].id);
                                                        ;
     break;}
-case 64:
-#line 702 "parse.y"
+case 92:
+#line 1344 "parse.y"
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " const", NULL);
                                                        ;
     break;}
 {
                        yyval.id = g_strconcat(yyvsp[-1].id, " const", NULL);
                                                        ;
     break;}
-case 65:
-#line 707 "parse.y"
+case 93:
+#line 1349 "parse.y"
 { yyval.id = "void"; ;
     break;}
 { yyval.id = "void"; ;
     break;}
-case 66:
-#line 708 "parse.y"
+case 94:
+#line 1350 "parse.y"
 { yyval.id = "char"; ;
     break;}
 { yyval.id = "char"; ;
     break;}
-case 67:
-#line 709 "parse.y"
+case 95:
+#line 1351 "parse.y"
 { yyval.id = "short"; ;
     break;}
 { yyval.id = "short"; ;
     break;}
-case 68:
-#line 710 "parse.y"
+case 96:
+#line 1352 "parse.y"
 { yyval.id = "int"; ;
     break;}
 { yyval.id = "int"; ;
     break;}
-case 69:
-#line 711 "parse.y"
+case 97:
+#line 1353 "parse.y"
 { yyval.id = "long"; ;
     break;}
 { yyval.id = "long"; ;
     break;}
-case 70:
-#line 712 "parse.y"
+case 98:
+#line 1354 "parse.y"
 { yyval.id = "float"; ;
     break;}
 { yyval.id = "float"; ;
     break;}
-case 71:
-#line 713 "parse.y"
+case 99:
+#line 1355 "parse.y"
 { yyval.id = "double"; ;
     break;}
 { yyval.id = "double"; ;
     break;}
-case 72:
-#line 714 "parse.y"
+case 100:
+#line 1356 "parse.y"
 { yyval.id = "signed"; ;
     break;}
 { yyval.id = "signed"; ;
     break;}
-case 73:
-#line 715 "parse.y"
+case 101:
+#line 1357 "parse.y"
 { yyval.id = "unsigned"; ;
     break;}
 { yyval.id = "unsigned"; ;
     break;}
-case 74:
-#line 718 "parse.y"
+case 102:
+#line 1360 "parse.y"
 { yyval.id = "struct"; ;
     break;}
 { yyval.id = "struct"; ;
     break;}
-case 75:
-#line 719 "parse.y"
+case 103:
+#line 1361 "parse.y"
 { yyval.id = "union"; ;
     break;}
 { yyval.id = "union"; ;
     break;}
-case 76:
-#line 720 "parse.y"
+case 104:
+#line 1362 "parse.y"
 { yyval.id = "enum"; ;
     break;}
 { yyval.id = "enum"; ;
     break;}
-case 77:
-#line 723 "parse.y"
+case 105:
+#line 1365 "parse.y"
 { yyval.id = g_strdup("*"); ;
     break;}
 { yyval.id = g_strdup("*"); ;
     break;}
-case 78:
-#line 724 "parse.y"
+case 106:
+#line 1366 "parse.y"
 { yyval.id = g_strdup("* const"); ;
     break;}
 { yyval.id = g_strdup("* const"); ;
     break;}
-case 79:
-#line 725 "parse.y"
+case 107:
+#line 1367 "parse.y"
 {
                                yyval.id = g_strconcat("*", yyvsp[0].id, NULL);
                                g_free(yyvsp[0].id);
                                        ;
     break;}
 {
                                yyval.id = g_strconcat("*", yyvsp[0].id, NULL);
                                g_free(yyvsp[0].id);
                                        ;
     break;}
-case 80:
-#line 729 "parse.y"
+case 108:
+#line 1371 "parse.y"
 {
                                yyval.id = g_strconcat("* const", yyvsp[0].id, NULL);
                                g_free(yyvsp[0].id);
                                        ;
     break;}
 {
                                yyval.id = g_strconcat("* const", yyvsp[0].id, NULL);
                                g_free(yyvsp[0].id);
                                        ;
     break;}
-case 81:
-#line 736 "parse.y"
+case 109:
+#line 1378 "parse.y"
 {
                        if(strcmp(yyvsp[-1].id, "first")==0)
                                yyval.sigtype = SIGNAL_FIRST_METHOD;
 {
                        if(strcmp(yyvsp[-1].id, "first")==0)
                                yyval.sigtype = SIGNAL_FIRST_METHOD;
@@ -1847,14 +2629,14 @@ case 81:
                        g_free(yyvsp[-1].id);
                                        ;
     break;}
                        g_free(yyvsp[-1].id);
                                        ;
     break;}
-case 82:
-#line 748 "parse.y"
+case 110:
+#line 1390 "parse.y"
 {
                        yyval.sigtype = SIGNAL_LAST_METHOD;
                                        ;
     break;}
 {
                        yyval.sigtype = SIGNAL_LAST_METHOD;
                                        ;
     break;}
-case 83:
-#line 754 "parse.y"
+case 111:
+#line 1396 "parse.y"
 {
                        if(strcmp(yyvsp[-1].id,"first")==0)
                                yyval.sigtype = SIGNAL_FIRST_METHOD;
 {
                        if(strcmp(yyvsp[-1].id,"first")==0)
                                yyval.sigtype = SIGNAL_FIRST_METHOD;
@@ -1868,8 +2650,8 @@ case 83:
                        g_free(yyvsp[-1].id);
                                        ;
     break;}
                        g_free(yyvsp[-1].id);
                                        ;
     break;}
-case 84:
-#line 766 "parse.y"
+case 112:
+#line 1408 "parse.y"
 {
                        if(strcmp(yyvsp[-2].id,"first")==0)
                                yyval.sigtype = SIGNAL_FIRST_METHOD;
 {
                        if(strcmp(yyvsp[-2].id,"first")==0)
                                yyval.sigtype = SIGNAL_FIRST_METHOD;
@@ -1883,47 +2665,47 @@ case 84:
                        g_free(yyvsp[-2].id);
                                        ;
     break;}
                        g_free(yyvsp[-2].id);
                                        ;
     break;}
-case 85:
-#line 778 "parse.y"
+case 113:
+#line 1420 "parse.y"
 {
                        yyval.sigtype = SIGNAL_LAST_METHOD;
                                        ;
     break;}
 {
                        yyval.sigtype = SIGNAL_LAST_METHOD;
                                        ;
     break;}
-case 86:
-#line 781 "parse.y"
+case 114:
+#line 1423 "parse.y"
 {
                        /* the_scope was default thus public */
                        the_scope = PUBLIC_SCOPE;
                                        ;
     break;}
 {
                        /* the_scope was default thus public */
                        the_scope = PUBLIC_SCOPE;
                                        ;
     break;}
-case 87:
-#line 787 "parse.y"
+case 115:
+#line 1429 "parse.y"
 {
 {
-                       gtktypes = g_list_prepend(gtktypes, yyvsp[-3].id);
+                       gtktypes = g_list_prepend(gtktypes, debool (yyvsp[-3].id));
                                                ;
     break;}
                                                ;
     break;}
-case 88:
-#line 792 "parse.y"
+case 116:
+#line 1434 "parse.y"
 {
 {
-                       gtktypes = g_list_append(gtktypes, yyvsp[0].id);
+                       gtktypes = g_list_append(gtktypes, debool (yyvsp[0].id));
                                                ;
     break;}
                                                ;
     break;}
-case 89:
-#line 795 "parse.y"
+case 117:
+#line 1437 "parse.y"
 { 
 { 
-                       gtktypes = g_list_append(gtktypes, yyvsp[0].id);
+                       gtktypes = g_list_append(gtktypes, debool (yyvsp[0].id));
                                                        ;
     break;}
                                                        ;
     break;}
-case 90:
-#line 800 "parse.y"
+case 118:
+#line 1442 "parse.y"
 { yyval.cbuf = yyvsp[0].cbuf; ;
     break;}
 { yyval.cbuf = yyvsp[0].cbuf; ;
     break;}
-case 91:
-#line 801 "parse.y"
+case 119:
+#line 1443 "parse.y"
 { yyval.cbuf = NULL; ;
     break;}
 { yyval.cbuf = NULL; ;
     break;}
-case 92:
-#line 805 "parse.y"
+case 120:
+#line 1447 "parse.y"
 {
                        if(!has_self) {
                                yyerror(_("signal without 'self' as "
 {
                        if(!has_self) {
                                yyerror(_("signal without 'self' as "
@@ -1941,8 +2723,8 @@ case 92:
                                      ccode_line, vararg, yyvsp[-8].list);
                                                                        ;
     break;}
                                      ccode_line, vararg, yyvsp[-8].list);
                                                                        ;
     break;}
-case 93:
-#line 821 "parse.y"
+case 121:
+#line 1463 "parse.y"
 {
                        if(!has_self) {
                                yyerror(_("signal without 'self' as "
 {
                        if(!has_self) {
                                yyerror(_("signal without 'self' as "
@@ -1960,8 +2742,8 @@ case 93:
                                      ccode_line, vararg, yyvsp[-8].list);
                                                                        ;
     break;}
                                      ccode_line, vararg, yyvsp[-8].list);
                                                                        ;
     break;}
-case 94:
-#line 837 "parse.y"
+case 122:
+#line 1479 "parse.y"
 {
                        if(!has_self) {
                                yyerror(_("virtual method without 'self' as "
 {
                        if(!has_self) {
                                yyerror(_("virtual method without 'self' as "
@@ -1979,8 +2761,8 @@ case 94:
                                      ccode_line, vararg, NULL);
                                                                        ;
     break;}
                                      ccode_line, vararg, NULL);
                                                                        ;
     break;}
-case 95:
-#line 853 "parse.y"
+case 123:
+#line 1495 "parse.y"
 {
                        if(!has_self) {
                                yyerror(_("virtual method without 'self' as "
 {
                        if(!has_self) {
                                yyerror(_("virtual method without 'self' as "
@@ -1998,8 +2780,8 @@ case 95:
                                      ccode_line, vararg, NULL);
                                                                        ;
     break;}
                                      ccode_line, vararg, NULL);
                                                                        ;
     break;}
-case 96:
-#line 869 "parse.y"
+case 124:
+#line 1511 "parse.y"
 {
                        if(!has_self) {
                                yyerror(_("virtual method without 'self' as "
 {
                        if(!has_self) {
                                yyerror(_("virtual method without 'self' as "
@@ -2012,8 +2794,8 @@ case 96:
                                      ccode_line, vararg, NULL);
                                                                        ;
     break;}
                                      ccode_line, vararg, NULL);
                                                                        ;
     break;}
-case 97:
-#line 880 "parse.y"
+case 125:
+#line 1522 "parse.y"
 {
                        push_function(NO_SCOPE, OVERRIDE_METHOD, yyvsp[-8].id,
                                      yyvsp[-5].id, yyvsp[0].cbuf,
 {
                        push_function(NO_SCOPE, OVERRIDE_METHOD, yyvsp[-8].id,
                                      yyvsp[-5].id, yyvsp[0].cbuf,
@@ -2021,8 +2803,8 @@ case 97:
                                      vararg, NULL);
                                                                        ;
     break;}
                                      vararg, NULL);
                                                                        ;
     break;}
-case 98:
-#line 886 "parse.y"
+case 126:
+#line 1528 "parse.y"
 {
                        if(the_scope == CLASS_SCOPE) {
                                yyerror(_("a method cannot be of class scope"));
 {
                        if(the_scope == CLASS_SCOPE) {
                                yyerror(_("a method cannot be of class scope"));
@@ -2034,8 +2816,8 @@ case 98:
                                      vararg, NULL);
                                                                ;
     break;}
                                      vararg, NULL);
                                                                ;
     break;}
-case 99:
-#line 896 "parse.y"
+case 127:
+#line 1538 "parse.y"
 {
                        if(strcmp(yyvsp[-4].id, "init")==0) {
                                push_init_arg(yyvsp[-2].id,FALSE);
 {
                        if(strcmp(yyvsp[-4].id, "init")==0) {
                                push_init_arg(yyvsp[-2].id,FALSE);
@@ -2058,8 +2840,8 @@ case 99:
                        }
                                                ;
     break;}
                        }
                                                ;
     break;}
-case 100:
-#line 919 "parse.y"
+case 128:
+#line 1561 "parse.y"
 {
                        g_free(onerror); onerror = NULL;
                        g_free(defreturn); defreturn = NULL;
 {
                        g_free(onerror); onerror = NULL;
                        g_free(defreturn); defreturn = NULL;
@@ -2072,8 +2854,8 @@ case 100:
                        g_free(yyvsp[-1].id);
                                        ;
     break;}
                        g_free(yyvsp[-1].id);
                                        ;
     break;}
-case 101:
-#line 930 "parse.y"
+case 129:
+#line 1572 "parse.y"
 {
                        g_free(onerror); onerror = NULL;
                        g_free(defreturn); defreturn = NULL;
 {
                        g_free(onerror); onerror = NULL;
                        g_free(defreturn); defreturn = NULL;
@@ -2094,30 +2876,30 @@ case 101:
                        g_free(yyvsp[-1].id);
                                                ;
     break;}
                        g_free(yyvsp[-1].id);
                                                ;
     break;}
-case 102:
-#line 949 "parse.y"
+case 130:
+#line 1591 "parse.y"
 {
                        g_free(onerror); onerror = NULL;
                        g_free(defreturn); defreturn = NULL;
                                        ;
     break;}
 {
                        g_free(onerror); onerror = NULL;
                        g_free(defreturn); defreturn = NULL;
                                        ;
     break;}
-case 103:
-#line 955 "parse.y"
+case 131:
+#line 1597 "parse.y"
 { yyval.id = yyvsp[0].id; ;
     break;}
 { yyval.id = yyvsp[0].id; ;
     break;}
-case 104:
-#line 956 "parse.y"
+case 132:
+#line 1598 "parse.y"
 {
                        yyval.id = (yyvsp[1].cbuf)->str;
                        g_string_free(yyvsp[1].cbuf, FALSE);
                                        ;
     break;}
 {
                        yyval.id = (yyvsp[1].cbuf)->str;
                        g_string_free(yyvsp[1].cbuf, FALSE);
                                        ;
     break;}
-case 105:
-#line 962 "parse.y"
+case 133:
+#line 1604 "parse.y"
 { vararg = FALSE; has_self = FALSE; ;
     break;}
 { vararg = FALSE; has_self = FALSE; ;
     break;}
-case 106:
-#line 963 "parse.y"
+case 134:
+#line 1605 "parse.y"
 {
                        vararg = FALSE;
                        has_self = TRUE;
 {
                        vararg = FALSE;
                        has_self = TRUE;
@@ -2130,8 +2912,8 @@ case 106:
                        }
                                                ;
     break;}
                        }
                                                ;
     break;}
-case 107:
-#line 974 "parse.y"
+case 135:
+#line 1616 "parse.y"
 {
                        vararg = FALSE;
                        has_self = TRUE;
 {
                        vararg = FALSE;
                        has_self = TRUE;
@@ -2144,8 +2926,8 @@ case 107:
                        }
                                                ;
     break;}
                        }
                                                ;
     break;}
-case 108:
-#line 985 "parse.y"
+case 136:
+#line 1627 "parse.y"
 {
                        vararg = FALSE;
                        has_self = TRUE;
 {
                        vararg = FALSE;
                        has_self = TRUE;
@@ -2158,8 +2940,8 @@ case 108:
                        }
                                                ;
     break;}
                        }
                                                ;
     break;}
-case 109:
-#line 996 "parse.y"
+case 137:
+#line 1638 "parse.y"
 {
                        has_self = TRUE;
                        if(strcmp(yyvsp[-2].id,"self")==0)
 {
                        has_self = TRUE;
                        if(strcmp(yyvsp[-2].id,"self")==0)
@@ -2171,8 +2953,8 @@ case 109:
                        }
                                        ;
     break;}
                        }
                                        ;
     break;}
-case 110:
-#line 1006 "parse.y"
+case 138:
+#line 1648 "parse.y"
 {
                        has_self = TRUE;
                        if(strcmp(yyvsp[-3].id,"self")==0)
 {
                        has_self = TRUE;
                        if(strcmp(yyvsp[-3].id,"self")==0)
@@ -2184,8 +2966,8 @@ case 110:
                        }
                                        ;
     break;}
                        }
                                        ;
     break;}
-case 111:
-#line 1016 "parse.y"
+case 139:
+#line 1658 "parse.y"
 {
                        has_self = TRUE;
                        if(strcmp(yyvsp[-2].id,"self")==0)
 {
                        has_self = TRUE;
                        if(strcmp(yyvsp[-2].id,"self")==0)
@@ -2197,40 +2979,40 @@ case 111:
                        }
                                        ;
     break;}
                        }
                                        ;
     break;}
-case 112:
-#line 1026 "parse.y"
+case 140:
+#line 1668 "parse.y"
 { has_self = FALSE; ;
     break;}
 { has_self = FALSE; ;
     break;}
-case 113:
-#line 1029 "parse.y"
+case 141:
+#line 1671 "parse.y"
 { vararg = TRUE; ;
     break;}
 { vararg = TRUE; ;
     break;}
-case 114:
-#line 1030 "parse.y"
+case 142:
+#line 1672 "parse.y"
 { vararg = FALSE; ;
     break;}
 { vararg = FALSE; ;
     break;}
-case 115:
-#line 1033 "parse.y"
+case 143:
+#line 1675 "parse.y"
 { ; ;
     break;}
 { ; ;
     break;}
-case 116:
-#line 1034 "parse.y"
+case 144:
+#line 1676 "parse.y"
 { ; ;
     break;}
 { ; ;
     break;}
-case 117:
-#line 1037 "parse.y"
+case 145:
+#line 1679 "parse.y"
 {
                        push_funcarg(yyvsp[0].id,NULL);
                                                                ;
     break;}
 {
                        push_funcarg(yyvsp[0].id,NULL);
                                                                ;
     break;}
-case 118:
-#line 1040 "parse.y"
+case 146:
+#line 1682 "parse.y"
 {
                        push_funcarg(yyvsp[-1].id,yyvsp[0].id);
                                                                ;
     break;}
 {
                        push_funcarg(yyvsp[-1].id,yyvsp[0].id);
                                                                ;
     break;}
-case 119:
-#line 1043 "parse.y"
+case 147:
+#line 1685 "parse.y"
 {
                        if(strcmp(yyvsp[-2].id,"check")!=0) {
                                yyerror(_("parse error"));
 {
                        if(strcmp(yyvsp[-2].id,"check")!=0) {
                                yyerror(_("parse error"));
@@ -2240,8 +3022,8 @@ case 119:
                        push_funcarg(yyvsp[-4].id,NULL);
                                                                ;
     break;}
                        push_funcarg(yyvsp[-4].id,NULL);
                                                                ;
     break;}
-case 120:
-#line 1051 "parse.y"
+case 148:
+#line 1693 "parse.y"
 {
                        if(strcmp(yyvsp[-2].id,"check")!=0) {
                                yyerror(_("parse error"));
 {
                        if(strcmp(yyvsp[-2].id,"check")!=0) {
                                yyerror(_("parse error"));
@@ -2251,22 +3033,26 @@ case 120:
                        push_funcarg(yyvsp[-5].id,yyvsp[-4].id);
                                                                ;
     break;}
                        push_funcarg(yyvsp[-5].id,yyvsp[-4].id);
                                                                ;
     break;}
-case 121:
-#line 1061 "parse.y"
+case 149:
+#line 1703 "parse.y"
 { ; ;
     break;}
 { ; ;
     break;}
-case 122:
-#line 1062 "parse.y"
+case 150:
+#line 1704 "parse.y"
 { ; ;
     break;}
 { ; ;
     break;}
-case 123:
-#line 1065 "parse.y"
+case 151:
+#line 1707 "parse.y"
 {
                        if(strcmp(yyvsp[0].id,"type")==0) {
 {
                        if(strcmp(yyvsp[0].id,"type")==0) {
-                               Node *node = new_check(TYPE_CHECK,NULL);
+                               Node *node = node_new (CHECK_NODE,
+                                                      "chtype", TYPE_CHECK,
+                                                      NULL);
                                checks = g_list_append(checks,node);
                        } else if(strcmp(yyvsp[0].id,"null")==0) {
                                checks = g_list_append(checks,node);
                        } else if(strcmp(yyvsp[0].id,"null")==0) {
-                               Node *node = new_check(NULL_CHECK,NULL);
+                               Node *node = node_new (CHECK_NODE,
+                                                      "chtype", NULL_CHECK,
+                                                      NULL);
                                checks = g_list_append(checks,node);
                        } else {
                                yyerror(_("parse error"));
                                checks = g_list_append(checks,node);
                        } else {
                                yyerror(_("parse error"));
@@ -2275,61 +3061,83 @@ case 123:
                        g_free(yyvsp[0].id);
                                        ;
     break;}
                        g_free(yyvsp[0].id);
                                        ;
     break;}
-case 124:
-#line 1078 "parse.y"
+case 152:
+#line 1724 "parse.y"
 {
 {
-                       Node *node = new_check(GT_CHECK,yyvsp[0].id);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", GT_CHECK,
+                                              "number:steal", yyvsp[0].id,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 125:
-#line 1082 "parse.y"
+case 153:
+#line 1731 "parse.y"
 {
 {
-                       Node *node = new_check(LT_CHECK,yyvsp[0].id);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", LT_CHECK,
+                                              "number:steal", yyvsp[0].id,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 126:
-#line 1086 "parse.y"
+case 154:
+#line 1738 "parse.y"
 {
 {
-                       Node *node = new_check(GE_CHECK,yyvsp[0].id);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", GE_CHECK,
+                                              "number:steal", yyvsp[0].id,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 127:
-#line 1090 "parse.y"
+case 155:
+#line 1745 "parse.y"
 {
 {
-                       Node *node = new_check(LE_CHECK,yyvsp[0].id);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", LE_CHECK,
+                                              "number:steal", yyvsp[0].id,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 128:
-#line 1094 "parse.y"
+case 156:
+#line 1752 "parse.y"
 {
 {
-                       Node *node = new_check(EQ_CHECK,yyvsp[0].id);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", EQ_CHECK,
+                                              "number:steal", yyvsp[0].id,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 129:
-#line 1098 "parse.y"
+case 157:
+#line 1759 "parse.y"
 {
 {
-                       Node *node = new_check(NE_CHECK,yyvsp[0].id);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", NE_CHECK,
+                                              "number:steal", yyvsp[0].id,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        ;
     break;}
                        checks = g_list_append(checks,node);
                                        ;
     break;}
-case 130:
-#line 1104 "parse.y"
+case 158:
+#line 1768 "parse.y"
 { yyval.id = yyvsp[0].id; ;
     break;}
 { yyval.id = yyvsp[0].id; ;
     break;}
-case 131:
-#line 1105 "parse.y"
+case 159:
+#line 1769 "parse.y"
 {
                        yyval.id = g_strconcat("-",yyvsp[0].id,NULL);
                        g_free(yyvsp[0].id);
                                        ;
     break;}
 {
                        yyval.id = g_strconcat("-",yyvsp[0].id,NULL);
                        g_free(yyvsp[0].id);
                                        ;
     break;}
-case 132:
-#line 1109 "parse.y"
+case 160:
+#line 1773 "parse.y"
+{ yyval.id = yyvsp[0].id; ;
+    break;}
+case 161:
+#line 1774 "parse.y"
 { yyval.id = yyvsp[0].id; ;
     break;}
 }
 { yyval.id = yyvsp[0].id; ;
     break;}
 }
@@ -2554,5 +3362,5 @@ yyerrhandle:
     }
   return 1;
 }
     }
   return 1;
 }
-#line 1112 "parse.y"
+#line 1777 "parse.y"
 
 
diff --git a/src/parse.h b/src/parse.h
new file mode 100644 (file)
index 0000000..6ebbe8d
--- /dev/null
@@ -0,0 +1,59 @@
+typedef union {
+       char *id;
+       GString *cbuf;
+       GList *list;
+       int line;
+       int sigtype;
+} YYSTYPE;
+#define        CLASS   257
+#define        FROM    258
+#define        CONST   259
+#define        VOID    260
+#define        STRUCT  261
+#define        UNION   262
+#define        ENUM    263
+#define        THREEDOTS       264
+#define        SIGNED  265
+#define        UNSIGNED        266
+#define        LONG    267
+#define        SHORT   268
+#define        INT     269
+#define        FLOAT   270
+#define        DOUBLE  271
+#define        CHAR    272
+#define        TOKEN   273
+#define        NUMBER  274
+#define        TYPETOKEN       275
+#define        ARRAY_DIM       276
+#define        SINGLE_CHAR     277
+#define        CCODE   278
+#define        HTCODE  279
+#define        PHCODE  280
+#define        HCODE   281
+#define        ACODE   282
+#define        ATCODE  283
+#define        STRING  284
+#define        PUBLIC  285
+#define        PRIVATE 286
+#define        PROTECTED       287
+#define        CLASSWIDE       288
+#define        PROPERTY        289
+#define        ARGUMENT        290
+#define        VIRTUAL 291
+#define        SIGNAL  292
+#define        OVERRIDE        293
+#define        NICK    294
+#define        BLURB   295
+#define        MAXIMUM 296
+#define        MINIMUM 297
+#define        DEFAULT_VALUE   298
+#define        FLAGS   299
+#define        TYPE    300
+#define        FLAGS_TYPE      301
+#define        ENUM_TYPE       302
+#define        PARAM_TYPE      303
+#define        BOXED_TYPE      304
+#define        OBJECT_TYPE     305
+
+
+extern YYSTYPE yylval;
index ba4615b50c16a3f04f5c22a23c307be3d8799ceb..36f9abc19c338fbb3e39e42edcab411bae14743d 100644 (file)
@@ -1,5 +1,6 @@
 /* GOB C Preprocessor
 /* GOB C Preprocessor
- * Copyright (C) 1999 the Free Software Foundation.
+ * Copyright (C) 1999-2000 the Free Software Foundation.
+ * Copyright (C) 2001 George Lebl
  *
  * Author: George Lebl
  *
  *
  * Author: George Lebl
  *
@@ -36,15 +37,18 @@ GList *nodes = NULL;
 
 static GList *class_nodes = NULL;
 Node *class = NULL;
 
 static GList *class_nodes = NULL;
 Node *class = NULL;
-char *chunk_size = NULL;
 
 
+static char *chunk_size = NULL;
+static char *bonobo_x_class = NULL;
 static GList *typestack = NULL;
 static GList *funcargs = NULL;
 static GList *checks = NULL;
 static int has_self = FALSE;
 static int vararg = FALSE;
 static GList *typestack = NULL;
 static GList *funcargs = NULL;
 static GList *checks = NULL;
 static int has_self = FALSE;
 static int vararg = FALSE;
+static Method *last_added_method = NULL;
 
 /* destructor and initializer for variables */
 
 /* destructor and initializer for variables */
+static gboolean destructor_unref = FALSE;
 static char *destructor = NULL;
 static int destructor_line = 0;
 static gboolean destructor_simple = TRUE;
 static char *destructor = NULL;
 static int destructor_line = 0;
 static gboolean destructor_simple = TRUE;
@@ -56,6 +60,8 @@ static char *defreturn = NULL;
 
 static GList *gtktypes = NULL;
 
 
 static GList *gtktypes = NULL;
 
+static Property *property = NULL;
+
 /* this can be a global as we will only do one function at a time
    anyway */
 static int the_scope = NO_SCOPE;
 /* this can be a global as we will only do one function at a time
    anyway */
 static int the_scope = NO_SCOPE;
@@ -102,24 +108,32 @@ pop_type(void)
 }
 
 static void
 }
 
 static void
-push_variable(char *name, int scope, int line_no, char *postfix)
+push_variable (char *name, int scope, int line_no, char *postfix)
 {
        Node *var;
 {
        Node *var;
-       Type *type = pop_type();
+       Type *type = pop_type ();
 
        type->postfix = postfix;
        
 
        type->postfix = postfix;
        
-       var = new_variable(scope, type, name, line_no,
-                          destructor, destructor_line,
-                          destructor_simple,
-                          initializer, initializer_line);
+       var = node_new (VARIABLE_NODE,
+                       "scope", scope,
+                       "vtype:steal", type,
+                       "id:steal", name,
+                       "line_no", line_no,
+                       "destructor_unref", destructor_unref,
+                       "destructor:steal", destructor,
+                       "destructor_line", destructor_line,
+                       "destructor_simple", destructor_simple,
+                       "initializer:steal", initializer,
+                       "initializer_line", initializer_line,
+                       NULL);
        class_nodes = g_list_append(class_nodes, var);
 }
 
 static void
        class_nodes = g_list_append(class_nodes, var);
 }
 
 static void
-push_function(int scope, int method, char *oid, char *id,
-             GString *cbuf, int line_no, int ccode_line,
-             gboolean vararg, GList *flags)
+push_function (int scope, int method, char *oid, char *id,
+              GString *cbuf, int line_no, int ccode_line,
+              gboolean vararg, GList *flags)
 {
        Node *node;
        Type *type;
 {
        Node *node;
        Type *type;
@@ -128,7 +142,9 @@ push_function(int scope, int method, char *oid, char *id,
        g_assert(scope != CLASS_SCOPE);
        
        if(method == INIT_METHOD || method == CLASS_INIT_METHOD) {
        g_assert(scope != CLASS_SCOPE);
        
        if(method == INIT_METHOD || method == CLASS_INIT_METHOD) {
-               type = (Type *)new_type(g_strdup("void"), NULL, NULL);
+               type = (Type *)node_new (TYPE_NODE,
+                                        "name", "void",
+                                        NULL);
        } else {
                type = pop_type();
        }
        } else {
                type = pop_type();
        }
@@ -166,9 +182,25 @@ push_function(int scope, int method, char *oid, char *id,
        } else
                c_cbuf = NULL;
 
        } else
                c_cbuf = NULL;
 
-       node = new_method(scope, method, type, oid, gtktypes, flags,
-                         id, funcargs, onerror, defreturn, c_cbuf, line_no,
-                         ccode_line, vararg, method_unique_id++);
+       node = node_new (METHOD_NODE,
+                        "scope", scope,
+                        "method", method,
+                        "mtype:steal", type,
+                        "otype:steal", oid,
+                        "gtktypes:steal", gtktypes,
+                        "flags:steal", flags,
+                        "id:steal", id,
+                        "args:steal", funcargs,
+                        "onerror:steal", onerror,
+                        "defreturn:steal", defreturn,
+                        "cbuf:steal", c_cbuf,
+                        "line_no", line_no,
+                        "ccode_line", ccode_line,
+                        "vararg", vararg,
+                        "unique_id", method_unique_id++,
+                        NULL);
+
+       last_added_method = (Method *)node;
 
        if(cbuf)
                g_string_free(cbuf,
 
        if(cbuf)
                g_string_free(cbuf,
@@ -199,7 +231,7 @@ free_all_global_state(void)
        g_list_free(gtktypes);
        gtktypes = NULL;
 
        g_list_free(gtktypes);
        gtktypes = NULL;
 
-       free_node_list(funcargs);
+       node_list_free (funcargs);
        funcargs = NULL;
 }
 
        funcargs = NULL;
 }
 
@@ -211,7 +243,11 @@ push_funcarg(char *name, char *postfix)
 
        type->postfix = postfix;
        
 
        type->postfix = postfix;
        
-       node = new_funcarg(type, name, checks);
+       node = node_new (FUNCARG_NODE,
+                        "atype:steal", type,
+                        "name:steal", name,
+                        "checks:steal", checks,
+                        NULL);
        checks = NULL;
        
        funcargs = g_list_append(funcargs, node);
        checks = NULL;
        
        funcargs = g_list_append(funcargs, node);
@@ -229,8 +265,14 @@ push_init_arg(char *name, int is_class)
        else
                tn = g_strdup(((Class *)class)->otype);
 
        else
                tn = g_strdup(((Class *)class)->otype);
 
-       type = new_type(tn, g_strdup("*"), NULL);
-       node = new_funcarg((Type *)type,name,NULL);
+       type = node_new (TYPE_NODE,
+                        "name:steal", tn,
+                        "pointer", "*",
+                        NULL);
+       node = node_new (FUNCARG_NODE,
+                        "atype:steal", (Type *)type,
+                        "name:steal", name,
+                        NULL);
        funcargs = g_list_prepend(funcargs, node);
 }
 
        funcargs = g_list_prepend(funcargs, node);
 }
 
@@ -240,11 +282,21 @@ push_self(char *id, gboolean constant)
        Node *node;
        Node *type;
        GList *ch = NULL;
        Node *node;
        Node *type;
        GList *ch = NULL;
-       type = new_type(g_strdup(((Class *)class)->otype),
-                       g_strdup(constant ? "const *" : "*"), NULL);
-       ch = g_list_append(ch,new_check(NULL_CHECK,NULL));
-       ch = g_list_append(ch,new_check(TYPE_CHECK,NULL));
-       node = new_funcarg((Type *)type,id,ch);
+       type = node_new (TYPE_NODE,
+                        "name", ((Class *)class)->otype,
+                        "pointer", constant ? "const *" : "*",
+                        NULL);
+       ch = g_list_append (ch, node_new (CHECK_NODE,
+                                         "chtype", NULL_CHECK,
+                                         NULL));
+       ch = g_list_append (ch, node_new (CHECK_NODE,
+                                         "chtype", TYPE_CHECK,
+                                         NULL));
+       node = node_new (FUNCARG_NODE,
+                        "atype:steal", (Type *)type,
+                        "name:steal", id,
+                        "checks:steal", ch,
+                        NULL);
        funcargs = g_list_prepend(funcargs, node);
 }
 
        funcargs = g_list_prepend(funcargs, node);
 }
 
@@ -288,6 +340,231 @@ set_return_value(char *type, char *val)
        return FALSE;
 }
 
        return FALSE;
 }
 
+static void
+export_accessors (const char *var_name,
+                 gboolean do_get,
+                 gboolean do_set,
+                 int get_lineno,
+                 int set_lineno,
+                 Type *type,
+                 const char *gtktype,
+                 int lineno)
+{      
+       Type *the_type;
+
+       if (type != NULL)
+               the_type = (Type *)node_copy ((Node *)type);
+       else
+               the_type = get_tree_type (gtktype, TRUE);
+
+       if (the_type == NULL) {
+               error_print (GOB_ERROR, line_no,
+                            _("Cannot determine type of property or argument"));
+               return;
+       }
+
+       if (do_get) {
+               char *get_id = g_strdup_printf ("get_%s", var_name);
+               GString *get_cbuf = g_string_new (NULL);
+               Node *node1 = node_new (TYPE_NODE,
+                                       "name", the_type->name,
+                                       "pointer", the_type->pointer,
+                                       "postfix", the_type->postfix,
+                                       NULL);
+               Node *node3 = node_new (TYPE_NODE,
+                                       "name", class->class.otype,
+                                       "pointer", "*",
+                                       NULL);
+
+               g_string_sprintf (get_cbuf,
+                                 "\t%s%s val; "
+                                 "g_object_get (G_OBJECT (self), \"%s\", "
+                                 "&val, NULL); "
+                                 "return val;\n",
+                                 the_type->name, 
+                                 the_type->pointer ? the_type->pointer : "",
+                                 var_name);
+               
+               typestack = g_list_prepend (typestack, node1);
+               typestack = g_list_prepend (typestack, node3);
+               
+               push_funcarg ("self", FALSE);
+               
+               push_function (PUBLIC_SCOPE, REGULAR_METHOD, NULL,
+                              get_id, get_cbuf, get_lineno,
+                              lineno, FALSE, NULL);
+       }
+       
+       if (do_set) {
+               char *set_id = g_strdup_printf ("set_%s", var_name);
+               GString *set_cbuf = g_string_new (NULL);
+               Node *node1 = node_new (TYPE_NODE, 
+                                       "name", the_type->name,
+                                       "pointer", the_type->pointer,
+                                       "postfix", the_type->postfix,
+                                       NULL);
+               Node *node2 = node_new (TYPE_NODE, 
+                                       "name", "void",
+                                       NULL);
+               Node *node3 = node_new (TYPE_NODE, 
+                                       "name", class->class.otype,
+                                       "pointer", "*",
+                                       NULL);
+
+               g_string_sprintf (set_cbuf,
+                                 "\tg_object_set (G_OBJECT (self), "
+                                 "\"%s\", val, NULL);\n",
+                                 var_name);
+
+               typestack = g_list_prepend (typestack, node2);
+               typestack = g_list_prepend (typestack, node1);
+               typestack = g_list_prepend (typestack, node3);
+               
+               push_funcarg ("self", FALSE);
+               push_funcarg ("val", FALSE);
+       
+               typestack = g_list_prepend (typestack, node2);
+               push_function (PUBLIC_SCOPE, REGULAR_METHOD, NULL,
+                              set_id, set_cbuf, set_lineno,
+                              lineno, FALSE, NULL);
+       }
+
+       node_free ((Node *)the_type);
+}
+
+static void
+property_link_and_export (Node *node)
+{
+       Property *prop = (Property *)node;
+
+       if (prop->link) {
+               const char *root;
+               char *get = NULL, *set = NULL;
+               Variable *var;
+
+               if (prop->set != NULL ||
+                   prop->get != NULL) {        
+                       error_print (GOB_ERROR, prop->line_no,
+                                    _("Property linking requested, but "
+                                      "getters and setters exist"));
+               }
+
+               var = find_var_or_die (prop->name, prop->line_no);
+               if(var->scope == PRIVATE_SCOPE) {
+                       root = "self->_priv";
+               } else if (var->scope == CLASS_SCOPE) {
+                       root = "SELF_GET_CLASS(self)";
+                       if (no_self_alias)
+                               error_print (GOB_ERROR, prop->line_no,
+                                            _("Self aliases needed when autolinking to a classwide member"));
+               } else {
+                       root = "self";
+               }
+
+               if (strcmp (prop->gtktype, "STRING") == 0) {
+                       set = g_strdup_printf("g_free (%s->%s); "
+                                             "%s->%s = g_value_dup_string (VAL);",
+                                             root, prop->name,
+                                             root, prop->name);
+                       get = g_strdup_printf("g_value_set_string (VAL, %s->%s);",
+                                             root, prop->name);
+               } else if (strcmp (prop->gtktype, "OBJECT") == 0) {
+                       set = g_strdup_printf("{ GtkObject *___old = (GtkObject *)%s->%s; "
+                                             "GtkObject *___new = (GtkObject *)gtk_value_get_object (VAL); "
+                                             "if (___new != NULL) { "
+                                               "gtk_object_ref (GTK_OBJECT (___new)); "
+                                               "%s->%s = GTK_OBJECT (___new); "
+                                             "} else { "
+                                               "%s->%s = NULL; "
+                                             "} "
+                                             "if (___old != NULL) { "
+                                               "gtk_object_unref (GTK_OBJECT (___old)); "
+                                             "} "
+                                             "}",
+                                             root, prop->name,
+                                             root, prop->name,
+                                             root, prop->name);
+                       get = g_strdup_printf("g_value_set_object (VAL, %s->%s);",
+                                             root, prop->name);
+               } else if (strcmp (prop->gtktype, "BOXED") == 0) {
+                       if (prop->extra_gtktype == NULL) {
+                               error_print (GOB_ERROR, prop->line_no,
+                                            _("Property linking requested for BOXED, but "
+                                              "boxed_type not set"));
+                       }
+                       set = g_strdup_printf("{ gpointer ___old = (gpointer)%s->%s; "
+                                             "gpointer ___new = (gpointer)gtk_value_get_boxed (VAL); "
+                                             "if (___new != ___old) { "
+                                               "if (___old != NULL) g_boxed_free (%s, ___old); "
+                                               "if (___new != NULL) %s->%s = g_boxed_copy (%s, ___new); "
+                                               "else %s->%s = NULL;"
+                                             "} "
+                                             "}",
+                                             root, prop->name,
+                                             prop->extra_gtktype,
+                                             root, prop->name,
+                                             prop->extra_gtktype,
+                                             root, prop->name);
+                       get = g_strdup_printf("g_value_set_object (VAL, %s->%s);",
+                                             root, prop->name);
+               } else {
+                       char *set_func;
+                       char *get_func;
+                       set_func = g_strdup_printf ("g_value_set_%s", prop->gtktype);
+                       g_strdown (set_func);
+                       get_func = g_strdup_printf ("g_value_get_%s", prop->gtktype);
+                       g_strdown (get_func);
+
+                       set = g_strdup_printf("%s->%s = %s (VAL);",
+                                             root, prop->name,
+                                             get_func);
+                       get = g_strdup_printf("%s (VAL, %s->%s);",
+                                             set_func,
+                                             root, prop->name);
+
+                       g_free (get_func);
+                       g_free (set_func);
+               }
+
+               node_set (node,
+                         "get:steal", get,
+                         "get_line", prop->line_no,
+                         "set:steal", set,
+                         "set_line", prop->line_no,
+                         NULL);
+       }
+
+       if (prop->export) {
+               export_accessors (prop->name,
+                                 prop->get != NULL, prop->get_line,
+                                 prop->set != NULL,  prop->get_line,
+                                 prop->ptype,
+                                 prop->gtktype,
+                                 prop->line_no);
+       } 
+}
+
+
+static char *
+debool (char *s)
+{
+       if (strcmp (s, "BOOL") == 0) {
+               error_print (GOB_WARN, line_no,
+                           _("BOOL type is deprecated, please use BOOLEAN"));
+               g_free (s);
+               return g_strdup ("BOOLEAN");
+       } else {
+               return s;
+       }
+}
+
+static void
+ensure_property (void)
+{
+       if (property == NULL)
+               property = (Property *)node_new (PROPERTY_NODE, NULL);
+}
+
 %}
 
 %union {
 %}
 
 %union {
@@ -302,9 +579,12 @@ set_return_value(char *type, char *val)
 %token CONST VOID STRUCT UNION ENUM THREEDOTS
 %token SIGNED UNSIGNED LONG SHORT INT FLOAT DOUBLE CHAR
 
 %token CONST VOID STRUCT UNION ENUM THREEDOTS
 %token SIGNED UNSIGNED LONG SHORT INT FLOAT DOUBLE CHAR
 
-%token <id> TOKEN NUMBER TYPETOKEN ARRAY_DIM
-%token <cbuf> CCODE HTCODE PHCODE HCODE ACODE ATCODE
-%token <line> PUBLIC PRIVATE PROTECTED CLASSWIDE ARGUMENT VIRTUAL SIGNAL OVERRIDE
+%token <id> TOKEN NUMBER TYPETOKEN ARRAY_DIM SINGLE_CHAR
+%token <cbuf> CCODE HTCODE PHCODE HCODE ACODE ATCODE STRING
+%token <line> PUBLIC PRIVATE PROTECTED CLASSWIDE PROPERTY ARGUMENT
+%token <line> VIRTUAL SIGNAL OVERRIDE
+%token <line> NICK BLURB MAXIMUM MINIMUM DEFAULT_VALUE FLAGS TYPE
+%token <line> FLAGS_TYPE ENUM_TYPE PARAM_TYPE BOXED_TYPE OBJECT_TYPE
 
 %%
 
 
 %%
 
@@ -315,38 +595,56 @@ prog:             ccodes class ccodes     { ; }
        ;
 
 ccode:         CCODE                   {
        ;
 
 ccode:         CCODE                   {
-                       Node *node = new_ccode(C_CCODE,($<cbuf>1)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", C_CCODE,
+                                              "cbuf:steal", ($<cbuf>1)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       HCODE                   {
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       HCODE                   {
-                       Node *node = new_ccode(H_CCODE,($<cbuf>1)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", H_CCODE,
+                                              "cbuf:steal", ($<cbuf>1)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       HTCODE                  {
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       HTCODE                  {
-                       Node *node = new_ccode(HT_CCODE,($<cbuf>1)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", HT_CCODE,
+                                              "cbuf:steal", ($<cbuf>1)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       PHCODE                  {
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       PHCODE                  {
-                       Node *node = new_ccode(PH_CCODE,($<cbuf>1)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", PH_CCODE,
+                                              "cbuf:steal", ($<cbuf>1)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       ACODE                   {
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       ACODE                   {
-                       Node *node = new_ccode(A_CCODE,($<cbuf>1)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", A_CCODE,
+                                              "cbuf:steal", ($<cbuf>1)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       ATCODE                  {
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
        |       ATCODE                  {
-                       Node *node = new_ccode(AT_CCODE,($<cbuf>1)->str,
-                                              ccode_line);
+                       Node *node = node_new (CCODE_NODE,
+                                              "cctype", AT_CCODE,
+                                              "cbuf:steal", ($<cbuf>1)->str,
+                                              "line_no", ccode_line,
+                                              NULL);
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
                        nodes = g_list_append(nodes,node);
                        g_string_free($<cbuf>1,FALSE);
                                        }
@@ -368,24 +666,36 @@ class:            classdec '{' classcode '}'      {
                                                }
        ;
 
                                                }
        ;
 
-classdec:      CLASS TYPETOKEN FROM TYPETOKEN  chunk {
-                       class = new_class($<id>2,$<id>4,chunk_size,NULL);
+classdec:      CLASS TYPETOKEN FROM TYPETOKEN  classflags {
+                       class = node_new (CLASS_NODE,
+                                         "otype:steal", $<id>2,
+                                         "ptype:steal", $<id>4,
+                                         "bonobo_x_class:steal", bonobo_x_class,
+                                         "chunk_size:steal", chunk_size,
+                                         NULL);
                                                }
        ;
 
                                                }
        ;
 
-chunk:
-       | '(' TOKEN TOKEN ')' {
+classflags:
+       | '(' TOKEN TOKEN ')' classflags {
                        if(strcmp($<id>2,"chunks") == 0) {
                        if(strcmp($<id>2,"chunks") == 0) {
-                                       chunk_size = g_strdup($<id>4);
+                               g_free (chunk_size);
+                               chunk_size = g_strdup($<id>3);
+                       } else if(strcmp($<id>2,"BonoboX") == 0) {
+                               g_free (bonobo_x_class);
+                               bonobo_x_class = g_strdup($<id>3);
                        } else {
                                yyerror(_("parse error"));
                                YYERROR;
                        }
                }
                        } else {
                                yyerror(_("parse error"));
                                YYERROR;
                        }
                }
-       | '(' TOKEN NUMBER ')' {
+       | '(' TOKEN NUMBER ')' classflags {
                        if(strcmp($<id>2,"chunks") == 0) {
                        if(strcmp($<id>2,"chunks") == 0) {
-                               if(atoi($<id>4) != 0)
-                                       chunk_size = g_strdup($<id>4);
+                               g_free (chunk_size);
+                               if(atoi($<id>3) != 0)
+                                       chunk_size = g_strdup($<id>3);
+                               else
+                                       chunk_size = NULL;
                        } else {
                                yyerror(_("parse error"));
                                YYERROR;
                        } else {
                                yyerror(_("parse error"));
                                YYERROR;
@@ -398,8 +708,17 @@ classcode: classcode thing                 { ; }
        ;
 
 thing:                 method                          { ; }
        ;
 
 thing:                 method                          { ; }
+       |       TOKEN method                    {
+                       if (strcmp ($<id>1, "BonoboX") != 0) {
+                               g_free($<id>1);
+                               yyerror(_("parse error"));
+                               YYERROR;
+                       }
+                       last_added_method->bonobo_x_func = TRUE;
+                                               }
        |       variable                        { ; }
        |       argument                        { ; }
        |       variable                        { ; }
        |       argument                        { ; }
+       |       property                        { ; }
        |       ';'                             { ; }
        ;
 
        |       ';'                             { ; }
        ;
 
@@ -410,29 +729,44 @@ scope:            PUBLIC                  { the_scope = PUBLIC_SCOPE; }
        ;
 
 destructor:    TOKEN TOKEN     {
        ;
 
 destructor:    TOKEN TOKEN     {
-                       if(strcmp($<id>1, "destroywith")==0) {
-                               g_free($<id>1);
+                       if (strcmp ($<id>1, "destroywith") == 0) {
+                               g_free ($<id>1);
+                               destructor_unref = FALSE;
+                               destructor = $<id>2;
+                               destructor_line = line_no;
+                               destructor_simple = TRUE;
+                       } else if (strcmp ($<id>1, "unrefwith") == 0) {
+                               g_free ($<id>1);
+                               destructor_unref = TRUE;
                                destructor = $<id>2;
                                destructor_line = line_no;
                                destructor_simple = TRUE;
                        } else {
                                destructor = $<id>2;
                                destructor_line = line_no;
                                destructor_simple = TRUE;
                        } else {
-                               g_free($<id>1);
-                               g_free($<id>2);
-                               yyerror(_("parse error"));
+                               g_free ($<id>1);
+                               g_free ($<id>2);
+                               yyerror (_("parse error"));
                                YYERROR;
                        }
                                }
        |       TOKEN '{' CCODE         {
                                YYERROR;
                        }
                                }
        |       TOKEN '{' CCODE         {
-                       if(strcmp($<id>1, "destroy")==0) {
+                       if (strcmp ($<id>1, "destroy") == 0) {
                                g_free($<id>1);
                                g_free($<id>1);
+                               destructor_unref = FALSE;
                                destructor = ($<cbuf>3)->str;
                                g_string_free($<cbuf>3, FALSE);
                                destructor_line = ccode_line;
                                destructor_simple = FALSE;
                                destructor = ($<cbuf>3)->str;
                                g_string_free($<cbuf>3, FALSE);
                                destructor_line = ccode_line;
                                destructor_simple = FALSE;
+                       } else if (strcmp ($<id>1, "unref") == 0) {
+                               g_free ($<id>1);
+                               destructor_unref = TRUE;
+                               destructor = ($<cbuf>3)->str;
+                               g_string_free ($<cbuf>3, FALSE);
+                               destructor_line = ccode_line;
+                               destructor_simple = FALSE;
                        } else {
                        } else {
-                               g_free($<id>1);
-                               g_string_free($<cbuf>3, TRUE);
-                               yyerror(_("parse error"));
+                               g_free ($<id>1);
+                               g_string_free ($<cbuf>3, TRUE);
+                               yyerror (_("parse error"));
                                YYERROR;
                        }
                                        }
                                YYERROR;
                        }
                                        }
@@ -467,82 +801,141 @@ variable:        scope type TOKEN varoptions ';'         {
                        push_variable($<id>3, the_scope, $<line>1, $<id>4);
                                                }
        ;
                        push_variable($<id>3, the_scope, $<line>1, $<id>4);
                                                }
        ;
-argument:      ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' {
-                       if(strcmp($<id>5,"get")==0 &&
-                          strcmp($<id>8,"set")==0) {
-                               Node *node;
+
+argument:      ARGUMENT flags argtype TOKEN export TOKEN '{' CCODE TOKEN '{' CCODE ';' {
+                       Node *node = NULL;
+                       if(strcmp($<id>6,"get")==0 &&
+                          strcmp($<id>9,"set")==0) {
                                Type *type = pop_type();
                                Type *type = pop_type();
-                               g_free($<id>5); g_free($<id>8);
-                               node = new_argument($<id>3,type,$<list>2,$<id>4,
-                                                   ($<cbuf>7)->str,$<line>6,
-                                                   ($<cbuf>10)->str,$<line>9,
-                                                   $<line>1);
-                               g_string_free($<cbuf>7,FALSE);
-                               g_string_free($<cbuf>10,FALSE);
+                               g_free ($<id>6); 
+                               g_free ($<id>9);
+                               node = node_new (ARGUMENT_NODE,
+                                                "gtktype:steal", $<id>3,
+                                                "atype:steal", type,
+                                                "flags:steal", $<list>2,
+                                                "name:steal", $<id>4,
+                                                "get:steal", ($<cbuf>8)->str,
+                                                "get_line", $<line>7,
+                                                "set:steal", ($<cbuf>11)->str,
+                                                "set_line", $<line>10,
+                                                "line_no", $<line>1,
+                                                NULL);
+
                                class_nodes = g_list_append(class_nodes,node);
                                class_nodes = g_list_append(class_nodes,node);
-                       } else if(strcmp($<id>5,"set")==0 &&
-                               strcmp($<id>8,"get")==0) {
-                               Node *node;
+
+                               g_string_free ($<cbuf>8, FALSE);
+                               g_string_free ($<cbuf>11, FALSE);
+
+                       } else if(strcmp($<id>6,"set")==0 &&
+                               strcmp($<id>9,"get")==0) {
                                Type *type = pop_type();
                                Type *type = pop_type();
-                               g_free($<id>5); g_free($<id>8);
-                               node = new_argument($<id>3,type,$<list>2,$<id>4,
-                                                   ($<cbuf>10)->str,$<line>9,
-                                                   ($<cbuf>7)->str,$<line>6,
-                                                   $<line>1);
-                               g_string_free($<cbuf>10,FALSE);
-                               g_string_free($<cbuf>7,FALSE);
+                               g_free ($<id>6); 
+                               g_free ($<id>9);
+                               node = node_new (ARGUMENT_NODE,
+                                                "gtktype:steal", $<id>3,
+                                                "atype:steal", type,
+                                                "flags:steal", $<list>2,
+                                                "name:steal", $<id>4,
+                                                "get:steal", ($<cbuf>11)->str,
+                                                "get_line", $<line>10,
+                                                "set:steal", ($<cbuf>8)->str,
+                                                "set_line", $<line>7,
+                                                "line_no", $<line>1,
+                                                NULL);
+                               g_string_free ($<cbuf>11, FALSE);
+                               g_string_free ($<cbuf>8, FALSE);
                                class_nodes = g_list_append(class_nodes,node);
                        } else {
                                class_nodes = g_list_append(class_nodes,node);
                        } else {
-                               g_free($<id>3); g_free($<id>4);
-                               g_free($<id>5); g_free($<id>8);
-                               g_list_foreach($<list>2,(GFunc)g_free,NULL);
-                               g_list_free($<list>2);
-                               g_string_free($<cbuf>10,TRUE);
-                               g_string_free($<cbuf>7,TRUE);
-                               yyerror(_("parse error"));
+                               g_free ($<id>3); 
+                               g_free ($<id>4);
+                               g_free ($<id>6); 
+                               g_free ($<id>9);
+                               g_list_foreach ($<list>2, (GFunc)g_free, NULL);
+                               g_list_free ($<list>2);
+                               g_string_free ($<cbuf>11, TRUE);
+                               g_string_free ($<cbuf>8, TRUE);
+                               yyerror (_("parse error"));
                                YYERROR;
                        }
                                YYERROR;
                        }
+
+                       if ($<id>5 != NULL) {
+                               Argument *arg = (Argument *)node;
+                               export_accessors (arg->name,
+                                                 arg->get != NULL, arg->get_line,
+                                                 arg->set != NULL, arg->set_line,
+                                                 arg->atype,
+                                                 arg->gtktype,
+                                                 arg->line_no);
+                               g_free ($<id>5);
+                       } 
+
                                                }
                                                }
-       |       ARGUMENT flags argtype TOKEN TOKEN '{' CCODE ';' {
-                       if(strcmp($<id>5, "get") == 0) {
-                               Node *node;
+       |       ARGUMENT flags argtype TOKEN export TOKEN '{' CCODE ';' {
+                       Node *node = NULL;
+                       if(strcmp($<id>6, "get") == 0) {
                                Type *type = pop_type();
                                Type *type = pop_type();
-                               g_free($<id>5);
-                               node = new_argument($<id>3, type, $<list>2, $<id>4,
-                                                   ($<cbuf>7)->str, $<line>6,
-                                                   NULL, 0, $<line>1);
-                               g_string_free($<cbuf>7, FALSE);
+                               g_free ($<id>6);
+                               node = node_new (ARGUMENT_NODE,
+                                                "gtktype:steal", $<id>3,
+                                                "atype:steal", type,
+                                                "flags:steal", $<list>2,
+                                                "name:steal", $<id>4,
+                                                "get:steal", ($<cbuf>8)->str,
+                                                "get_line", $<line>7,
+                                                "line_no", $<line>1,
+                                                NULL);
+
+                               g_string_free ($<cbuf>8, FALSE);
                                class_nodes = g_list_append(class_nodes, node);
                                class_nodes = g_list_append(class_nodes, node);
-                       } else if(strcmp($<id>5, "set") == 0) {
-                               Node *node;
+                       } else if(strcmp($<id>6, "set") == 0) {
                                Type *type = pop_type();
                                Type *type = pop_type();
-                               g_free($<id>5);
-                               node = new_argument($<id>3, type, $<list>2, $<id>4,
-                                                   NULL, 0, ($<cbuf>7)->str,
-                                                   $<line>6, $<line>1);
-                               g_string_free($<cbuf>7, FALSE);
-                               class_nodes = g_list_append(class_nodes, node);
+                               g_free ($<id>6);
+                               node = node_new (ARGUMENT_NODE,
+                                                "gtktype:steal", $<id>3,
+                                                "atype:steal", type,
+                                                "flags:steal", $<list>2,
+                                                "name:steal", $<id>4,
+                                                "set:steal", ($<cbuf>8)->str,
+                                                "set_line", $<line>7,
+                                                "line_no", $<line>1,
+                                                NULL);
+
+                               g_string_free ($<cbuf>8, FALSE);
+                               class_nodes = g_list_append (class_nodes, node);
                        } else {
                        } else {
-                               g_free($<id>5); g_free($<id>3);
-                               g_free($<id>4);
-                               g_list_foreach($<list>2, (GFunc)g_free, NULL);
-                               g_list_free($<list>2);
-                               g_string_free($<cbuf>7, TRUE);
+                               g_free ($<id>6); 
+                               g_free ($<id>3);
+                               g_free ($<id>4);
+                               g_list_foreach ($<list>2, (GFunc)g_free, NULL);
+                               g_list_free ($<list>2);
+                               g_string_free ($<cbuf>8, TRUE);
                                yyerror(_("parse error"));
                                YYERROR;
                        }
                                yyerror(_("parse error"));
                                YYERROR;
                        }
+
+                       if ($<id>5 != NULL) {
+                               Argument *arg = (Argument *)node;
+                               export_accessors (arg->name,
+                                                 arg->get != NULL, arg->get_line,
+                                                 arg->set != NULL, arg->set_line,
+                                                 arg->atype,
+                                                 arg->gtktype,
+                                                 arg->line_no);
+                               g_free ($<id>5);
+                       } 
                                                }
                                                }
-       |       ARGUMENT flags argtype TOKEN TOKEN {
+       |       ARGUMENT flags argtype TOKEN export TOKEN {
                        Node *node;
                        char *get, *set = NULL;
                        Variable *var;
                        Type *type;
                        char *root;
                        
                        Node *node;
                        char *get, *set = NULL;
                        Variable *var;
                        Type *type;
                        char *root;
                        
-                       if(strcmp($<id>5, "link")!=0 &&
-                          strcmp($<id>5, "stringlink")!=0 &&
-                          strcmp($<id>5, "objectlink")!=0) {
-                               g_free($<id>5); g_free($<id>3);
+                       if(strcmp($<id>6, "link")!=0 &&
+                          strcmp($<id>6, "stringlink")!=0 && 
+                          strcmp($<id>6, "objectlink")!=0) {
+                               g_free($<id>6); 
+                               g_free($<id>3);
                                g_free($<id>4);
                                g_list_foreach($<list>2,(GFunc)g_free,NULL);
                                g_list_free($<list>2);
                                g_free($<id>4);
                                g_list_foreach($<list>2,(GFunc)g_free,NULL);
                                g_list_free($<list>2);
@@ -563,23 +956,21 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' {
                        } else
                                root = "self";
 
                        } else
                                root = "self";
 
-                       if(strcmp($<id>5, "link")==0) {
+                       if(strcmp($<id>6, "link")==0) {
                                set = g_strdup_printf("%s->%s = ARG;",
                                                      root, $<id>4);
                                set = g_strdup_printf("%s->%s = ARG;",
                                                      root, $<id>4);
-                       } else if(strcmp($<id>5, "stringlink")==0) {
-                               set = g_strdup_printf("g_free(%s->%s); "
-                                                     "%s->%s = g_strdup(ARG);",
+                       } else if(strcmp($<id>6, "stringlink")==0) {
+                               set = g_strdup_printf("g_free (%s->%s); "
+                                                     "%s->%s = g_strdup (ARG);",
                                                      root, $<id>4,
                                                      root, $<id>4);
                                                      root, $<id>4,
                                                      root, $<id>4);
-                       } else if(strcmp($<id>5, "objectlink")==0) {
+                       } else if(strcmp($<id>6, "objectlink")==0) {
                                set = g_strdup_printf(
                                set = g_strdup_printf(
-                                 "if(%s->%s) "
-                                  "gtk_object_unref(GTK_OBJECT(%s->%s)); "
-                                 "%s->%s = ARG; "
-                                 "if(%s->%s) "
-                                  "gtk_object_ref(GTK_OBJECT(%s->%s));",
-                                 root, $<id>4,
-                                 root, $<id>4,
+                                 "if (ARG != NULL) "
+                                  "g_object_ref (G_OBJECT (ARG)); "
+                                 "if (%s->%s != NULL) "
+                                  "g_object_unref (G_OBJECT (%s->%s)); "
+                                 "%s->%s = ARG;",
                                  root, $<id>4,
                                  root, $<id>4,
                                  root, $<id>4);
                                  root, $<id>4,
                                  root, $<id>4,
                                  root, $<id>4);
@@ -587,23 +978,269 @@ argument:        ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' {
                                g_assert_not_reached();
                        }
 
                                g_assert_not_reached();
                        }
 
-                       if(strcmp($<id>5, "stringlink")==0) {
-                               get = g_strdup_printf("ARG = g_strdup(%s->%s);", root, $<id>4);
-                       } else
-                               /* For everything else, get is just straight assignment */
-                               get = g_strdup_printf("ARG = %s->%s;", root, $<id>4);
+                       get = g_strdup_printf("ARG = %s->%s;", root, $<id>4);
+  
+                       g_free ($<id>6);
+
+                       if (type == NULL)
+                               type = (Type *)node_copy ((Node *)var->vtype);
+
+                       node = node_new (ARGUMENT_NODE,
+                                        "gtktype:steal", $<id>3,
+                                        "atype:steal", type,
+                                        "flags:steal", $<list>2,
+                                        "name:steal", $<id>4,
+                                        "get:steal", get,
+                                        "get_line", $<line>1,
+                                        "set:steal", set,
+                                        "set_line", $<line>1,
+                                        "line_no", $<line>1,
+                                        NULL);
+
+                       if ($<id>5 != NULL) {
+                               Argument *arg = (Argument *)node;
+                               export_accessors (arg->name,
+                                                 arg->get != NULL, arg->get_line,
+                                                 arg->set != NULL, arg->set_line,
+                                                 arg->atype,
+                                                 arg->gtktype,
+                                                 arg->line_no);
+                               g_free ($<id>5);
+                       } 
+
+                       class_nodes = g_list_append (class_nodes, node);
+                                               }
+       ;
 
 
-                       g_free($<id>5);
+export:         '(' TOKEN ')'                   {
+                       if (strcmp ($<id>2, "export")!=0) {
+                               g_free ($<id>2); 
+                               yyerror (_("parse error"));
+                               YYERROR;
+                       }
+                       $<id>$ = $<id>2;
+                                               }
+         |                                      {
+                       $<id>$ = NULL;
+                                               }
+        ;
+
+property:      PROPERTY TOKEN TOKEN param_spec TOKEN '{' CCODE TOKEN '{' CCODE ';' {
+                       ensure_property ();
+                       node_set ((Node *)property,
+                                 "line_no", $<line>1,
+                                 "gtktype:steal", debool ($<id>2),
+                                 "name:steal", $<id>3,
+                                 NULL);
+                       if (strcmp ($<id>5, "get") == 0 &&
+                           strcmp ($<id>8, "set") == 0) {
+                               node_set ((Node *)property,
+                                         "get:steal", ($<cbuf>7)->str,
+                                         "get_line", $<line>6,
+                                         "set:steal", ($<cbuf>10)->str,
+                                         "set_line", $<line>9,
+                                         NULL);
+                               g_string_free ($<cbuf>7, FALSE);
+                               g_string_free ($<cbuf>10, FALSE);
+                               g_free ($<id>5); 
+                               g_free ($<id>8);
+                       } else if (strcmp ($<id>5, "set") == 0 &&
+                                  strcmp ($<id>8, "get") == 0) {
+                               node_set ((Node *)property,
+                                         "get:steal", ($<cbuf>10)->str,
+                                         "get_line", $<line>9,
+                                         "set:steal", ($<cbuf>7)->str,
+                                         "set_line", $<line>6,
+                                         NULL);
+                               g_string_free ($<cbuf>7, FALSE);
+                               g_string_free ($<cbuf>10, FALSE);
+                               g_free ($<id>5); 
+                               g_free ($<id>8);
+                       } else {
+                               g_string_free ($<cbuf>7, TRUE);
+                               g_string_free ($<cbuf>10, TRUE);
+                               g_free ($<id>5); 
+                               g_free ($<id>8);
+                               node_free ((Node *)property);
+                               property = NULL;
+                               yyerror (_("parse error"));
+                               YYERROR;
+                       }
+                       property_link_and_export ((Node *)property);
+                       if (property != NULL) {
+                               class_nodes = g_list_append (class_nodes,
+                                                            property);
+                               property = NULL;
+                       }
+               }
+       |       PROPERTY TOKEN TOKEN param_spec TOKEN '{' CCODE ';' {
+                       ensure_property ();
+                       node_set ((Node *)property,
+                                 "line_no", $<line>1,
+                                 "gtktype:steal", debool ($<id>2),
+                                 "name:steal", $<id>3,
+                                 NULL);
+                       if (strcmp ($<id>5, "get") == 0) {
+                               node_set ((Node *)property,
+                                         "get:steal", ($<cbuf>7)->str,
+                                         "get_line", $<line>6,
+                                         NULL);
+                               g_string_free ($<cbuf>7, FALSE);
+                               g_free ($<id>5); 
+                       } else if (strcmp ($<id>5, "set") == 0) {
+                               node_set ((Node *)property,
+                                         "set:steal", ($<cbuf>7)->str,
+                                         "set_line", $<line>6,
+                                         NULL);
+                               g_string_free ($<cbuf>7, FALSE);
+                               g_free ($<id>5); 
+                       } else {
+                               g_string_free ($<cbuf>7, TRUE);
+                               g_free ($<id>5); 
+                               node_free ((Node *)property);
+                               property = NULL;
+                               yyerror (_("parse error"));
+                               YYERROR;
+                       }
+                       property_link_and_export ((Node *)property);
+                       if (property != NULL) {
+                               class_nodes = g_list_append (class_nodes,
+                                                            property);
+                               property = NULL;
+                       }
+               }
+       |       PROPERTY TOKEN TOKEN param_spec ';' {
+                       ensure_property ();
+                       node_set ((Node *)property,
+                                 "line_no", $<line>1,
+                                 "gtktype:steal", debool ($<id>2),
+                                 "name:steal", $<id>3,
+                                 NULL);
+                       property_link_and_export ((Node *)property);
+                       if (property != NULL) {
+                               class_nodes = g_list_append (class_nodes,
+                                                            property);
+                               property = NULL;
+                       }
+               }
+       ;
 
 
+param_spec:    '(' param_spec_list ')' { ; }
+       |                               { ; }
+       ;
 
 
-                       if(!type)
-                               type = copy_type(var->vtype);
+param_spec_list:       param_spec_list ',' param_spec_value    { ; }
+       |               param_spec_value                        { ; }
+       ;
 
 
-                       node = new_argument($<id>3, type, $<list>2,
-                                           $<id>4, get, $<line>1,
-                                           set, $<line>1, $<line>1);
-                       class_nodes = g_list_append(class_nodes,node);
-                                               }
+string:                STRING                          { $<id>$ = $<id>1; }
+       |       TOKEN '(' STRING ')'            {
+                       if (strcmp ($<id>1, "_") != 0) {
+                               g_free ($<id>1);
+                               yyerror(_("parse error"));
+                               YYERROR;
+                       }
+                       g_free ($<id>1);
+                       $<id>$ = g_strconcat ("_(", $<id>3, ")", NULL);
+                       g_free ($<id>3);
+               }
+       ;
+
+anyval:                numtok          { $<id>$ = $<id>1; }
+       |       string          { $<id>$ = $<id>1; }
+       ;
+
+param_spec_value: NICK '=' string              {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "nick:steal", $<id>3,
+                         NULL);
+                 }
+       |       BLURB '=' string                {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "blurb:steal", $<id>3,
+                         NULL);
+                 }
+       |       MAXIMUM '=' numtok              {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "maximum:steal", $<id>3,
+                         NULL);
+                 }
+       |       MINIMUM '=' numtok              {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "minimum:steal", $<id>3,
+                         NULL);
+                 }
+       |       DEFAULT_VALUE '=' anyval        {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "default_value:steal", $<id>3,
+                         NULL);
+                 }
+       |       FLAGS '=' flaglist              {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "flags:steal", $<list>3,
+                         NULL);
+                 }
+       |       TYPE '=' type                   {
+               Type *type = pop_type ();
+               ensure_property ();
+               node_set ((Node *)property,
+                         "ptype:steal", type,
+                         NULL);
+                 }
+       |       FLAGS_TYPE '=' TOKEN            {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", $<id>3,
+                         NULL);
+                 }
+       |       ENUM_TYPE '=' TOKEN             {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", $<id>3,
+                         NULL);
+                 }
+       |       PARAM_TYPE '=' TOKEN            {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", $<id>3,
+                         NULL);
+                 }
+       |       BOXED_TYPE '=' TOKEN            {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", $<id>3,
+                         NULL);
+                 }
+       |       OBJECT_TYPE '=' TOKEN           {
+               ensure_property ();
+               node_set ((Node *)property,
+                         "extra_gtktype:steal", $<id>3,
+                         NULL);
+                 }
+       |       TOKEN           {
+               ensure_property ();
+               if (strcmp ($<id>1, "link") == 0) {
+                       g_free($<id>1);
+                       node_set ((Node *)property,
+                                 "link", TRUE,
+                                 NULL);
+               } else if (strcmp ($<id>1, "export") == 0) {
+                       g_free($<id>1);
+                       node_set ((Node *)property,
+                                 "export", TRUE,
+                                 NULL);
+               } else {
+                       g_free($<id>1);
+                       yyerror(_("parse error"));
+                       YYERROR;
+               }
+                 }
        ;
 
 argtype:       TOKEN '(' TOKEN type ')'        {
        ;
 
 argtype:       TOKEN '(' TOKEN type ')'        {
@@ -613,10 +1250,10 @@ argtype: TOKEN '(' TOKEN type ')'        {
                                yyerror(_("parse error"));
                                YYERROR;
                        }
                                yyerror(_("parse error"));
                                YYERROR;
                        }
-                       $<id>$ = $<id>1;
+                       $<id>$ = debool ($<id>1);
                                                }
        |       TOKEN                           {
                                                }
        |       TOKEN                           {
-                       $<id>$ = $<id>1;
+                       $<id>$ = debool ($<id>1);
                        typestack = g_list_prepend(typestack,NULL);
                                                }
        ;
                        typestack = g_list_prepend(typestack,NULL);
                                                }
        ;
@@ -635,11 +1272,16 @@ flaglist:        TOKEN '|' flaglist              {
 
 
 type:          specifier_list pointer                          {
 
 
 type:          specifier_list pointer                          {
-                       Node *node = new_type($<id>1, $<id>2, NULL);
+                       Node *node = node_new (TYPE_NODE, 
+                                              "name:steal", $<id>1,
+                                              "pointer:steal", $<id>2,
+                                              NULL);
                        typestack = g_list_prepend(typestack,node);
                                                        }
        |       specifier_list                          {
                        typestack = g_list_prepend(typestack,node);
                                                        }
        |       specifier_list                          {
-                       Node *node = new_type($<id>1, NULL, NULL);
+                       Node *node = node_new (TYPE_NODE, 
+                                              "name:steal", $<id>1,
+                                              NULL);
                        typestack = g_list_prepend(typestack,node);
                                                        }
        ;
                        typestack = g_list_prepend(typestack,node);
                                                        }
        ;
@@ -785,15 +1427,15 @@ fullsigtype:     scope TOKEN sigtype     {
        ;
        
 sigtype:       TOKEN '(' tokenlist ')'         {
        ;
        
 sigtype:       TOKEN '(' tokenlist ')'         {
-                       gtktypes = g_list_prepend(gtktypes, $<id>1);
+                       gtktypes = g_list_prepend(gtktypes, debool ($<id>1));
                                                }
        ;
 
 tokenlist:     tokenlist ',' TOKEN             {
                                                }
        ;
 
 tokenlist:     tokenlist ',' TOKEN             {
-                       gtktypes = g_list_append(gtktypes, $<id>3);
+                       gtktypes = g_list_append(gtktypes, debool ($<id>3));
                                                }
        |       TOKEN                           { 
                                                }
        |       TOKEN                           { 
-                       gtktypes = g_list_append(gtktypes, $<id>1);
+                       gtktypes = g_list_append(gtktypes, debool ($<id>1));
                                                        }
        ;
 
                                                        }
        ;
 
@@ -1064,10 +1706,14 @@ checklist:      checklist check         { ; }
 
 check:         TOKEN                   {
                        if(strcmp($<id>1,"type")==0) {
 
 check:         TOKEN                   {
                        if(strcmp($<id>1,"type")==0) {
-                               Node *node = new_check(TYPE_CHECK,NULL);
+                               Node *node = node_new (CHECK_NODE,
+                                                      "chtype", TYPE_CHECK,
+                                                      NULL);
                                checks = g_list_append(checks,node);
                        } else if(strcmp($<id>1,"null")==0) {
                                checks = g_list_append(checks,node);
                        } else if(strcmp($<id>1,"null")==0) {
-                               Node *node = new_check(NULL_CHECK,NULL);
+                               Node *node = node_new (CHECK_NODE,
+                                                      "chtype", NULL_CHECK,
+                                                      NULL);
                                checks = g_list_append(checks,node);
                        } else {
                                yyerror(_("parse error"));
                                checks = g_list_append(checks,node);
                        } else {
                                yyerror(_("parse error"));
@@ -1076,27 +1722,45 @@ check:          TOKEN                   {
                        g_free($<id>1);
                                        }
        |       '>' numtok              {
                        g_free($<id>1);
                                        }
        |       '>' numtok              {
-                       Node *node = new_check(GT_CHECK,$<id>2);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", GT_CHECK,
+                                              "number:steal", $<id>2,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        }
        |       '<' numtok              {
                        checks = g_list_append(checks,node);
                                        }
        |       '<' numtok              {
-                       Node *node = new_check(LT_CHECK,$<id>2);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", LT_CHECK,
+                                              "number:steal", $<id>2,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        }
        |       '>' '=' numtok          {
                        checks = g_list_append(checks,node);
                                        }
        |       '>' '=' numtok          {
-                       Node *node = new_check(GE_CHECK,$<id>3);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", GE_CHECK,
+                                              "number:steal", $<id>3,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        }
        |       '<' '=' numtok          {
                        checks = g_list_append(checks,node);
                                        }
        |       '<' '=' numtok          {
-                       Node *node = new_check(LE_CHECK,$<id>3);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", LE_CHECK,
+                                              "number:steal", $<id>3,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        }
        |       '=' '=' numtok          {
                        checks = g_list_append(checks,node);
                                        }
        |       '=' '=' numtok          {
-                       Node *node = new_check(EQ_CHECK,$<id>3);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", EQ_CHECK,
+                                              "number:steal", $<id>3,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        }
        |       '!' '=' numtok          {
                        checks = g_list_append(checks,node);
                                        }
        |       '!' '=' numtok          {
-                       Node *node = new_check(NE_CHECK,$<id>3);
+                       Node *node = node_new (CHECK_NODE,
+                                              "chtype", NE_CHECK,
+                                              "number:steal", $<id>3,
+                                              NULL);
                        checks = g_list_append(checks,node);
                                        }
        ;
                        checks = g_list_append(checks,node);
                                        }
        ;
@@ -1106,6 +1770,7 @@ numtok:           NUMBER                  { $<id>$ = $<id>1; }
                        $<id>$ = g_strconcat("-",$<id>2,NULL);
                        g_free($<id>2);
                                        }
                        $<id>$ = g_strconcat("-",$<id>2,NULL);
                        g_free($<id>2);
                                        }
+       |       SINGLE_CHAR             { $<id>$ = $<id>1; }
        |       TOKEN                   { $<id>$ = $<id>1; }
        ;
        
        |       TOKEN                   { $<id>$ = $<id>1; }
        ;
        
index 9ea1d90167d82a68bb187bfda12f73bb032a694d..8c7cf8516cb106e08d90a16628721316b8e49529 100644 (file)
@@ -3,7 +3,7 @@
    look in here to see a whole array of different syntax options, but
    don't expect this to be an easy to read file */
 
    look in here to see a whole array of different syntax options, but
    don't expect this to be an easy to read file */
 
-requires 0.93.0
+requires 1.99.0
 
 %at{
 /* ALL TOP */
 
 %at{
 /* ALL TOP */
@@ -30,8 +30,8 @@ requires 0.93.0
    the %{ %} sections above the class definitions, it will not put it in
    the file itself.  So you can this way select where the include file is
    at */
    the %{ %} sections above the class definitions, it will not put it in
    the file itself.  So you can this way select where the include file is
    at */
-#include "gtk-weird-button.h"
-#include "gtk-weird-button-private.h"
+#include "test-object.h"
+#include "test-object-private.h"
 
 /* this is to test if the lexer won't get confused by requires inside
    some c code
 
 /* this is to test if the lexer won't get confused by requires inside
    some c code
@@ -39,6 +39,8 @@ requires 99.99.99
 */
 
 static void jjjj(void);
 */
 
 static void jjjj(void);
+
+#define _(x) x
 %}
 
 %h{
 %}
 
 %h{
@@ -59,7 +61,7 @@ void bubu(void);
 #define TEST_ARRAY 5
 %}
 
 #define TEST_ARRAY 5
 %}
 
-class Gtk:Weird:Button from Gtk:Button {
+class Test:Object from G:Object {
 
        public int test_array[TEST_ARRAY];
        public int i;
 
        public int test_array[TEST_ARRAY];
        public int i;
@@ -72,21 +74,21 @@ class Gtk:Weird:Button from Gtk:Button {
                destroywith g_free;
        argument POINTER testingstring stringlink;
 
                destroywith g_free;
        argument POINTER testingstring stringlink;
 
-       public Gtk:Weird:Button * testingobj
-               destroywith gtk_object_unref;
+       public Test:Object * testingobj
+               destroywith g_object_unref;
        argument POINTER testingobj objectlink;
 
        classwide int foo = 20;
        argument INT foo link;
 
        argument POINTER testingobj objectlink;
 
        classwide int foo = 20;
        argument INT foo link;
 
-       public Gtk:Object * testingobj2
+       public G:Object * testingobj2
                destroy {
                        if(VAR)
                destroy {
                        if(VAR)
-                               gtk_object_unref(GTK_OBJECT(VAR));
+                               g_object_unref(G_OBJECT(VAR));
                };
                };
-       argument POINTER (type Gtk:Object *) testingobj2 objectlink;
+       argument POINTER (type G:Object *) testingobj2 objectlink;
        
        
-       argument POINTER (type GtkObject *) some_object
+       argument POINTER (type GObject *) some_object
                set { /* set some_object */ }
                get { /* get some_object */
                        ARG=NULL; };
                set { /* set some_object */ }
                get { /* get some_object */
                        ARG=NULL; };
@@ -95,8 +97,32 @@ class Gtk:Weird:Button from Gtk:Button {
        argument POINTER (type char *) read_only_string
                get { /* get readonly_long */
                        ARG = g_strdup("BLAH"); };
        argument POINTER (type char *) read_only_string
                get { /* get readonly_long */
                        ARG = g_strdup("BLAH"); };
+
+       private char a_property;
+       property CHAR a_property
+               (nick = _("Nick"),
+                blurb = _("Blurb"),
+                minimum = 'a',
+                maximum = 'Z',
+                default_value = 'C',
+                export)
+               set { self->_priv->a_property = g_value_get_char (VAL); }
+               get { g_value_set_char (VAL, self->_priv->a_property); };
+
+
+       private char *b_property;
+       property STRING b_property
+               (nick = _("Nick b"),
+                blurb = _("Blurb b"),
+                default_value = "default",
+                type = char *,
+                flags = CONSTRUCT,
+                export,
+                link);
+
+
        private int j;
        private int j;
-       public GtkWidget * h;
+       public GObject * h;
        public char *bleh;
        public double array[23][18];
        protected unsigned long int wagawaga;
        public char *bleh;
        public double array[23][18];
        protected unsigned long int wagawaga;
@@ -115,21 +141,19 @@ class Gtk:Weird:Button from Gtk:Button {
         *
         * Returns: new object
         */
         *
         * Returns: new object
         */
-       public GtkWidget * new(int j (check > 0)) {
-               GtkWidget *ret;
-               ret = GTK_WIDGET (GET_NEW);
+       public GObject * new(int j (check > 0)) {
+               GObject *ret;
+               ret = G_OBJECT (GET_NEW);
 
                SELF(ret)->_priv->j = j;
 
                return ret;
        }
 
                SELF(ret)->_priv->j = j;
 
                return ret;
        }
-       private int _blah(self, Gtk:Widget * wid (check null type),
+       private int blah(self, G:Object * wid (check null type),
                         int h (check > 0)) onerror -1 {
                         int h (check > 0)) onerror -1 {
-               gtk_container_add(GTK_CONTAINER(self),wid);
-
-               gtk_object_set(GTK_OBJECT(self),
-                              GTK_WEIRD_BUTTON_ARG_I(99),
-                              NULL);
+               g_object_set (G_OBJECT (self),
+                             TEST_OBJECT_PROP_I (99),
+                             NULL);
                return h;
        }
        /**
                return h;
        }
        /**
@@ -142,15 +166,15 @@ class Gtk:Weird:Button from Gtk:Button {
         *
         * Returns: new object
         **/
         *
         * Returns: new object
         **/
-       signal last INT (POINTER, INT)
-       int bleh(self, Gtk:Widget * wid (check null type),
+       signal last STRING (POINTER, INT)
+       char * bleh(self, G:Object * wid (check null type),
                        int h (check > 0)) {
                        int h (check > 0)) {
-               return _blah(self,wid,h);
+               return self_blah(self,wid,h) > 0 ? g_strdup ("foo") : g_strdup ("bar");
        }
 
        private
        int
        }
 
        private
        int
-       test_handler (self, GtkWidget *w, int h, gpointer data)
+       test_handler (self, GObject *w, int h, gpointer data)
        {
                return -1;
        }
        {
                return -1;
        }
@@ -165,11 +189,11 @@ class Gtk:Weird:Button from Gtk:Button {
         *
         * Returns: new object */
        signal last INT (POINTER, INT)
         *
         * Returns: new object */
        signal last INT (POINTER, INT)
-       int bleh2(self, const Gtk:Widget * wid (check null type),
+       int bleh2(self, const G:Object * wid (check null type),
                        int h (check > 0)) {
                        int h (check > 0)) {
-               gtk_signal_connect (GTK_OBJECT (self),
+               /*gtk_signal_connect (GTK_OBJECT (self),
                                    GTK_WEIRD_BUTTON_SIGNAL_BLEH (test_handler),
                                    GTK_WEIRD_BUTTON_SIGNAL_BLEH (test_handler),
-                                   NULL);
+                                   NULL);*/
 
                /* testing multiple marshaller support */
                return 0;
 
                /* testing multiple marshaller support */
                return 0;
@@ -201,14 +225,14 @@ class Gtk:Weird:Button from Gtk:Button {
        signal first NONE (NONE)
        void bloh(self);
        virtual void * bah(self, int h (check > 0)) onerror NULL defreturn 0 {
        signal first NONE (NONE)
        void bloh(self);
        virtual void * bah(self, int h (check > 0)) onerror NULL defreturn 0 {
-               beh(self,h);
+               self_beh(self,h);
                return NULL;
        }
        virtual int beh(self, int h (check > 0));
                return NULL;
        }
        virtual int beh(self, int h (check > 0));
-       override(Gtk:Container) void add(Gtk:Container * self (check null type),
+       /*override(G:Object) void add(Gtk:Container * self (check null type),
                                         Gtk:Widget * wid (check null type)) {
                PARENT_HANDLER(self,wid);
                                         Gtk:Widget * wid (check null type)) {
                PARENT_HANDLER(self,wid);
-       }
+       }*/
        public int consttest(self, const gchar *text, ...)
        {
                return 25;
        public int consttest(self, const gchar *text, ...)
        {
                return 25;
@@ -217,7 +241,7 @@ class Gtk:Weird:Button from Gtk:Button {
        {
                return 25;
        }
        {
                return 25;
        }
-       public int consttest3(self, Gtk:Widget const *wid (check null type))
+       public int consttest3(self, G:Object const *wid (check null type))
        {
                return 25;
        }
        {
                return 25;
        }
@@ -241,7 +265,7 @@ class Gtk:Weird:Button from Gtk:Button {
        {
                Self const *selfconst1, *selfconst2;
                selfconst1 = SELF_CONST(self);
        {
                Self const *selfconst1, *selfconst2;
                selfconst1 = SELF_CONST(self);
-               selfconst2 = GTK_WEIRD_BUTTON_CONST(self);
+               selfconst2 = TEST_OBJECT_CONST(self);
                return 25;
        }
        public int consttest9(const self, int i, double b)
                return 25;
        }
        public int consttest9(const self, int i, double b)
@@ -256,7 +280,7 @@ class Gtk:Weird:Button from Gtk:Button {
        void googlegoogle(self)
        {
                puts("TEST1");
        void googlegoogle(self)
        {
                puts("TEST1");
-               googlegoogle2(self);
+               self_googlegoogle2(self);
        }
        signal first private NONE (NONE)
        void googlegoogle2(self)
        }
        signal first private NONE (NONE)
        void googlegoogle2(self)
@@ -264,7 +288,7 @@ class Gtk:Weird:Button from Gtk:Button {
                int array[5][8][9]={{{0}}};
                Self *foo = self;
                puts("TEST2");
                int array[5][8][9]={{{0}}};
                Self *foo = self;
                puts("TEST2");
-               testprivvirtual(foo, array);
+               self_testprivvirtual(foo, array);
        }
        private signal first NONE (NONE)
        void googlegoogle3(self)
        }
        private signal first NONE (NONE)
        void googlegoogle3(self)
@@ -290,7 +314,7 @@ class Gtk:Weird:Button from Gtk:Button {
        void testprivvirtual(self, int some_array[5][8][9])
        {
                puts("TEST3");
        void testprivvirtual(self, int some_array[5][8][9])
        {
                puts("TEST3");
-               googlegoogle(self);
+               self_googlegoogle(self);
        }
        private virtual
        void testprivvirtual2(self, const int some_array[5][8][9])
        }
        private virtual
        void testprivvirtual2(self, const int some_array[5][8][9])
@@ -324,28 +348,28 @@ class Gtk:Weird:Button from Gtk:Button {
        {
        }
 
        {
        }
 
-       override (Gtk:Widget)
-       int event(Gtk:Widget *self (check null type),
-                 GdkEvent *event (check null)) onerror FALSE
-       {
-               int ret;
-               /* some code */
-               ret = PARENT_HANDLER(self,event);
-               /* some code */
-               return ret;
-       }
-       override(Gtk:Container)
-       void
-       remove(Gtk:Container * self (check null type),
-              Gtk:Widget * wid (check null type));
-
-       override(Gtk:Object)
-       void
-       destroy(Gtk:Object * self (check null type))
-       {
-               /* foo bar */
-               PARENT_HANDLER(self);
-       }
+//     override (Gtk:Widget)
+//     int event(Gtk:Widget *self (check null type),
+//               GdkEvent *event (check null)) onerror FALSE
+//     {
+//             int ret;
+//             /* some code */
+//             ret = PARENT_HANDLER(self,event);
+//             /* some code */
+//             return ret;
+//     }
+//     override(Gtk:Container)
+//     void
+//     remove(Gtk:Container * self (check null type),
+//            Gtk:Widget * wid (check null type));
+//
+//     override(Gtk:Object)
+//     void
+//     destroy(Gtk:Object * self (check null type))
+//     {
+//             /* foo bar */
+//             PARENT_HANDLER(self);
+//     }
 
        protected
        int foobar(self) {
 
        protected
        int foobar(self) {
@@ -353,12 +377,12 @@ class Gtk:Weird:Button from Gtk:Button {
                return 5;
        }
 
                return 5;
        }
 
-       signal last NONE(CHAR,UCHAR,BOOL,INT,UINT,LONG,ULONG,FLOAT,DOUBLE,
+       signal last NONE(CHAR,UCHAR,BOOLEAN,INT,UINT,LONG,ULONG,FLOAT,DOUBLE,
                         STRING,ENUM,FLAGS,BOXED,POINTER,OBJECT)
        void
        testargs(self, gchar a, guchar b, gboolean c, gint d, guint e, glong f,
                 gulong g, gfloat h, gdouble i, gchar * j, gint k,
                         STRING,ENUM,FLAGS,BOXED,POINTER,OBJECT)
        void
        testargs(self, gchar a, guchar b, gboolean c, gint d, guint e, glong f,
                 gulong g, gfloat h, gdouble i, gchar * j, gint k,
-                guint l, gpointer m, gpointer o, GtkObject *p)
+                guint l, gpointer m, gpointer o, GObject *p)
        {
                /* ugh, testing casting */
        }
        {
                /* ugh, testing casting */
        }
@@ -370,7 +394,7 @@ class Gtk:Weird:Button from Gtk:Button {
        }
 
        /* testing NONE */
        }
 
        /* testing NONE */
-       signal BOOL (NONE)
+       signal BOOLEAN (NONE)
        gboolean
        test_none_thing (self)
        {
        gboolean
        test_none_thing (self)
        {
@@ -404,7 +428,7 @@ class Gtk:Weird:Button from Gtk:Button {
 
        /* testing calling the above method */
        public void foo (self) {
 
        /* testing calling the above method */
        public void foo (self) {
-               method_with_no_arguments ();
+               self_method_with_no_arguments ();
        }
 
        /* this is to test custom get_type */
        }
 
        /* this is to test custom get_type */
index e424df35e863c2d1e14a9ea31dc9d2ed80f994b1..486a599dc7072c1d8edf63358cd6d71d50a99bea 100644 (file)
  * Do not edit by hand! */
 
 #include <glib.h>
  * Do not edit by hand! */
 
 #include <glib.h>
+#include <stdarg.h>
 #include "treefuncs.h"
 
 #include "treefuncs.h"
 
-#define COPY_LIST_VALS(list,func) { GList *li; for(li=(list);li;li=li->next) { li->data=func(li->data); } }
-
-Node * new_argument (char * gtktype, Type * atype, GList * flags, char * name, char * get, int get_line, char * set, int set_line, int line_no)
-{
-       Argument * self = g_new0(Argument, 1);
-       self->type = ARGUMENT_NODE;
-       self->gtktype = gtktype;
-       self->atype = atype;
-       self->flags = flags;
-       self->name = name;
-       self->get = get;
-       self->get_line = get_line;
-       self->set = set;
-       self->set_line = set_line;
-       self->line_no = line_no;
-       return (Node *)self;
-}
+#define COPY_LIST_VALS(list,func) { GList *li; for (li=(list);li;li=li->next) { li->data=func (li->data); } }
 
 
-Node * new_ccode (int cctype, char * cbuf, int line_no)
-{
-       CCode * self = g_new0(CCode, 1);
-       self->type = CCODE_NODE;
-       self->cctype = cctype;
-       self->cbuf = cbuf;
-       self->line_no = line_no;
-       return (Node *)self;
-}
+static Argument *
+copy_argument (Argument * self);
+static CCode *
+copy_ccode (CCode * self);
+static Check *
+copy_check (Check * self);
+static Class *
+copy_class (Class * self);
+static FuncArg *
+copy_funcarg (FuncArg * self);
+static Method *
+copy_method (Method * self);
+static Property *
+copy_property (Property * self);
+static Type *
+copy_type (Type * self);
+static Variable *
+copy_variable (Variable * self);
 
 
-Node * new_check (int chtype, char * number)
-{
-       Check * self = g_new0(Check, 1);
-       self->type = CHECK_NODE;
-       self->chtype = chtype;
-       self->number = number;
-       return (Node *)self;
-}
+void
+free_argument (Argument * self);
+void
+free_ccode (CCode * self);
+void
+free_check (Check * self);
+void
+free_class (Class * self);
+void
+free_funcarg (FuncArg * self);
+void
+free_method (Method * self);
+void
+free_property (Property * self);
+void
+free_type (Type * self);
+void
+free_variable (Variable * self);
 
 
-Node * new_class (char * otype, char * ptype, char * chunk_size, GList * nodes)
-{
-       Class * self = g_new0(Class, 1);
-       self->type = CLASS_NODE;
-       self->otype = otype;
-       self->ptype = ptype;
-       self->chunk_size = chunk_size;
-       self->nodes = nodes;
-       return (Node *)self;
-}
-
-Node * new_funcarg (Type * atype, char * name, GList * checks)
-{
-       FuncArg * self = g_new0(FuncArg, 1);
-       self->type = FUNCARG_NODE;
-       self->atype = atype;
-       self->name = name;
-       self->checks = checks;
-       return (Node *)self;
-}
+static void
+setv_argument (Argument * self, va_list __ap);
+static void
+setv_ccode (CCode * self, va_list __ap);
+static void
+setv_check (Check * self, va_list __ap);
+static void
+setv_class (Class * self, va_list __ap);
+static void
+setv_funcarg (FuncArg * self, va_list __ap);
+static void
+setv_method (Method * self, va_list __ap);
+static void
+setv_property (Property * self, va_list __ap);
+static void
+setv_type (Type * self, va_list __ap);
+static void
+setv_variable (Variable * self, va_list __ap);
 
 
-Node * new_method (int scope, int method, Type * mtype, char * otype, GList * gtktypes, GList * flags, char * id, GList * args, char * onerror, char * defreturn, char * cbuf, int line_no, int ccode_line, gboolean vararg, int unique_id)
-{
-       Method * self = g_new0(Method, 1);
-       self->type = METHOD_NODE;
-       self->scope = scope;
-       self->method = method;
-       self->mtype = mtype;
-       self->otype = otype;
-       self->gtktypes = gtktypes;
-       self->flags = flags;
-       self->id = id;
-       self->args = args;
-       self->onerror = onerror;
-       self->defreturn = defreturn;
-       self->cbuf = cbuf;
-       self->line_no = line_no;
-       self->ccode_line = ccode_line;
-       self->vararg = vararg;
-       self->unique_id = unique_id;
-       return (Node *)self;
-}
+static gboolean quarks_set_up = FALSE;
+static GHashTable *quark_ht;
+enum {
+       QUARK_0,
+       QUARK_otype,
+       QUARK_otype_STEAL,
+       QUARK_ptype,
+       QUARK_ptype_STEAL,
+       QUARK_bonobo_x_class,
+       QUARK_bonobo_x_class_STEAL,
+       QUARK_chunk_size,
+       QUARK_chunk_size_STEAL,
+       QUARK_nodes,
+       QUARK_nodes_STEAL,
+       QUARK_name,
+       QUARK_name_STEAL,
+       QUARK_pointer,
+       QUARK_pointer_STEAL,
+       QUARK_postfix,
+       QUARK_postfix_STEAL,
+       QUARK_cctype,
+       QUARK_cbuf,
+       QUARK_cbuf_STEAL,
+       QUARK_line_no,
+       QUARK_chtype,
+       QUARK_number,
+       QUARK_number_STEAL,
+       QUARK_atype,
+       QUARK_atype_STEAL,
+       QUARK_checks,
+       QUARK_checks_STEAL,
+       QUARK_gtktype,
+       QUARK_gtktype_STEAL,
+       QUARK_flags,
+       QUARK_flags_STEAL,
+       QUARK_get,
+       QUARK_get_STEAL,
+       QUARK_get_line,
+       QUARK_set,
+       QUARK_set_STEAL,
+       QUARK_set_line,
+       QUARK_nick,
+       QUARK_nick_STEAL,
+       QUARK_blurb,
+       QUARK_blurb_STEAL,
+       QUARK_minimum,
+       QUARK_minimum_STEAL,
+       QUARK_maximum,
+       QUARK_maximum_STEAL,
+       QUARK_default_value,
+       QUARK_default_value_STEAL,
+       QUARK_extra_gtktype,
+       QUARK_extra_gtktype_STEAL,
+       QUARK_link,
+       QUARK_export,
+       QUARK_scope,
+       QUARK_method,
+       QUARK_mtype,
+       QUARK_mtype_STEAL,
+       QUARK_gtktypes,
+       QUARK_gtktypes_STEAL,
+       QUARK_id,
+       QUARK_id_STEAL,
+       QUARK_args,
+       QUARK_args_STEAL,
+       QUARK_onerror,
+       QUARK_onerror_STEAL,
+       QUARK_defreturn,
+       QUARK_defreturn_STEAL,
+       QUARK_ccode_line,
+       QUARK_vararg,
+       QUARK_unique_id,
+       QUARK_bonobo_x_func,
+       QUARK_vtype,
+       QUARK_vtype_STEAL,
+       QUARK_destructor_unref,
+       QUARK_destructor,
+       QUARK_destructor_STEAL,
+       QUARK_destructor_line,
+       QUARK_destructor_simple,
+       QUARK_initializer,
+       QUARK_initializer_STEAL,
+       QUARK_initializer_line,
+       QUARK_LAST
+};
 
 
-Node * new_type (char * name, char * pointer, char * postfix)
+static void
+ensure_quarks (void)
 {
 {
-       Type * self = g_new0(Type, 1);
-       self->type = TYPE_NODE;
-       self->name = name;
-       self->pointer = pointer;
-       self->postfix = postfix;
-       return (Node *)self;
+       if (quarks_set_up)
+               return;
+       quark_ht = g_hash_table_new (g_str_hash, g_str_equal);
+       quarks_set_up = TRUE;
+       g_hash_table_insert (quark_ht, "otype", GINT_TO_POINTER (QUARK_otype));
+       g_hash_table_insert (quark_ht, "otype:steal", GINT_TO_POINTER (QUARK_otype_STEAL));
+       g_hash_table_insert (quark_ht, "ptype", GINT_TO_POINTER (QUARK_ptype));
+       g_hash_table_insert (quark_ht, "ptype:steal", GINT_TO_POINTER (QUARK_ptype_STEAL));
+       g_hash_table_insert (quark_ht, "bonobo_x_class", GINT_TO_POINTER (QUARK_bonobo_x_class));
+       g_hash_table_insert (quark_ht, "bonobo_x_class:steal", GINT_TO_POINTER (QUARK_bonobo_x_class_STEAL));
+       g_hash_table_insert (quark_ht, "chunk_size", GINT_TO_POINTER (QUARK_chunk_size));
+       g_hash_table_insert (quark_ht, "chunk_size:steal", GINT_TO_POINTER (QUARK_chunk_size_STEAL));
+       g_hash_table_insert (quark_ht, "nodes", GINT_TO_POINTER (QUARK_nodes));
+       g_hash_table_insert (quark_ht, "nodes:steal", GINT_TO_POINTER (QUARK_nodes_STEAL));
+       g_hash_table_insert (quark_ht, "name", GINT_TO_POINTER (QUARK_name));
+       g_hash_table_insert (quark_ht, "name:steal", GINT_TO_POINTER (QUARK_name_STEAL));
+       g_hash_table_insert (quark_ht, "pointer", GINT_TO_POINTER (QUARK_pointer));
+       g_hash_table_insert (quark_ht, "pointer:steal", GINT_TO_POINTER (QUARK_pointer_STEAL));
+       g_hash_table_insert (quark_ht, "postfix", GINT_TO_POINTER (QUARK_postfix));
+       g_hash_table_insert (quark_ht, "postfix:steal", GINT_TO_POINTER (QUARK_postfix_STEAL));
+       g_hash_table_insert (quark_ht, "cctype", GINT_TO_POINTER (QUARK_cctype));
+       g_hash_table_insert (quark_ht, "cbuf", GINT_TO_POINTER (QUARK_cbuf));
+       g_hash_table_insert (quark_ht, "cbuf:steal", GINT_TO_POINTER (QUARK_cbuf_STEAL));
+       g_hash_table_insert (quark_ht, "line_no", GINT_TO_POINTER (QUARK_line_no));
+       g_hash_table_insert (quark_ht, "chtype", GINT_TO_POINTER (QUARK_chtype));
+       g_hash_table_insert (quark_ht, "number", GINT_TO_POINTER (QUARK_number));
+       g_hash_table_insert (quark_ht, "number:steal", GINT_TO_POINTER (QUARK_number_STEAL));
+       g_hash_table_insert (quark_ht, "atype", GINT_TO_POINTER (QUARK_atype));
+       g_hash_table_insert (quark_ht, "atype:steal", GINT_TO_POINTER (QUARK_atype_STEAL));
+       g_hash_table_insert (quark_ht, "checks", GINT_TO_POINTER (QUARK_checks));
+       g_hash_table_insert (quark_ht, "checks:steal", GINT_TO_POINTER (QUARK_checks_STEAL));
+       g_hash_table_insert (quark_ht, "gtktype", GINT_TO_POINTER (QUARK_gtktype));
+       g_hash_table_insert (quark_ht, "gtktype:steal", GINT_TO_POINTER (QUARK_gtktype_STEAL));
+       g_hash_table_insert (quark_ht, "flags", GINT_TO_POINTER (QUARK_flags));
+       g_hash_table_insert (quark_ht, "flags:steal", GINT_TO_POINTER (QUARK_flags_STEAL));
+       g_hash_table_insert (quark_ht, "get", GINT_TO_POINTER (QUARK_get));
+       g_hash_table_insert (quark_ht, "get:steal", GINT_TO_POINTER (QUARK_get_STEAL));
+       g_hash_table_insert (quark_ht, "get_line", GINT_TO_POINTER (QUARK_get_line));
+       g_hash_table_insert (quark_ht, "set", GINT_TO_POINTER (QUARK_set));
+       g_hash_table_insert (quark_ht, "set:steal", GINT_TO_POINTER (QUARK_set_STEAL));
+       g_hash_table_insert (quark_ht, "set_line", GINT_TO_POINTER (QUARK_set_line));
+       g_hash_table_insert (quark_ht, "nick", GINT_TO_POINTER (QUARK_nick));
+       g_hash_table_insert (quark_ht, "nick:steal", GINT_TO_POINTER (QUARK_nick_STEAL));
+       g_hash_table_insert (quark_ht, "blurb", GINT_TO_POINTER (QUARK_blurb));
+       g_hash_table_insert (quark_ht, "blurb:steal", GINT_TO_POINTER (QUARK_blurb_STEAL));
+       g_hash_table_insert (quark_ht, "minimum", GINT_TO_POINTER (QUARK_minimum));
+       g_hash_table_insert (quark_ht, "minimum:steal", GINT_TO_POINTER (QUARK_minimum_STEAL));
+       g_hash_table_insert (quark_ht, "maximum", GINT_TO_POINTER (QUARK_maximum));
+       g_hash_table_insert (quark_ht, "maximum:steal", GINT_TO_POINTER (QUARK_maximum_STEAL));
+       g_hash_table_insert (quark_ht, "default_value", GINT_TO_POINTER (QUARK_default_value));
+       g_hash_table_insert (quark_ht, "default_value:steal", GINT_TO_POINTER (QUARK_default_value_STEAL));
+       g_hash_table_insert (quark_ht, "extra_gtktype", GINT_TO_POINTER (QUARK_extra_gtktype));
+       g_hash_table_insert (quark_ht, "extra_gtktype:steal", GINT_TO_POINTER (QUARK_extra_gtktype_STEAL));
+       g_hash_table_insert (quark_ht, "link", GINT_TO_POINTER (QUARK_link));
+       g_hash_table_insert (quark_ht, "export", GINT_TO_POINTER (QUARK_export));
+       g_hash_table_insert (quark_ht, "scope", GINT_TO_POINTER (QUARK_scope));
+       g_hash_table_insert (quark_ht, "method", GINT_TO_POINTER (QUARK_method));
+       g_hash_table_insert (quark_ht, "mtype", GINT_TO_POINTER (QUARK_mtype));
+       g_hash_table_insert (quark_ht, "mtype:steal", GINT_TO_POINTER (QUARK_mtype_STEAL));
+       g_hash_table_insert (quark_ht, "gtktypes", GINT_TO_POINTER (QUARK_gtktypes));
+       g_hash_table_insert (quark_ht, "gtktypes:steal", GINT_TO_POINTER (QUARK_gtktypes_STEAL));
+       g_hash_table_insert (quark_ht, "id", GINT_TO_POINTER (QUARK_id));
+       g_hash_table_insert (quark_ht, "id:steal", GINT_TO_POINTER (QUARK_id_STEAL));
+       g_hash_table_insert (quark_ht, "args", GINT_TO_POINTER (QUARK_args));
+       g_hash_table_insert (quark_ht, "args:steal", GINT_TO_POINTER (QUARK_args_STEAL));
+       g_hash_table_insert (quark_ht, "onerror", GINT_TO_POINTER (QUARK_onerror));
+       g_hash_table_insert (quark_ht, "onerror:steal", GINT_TO_POINTER (QUARK_onerror_STEAL));
+       g_hash_table_insert (quark_ht, "defreturn", GINT_TO_POINTER (QUARK_defreturn));
+       g_hash_table_insert (quark_ht, "defreturn:steal", GINT_TO_POINTER (QUARK_defreturn_STEAL));
+       g_hash_table_insert (quark_ht, "ccode_line", GINT_TO_POINTER (QUARK_ccode_line));
+       g_hash_table_insert (quark_ht, "vararg", GINT_TO_POINTER (QUARK_vararg));
+       g_hash_table_insert (quark_ht, "unique_id", GINT_TO_POINTER (QUARK_unique_id));
+       g_hash_table_insert (quark_ht, "bonobo_x_func", GINT_TO_POINTER (QUARK_bonobo_x_func));
+       g_hash_table_insert (quark_ht, "vtype", GINT_TO_POINTER (QUARK_vtype));
+       g_hash_table_insert (quark_ht, "vtype:steal", GINT_TO_POINTER (QUARK_vtype_STEAL));
+       g_hash_table_insert (quark_ht, "destructor_unref", GINT_TO_POINTER (QUARK_destructor_unref));
+       g_hash_table_insert (quark_ht, "destructor", GINT_TO_POINTER (QUARK_destructor));
+       g_hash_table_insert (quark_ht, "destructor:steal", GINT_TO_POINTER (QUARK_destructor_STEAL));
+       g_hash_table_insert (quark_ht, "destructor_line", GINT_TO_POINTER (QUARK_destructor_line));
+       g_hash_table_insert (quark_ht, "destructor_simple", GINT_TO_POINTER (QUARK_destructor_simple));
+       g_hash_table_insert (quark_ht, "initializer", GINT_TO_POINTER (QUARK_initializer));
+       g_hash_table_insert (quark_ht, "initializer:steal", GINT_TO_POINTER (QUARK_initializer_STEAL));
+       g_hash_table_insert (quark_ht, "initializer_line", GINT_TO_POINTER (QUARK_initializer_line));
 }
 
 }
 
-Node * new_variable (int scope, Type * vtype, char * id, int line_no, char * destructor, int destructor_line, gboolean destructor_simple, char * initializer, int initializer_line)
-{
-       Variable * self = g_new0(Variable, 1);
-       self->type = VARIABLE_NODE;
-       self->scope = scope;
-       self->vtype = vtype;
-       self->id = id;
-       self->line_no = line_no;
-       self->destructor = destructor;
-       self->destructor_line = destructor_line;
-       self->destructor_simple = destructor_simple;
-       self->initializer = initializer;
-       self->initializer_line = initializer_line;
-       return (Node *)self;
-}
-
-Argument * copy_argument (Argument * self)
+static Argument *
+copy_argument (Argument * self)
 {
        Argument * new;
 {
        Argument * new;
-       g_return_val_if_fail(self != NULL, NULL);
-       g_return_val_if_fail(self->type == ARGUMENT_NODE, NULL);
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (self->type == ARGUMENT_NODE, NULL);
        new = g_new0(Argument, 1);
        new->type = ARGUMENT_NODE;
        new = g_new0(Argument, 1);
        new->type = ARGUMENT_NODE;
-       new->gtktype = g_strdup(self->gtktype);
-       new->atype = copy_type(self->atype);
-       new->flags = g_list_copy(self->flags); COPY_LIST_VALS(new->flags, g_strdup);
-       new->name = g_strdup(self->name);
-       new->get = g_strdup(self->get);
+       new->gtktype = g_strdup (self->gtktype);
+       new->atype = copy_type (self->atype);
+       new->flags = g_list_copy (self->flags); COPY_LIST_VALS(new->flags, g_strdup);
+       new->name = g_strdup (self->name);
+       new->get = g_strdup (self->get);
        new->get_line = self->get_line;
        new->get_line = self->get_line;
-       new->set = g_strdup(self->set);
+       new->set = g_strdup (self->set);
        new->set_line = self->set_line;
        new->line_no = self->line_no;
        return new;
 }
 
        new->set_line = self->set_line;
        new->line_no = self->line_no;
        return new;
 }
 
-CCode * copy_ccode (CCode * self)
+static CCode *
+copy_ccode (CCode * self)
 {
        CCode * new;
 {
        CCode * new;
-       g_return_val_if_fail(self != NULL, NULL);
-       g_return_val_if_fail(self->type == CCODE_NODE, NULL);
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (self->type == CCODE_NODE, NULL);
        new = g_new0(CCode, 1);
        new->type = CCODE_NODE;
        new->cctype = self->cctype;
        new = g_new0(CCode, 1);
        new->type = CCODE_NODE;
        new->cctype = self->cctype;
-       new->cbuf = g_strdup(self->cbuf);
+       new->cbuf = g_strdup (self->cbuf);
        new->line_no = self->line_no;
        return new;
 }
 
        new->line_no = self->line_no;
        return new;
 }
 
-Check * copy_check (Check * self)
+static Check *
+copy_check (Check * self)
 {
        Check * new;
 {
        Check * new;
-       g_return_val_if_fail(self != NULL, NULL);
-       g_return_val_if_fail(self->type == CHECK_NODE, NULL);
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (self->type == CHECK_NODE, NULL);
        new = g_new0(Check, 1);
        new->type = CHECK_NODE;
        new->chtype = self->chtype;
        new = g_new0(Check, 1);
        new->type = CHECK_NODE;
        new->chtype = self->chtype;
-       new->number = g_strdup(self->number);
+       new->number = g_strdup (self->number);
        return new;
 }
 
        return new;
 }
 
-Class * copy_class (Class * self)
+static Class *
+copy_class (Class * self)
 {
        Class * new;
 {
        Class * new;
-       g_return_val_if_fail(self != NULL, NULL);
-       g_return_val_if_fail(self->type == CLASS_NODE, NULL);
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (self->type == CLASS_NODE, NULL);
        new = g_new0(Class, 1);
        new->type = CLASS_NODE;
        new = g_new0(Class, 1);
        new->type = CLASS_NODE;
-       new->otype = g_strdup(self->otype);
-       new->ptype = g_strdup(self->ptype);
-       new->chunk_size = g_strdup(self->chunk_size);
-       new->nodes = copy_node_list(self->nodes);
+       new->otype = g_strdup (self->otype);
+       new->ptype = g_strdup (self->ptype);
+       new->bonobo_x_class = g_strdup (self->bonobo_x_class);
+       new->chunk_size = g_strdup (self->chunk_size);
+       new->nodes = node_list_copy (self->nodes);
        return new;
 }
 
        return new;
 }
 
-FuncArg * copy_funcarg (FuncArg * self)
+static FuncArg *
+copy_funcarg (FuncArg * self)
 {
        FuncArg * new;
 {
        FuncArg * new;
-       g_return_val_if_fail(self != NULL, NULL);
-       g_return_val_if_fail(self->type == FUNCARG_NODE, NULL);
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (self->type == FUNCARG_NODE, NULL);
        new = g_new0(FuncArg, 1);
        new->type = FUNCARG_NODE;
        new = g_new0(FuncArg, 1);
        new->type = FUNCARG_NODE;
-       new->atype = copy_type(self->atype);
-       new->name = g_strdup(self->name);
-       new->checks = copy_node_list(self->checks);
+       new->atype = copy_type (self->atype);
+       new->name = g_strdup (self->name);
+       new->checks = node_list_copy (self->checks);
        return new;
 }
 
        return new;
 }
 
-Method * copy_method (Method * self)
+static Method *
+copy_method (Method * self)
 {
        Method * new;
 {
        Method * new;
-       g_return_val_if_fail(self != NULL, NULL);
-       g_return_val_if_fail(self->type == METHOD_NODE, NULL);
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (self->type == METHOD_NODE, NULL);
        new = g_new0(Method, 1);
        new->type = METHOD_NODE;
        new->scope = self->scope;
        new->method = self->method;
        new = g_new0(Method, 1);
        new->type = METHOD_NODE;
        new->scope = self->scope;
        new->method = self->method;
-       new->mtype = copy_type(self->mtype);
-       new->otype = g_strdup(self->otype);
-       new->gtktypes = g_list_copy(self->gtktypes); COPY_LIST_VALS(new->gtktypes, g_strdup);
-       new->flags = g_list_copy(self->flags); COPY_LIST_VALS(new->flags, g_strdup);
-       new->id = g_strdup(self->id);
-       new->args = copy_node_list(self->args);
-       new->onerror = g_strdup(self->onerror);
-       new->defreturn = g_strdup(self->defreturn);
-       new->cbuf = g_strdup(self->cbuf);
+       new->mtype = copy_type (self->mtype);
+       new->otype = g_strdup (self->otype);
+       new->gtktypes = g_list_copy (self->gtktypes); COPY_LIST_VALS(new->gtktypes, g_strdup);
+       new->flags = g_list_copy (self->flags); COPY_LIST_VALS(new->flags, g_strdup);
+       new->id = g_strdup (self->id);
+       new->args = node_list_copy (self->args);
+       new->onerror = g_strdup (self->onerror);
+       new->defreturn = g_strdup (self->defreturn);
+       new->cbuf = g_strdup (self->cbuf);
        new->line_no = self->line_no;
        new->ccode_line = self->ccode_line;
        new->vararg = self->vararg;
        new->unique_id = self->unique_id;
        new->line_no = self->line_no;
        new->ccode_line = self->ccode_line;
        new->vararg = self->vararg;
        new->unique_id = self->unique_id;
+       new->bonobo_x_func = self->bonobo_x_func;
        return new;
 }
 
        return new;
 }
 
-Type * copy_type (Type * self)
+static Property *
+copy_property (Property * self)
+{
+       Property * new;
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (self->type == PROPERTY_NODE, NULL);
+       new = g_new0(Property, 1);
+       new->type = PROPERTY_NODE;
+       new->gtktype = g_strdup (self->gtktype);
+       new->ptype = copy_type (self->ptype);
+       new->flags = g_list_copy (self->flags); COPY_LIST_VALS(new->flags, g_strdup);
+       new->name = g_strdup (self->name);
+       new->nick = g_strdup (self->nick);
+       new->blurb = g_strdup (self->blurb);
+       new->minimum = g_strdup (self->minimum);
+       new->maximum = g_strdup (self->maximum);
+       new->default_value = g_strdup (self->default_value);
+       new->extra_gtktype = g_strdup (self->extra_gtktype);
+       new->link = self->link;
+       new->export = self->export;
+       new->get = g_strdup (self->get);
+       new->get_line = self->get_line;
+       new->set = g_strdup (self->set);
+       new->set_line = self->set_line;
+       new->line_no = self->line_no;
+       return new;
+}
+
+static Type *
+copy_type (Type * self)
 {
        Type * new;
 {
        Type * new;
-       g_return_val_if_fail(self != NULL, NULL);
-       g_return_val_if_fail(self->type == TYPE_NODE, NULL);
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (self->type == TYPE_NODE, NULL);
        new = g_new0(Type, 1);
        new->type = TYPE_NODE;
        new = g_new0(Type, 1);
        new->type = TYPE_NODE;
-       new->name = g_strdup(self->name);
-       new->pointer = g_strdup(self->pointer);
-       new->postfix = g_strdup(self->postfix);
+       new->name = g_strdup (self->name);
+       new->pointer = g_strdup (self->pointer);
+       new->postfix = g_strdup (self->postfix);
        return new;
 }
 
        return new;
 }
 
-Variable * copy_variable (Variable * self)
+static Variable *
+copy_variable (Variable * self)
 {
        Variable * new;
 {
        Variable * new;
-       g_return_val_if_fail(self != NULL, NULL);
-       g_return_val_if_fail(self->type == VARIABLE_NODE, NULL);
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (self->type == VARIABLE_NODE, NULL);
        new = g_new0(Variable, 1);
        new->type = VARIABLE_NODE;
        new->scope = self->scope;
        new = g_new0(Variable, 1);
        new->type = VARIABLE_NODE;
        new->scope = self->scope;
-       new->vtype = copy_type(self->vtype);
-       new->id = g_strdup(self->id);
+       new->vtype = copy_type (self->vtype);
+       new->id = g_strdup (self->id);
        new->line_no = self->line_no;
        new->line_no = self->line_no;
-       new->destructor = g_strdup(self->destructor);
+       new->destructor_unref = self->destructor_unref;
+       new->destructor = g_strdup (self->destructor);
        new->destructor_line = self->destructor_line;
        new->destructor_simple = self->destructor_simple;
        new->destructor_line = self->destructor_line;
        new->destructor_simple = self->destructor_simple;
-       new->initializer = g_strdup(self->initializer);
+       new->initializer = g_strdup (self->initializer);
        new->initializer_line = self->initializer_line;
        return new;
 }
 
        new->initializer_line = self->initializer_line;
        return new;
 }
 
-void free_argument (Argument * self)
+void
+free_argument (Argument * self)
+{
+       g_return_if_fail (self != NULL);
+       g_return_if_fail (self->type == ARGUMENT_NODE);
+       g_free (self->gtktype);
+       free_type (self->atype);
+       g_list_foreach (self->flags, (GFunc)g_free, NULL); g_list_free (self->flags);
+       g_free (self->name);
+       g_free (self->get);
+       g_free (self->set);
+       g_free (self);
+}
+
+void
+free_ccode (CCode * self)
+{
+       g_return_if_fail (self != NULL);
+       g_return_if_fail (self->type == CCODE_NODE);
+       g_free (self->cbuf);
+       g_free (self);
+}
+
+void
+free_check (Check * self)
+{
+       g_return_if_fail (self != NULL);
+       g_return_if_fail (self->type == CHECK_NODE);
+       g_free (self->number);
+       g_free (self);
+}
+
+void
+free_class (Class * self)
+{
+       g_return_if_fail (self != NULL);
+       g_return_if_fail (self->type == CLASS_NODE);
+       g_free (self->otype);
+       g_free (self->ptype);
+       g_free (self->bonobo_x_class);
+       g_free (self->chunk_size);
+       node_list_free (self->nodes);
+       g_free (self);
+}
+
+void
+free_funcarg (FuncArg * self)
+{
+       g_return_if_fail (self != NULL);
+       g_return_if_fail (self->type == FUNCARG_NODE);
+       free_type (self->atype);
+       g_free (self->name);
+       node_list_free (self->checks);
+       g_free (self);
+}
+
+void
+free_method (Method * self)
 {
 {
-       g_return_if_fail(self != NULL);
-       g_return_if_fail(self->type == ARGUMENT_NODE);
-       g_free(self->gtktype);
-       free_type(self->atype);
-       g_list_foreach(self->flags, (GFunc)g_free, NULL); g_list_free(self->flags);
-       g_free(self->name);
-       g_free(self->get);
-       g_free(self->set);
-       g_free(self);
+       g_return_if_fail (self != NULL);
+       g_return_if_fail (self->type == METHOD_NODE);
+       free_type (self->mtype);
+       g_free (self->otype);
+       g_list_foreach (self->gtktypes, (GFunc)g_free, NULL); g_list_free (self->gtktypes);
+       g_list_foreach (self->flags, (GFunc)g_free, NULL); g_list_free (self->flags);
+       g_free (self->id);
+       node_list_free (self->args);
+       g_free (self->onerror);
+       g_free (self->defreturn);
+       g_free (self->cbuf);
+       g_free (self);
 }
 
 }
 
-void free_ccode (CCode * self)
+void
+free_property (Property * self)
 {
 {
-       g_return_if_fail(self != NULL);
-       g_return_if_fail(self->type == CCODE_NODE);
-       g_free(self->cbuf);
-       g_free(self);
+       g_return_if_fail (self != NULL);
+       g_return_if_fail (self->type == PROPERTY_NODE);
+       g_free (self->gtktype);
+       free_type (self->ptype);
+       g_list_foreach (self->flags, (GFunc)g_free, NULL); g_list_free (self->flags);
+       g_free (self->name);
+       g_free (self->nick);
+       g_free (self->blurb);
+       g_free (self->minimum);
+       g_free (self->maximum);
+       g_free (self->default_value);
+       g_free (self->extra_gtktype);
+       g_free (self->get);
+       g_free (self->set);
+       g_free (self);
 }
 
 }
 
-void free_check (Check * self)
+void
+free_type (Type * self)
 {
 {
-       g_return_if_fail(self != NULL);
-       g_return_if_fail(self->type == CHECK_NODE);
-       g_free(self->number);
-       g_free(self);
+       g_return_if_fail (self != NULL);
+       g_return_if_fail (self->type == TYPE_NODE);
+       g_free (self->name);
+       g_free (self->pointer);
+       g_free (self->postfix);
+       g_free (self);
 }
 
 }
 
-void free_class (Class * self)
+void
+free_variable (Variable * self)
 {
 {
-       g_return_if_fail(self != NULL);
-       g_return_if_fail(self->type == CLASS_NODE);
-       g_free(self->otype);
-       g_free(self->ptype);
-       g_free(self->chunk_size);
-       free_node_list(self->nodes);
-       g_free(self);
+       g_return_if_fail (self != NULL);
+       g_return_if_fail (self->type == VARIABLE_NODE);
+       free_type (self->vtype);
+       g_free (self->id);
+       g_free (self->destructor);
+       g_free (self->initializer);
+       g_free (self);
 }
 
 }
 
-void free_funcarg (FuncArg * self)
+static void
+setv_argument (Argument * self, va_list __ap)
 {
 {
-       g_return_if_fail(self != NULL);
-       g_return_if_fail(self->type == FUNCARG_NODE);
-       free_type(self->atype);
-       g_free(self->name);
-       free_node_list(self->checks);
-       g_free(self);
+       int quark;
+       const char *arg;
+       ensure_quarks ();
+       while ((arg = va_arg (__ap, char *)) != NULL) {
+               quark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));
+               switch (quark) {
+               case QUARK_gtktype: {
+                       char * gtktype = va_arg (__ap, char *);
+                       char * __old_value = self->gtktype;
+                       self->gtktype = g_strdup (gtktype);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_gtktype_STEAL: {
+                       char * gtktype = va_arg (__ap, char *);
+                       self->gtktype = gtktype;
+                       break;
+               }
+               case QUARK_atype: {
+                       Type * atype = va_arg (__ap, Type *);
+                       Type * __old_value = self->atype;
+                       self->atype = copy_type (atype);
+                       free_type (__old_value);
+                       break;
+               }
+               case QUARK_atype_STEAL: {
+                       Type * atype = va_arg (__ap, Type *);
+                       self->atype = atype;
+                       break;
+               }
+               case QUARK_flags: {
+                       GList * flags = va_arg (__ap, GList *);
+                       GList * __old_value = self->flags;
+                       self->flags = g_list_copy (flags); COPY_LIST_VALS(self->flags, g_strdup);
+                       g_list_foreach (__old_value, (GFunc)g_free, NULL); g_list_free (__old_value);
+                       break;
+               }
+               case QUARK_flags_STEAL: {
+                       GList * flags = va_arg (__ap, GList *);
+                       self->flags = flags;
+                       break;
+               }
+               case QUARK_name: {
+                       char * name = va_arg (__ap, char *);
+                       char * __old_value = self->name;
+                       self->name = g_strdup (name);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_name_STEAL: {
+                       char * name = va_arg (__ap, char *);
+                       self->name = name;
+                       break;
+               }
+               case QUARK_get: {
+                       char * get = va_arg (__ap, char *);
+                       char * __old_value = self->get;
+                       self->get = g_strdup (get);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_get_STEAL: {
+                       char * get = va_arg (__ap, char *);
+                       self->get = get;
+                       break;
+               }
+               case QUARK_get_line: {
+                       int get_line = va_arg (__ap, int);
+                       self->get_line = get_line;
+                       break;
+               }
+               case QUARK_set: {
+                       char * set = va_arg (__ap, char *);
+                       char * __old_value = self->set;
+                       self->set = g_strdup (set);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_set_STEAL: {
+                       char * set = va_arg (__ap, char *);
+                       self->set = set;
+                       break;
+               }
+               case QUARK_set_line: {
+                       int set_line = va_arg (__ap, int);
+                       self->set_line = set_line;
+                       break;
+               }
+               case QUARK_line_no: {
+                       int line_no = va_arg (__ap, int);
+                       self->line_no = line_no;
+                       break;
+               }
+               default:
+                       g_warning ("Argument named 'Argument::%s' does not exist", arg);
+                       break;
+               }
+       }
+}
+
+static void
+setv_ccode (CCode * self, va_list __ap)
+{
+       int quark;
+       const char *arg;
+       ensure_quarks ();
+       while ((arg = va_arg (__ap, char *)) != NULL) {
+               quark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));
+               switch (quark) {
+               case QUARK_cctype: {
+                       int cctype = va_arg (__ap, int);
+                       self->cctype = cctype;
+                       break;
+               }
+               case QUARK_cbuf: {
+                       char * cbuf = va_arg (__ap, char *);
+                       char * __old_value = self->cbuf;
+                       self->cbuf = g_strdup (cbuf);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_cbuf_STEAL: {
+                       char * cbuf = va_arg (__ap, char *);
+                       self->cbuf = cbuf;
+                       break;
+               }
+               case QUARK_line_no: {
+                       int line_no = va_arg (__ap, int);
+                       self->line_no = line_no;
+                       break;
+               }
+               default:
+                       g_warning ("Argument named 'CCode::%s' does not exist", arg);
+                       break;
+               }
+       }
+}
+
+static void
+setv_check (Check * self, va_list __ap)
+{
+       int quark;
+       const char *arg;
+       ensure_quarks ();
+       while ((arg = va_arg (__ap, char *)) != NULL) {
+               quark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));
+               switch (quark) {
+               case QUARK_chtype: {
+                       int chtype = va_arg (__ap, int);
+                       self->chtype = chtype;
+                       break;
+               }
+               case QUARK_number: {
+                       char * number = va_arg (__ap, char *);
+                       char * __old_value = self->number;
+                       self->number = g_strdup (number);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_number_STEAL: {
+                       char * number = va_arg (__ap, char *);
+                       self->number = number;
+                       break;
+               }
+               default:
+                       g_warning ("Argument named 'Check::%s' does not exist", arg);
+                       break;
+               }
+       }
 }
 
 }
 
-void free_method (Method * self)
+static void
+setv_class (Class * self, va_list __ap)
 {
 {
-       g_return_if_fail(self != NULL);
-       g_return_if_fail(self->type == METHOD_NODE);
-       free_type(self->mtype);
-       g_free(self->otype);
-       g_list_foreach(self->gtktypes, (GFunc)g_free, NULL); g_list_free(self->gtktypes);
-       g_list_foreach(self->flags, (GFunc)g_free, NULL); g_list_free(self->flags);
-       g_free(self->id);
-       free_node_list(self->args);
-       g_free(self->onerror);
-       g_free(self->defreturn);
-       g_free(self->cbuf);
-       g_free(self);
+       int quark;
+       const char *arg;
+       ensure_quarks ();
+       while ((arg = va_arg (__ap, char *)) != NULL) {
+               quark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));
+               switch (quark) {
+               case QUARK_otype: {
+                       char * otype = va_arg (__ap, char *);
+                       char * __old_value = self->otype;
+                       self->otype = g_strdup (otype);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_otype_STEAL: {
+                       char * otype = va_arg (__ap, char *);
+                       self->otype = otype;
+                       break;
+               }
+               case QUARK_ptype: {
+                       char * ptype = va_arg (__ap, char *);
+                       char * __old_value = self->ptype;
+                       self->ptype = g_strdup (ptype);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_ptype_STEAL: {
+                       char * ptype = va_arg (__ap, char *);
+                       self->ptype = ptype;
+                       break;
+               }
+               case QUARK_bonobo_x_class: {
+                       char * bonobo_x_class = va_arg (__ap, char *);
+                       char * __old_value = self->bonobo_x_class;
+                       self->bonobo_x_class = g_strdup (bonobo_x_class);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_bonobo_x_class_STEAL: {
+                       char * bonobo_x_class = va_arg (__ap, char *);
+                       self->bonobo_x_class = bonobo_x_class;
+                       break;
+               }
+               case QUARK_chunk_size: {
+                       char * chunk_size = va_arg (__ap, char *);
+                       char * __old_value = self->chunk_size;
+                       self->chunk_size = g_strdup (chunk_size);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_chunk_size_STEAL: {
+                       char * chunk_size = va_arg (__ap, char *);
+                       self->chunk_size = chunk_size;
+                       break;
+               }
+               case QUARK_nodes: {
+                       GList * nodes = va_arg (__ap, GList *);
+                       GList * __old_value = self->nodes;
+                       self->nodes = node_list_copy (nodes);
+                       node_list_free (__old_value);
+                       break;
+               }
+               case QUARK_nodes_STEAL: {
+                       GList * nodes = va_arg (__ap, GList *);
+                       self->nodes = nodes;
+                       break;
+               }
+               default:
+                       g_warning ("Argument named 'Class::%s' does not exist", arg);
+                       break;
+               }
+       }
 }
 
 }
 
-void free_type (Type * self)
+static void
+setv_funcarg (FuncArg * self, va_list __ap)
 {
 {
-       g_return_if_fail(self != NULL);
-       g_return_if_fail(self->type == TYPE_NODE);
-       g_free(self->name);
-       g_free(self->pointer);
-       g_free(self->postfix);
-       g_free(self);
+       int quark;
+       const char *arg;
+       ensure_quarks ();
+       while ((arg = va_arg (__ap, char *)) != NULL) {
+               quark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));
+               switch (quark) {
+               case QUARK_atype: {
+                       Type * atype = va_arg (__ap, Type *);
+                       Type * __old_value = self->atype;
+                       self->atype = copy_type (atype);
+                       free_type (__old_value);
+                       break;
+               }
+               case QUARK_atype_STEAL: {
+                       Type * atype = va_arg (__ap, Type *);
+                       self->atype = atype;
+                       break;
+               }
+               case QUARK_name: {
+                       char * name = va_arg (__ap, char *);
+                       char * __old_value = self->name;
+                       self->name = g_strdup (name);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_name_STEAL: {
+                       char * name = va_arg (__ap, char *);
+                       self->name = name;
+                       break;
+               }
+               case QUARK_checks: {
+                       GList * checks = va_arg (__ap, GList *);
+                       GList * __old_value = self->checks;
+                       self->checks = node_list_copy (checks);
+                       node_list_free (__old_value);
+                       break;
+               }
+               case QUARK_checks_STEAL: {
+                       GList * checks = va_arg (__ap, GList *);
+                       self->checks = checks;
+                       break;
+               }
+               default:
+                       g_warning ("Argument named 'FuncArg::%s' does not exist", arg);
+                       break;
+               }
+       }
 }
 
 }
 
-void free_variable (Variable * self)
+static void
+setv_method (Method * self, va_list __ap)
 {
 {
-       g_return_if_fail(self != NULL);
-       g_return_if_fail(self->type == VARIABLE_NODE);
-       free_type(self->vtype);
-       g_free(self->id);
-       g_free(self->destructor);
-       g_free(self->initializer);
-       g_free(self);
+       int quark;
+       const char *arg;
+       ensure_quarks ();
+       while ((arg = va_arg (__ap, char *)) != NULL) {
+               quark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));
+               switch (quark) {
+               case QUARK_scope: {
+                       int scope = va_arg (__ap, int);
+                       self->scope = scope;
+                       break;
+               }
+               case QUARK_method: {
+                       int method = va_arg (__ap, int);
+                       self->method = method;
+                       break;
+               }
+               case QUARK_mtype: {
+                       Type * mtype = va_arg (__ap, Type *);
+                       Type * __old_value = self->mtype;
+                       self->mtype = copy_type (mtype);
+                       free_type (__old_value);
+                       break;
+               }
+               case QUARK_mtype_STEAL: {
+                       Type * mtype = va_arg (__ap, Type *);
+                       self->mtype = mtype;
+                       break;
+               }
+               case QUARK_otype: {
+                       char * otype = va_arg (__ap, char *);
+                       char * __old_value = self->otype;
+                       self->otype = g_strdup (otype);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_otype_STEAL: {
+                       char * otype = va_arg (__ap, char *);
+                       self->otype = otype;
+                       break;
+               }
+               case QUARK_gtktypes: {
+                       GList * gtktypes = va_arg (__ap, GList *);
+                       GList * __old_value = self->gtktypes;
+                       self->gtktypes = g_list_copy (gtktypes); COPY_LIST_VALS(self->gtktypes, g_strdup);
+                       g_list_foreach (__old_value, (GFunc)g_free, NULL); g_list_free (__old_value);
+                       break;
+               }
+               case QUARK_gtktypes_STEAL: {
+                       GList * gtktypes = va_arg (__ap, GList *);
+                       self->gtktypes = gtktypes;
+                       break;
+               }
+               case QUARK_flags: {
+                       GList * flags = va_arg (__ap, GList *);
+                       GList * __old_value = self->flags;
+                       self->flags = g_list_copy (flags); COPY_LIST_VALS(self->flags, g_strdup);
+                       g_list_foreach (__old_value, (GFunc)g_free, NULL); g_list_free (__old_value);
+                       break;
+               }
+               case QUARK_flags_STEAL: {
+                       GList * flags = va_arg (__ap, GList *);
+                       self->flags = flags;
+                       break;
+               }
+               case QUARK_id: {
+                       char * id = va_arg (__ap, char *);
+                       char * __old_value = self->id;
+                       self->id = g_strdup (id);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_id_STEAL: {
+                       char * id = va_arg (__ap, char *);
+                       self->id = id;
+                       break;
+               }
+               case QUARK_args: {
+                       GList * args = va_arg (__ap, GList *);
+                       GList * __old_value = self->args;
+                       self->args = node_list_copy (args);
+                       node_list_free (__old_value);
+                       break;
+               }
+               case QUARK_args_STEAL: {
+                       GList * args = va_arg (__ap, GList *);
+                       self->args = args;
+                       break;
+               }
+               case QUARK_onerror: {
+                       char * onerror = va_arg (__ap, char *);
+                       char * __old_value = self->onerror;
+                       self->onerror = g_strdup (onerror);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_onerror_STEAL: {
+                       char * onerror = va_arg (__ap, char *);
+                       self->onerror = onerror;
+                       break;
+               }
+               case QUARK_defreturn: {
+                       char * defreturn = va_arg (__ap, char *);
+                       char * __old_value = self->defreturn;
+                       self->defreturn = g_strdup (defreturn);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_defreturn_STEAL: {
+                       char * defreturn = va_arg (__ap, char *);
+                       self->defreturn = defreturn;
+                       break;
+               }
+               case QUARK_cbuf: {
+                       char * cbuf = va_arg (__ap, char *);
+                       char * __old_value = self->cbuf;
+                       self->cbuf = g_strdup (cbuf);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_cbuf_STEAL: {
+                       char * cbuf = va_arg (__ap, char *);
+                       self->cbuf = cbuf;
+                       break;
+               }
+               case QUARK_line_no: {
+                       int line_no = va_arg (__ap, int);
+                       self->line_no = line_no;
+                       break;
+               }
+               case QUARK_ccode_line: {
+                       int ccode_line = va_arg (__ap, int);
+                       self->ccode_line = ccode_line;
+                       break;
+               }
+               case QUARK_vararg: {
+                       gboolean vararg = va_arg (__ap, gboolean);
+                       self->vararg = vararg;
+                       break;
+               }
+               case QUARK_unique_id: {
+                       int unique_id = va_arg (__ap, int);
+                       self->unique_id = unique_id;
+                       break;
+               }
+               case QUARK_bonobo_x_func: {
+                       gboolean bonobo_x_func = va_arg (__ap, gboolean);
+                       self->bonobo_x_func = bonobo_x_func;
+                       break;
+               }
+               default:
+                       g_warning ("Argument named 'Method::%s' does not exist", arg);
+                       break;
+               }
+       }
 }
 
 }
 
-Node * copy_node(Node *node)
+static void
+setv_property (Property * self, va_list __ap)
 {
 {
-       g_return_val_if_fail(node != NULL, NULL);
-       g_return_val_if_fail(node->type >= 0 && node->type < LAST_NODE_TYPE, NULL);
-       switch(node->type) {
+       int quark;
+       const char *arg;
+       ensure_quarks ();
+       while ((arg = va_arg (__ap, char *)) != NULL) {
+               quark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));
+               switch (quark) {
+               case QUARK_gtktype: {
+                       char * gtktype = va_arg (__ap, char *);
+                       char * __old_value = self->gtktype;
+                       self->gtktype = g_strdup (gtktype);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_gtktype_STEAL: {
+                       char * gtktype = va_arg (__ap, char *);
+                       self->gtktype = gtktype;
+                       break;
+               }
+               case QUARK_ptype: {
+                       Type * ptype = va_arg (__ap, Type *);
+                       Type * __old_value = self->ptype;
+                       self->ptype = copy_type (ptype);
+                       free_type (__old_value);
+                       break;
+               }
+               case QUARK_ptype_STEAL: {
+                       Type * ptype = va_arg (__ap, Type *);
+                       self->ptype = ptype;
+                       break;
+               }
+               case QUARK_flags: {
+                       GList * flags = va_arg (__ap, GList *);
+                       GList * __old_value = self->flags;
+                       self->flags = g_list_copy (flags); COPY_LIST_VALS(self->flags, g_strdup);
+                       g_list_foreach (__old_value, (GFunc)g_free, NULL); g_list_free (__old_value);
+                       break;
+               }
+               case QUARK_flags_STEAL: {
+                       GList * flags = va_arg (__ap, GList *);
+                       self->flags = flags;
+                       break;
+               }
+               case QUARK_name: {
+                       char * name = va_arg (__ap, char *);
+                       char * __old_value = self->name;
+                       self->name = g_strdup (name);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_name_STEAL: {
+                       char * name = va_arg (__ap, char *);
+                       self->name = name;
+                       break;
+               }
+               case QUARK_nick: {
+                       char * nick = va_arg (__ap, char *);
+                       char * __old_value = self->nick;
+                       self->nick = g_strdup (nick);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_nick_STEAL: {
+                       char * nick = va_arg (__ap, char *);
+                       self->nick = nick;
+                       break;
+               }
+               case QUARK_blurb: {
+                       char * blurb = va_arg (__ap, char *);
+                       char * __old_value = self->blurb;
+                       self->blurb = g_strdup (blurb);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_blurb_STEAL: {
+                       char * blurb = va_arg (__ap, char *);
+                       self->blurb = blurb;
+                       break;
+               }
+               case QUARK_minimum: {
+                       char * minimum = va_arg (__ap, char *);
+                       char * __old_value = self->minimum;
+                       self->minimum = g_strdup (minimum);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_minimum_STEAL: {
+                       char * minimum = va_arg (__ap, char *);
+                       self->minimum = minimum;
+                       break;
+               }
+               case QUARK_maximum: {
+                       char * maximum = va_arg (__ap, char *);
+                       char * __old_value = self->maximum;
+                       self->maximum = g_strdup (maximum);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_maximum_STEAL: {
+                       char * maximum = va_arg (__ap, char *);
+                       self->maximum = maximum;
+                       break;
+               }
+               case QUARK_default_value: {
+                       char * default_value = va_arg (__ap, char *);
+                       char * __old_value = self->default_value;
+                       self->default_value = g_strdup (default_value);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_default_value_STEAL: {
+                       char * default_value = va_arg (__ap, char *);
+                       self->default_value = default_value;
+                       break;
+               }
+               case QUARK_extra_gtktype: {
+                       char * extra_gtktype = va_arg (__ap, char *);
+                       char * __old_value = self->extra_gtktype;
+                       self->extra_gtktype = g_strdup (extra_gtktype);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_extra_gtktype_STEAL: {
+                       char * extra_gtktype = va_arg (__ap, char *);
+                       self->extra_gtktype = extra_gtktype;
+                       break;
+               }
+               case QUARK_link: {
+                       gboolean link = va_arg (__ap, gboolean);
+                       self->link = link;
+                       break;
+               }
+               case QUARK_export: {
+                       gboolean export = va_arg (__ap, gboolean);
+                       self->export = export;
+                       break;
+               }
+               case QUARK_get: {
+                       char * get = va_arg (__ap, char *);
+                       char * __old_value = self->get;
+                       self->get = g_strdup (get);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_get_STEAL: {
+                       char * get = va_arg (__ap, char *);
+                       self->get = get;
+                       break;
+               }
+               case QUARK_get_line: {
+                       int get_line = va_arg (__ap, int);
+                       self->get_line = get_line;
+                       break;
+               }
+               case QUARK_set: {
+                       char * set = va_arg (__ap, char *);
+                       char * __old_value = self->set;
+                       self->set = g_strdup (set);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_set_STEAL: {
+                       char * set = va_arg (__ap, char *);
+                       self->set = set;
+                       break;
+               }
+               case QUARK_set_line: {
+                       int set_line = va_arg (__ap, int);
+                       self->set_line = set_line;
+                       break;
+               }
+               case QUARK_line_no: {
+                       int line_no = va_arg (__ap, int);
+                       self->line_no = line_no;
+                       break;
+               }
+               default:
+                       g_warning ("Argument named 'Property::%s' does not exist", arg);
+                       break;
+               }
+       }
+}
+
+static void
+setv_type (Type * self, va_list __ap)
+{
+       int quark;
+       const char *arg;
+       ensure_quarks ();
+       while ((arg = va_arg (__ap, char *)) != NULL) {
+               quark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));
+               switch (quark) {
+               case QUARK_name: {
+                       char * name = va_arg (__ap, char *);
+                       char * __old_value = self->name;
+                       self->name = g_strdup (name);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_name_STEAL: {
+                       char * name = va_arg (__ap, char *);
+                       self->name = name;
+                       break;
+               }
+               case QUARK_pointer: {
+                       char * pointer = va_arg (__ap, char *);
+                       char * __old_value = self->pointer;
+                       self->pointer = g_strdup (pointer);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_pointer_STEAL: {
+                       char * pointer = va_arg (__ap, char *);
+                       self->pointer = pointer;
+                       break;
+               }
+               case QUARK_postfix: {
+                       char * postfix = va_arg (__ap, char *);
+                       char * __old_value = self->postfix;
+                       self->postfix = g_strdup (postfix);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_postfix_STEAL: {
+                       char * postfix = va_arg (__ap, char *);
+                       self->postfix = postfix;
+                       break;
+               }
+               default:
+                       g_warning ("Argument named 'Type::%s' does not exist", arg);
+                       break;
+               }
+       }
+}
+
+static void
+setv_variable (Variable * self, va_list __ap)
+{
+       int quark;
+       const char *arg;
+       ensure_quarks ();
+       while ((arg = va_arg (__ap, char *)) != NULL) {
+               quark = GPOINTER_TO_INT (g_hash_table_lookup (quark_ht, arg));
+               switch (quark) {
+               case QUARK_scope: {
+                       int scope = va_arg (__ap, int);
+                       self->scope = scope;
+                       break;
+               }
+               case QUARK_vtype: {
+                       Type * vtype = va_arg (__ap, Type *);
+                       Type * __old_value = self->vtype;
+                       self->vtype = copy_type (vtype);
+                       free_type (__old_value);
+                       break;
+               }
+               case QUARK_vtype_STEAL: {
+                       Type * vtype = va_arg (__ap, Type *);
+                       self->vtype = vtype;
+                       break;
+               }
+               case QUARK_id: {
+                       char * id = va_arg (__ap, char *);
+                       char * __old_value = self->id;
+                       self->id = g_strdup (id);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_id_STEAL: {
+                       char * id = va_arg (__ap, char *);
+                       self->id = id;
+                       break;
+               }
+               case QUARK_line_no: {
+                       int line_no = va_arg (__ap, int);
+                       self->line_no = line_no;
+                       break;
+               }
+               case QUARK_destructor_unref: {
+                       gboolean destructor_unref = va_arg (__ap, gboolean);
+                       self->destructor_unref = destructor_unref;
+                       break;
+               }
+               case QUARK_destructor: {
+                       char * destructor = va_arg (__ap, char *);
+                       char * __old_value = self->destructor;
+                       self->destructor = g_strdup (destructor);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_destructor_STEAL: {
+                       char * destructor = va_arg (__ap, char *);
+                       self->destructor = destructor;
+                       break;
+               }
+               case QUARK_destructor_line: {
+                       int destructor_line = va_arg (__ap, int);
+                       self->destructor_line = destructor_line;
+                       break;
+               }
+               case QUARK_destructor_simple: {
+                       gboolean destructor_simple = va_arg (__ap, gboolean);
+                       self->destructor_simple = destructor_simple;
+                       break;
+               }
+               case QUARK_initializer: {
+                       char * initializer = va_arg (__ap, char *);
+                       char * __old_value = self->initializer;
+                       self->initializer = g_strdup (initializer);
+                       g_free (__old_value);
+                       break;
+               }
+               case QUARK_initializer_STEAL: {
+                       char * initializer = va_arg (__ap, char *);
+                       self->initializer = initializer;
+                       break;
+               }
+               case QUARK_initializer_line: {
+                       int initializer_line = va_arg (__ap, int);
+                       self->initializer_line = initializer_line;
+                       break;
+               }
+               default:
+                       g_warning ("Argument named 'Variable::%s' does not exist", arg);
+                       break;
+               }
+       }
+}
+
+Node *
+node_copy (Node *node)
+{
+       g_return_val_if_fail (node != NULL, NULL);
+       g_return_val_if_fail (node->type >= 0 && node->type < LAST_NODE_TYPE, NULL);
+       switch (node->type) {
        case ARGUMENT_NODE: return (Node *)copy_argument ((Argument *)node);
        case CCODE_NODE: return (Node *)copy_ccode ((CCode *)node);
        case CHECK_NODE: return (Node *)copy_check ((Check *)node);
        case CLASS_NODE: return (Node *)copy_class ((Class *)node);
        case FUNCARG_NODE: return (Node *)copy_funcarg ((FuncArg *)node);
        case METHOD_NODE: return (Node *)copy_method ((Method *)node);
        case ARGUMENT_NODE: return (Node *)copy_argument ((Argument *)node);
        case CCODE_NODE: return (Node *)copy_ccode ((CCode *)node);
        case CHECK_NODE: return (Node *)copy_check ((Check *)node);
        case CLASS_NODE: return (Node *)copy_class ((Class *)node);
        case FUNCARG_NODE: return (Node *)copy_funcarg ((FuncArg *)node);
        case METHOD_NODE: return (Node *)copy_method ((Method *)node);
+       case PROPERTY_NODE: return (Node *)copy_property ((Property *)node);
        case TYPE_NODE: return (Node *)copy_type ((Type *)node);
        case VARIABLE_NODE: return (Node *)copy_variable ((Variable *)node);
        default: return NULL;
        }
 }
 
        case TYPE_NODE: return (Node *)copy_type ((Type *)node);
        case VARIABLE_NODE: return (Node *)copy_variable ((Variable *)node);
        default: return NULL;
        }
 }
 
-void free_node(Node *node)
+static void
+node_setv (Node *node, va_list __ap)
+{
+       g_return_if_fail (node != NULL);
+       g_return_if_fail (node->type >= 0 && node->type < LAST_NODE_TYPE);
+       switch (node->type) {
+       case ARGUMENT_NODE: setv_argument ((Argument *)node, __ap); break;
+       case CCODE_NODE: setv_ccode ((CCode *)node, __ap); break;
+       case CHECK_NODE: setv_check ((Check *)node, __ap); break;
+       case CLASS_NODE: setv_class ((Class *)node, __ap); break;
+       case FUNCARG_NODE: setv_funcarg ((FuncArg *)node, __ap); break;
+       case METHOD_NODE: setv_method ((Method *)node, __ap); break;
+       case PROPERTY_NODE: setv_property ((Property *)node, __ap); break;
+       case TYPE_NODE: setv_type ((Type *)node, __ap); break;
+       case VARIABLE_NODE: setv_variable ((Variable *)node, __ap); break;
+       default: break;
+       }
+}
+
+void
+node_set (Node *node, ...)
+{
+       va_list __ap;
+       va_start (__ap, node);
+       node_setv (node, __ap);
+       va_end (__ap);
+}
+
+Node *
+node_new (NodeType type, ...)
+{
+       va_list __ap;
+       Node *node = NULL;
+       va_start (__ap, type);
+       g_return_val_if_fail (type >= 0 && type < LAST_NODE_TYPE, NULL);
+       switch (type) {
+       case ARGUMENT_NODE:
+               node = (Node *)g_new0 (Argument, 1);
+               node->type = type;
+               setv_argument ((Argument *)node, __ap);
+               break;
+       case CCODE_NODE:
+               node = (Node *)g_new0 (CCode, 1);
+               node->type = type;
+               setv_ccode ((CCode *)node, __ap);
+               break;
+       case CHECK_NODE:
+               node = (Node *)g_new0 (Check, 1);
+               node->type = type;
+               setv_check ((Check *)node, __ap);
+               break;
+       case CLASS_NODE:
+               node = (Node *)g_new0 (Class, 1);
+               node->type = type;
+               setv_class ((Class *)node, __ap);
+               break;
+       case FUNCARG_NODE:
+               node = (Node *)g_new0 (FuncArg, 1);
+               node->type = type;
+               setv_funcarg ((FuncArg *)node, __ap);
+               break;
+       case METHOD_NODE:
+               node = (Node *)g_new0 (Method, 1);
+               node->type = type;
+               setv_method ((Method *)node, __ap);
+               break;
+       case PROPERTY_NODE:
+               node = (Node *)g_new0 (Property, 1);
+               node->type = type;
+               setv_property ((Property *)node, __ap);
+               break;
+       case TYPE_NODE:
+               node = (Node *)g_new0 (Type, 1);
+               node->type = type;
+               setv_type ((Type *)node, __ap);
+               break;
+       case VARIABLE_NODE:
+               node = (Node *)g_new0 (Variable, 1);
+               node->type = type;
+               setv_variable ((Variable *)node, __ap);
+               break;
+       default: break;
+       }
+       va_end (__ap);
+       return node;
+}
+
+void
+node_free (Node *node)
 {
 {
-       g_return_if_fail(node != NULL);
-       g_return_if_fail(node->type >= 0 && node->type < LAST_NODE_TYPE);
-       switch(node->type) {
+       g_return_if_fail (node != NULL);
+       g_return_if_fail (node->type >= 0 && node->type < LAST_NODE_TYPE);
+       switch (node->type) {
        case ARGUMENT_NODE: free_argument ((Argument *)node); return;
        case CCODE_NODE: free_ccode ((CCode *)node); return;
        case CHECK_NODE: free_check ((Check *)node); return;
        case CLASS_NODE: free_class ((Class *)node); return;
        case FUNCARG_NODE: free_funcarg ((FuncArg *)node); return;
        case METHOD_NODE: free_method ((Method *)node); return;
        case ARGUMENT_NODE: free_argument ((Argument *)node); return;
        case CCODE_NODE: free_ccode ((CCode *)node); return;
        case CHECK_NODE: free_check ((Check *)node); return;
        case CLASS_NODE: free_class ((Class *)node); return;
        case FUNCARG_NODE: free_funcarg ((FuncArg *)node); return;
        case METHOD_NODE: free_method ((Method *)node); return;
+       case PROPERTY_NODE: free_property ((Property *)node); return;
        case TYPE_NODE: free_type ((Type *)node); return;
        case VARIABLE_NODE: free_variable ((Variable *)node); return;
        default: return;
        }
 }
 
        case TYPE_NODE: free_type ((Type *)node); return;
        case VARIABLE_NODE: free_variable ((Variable *)node); return;
        default: return;
        }
 }
 
-GList * copy_node_list(GList *nodes)
+GList *
+node_list_copy (GList *nodes)
 {
        GList *li;
 {
        GList *li;
-       nodes = g_list_copy(nodes);
-       for(li = nodes; li != NULL; li = li->next) {
-               li->data = copy_node(li->data);
+       nodes = g_list_copy (nodes);
+       for (li = nodes; li != NULL; li = li->next) {
+               li->data = node_copy (li->data);
        }
        return nodes;
 }
 
        }
        return nodes;
 }
 
-void free_node_list(GList *nodes)
+void
+node_list_free (GList *nodes)
 {
        GList *li;
 {
        GList *li;
-       for(li = nodes; li != NULL; li = li->next) {
-               free_node(li->data);
+       for (li = nodes; li != NULL; li = li->next) {
+               node_free (li->data);
        }
        }
-       g_list_free(nodes);
+       g_list_free (nodes);
 }
 
 }
 
index e7a16b001b47d8455822756ff75f340869aabcca..fde15cb2613e71d12e39369e549d2eab30fa9512 100644 (file)
@@ -40,11 +40,13 @@ enum {
        SIGNAL_FIRST_METHOD,
        OVERRIDE_METHOD
 };
        SIGNAL_FIRST_METHOD,
        OVERRIDE_METHOD
 };
+
 ENDHEADER
 
 CLASS Class
   STRING       otype   # this object class type
   STRING       ptype   # parent class type
 ENDHEADER
 
 CLASS Class
   STRING       otype   # this object class type
   STRING       ptype   # parent class type
+  STRING       bonobo_x_class # Class for BonoboXObject
   STRING       chunk_size # if the object should be allocated with mem_chunks
   NODELIST     nodes
 ENDCLASS
   STRING       chunk_size # if the object should be allocated with mem_chunks
   NODELIST     nodes
 ENDCLASS
@@ -84,13 +86,33 @@ CLASS Argument
   INT          line_no
 ENDCLASS
 
   INT          line_no
 ENDCLASS
 
+CLASS Property
+  STRING       gtktype
+  TYPE         ptype
+  STRINGLIST   flags
+  STRING       name
+  STRING       nick
+  STRING       blurb
+  STRING       minimum
+  STRING       maximum
+  STRING       default_value
+  STRING       extra_gtktype
+  BOOL         link
+  BOOL         export
+  STRING       get
+  INT          get_line
+  STRING       set
+  INT          set_line
+  INT          line_no
+ENDCLASS
+
 CLASS Method
   INT          scope           # scope type
   INT          method          # method type
   TYPE         mtype
   STRING       otype           # for override methods
 CLASS Method
   INT          scope           # scope type
   INT          method          # method type
   TYPE         mtype
   STRING       otype           # for override methods
-  STRINGLIST   gtktypes        # GTK types for a signal
-  STRINGLIST   flags           # GTK_RUN_* flags for a signal
+  STRINGLIST   gtktypes        # GObject types for a signal
+  STRINGLIST   flags           # G_SIGNAL_* flags for a signal
   STRING       id
   NODELIST     args
   STRING       onerror
   STRING       id
   NODELIST     args
   STRING       onerror
@@ -100,6 +122,7 @@ CLASS Method
   INT          ccode_line
   BOOL         vararg
   INT          unique_id       # A unique id for new methods
   INT          ccode_line
   BOOL         vararg
   INT          unique_id       # A unique id for new methods
+  BOOL         bonobo_x_func   # Function for BonoboXObject
 ENDCLASS
 
 CLASS Variable
 ENDCLASS
 
 CLASS Variable
@@ -107,6 +130,7 @@ CLASS Variable
   TYPE         vtype
   STRING       id
   INT          line_no
   TYPE         vtype
   STRING       id
   INT          line_no
+  BOOL         destructor_unref
   STRING       destructor
   INT          destructor_line
   BOOL         destructor_simple
   STRING       destructor
   INT          destructor_line
   BOOL         destructor_simple
index 4d60558645f4d406444c7d3dac1acd4271d44471..f7ba204bb362ef3376e7fbeafe915ae13a296433 100644 (file)
@@ -2,9 +2,8 @@
  * Do not edit by hand! */
 
 
  * Do not edit by hand! */
 
 
-#ifndef _TREEFUNCS_H_
-
-#define _TREEFUNCS_H_
+#ifndef TREEFUNCS_H
+#define TREEFUNCS_H
 
 /* for ccode type */
 enum {
 
 /* for ccode type */
 enum {
@@ -49,6 +48,8 @@ enum {
 };
 
 
 };
 
 
+
+typedef long NodeType;
 enum {
        CLASS_NODE,
        TYPE_NODE,
 enum {
        CLASS_NODE,
        TYPE_NODE,
@@ -56,6 +57,7 @@ enum {
        CHECK_NODE,
        FUNCARG_NODE,
        ARGUMENT_NODE,
        CHECK_NODE,
        FUNCARG_NODE,
        ARGUMENT_NODE,
+       PROPERTY_NODE,
        METHOD_NODE,
        VARIABLE_NODE,
        LAST_NODE_TYPE
        METHOD_NODE,
        VARIABLE_NODE,
        LAST_NODE_TYPE
@@ -68,12 +70,13 @@ typedef struct _CCode CCode;
 typedef struct _Check Check;
 typedef struct _FuncArg FuncArg;
 typedef struct _Argument Argument;
 typedef struct _Check Check;
 typedef struct _FuncArg FuncArg;
 typedef struct _Argument Argument;
+typedef struct _Property Property;
 typedef struct _Method Method;
 typedef struct _Variable Variable;
 
 
 struct _Argument {
 typedef struct _Method Method;
 typedef struct _Variable Variable;
 
 
 struct _Argument {
-       int type;
+       NodeType type;
        char * gtktype;
        Type * atype;
        GList * flags;
        char * gtktype;
        Type * atype;
        GList * flags;
@@ -86,35 +89,36 @@ struct _Argument {
 };
 
 struct _CCode {
 };
 
 struct _CCode {
-       int type;
+       NodeType type;
        int cctype;
        char * cbuf;
        int line_no;
 };
 
 struct _Check {
        int cctype;
        char * cbuf;
        int line_no;
 };
 
 struct _Check {
-       int type;
+       NodeType type;
        int chtype;
        char * number;
 };
 
 struct _Class {
        int chtype;
        char * number;
 };
 
 struct _Class {
-       int type;
+       NodeType type;
        char * otype;
        char * ptype;
        char * otype;
        char * ptype;
+       char * bonobo_x_class;
        char * chunk_size;
        GList * nodes;
 };
 
 struct _FuncArg {
        char * chunk_size;
        GList * nodes;
 };
 
 struct _FuncArg {
-       int type;
+       NodeType type;
        Type * atype;
        char * name;
        GList * checks;
 };
 
 struct _Method {
        Type * atype;
        char * name;
        GList * checks;
 };
 
 struct _Method {
-       int type;
+       NodeType type;
        int scope;
        int method;
        Type * mtype;
        int scope;
        int method;
        Type * mtype;
@@ -130,21 +134,44 @@ struct _Method {
        int ccode_line;
        gboolean vararg;
        int unique_id;
        int ccode_line;
        gboolean vararg;
        int unique_id;
+       gboolean bonobo_x_func;
+};
+
+struct _Property {
+       NodeType type;
+       char * gtktype;
+       Type * ptype;
+       GList * flags;
+       char * name;
+       char * nick;
+       char * blurb;
+       char * minimum;
+       char * maximum;
+       char * default_value;
+       char * extra_gtktype;
+       gboolean link;
+       gboolean export;
+       char * get;
+       int get_line;
+       char * set;
+       int set_line;
+       int line_no;
 };
 
 struct _Type {
 };
 
 struct _Type {
-       int type;
+       NodeType type;
        char * name;
        char * pointer;
        char * postfix;
 };
 
 struct _Variable {
        char * name;
        char * pointer;
        char * postfix;
 };
 
 struct _Variable {
-       int type;
+       NodeType type;
        int scope;
        Type * vtype;
        char * id;
        int line_no;
        int scope;
        Type * vtype;
        char * id;
        int line_no;
+       gboolean destructor_unref;
        char * destructor;
        int destructor_line;
        gboolean destructor_simple;
        char * destructor;
        int destructor_line;
        gboolean destructor_simple;
@@ -153,52 +180,29 @@ struct _Variable {
 };
 
 union _Node {
 };
 
 union _Node {
-       int type;
+       NodeType type;
        Argument argument;
        CCode ccode;
        Check check;
        Class class;
        FuncArg funcarg;
        Method method;
        Argument argument;
        CCode ccode;
        Check check;
        Class class;
        FuncArg funcarg;
        Method method;
+       Property property;
        Type _type;
        Variable variable;
 };
 
        Type _type;
        Variable variable;
 };
 
-/* New functions */
-Node * new_argument (char * gtktype, Type * atype, GList * flags, char * name, char * get, int get_line, char * set, int set_line, int line_no);
-Node * new_ccode (int cctype, char * cbuf, int line_no);
-Node * new_check (int chtype, char * number);
-Node * new_class (char * otype, char * ptype, char * chunk_size, GList * nodes);
-Node * new_funcarg (Type * atype, char * name, GList * checks);
-Node * new_method (int scope, int method, Type * mtype, char * otype, GList * gtktypes, GList * flags, char * id, GList * args, char * onerror, char * defreturn, char * cbuf, int line_no, int ccode_line, gboolean vararg, int unique_id);
-Node * new_type (char * name, char * pointer, char * postfix);
-Node * new_variable (int scope, Type * vtype, char * id, int line_no, char * destructor, int destructor_line, gboolean destructor_simple, char * initializer, int initializer_line);
 
 /* General copy/free functions */
 
 /* General copy/free functions */
-Node * copy_node(Node *node);
-void free_node(Node *node);
-
-GList * copy_node_list(GList *nodes);
-void free_node_list(GList *nodes);
-
-/* Copy functions */
-Argument * copy_argument (Argument * self);
-CCode * copy_ccode (CCode * self);
-Check * copy_check (Check * self);
-Class * copy_class (Class * self);
-FuncArg * copy_funcarg (FuncArg * self);
-Method * copy_method (Method * self);
-Type * copy_type (Type * self);
-Variable * copy_variable (Variable * self);
-
-/* Free functions */
-void free_argument (Argument * self);
-void free_ccode (CCode * self);
-void free_check (Check * self);
-void free_class (Class * self);
-void free_funcarg (FuncArg * self);
-void free_method (Method * self);
-void free_type (Type * self);
-void free_variable (Variable * self);
-
-#endif /*_TREEFUNCS_H_*/
+Node * node_copy (Node *node);
+void node_free (Node *node);
+
+GList * node_list_copy (GList *nodes);
+void node_list_free (GList *nodes);
+
+/* Node new/set functions */
+Node * node_new (NodeType type, ...);
+void node_set (Node *node, ...);
+
+
+#endif /* TREEFUNCS_H */
index acc112e0757ab42424ea10dd02612795128ff6ed..cc523ed529a4e0d7bbce4e62416adbcfa0d8a2bf 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 #include "config.h"
  */
 
 #include "config.h"
+#include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <glib.h>
 #include <string.h>
 #include <stdio.h>
 #include <glib.h>
@@ -163,26 +164,36 @@ typedef struct _OurGtkType OurGtkType;
 struct _OurGtkType {
        gboolean simple;
        char *gtkname;
 struct _OurGtkType {
        gboolean simple;
        char *gtkname;
-       char *typename;
+       char *cast;
+       char *type_name;
+       char *type_pointer;
        int special;
 };
 const OurGtkType our_gtk_type_table[] = {
        int special;
 };
 const OurGtkType our_gtk_type_table[] = {
-       { TRUE, "NONE",         "void ", -1 },
-       { TRUE, "CHAR",         "gchar ", -1 },
-       { TRUE, "UCHAR",        "guchar ", -1 },
-       { TRUE, "BOOL",         "gboolean ", -1 },
-       { TRUE, "INT",          "gint ", -1 },
-       { TRUE, "UINT",         "guint ", -1 },
-       { TRUE, "LONG",         "glong ", -1 },
-       { TRUE, "ULONG",        "gulong ", -1 },
-       { TRUE, "FLOAT",        "gfloat ", -1 },
-       { TRUE, "DOUBLE",       "gdouble ", -1 },
-       { TRUE, "STRING",       /*"GtkString"*/"gchar *", -1 },
-       { TRUE, "ENUM",         /*"GtkEnum"*/"gint ", -1 },
-       { TRUE, "FLAGS",        /*"GtkFlags"*/"guint ", -1 },
-       { TRUE, "BOXED",        /*"GtkBoxed"*/"gpointer ", -1 },
-       { TRUE, "POINTER",      "gpointer ", -1 },
-       { TRUE, "OBJECT",       "GtkObject *", -1 },
+       { TRUE, "NONE",         "void ",        "void",         NULL,   -1 },
+       { TRUE, "CHAR",         "gchar ",       "gchar",        NULL,   -1 },
+       { TRUE, "UCHAR",        "guchar ",      "guchar",       NULL,   -1 },
+       { TRUE, "BOOLEAN",      "gboolean ",    "gboolean",     NULL,   -1 },
+       { TRUE, "INT",          "gint ",        "gint",         NULL,   -1 },
+       { TRUE, "UINT",         "guint ",       "guint",        NULL,   -1 },
+       { TRUE, "LONG",         "glong ",       "glong",        NULL,   -1 },
+       { TRUE, "ULONG",        "gulong ",      "gulong",       NULL,   -1 },
+       { TRUE, "ENUM",         /*"enum"*/"gint ", "gint",      NULL,   -1 },
+       { TRUE, "FLAGS",        /*"flags"*/"guint ", "guint",   NULL,   -1 },
+       { TRUE, "FLOAT",        "gfloat ",      "gfloat",       NULL,   -1 },
+       { TRUE, "DOUBLE",       "gdouble ",     "gdouble",      NULL,   -1 },
+       { TRUE, "STRING",       /*"string"*/"gchar *", "gchar", "*",    -1 },
+       { TRUE, "POINTER",      "gpointer ",    "gpointer",     NULL,   -1 },
+       { TRUE, "BOXED",        /*"boxed"*/"gpointer ", "gpointer", NULL, -1 },
+       { TRUE, "OBJECT",       "GObject *",    "GObject",      "*",    -1 },
+       { TRUE, "PARAM",        "GParamSpec *", "GParamSpec",   "*",    -1 },
+
+       /* FIXME: VALUE_ARRAY, CLOSURE, UNICHAR */
+       /* Note that those have some issues with g_value_ calls etc... so
+        * we can't just add them */
+
+       /* Do we need this??? */
+#if 0
        { FALSE, "SIGNAL",      /*"GtkSignal"*/"___twopointertype ",
                SPECIAL_2POINTER },
        { FALSE, "ARGS",        /*"GtkArgs"*/"___intpointertype ",
        { FALSE, "SIGNAL",      /*"GtkSignal"*/"___twopointertype ",
                SPECIAL_2POINTER },
        { FALSE, "ARGS",        /*"GtkArgs"*/"___intpointertype ",
@@ -193,6 +204,7 @@ const OurGtkType our_gtk_type_table[] = {
                SPECIAL_2POINTER },
        { FALSE, "FOREIGN",     /*"GtkForeign"*/"___twopointertype ",
                SPECIAL_2POINTER },
                SPECIAL_2POINTER },
        { FALSE, "FOREIGN",     /*"GtkForeign"*/"___twopointertype ",
                SPECIAL_2POINTER },
+#endif
 
        { FALSE, NULL, NULL }
 };
 
        { FALSE, NULL, NULL }
 };
@@ -215,20 +227,43 @@ init_type_hash(void)
 }
 
 const char *
 }
 
 const char *
-get_cast(char *type, gboolean simple_only)
+get_cast (const char *type, gboolean simple_only)
 {
        OurGtkType *gtype;
 
 {
        OurGtkType *gtype;
 
-       init_type_hash();
+       init_type_hash ();
 
 
-       gtype = g_hash_table_lookup(type_hash, type);
+       gtype = g_hash_table_lookup (type_hash, type);
 
 
-       if(!gtype ||
-          (simple_only &&
-           !gtype->simple))
+       if (gtype == NULL ||
+           (simple_only &&
+            ! gtype->simple))
                return NULL;
 
                return NULL;
 
-       return gtype->typename;
+       return gtype->cast;
+}
+
+Type *
+get_tree_type (const char *type, gboolean simple_only)
+{
+       OurGtkType *gtype;
+       Node *node;
+
+       init_type_hash ();
+
+       gtype = g_hash_table_lookup (type_hash, type);
+
+       if (gtype == NULL ||
+           (simple_only &&
+            ! gtype->simple))
+               return NULL;
+
+       node = node_new (TYPE_NODE,
+                        "name", gtype->type_name,
+                        "pointer", gtype->type_pointer,
+                        NULL);
+
+       return (Type *)node;
 }
 
 static void
 }
 
 static void
@@ -275,15 +310,3 @@ setup_special_array(Class *c, gboolean *special_array)
 
        return any_special;
 }
 
        return any_special;
 }
-
-/* get the id without the first underscore, but only if we're removing them */
-const char *
-get_real_id(const char *id)
-{
-       if( ! no_kill_underscores &&
-           id[0] == '_' &&
-           id[1] != '\0')
-               return &id[1];
-       else
-               return id;
-}
index 20692b0de46e02ec0c151ffa35c9b94e27fd919e..f80eafccc082b5cdcdf4cc1871e34b3c504155df 100644 (file)
@@ -20,8 +20,8 @@
  * USA.
  */
 
  * USA.
  */
 
-#ifndef _UTIL_H_
-#define _UTIL_H_
+#ifndef UTIL_H
+#define UTIL_H
 
 enum {
        GOB_WARN,
 
 enum {
        GOB_WARN,
@@ -47,7 +47,8 @@ void separns_replace_sep(const char *base, char **ns, char **name, char r);
 char * make_pre_macro(const char *base,const  char *pre);
 
 /* get a name usable for a cast from a GTK+ type (without GTK_TYPE_)*/
 char * make_pre_macro(const char *base,const  char *pre);
 
 /* get a name usable for a cast from a GTK+ type (without GTK_TYPE_)*/
-const char * get_cast(char *type, gboolean simple_only);
+const char * get_cast (const char *type, gboolean simple_only);
+Type * get_tree_type (const char *type, gboolean simple_only);
 
 enum {
        SPECIAL_2POINTER,
 
 enum {
        SPECIAL_2POINTER,
@@ -58,8 +59,4 @@ enum {
 /* returns TRUE if there are any special types at all */
 gboolean setup_special_array(Class *c, gboolean *special_array);
 
 /* returns TRUE if there are any special types at all */
 gboolean setup_special_array(Class *c, gboolean *special_array);
 
-/* get the id without the first underscore, but only if we're removing them */
-const char *get_real_id(const char *id);
-
-#endif
-
+#endif /* UTIL_H */
index 9788f70238c91894045d22366fa941580826c3c1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1 +0,0 @@
-timestamp