diff --git a/ChangeLog b/ChangeLog
index f705a3b..12b344e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu Mar 15 10:37:49 2001  Owen Taylor  <otaylor@redhat.com>
+
+	* Released 1.2.10
+
+	* NEWS: Update
+
+	* configure.in: Up micro/interface-age/binary-age to 10.
+
 2001-03-08  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
 	* configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862.
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index f705a3b..12b344e 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,11 @@
+Thu Mar 15 10:37:49 2001  Owen Taylor  <otaylor@redhat.com>
+
+	* Released 1.2.10
+
+	* NEWS: Update
+
+	* configure.in: Up micro/interface-age/binary-age to 10.
+
 2001-03-08  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
 	* configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862.
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index f705a3b..12b344e 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,11 @@
+Thu Mar 15 10:37:49 2001  Owen Taylor  <otaylor@redhat.com>
+
+	* Released 1.2.10
+
+	* NEWS: Update
+
+	* configure.in: Up micro/interface-age/binary-age to 10.
+
 2001-03-08  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
 	* configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862.
diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12
index f705a3b..12b344e 100644
--- a/ChangeLog.pre-2-12
+++ b/ChangeLog.pre-2-12
@@ -1,3 +1,11 @@
+Thu Mar 15 10:37:49 2001  Owen Taylor  <otaylor@redhat.com>
+
+	* Released 1.2.10
+
+	* NEWS: Update
+
+	* configure.in: Up micro/interface-age/binary-age to 10.
+
 2001-03-08  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
 	* configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862.
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index f705a3b..12b344e 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,11 @@
+Thu Mar 15 10:37:49 2001  Owen Taylor  <otaylor@redhat.com>
+
+	* Released 1.2.10
+
+	* NEWS: Update
+
+	* configure.in: Up micro/interface-age/binary-age to 10.
+
 2001-03-08  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
 	* configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862.
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index f705a3b..12b344e 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,11 @@
+Thu Mar 15 10:37:49 2001  Owen Taylor  <otaylor@redhat.com>
+
+	* Released 1.2.10
+
+	* NEWS: Update
+
+	* configure.in: Up micro/interface-age/binary-age to 10.
+
 2001-03-08  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
 	* configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862.
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index f705a3b..12b344e 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,11 @@
+Thu Mar 15 10:37:49 2001  Owen Taylor  <otaylor@redhat.com>
+
+	* Released 1.2.10
+
+	* NEWS: Update
+
+	* configure.in: Up micro/interface-age/binary-age to 10.
+
 2001-03-08  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
 	* configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862.
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index f705a3b..12b344e 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,11 @@
+Thu Mar 15 10:37:49 2001  Owen Taylor  <otaylor@redhat.com>
+
+	* Released 1.2.10
+
+	* NEWS: Update
+
+	* configure.in: Up micro/interface-age/binary-age to 10.
+
 2001-03-08  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
 	* configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862.
diff --git a/HACKING b/HACKING
index 0506b84..2a68252 100644
--- a/HACKING
+++ b/HACKING
@@ -31,5 +31,3 @@
 to autogen.sh and they will be passed on to configure.
 
 For information about submitting patches see the README file.
-
-
diff --git a/INSTALL b/INSTALL
index 884b26b..c396d40 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,8 +1,8 @@
 Simple install procedure
 ========================
 
-  % gzip -cd glib-1.2.9.tar.gz | tar xvf -  # unpack the sources
-  % cd glib-1.2.9                           # change to the toplevel directory
+  % gzip -cd glib-1.2.10.tar.gz | tar xvf -  # unpack the sources
+  % cd glib-1.2.10                           # change to the toplevel directory
   % ./configure                             # run the `configure' script
   % make                                    # build GLIB
 
diff --git a/NEWS b/NEWS
index ccb1470..0ab35d5 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,8 @@
+Overview of Changes in GLib 1.2.10:
+
+* Fix compilation problem on some compilers where 
+  g_log_domain_gmodule was not being declared properly.
+
 Overview of Changes in GLib 1.2.9:
 
 * Move include files into a glib-1-2/ subdir to support parallel
diff --git a/README b/README
index 911623c..39024d9 100644
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
 General Information
 ===================
 
-This is GLib version 1.2.9. GLib is a library which includes support
+This is GLib version 1.2.10. GLib is a library which includes support
 routines for C such as lists, trees, hashes, memory allocation, and
 many other things.
 
diff --git a/configure.in b/configure.in
index afe469a..8ee9339 100644
--- a/configure.in
+++ b/configure.in
@@ -33,9 +33,9 @@
 #
 GLIB_MAJOR_VERSION=1
 GLIB_MINOR_VERSION=2
-GLIB_MICRO_VERSION=9
-GLIB_INTERFACE_AGE=9
-GLIB_BINARY_AGE=9
+GLIB_MICRO_VERSION=10
+GLIB_INTERFACE_AGE=10
+GLIB_BINARY_AGE=10
 GLIB_VERSION=$GLIB_MAJOR_VERSION.$GLIB_MINOR_VERSION.$GLIB_MICRO_VERSION
 dnl
 AC_DIVERT_POP()dnl
diff --git a/glib/Makefile.am b/glib/Makefile.am
deleted file mode 100644
index 3a6e201..0000000
--- a/glib/Makefile.am
+++ /dev/null
@@ -1,130 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# require automake 1.4
-AUTOMAKE_OPTIONS = 1.4
-
-SUBDIRS = . gmodule gthread docs tests
-
-configincludedir = $(pkglibdir)/include
-
-bin_SCRIPTS=glib-config
-BUILT_SOURCES=glib-config
-glib-config: glib-config.in
-
-INCLUDES = -DG_LOG_DOMAIN=g_log_domain_glib @GLIB_DEBUG_FLAGS@
-
-EXTRA_DIST = \
-	glib.m4			\
-	glib.spec.in		\
-	acglib.m4		\
-	sanity_check		\
-	README.win32		\
-	glib.def		\
-	makefile.msc.in		\
-	makefile.msc		\
-	giowin32.c		\
-	glibconfig.h.win32	\
-	glibconfig.h.win32.in	\
-	config.h.win32		\
-	config.h.win32.in	\
-	glib.pc.in 		\
-	gmodule.pc.in		\
-	gthread.pc.in
-
-
-lib_LTLIBRARIES = libglib.la
-
-libglib_la_SOURCES = \
-	garray.c	\
-	gcache.c	\
-	gcompletion.c	\
-	gdataset.c	\
-	gdate.c         \
-	gerror.c	\
-	ghash.c		\
-	ghook.c		\
-	giochannel.c    \
-	giounix.c       \
-	glist.c		\
-	gmain.c         \
-	gmem.c		\
-	gmessages.c	\
-	gmutex.c	\
-	gnode.c		\
-	gprimes.c	\
-	grel.c		\
-	gscanner.c	\
-	gslist.c	\
-	gstrfuncs.c	\
-	gstring.c	\
-	gtimer.c	\
-	gtree.c		\
-	gutils.c
-
-glibincludedir=$(includedir)/glib-1.2
-glibinclude_HEADERS =   \
-	glib.h
-
-configinclude_DATA = \
-	glibconfig.h
-
-CONFIGURE_DEPENDENCIES = acglib.m4		
-
-BUILT_SOURCES = stamp-gc-h #note: not glibconfig.h
-glibconfig.h: stamp-gc-h
-	@:
-stamp-gc-h: config.status
-	CONFIG_FILES= CONFIG_HEADERS= CONFIG_OTHER=glibconfig.h ./config.status
-	echo timestamp > stamp-gc-h
-
-libglib_la_LDFLAGS = \
-	-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
-	-release $(LT_RELEASE) \
-	-export-dynamic
-
-noinst_PROGRAMS = testglib testgdate testgdateparser
-testglib_LDADD = libglib.la
-testgdate_LDADD = libglib.la
-testgdateparser_LDADD = libglib.la
-
-m4datadir = $(datadir)/aclocal
-m4data_DATA = glib.m4
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = glib.pc gmodule.pc gthread.pc
-
-glibconfig.h.win32: $(top_builddir)/config.status $(top_srcdir)/glibconfig.h.win32.in
-	cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-config.h.win32: $(top_builddir)/config.status $(top_srcdir)/config.h.win32.in
-	cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-makefile.msc: $(top_builddir)/config.status $(top_srcdir)/makefile.msc.in
-	cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-.PHONY: files release sanity snapshot
-
-files:
-	@files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \
-	  echo $$p; \
-	done
-
-release:
-	rm -rf .deps */.deps
-	cd docs && make glib.html
-	$(MAKE) distcheck
-
-sanity:
-	./sanity_check $(VERSION)
-
-snapshot:
-	$(MAKE) dist distdir=$(PACKAGE)`date +"%y%m%d"`
-
-dist-hook: glib.spec
-	if test -e $(srcdir)/INSTALL.in && test -e $(srcdir)/README.in ; then \
-	     CONFIG_FILES="INSTALL:$(srcdir)/INSTALL.in README:$(srcdir)/README.in" \
-	     CONFIG_HEADERS= \
-	     $(SHELL) config.status \
-	     && cp INSTALL README $(distdir) ; \
-	fi \
-	&& cp glib.spec $(distdir)
diff --git a/glib/garray.c b/glib/garray.c
deleted file mode 100644
index d018ec7..0000000
--- a/glib/garray.c
+++ /dev/null
@@ -1,490 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include <string.h>
-#include "glib.h"
-
-
-#define MIN_ARRAY_SIZE  16
-
-
-typedef struct _GRealArray  GRealArray;
-
-struct _GRealArray
-{
-  guint8 *data;
-  guint   len;
-  guint   alloc;
-  guint   elt_size;
-  guint   zero_terminated : 1;
-  guint   clear : 1;
-};
-
-
-static gint g_nearest_pow        (gint        num);
-static void g_array_maybe_expand (GRealArray *array,
-				  gint        len);
-
-static GMemChunk *array_mem_chunk = NULL;
-G_LOCK_DEFINE_STATIC (array_mem_chunk);
-
-GArray*
-g_array_new (gboolean zero_terminated,
-	     gboolean clear,
-	     guint    elt_size)
-{
-  GRealArray *array;
-
-  G_LOCK (array_mem_chunk);
-  if (!array_mem_chunk)
-    array_mem_chunk = g_mem_chunk_new ("array mem chunk",
-				       sizeof (GRealArray),
-				       1024, G_ALLOC_AND_FREE);
-
-  array = g_chunk_new (GRealArray, array_mem_chunk);
-  G_UNLOCK (array_mem_chunk);
-
-  array->data            = NULL;
-  array->len             = 0;
-  array->alloc           = 0;
-  array->zero_terminated = (zero_terminated ? 1 : 0);
-  array->clear           = (clear ? 1 : 0);
-  array->elt_size        = elt_size;
-
-  return (GArray*) array;
-}
-
-void
-g_array_free (GArray  *array,
-	      gboolean free_segment)
-{
-  if (free_segment)
-    g_free (array->data);
-
-  G_LOCK (array_mem_chunk);
-  g_mem_chunk_free (array_mem_chunk, array);
-  G_UNLOCK (array_mem_chunk);
-}
-
-GArray*
-g_array_append_vals (GArray       *farray,
-		     gconstpointer data,
-		     guint         len)
-{
-  GRealArray *array = (GRealArray*) farray;
-
-  g_array_maybe_expand (array, len);
-
-  memcpy (array->data + array->elt_size * array->len, data, array->elt_size * len);
-
-  array->len += len;
-
-  return farray;
-}
-
-GArray*
-g_array_prepend_vals (GArray        *farray,
-		      gconstpointer  data,
-		      guint          len)
-{
-  GRealArray *array = (GRealArray*) farray;
-
-  g_array_maybe_expand (array, len);
-
-  g_memmove (array->data + array->elt_size * len, array->data, array->elt_size * array->len);
-
-  memcpy (array->data, data, len * array->elt_size);
-
-  array->len += len;
-
-  return farray;
-}
-
-GArray*
-g_array_insert_vals (GArray        *farray,
-		     guint          index,
-		     gconstpointer  data,
-		     guint          len)
-{
-  GRealArray *array = (GRealArray*) farray;
-
-  g_array_maybe_expand (array, len);
-
-  g_memmove (array->data + array->elt_size * (len + index), 
-	     array->data + array->elt_size * index, 
-	     array->elt_size * (array->len - index));
-
-  memcpy (array->data + array->elt_size * index, data, len * array->elt_size);
-
-  array->len += len;
-
-  return farray;
-}
-
-GArray*
-g_array_set_size (GArray *farray,
-		  guint   length)
-{
-  GRealArray *array = (GRealArray*) farray;
-
-  if (array->len < length)
-    g_array_maybe_expand (array, length - array->len);
-
-  array->len = length;
-
-  return farray;
-}
-
-GArray*
-g_array_remove_index (GArray* farray,
-		      guint index)
-{
-  GRealArray* array = (GRealArray*) farray;
-
-  g_return_val_if_fail (array, NULL);
-
-  g_return_val_if_fail (index < array->len, NULL);
-
-  if (index != array->len - 1)
-      g_memmove (array->data + array->elt_size * index, 
-		 array->data + array->elt_size * (index + 1), 
-		 array->elt_size * (array->len - index - 1));
-  
-  if (array->zero_terminated)
-    memset (array->data + array->elt_size * (array->len - 1), 0, 
-	    array->elt_size);
-
-  array->len -= 1;
-
-  return farray;
-}
-
-GArray*
-g_array_remove_index_fast (GArray* farray,
-			   guint index)
-{
-  GRealArray* array = (GRealArray*) farray;
-
-  g_return_val_if_fail (array, NULL);
-
-  g_return_val_if_fail (index < array->len, NULL);
-
-  if (index != array->len - 1)
-    g_memmove (array->data + array->elt_size * index, 
-	       array->data + array->elt_size * (array->len - 1), 
-	       array->elt_size);
-  
-  if (array->zero_terminated)
-    memset (array->data + array->elt_size * (array->len - 1), 0, 
-	    array->elt_size);
-
-  array->len -= 1;
-
-  return farray;
-}
-
-static gint
-g_nearest_pow (gint num)
-{
-  gint n = 1;
-
-  while (n < num)
-    n <<= 1;
-
-  return n;
-}
-
-static void
-g_array_maybe_expand (GRealArray *array,
-		      gint        len)
-{
-  guint want_alloc = (array->len + len + array->zero_terminated) * array->elt_size;
-
-  if (want_alloc > array->alloc)
-    {
-      guint old_alloc = array->alloc;
-
-      array->alloc = g_nearest_pow (want_alloc);
-      array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
-
-      array->data = g_realloc (array->data, array->alloc);
-
-      if (array->clear || array->zero_terminated)
-	memset (array->data + old_alloc, 0, array->alloc - old_alloc);
-    }
-}
-
-/* Pointer Array
- */
-
-typedef struct _GRealPtrArray  GRealPtrArray;
-
-struct _GRealPtrArray
-{
-  gpointer *pdata;
-  guint     len;
-  guint     alloc;
-};
-
-static void g_ptr_array_maybe_expand (GRealPtrArray *array,
-				      gint           len);
-
-static GMemChunk *ptr_array_mem_chunk = NULL;
-G_LOCK_DEFINE_STATIC (ptr_array_mem_chunk);
-
-
-GPtrArray*
-g_ptr_array_new (void)
-{
-  GRealPtrArray *array;
-
-  G_LOCK (ptr_array_mem_chunk);
-  if (!ptr_array_mem_chunk)
-    ptr_array_mem_chunk = g_mem_chunk_new ("array mem chunk",
-					   sizeof (GRealPtrArray),
-					   1024, G_ALLOC_AND_FREE);
-
-  array = g_chunk_new (GRealPtrArray, ptr_array_mem_chunk);
-  G_UNLOCK (ptr_array_mem_chunk);
-
-  array->pdata = NULL;
-  array->len = 0;
-  array->alloc = 0;
-
-  return (GPtrArray*) array;
-}
-
-void
-g_ptr_array_free (GPtrArray   *array,
-		  gboolean  free_segment)
-{
-  g_return_if_fail (array);
-
-  if (free_segment)
-    g_free (array->pdata);
-
-  G_LOCK (ptr_array_mem_chunk);
-  g_mem_chunk_free (ptr_array_mem_chunk, array);
-  G_UNLOCK (ptr_array_mem_chunk);
-}
-
-static void
-g_ptr_array_maybe_expand (GRealPtrArray *array,
-			  gint        len)
-{
-  guint old_alloc;
-
-  if ((array->len + len) > array->alloc)
-    {
-      old_alloc = array->alloc;
-
-      array->alloc = g_nearest_pow (array->len + len);
-      array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
-      if (array->pdata)
-	array->pdata = g_realloc (array->pdata, sizeof(gpointer) * array->alloc);
-      else
-	array->pdata = g_new0 (gpointer, array->alloc);
-
-      memset (array->pdata + old_alloc, 0, 
-	      sizeof (gpointer) * (array->alloc - old_alloc));
-    }
-}
-
-void
-g_ptr_array_set_size  (GPtrArray   *farray,
-		       gint	     length)
-{
-  GRealPtrArray* array = (GRealPtrArray*) farray;
-
-  g_return_if_fail (array);
-
-  if (length > array->len)
-    g_ptr_array_maybe_expand (array, (length - array->len));
-
-  array->len = length;
-}
-
-gpointer
-g_ptr_array_remove_index (GPtrArray* farray,
-			  guint index)
-{
-  GRealPtrArray* array = (GRealPtrArray*) farray;
-  gpointer result;
-
-  g_return_val_if_fail (array, NULL);
-
-  g_return_val_if_fail (index < array->len, NULL);
-
-  result = array->pdata[index];
-  
-  if (index != array->len - 1)
-    g_memmove (array->pdata + index, array->pdata + index + 1, 
-	       sizeof (gpointer) * (array->len - index - 1));
-  
-  array->pdata[array->len - 1] = NULL;
-
-  array->len -= 1;
-
-  return result;
-}
-
-gpointer
-g_ptr_array_remove_index_fast (GPtrArray* farray,
-			       guint index)
-{
-  GRealPtrArray* array = (GRealPtrArray*) farray;
-  gpointer result;
-
-  g_return_val_if_fail (array, NULL);
-
-  g_return_val_if_fail (index < array->len, NULL);
-
-  result = array->pdata[index];
-  
-  if (index != array->len - 1)
-    array->pdata[index] = array->pdata[array->len - 1];
-
-  array->pdata[array->len - 1] = NULL;
-
-  array->len -= 1;
-
-  return result;
-}
-
-gboolean
-g_ptr_array_remove (GPtrArray* farray,
-		    gpointer data)
-{
-  GRealPtrArray* array = (GRealPtrArray*) farray;
-  int i;
-
-  g_return_val_if_fail (array, FALSE);
-
-  for (i = 0; i < array->len; i += 1)
-    {
-      if (array->pdata[i] == data)
-	{
-	  g_ptr_array_remove_index (farray, i);
-	  return TRUE;
-	}
-    }
-
-  return FALSE;
-}
-
-gboolean
-g_ptr_array_remove_fast (GPtrArray* farray,
-			 gpointer data)
-{
-  GRealPtrArray* array = (GRealPtrArray*) farray;
-  int i;
-
-  g_return_val_if_fail (array, FALSE);
-
-  for (i = 0; i < array->len; i += 1)
-    {
-      if (array->pdata[i] == data)
-	{
-	  g_ptr_array_remove_index_fast (farray, i);
-	  return TRUE;
-	}
-    }
-
-  return FALSE;
-}
-
-void
-g_ptr_array_add (GPtrArray* farray,
-		 gpointer data)
-{
-  GRealPtrArray* array = (GRealPtrArray*) farray;
-
-  g_return_if_fail (array);
-
-  g_ptr_array_maybe_expand (array, 1);
-
-  array->pdata[array->len++] = data;
-}
-
-/* Byte arrays
- */
-
-GByteArray* g_byte_array_new      (void)
-{
-  return (GByteArray*) g_array_new (FALSE, FALSE, 1);
-}
-
-void	    g_byte_array_free     (GByteArray *array,
-			           gboolean    free_segment)
-{
-  g_array_free ((GArray*) array, free_segment);
-}
-
-GByteArray* g_byte_array_append   (GByteArray *array,
-				   const guint8 *data,
-				   guint       len)
-{
-  g_array_append_vals ((GArray*) array, (guint8*)data, len);
-
-  return array;
-}
-
-GByteArray* g_byte_array_prepend  (GByteArray *array,
-				   const guint8 *data,
-				   guint       len)
-{
-  g_array_prepend_vals ((GArray*) array, (guint8*)data, len);
-
-  return array;
-}
-
-GByteArray* g_byte_array_set_size (GByteArray *array,
-				   guint       length)
-{
-  g_array_set_size ((GArray*) array, length);
-
-  return array;
-}
-
-GByteArray* g_byte_array_remove_index (GByteArray *array,
-				       guint index)
-{
-  g_array_remove_index((GArray*) array, index);
-
-  return array;
-}
-
-GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
-						   guint index)
-{
-  g_array_remove_index_fast((GArray*) array, index);
-
-  return array;
-}
diff --git a/glib/gcache.c b/glib/gcache.c
deleted file mode 100644
index bba7910..0000000
--- a/glib/gcache.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-
-
-typedef struct _GCacheNode  GCacheNode;
-typedef struct _GRealCache  GRealCache;
-
-struct _GCacheNode
-{
-  /* A reference counted node */
-  gpointer value;
-  gint ref_count;
-};
-
-struct _GRealCache
-{
-  /* Called to create a value from a key */
-  GCacheNewFunc value_new_func;
-
-  /* Called to destroy a value */
-  GCacheDestroyFunc value_destroy_func;
-
-  /* Called to duplicate a key */
-  GCacheDupFunc key_dup_func;
-
-  /* Called to destroy a key */
-  GCacheDestroyFunc key_destroy_func;
-
-  /* Associates keys with nodes */
-  GHashTable *key_table;
-
-  /* Associates nodes with keys */
-  GHashTable *value_table;
-};
-
-
-static GCacheNode* g_cache_node_new     (gpointer value);
-static void        g_cache_node_destroy (GCacheNode *node);
-
-
-static GMemChunk *node_mem_chunk = NULL;
-G_LOCK_DEFINE_STATIC (node_mem_chunk);
-
-GCache*
-g_cache_new (GCacheNewFunc      value_new_func,
-	     GCacheDestroyFunc  value_destroy_func,
-	     GCacheDupFunc      key_dup_func,
-	     GCacheDestroyFunc  key_destroy_func,
-	     GHashFunc          hash_key_func,
-	     GHashFunc          hash_value_func,
-	     GCompareFunc       key_compare_func)
-{
-  GRealCache *cache;
-
-  g_return_val_if_fail (value_new_func != NULL, NULL);
-  g_return_val_if_fail (value_destroy_func != NULL, NULL);
-  g_return_val_if_fail (key_dup_func != NULL, NULL);
-  g_return_val_if_fail (key_destroy_func != NULL, NULL);
-  g_return_val_if_fail (hash_key_func != NULL, NULL);
-  g_return_val_if_fail (hash_value_func != NULL, NULL);
-  g_return_val_if_fail (key_compare_func != NULL, NULL);
-
-  cache = g_new (GRealCache, 1);
-  cache->value_new_func = value_new_func;
-  cache->value_destroy_func = value_destroy_func;
-  cache->key_dup_func = key_dup_func;
-  cache->key_destroy_func = key_destroy_func;
-  cache->key_table = g_hash_table_new (hash_key_func, key_compare_func);
-  cache->value_table = g_hash_table_new (hash_value_func, NULL);
-
-  return (GCache*) cache;
-}
-
-void
-g_cache_destroy (GCache *cache)
-{
-  GRealCache *rcache;
-
-  g_return_if_fail (cache != NULL);
-
-  rcache = (GRealCache*) cache;
-  g_hash_table_destroy (rcache->key_table);
-  g_hash_table_destroy (rcache->value_table);
-  g_free (rcache);
-}
-
-gpointer
-g_cache_insert (GCache   *cache,
-		gpointer  key)
-{
-  GRealCache *rcache;
-  GCacheNode *node;
-  gpointer value;
-
-  g_return_val_if_fail (cache != NULL, NULL);
-
-  rcache = (GRealCache*) cache;
-
-  node = g_hash_table_lookup (rcache->key_table, key);
-  if (node)
-    {
-      node->ref_count += 1;
-      return node->value;
-    }
-
-  key = (* rcache->key_dup_func) (key);
-  value = (* rcache->value_new_func) (key);
-  node = g_cache_node_new (value);
-
-  g_hash_table_insert (rcache->key_table, key, node);
-  g_hash_table_insert (rcache->value_table, value, key);
-
-  return node->value;
-}
-
-void
-g_cache_remove (GCache   *cache,
-		gpointer  value)
-{
-  GRealCache *rcache;
-  GCacheNode *node;
-  gpointer key;
-
-  g_return_if_fail (cache != NULL);
-
-  rcache = (GRealCache*) cache;
-
-  key = g_hash_table_lookup (rcache->value_table, value);
-  node = g_hash_table_lookup (rcache->key_table, key);
-
-  g_return_if_fail (node != NULL);
-
-  node->ref_count -= 1;
-  if (node->ref_count == 0)
-    {
-      g_hash_table_remove (rcache->value_table, value);
-      g_hash_table_remove (rcache->key_table, key);
-
-      (* rcache->key_destroy_func) (key);
-      (* rcache->value_destroy_func) (node->value);
-      g_cache_node_destroy (node);
-    }
-}
-
-void
-g_cache_key_foreach (GCache   *cache,
-		     GHFunc    func,
-		     gpointer  user_data)
-{
-  GRealCache *rcache;
-
-  g_return_if_fail (cache != NULL);
-  g_return_if_fail (func != NULL);
-
-  rcache = (GRealCache*) cache;
-
-  g_hash_table_foreach (rcache->value_table, func, user_data);
-}
-
-void
-g_cache_value_foreach (GCache   *cache,
-		       GHFunc    func,
-		       gpointer  user_data)
-{
-  GRealCache *rcache;
-
-  g_return_if_fail (cache != NULL);
-  g_return_if_fail (func != NULL);
-
-  rcache = (GRealCache*) cache;
-
-  g_hash_table_foreach (rcache->key_table, func, user_data);
-}
-
-
-static GCacheNode*
-g_cache_node_new (gpointer value)
-{
-  GCacheNode *node;
-
-  G_LOCK (node_mem_chunk);
-  if (!node_mem_chunk)
-    node_mem_chunk = g_mem_chunk_new ("cache node mem chunk", sizeof (GCacheNode),
-				      1024, G_ALLOC_AND_FREE);
-
-  node = g_chunk_new (GCacheNode, node_mem_chunk);
-  G_UNLOCK (node_mem_chunk);
-
-  node->value = value;
-  node->ref_count = 1;
-
-  return node;
-}
-
-static void
-g_cache_node_destroy (GCacheNode *node)
-{
-  G_LOCK (node_mem_chunk);
-  g_mem_chunk_free (node_mem_chunk, node);
-  G_UNLOCK (node_mem_chunk);
-}
diff --git a/glib/gcompletion.c b/glib/gcompletion.c
deleted file mode 100644
index 9bc4c9b..0000000
--- a/glib/gcompletion.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-#include <string.h>
-
-static void completion_check_cache (GCompletion* cmp,
-				    gchar**	 new_prefix);
-
-GCompletion* 
-g_completion_new (GCompletionFunc func)
-{
-  GCompletion* gcomp;
-  
-  gcomp = g_new (GCompletion, 1);
-  gcomp->items = NULL;
-  gcomp->cache = NULL;
-  gcomp->prefix = NULL;
-  gcomp->func = func;
-
-  return gcomp;
-}
-
-void 
-g_completion_add_items (GCompletion* cmp,
-			GList*	     items)
-{
-  GList* it;
-  
-  g_return_if_fail (cmp != NULL);
-  g_return_if_fail (items != NULL);
-  
-  /* optimize adding to cache? */
-  if (cmp->cache)
-    {
-      g_list_free (cmp->cache);
-      cmp->cache = NULL;
-    }
-
-  if (cmp->prefix)
-    {
-      g_free (cmp->prefix);
-      cmp->prefix = NULL;
-    }
-  
-  it = items;
-  while (it)
-    {
-      cmp->items = g_list_prepend (cmp->items, it->data);
-      it = it->next;
-    }
-}
-
-void 
-g_completion_remove_items (GCompletion* cmp,
-			   GList*	items)
-{
-  GList* it;
-  
-  g_return_if_fail (cmp != NULL);
-  g_return_if_fail (items != NULL);
-  
-  it = items;
-  while (cmp->items && it)
-    {
-      cmp->items = g_list_remove (cmp->items, it->data);
-      it = it->next;
-    }
-
-  it = items;
-  while (cmp->cache && it)
-    {
-      cmp->cache = g_list_remove(cmp->cache, it->data);
-      it = it->next;
-    }
-}
-
-void 
-g_completion_clear_items (GCompletion* cmp)
-{
-  g_return_if_fail (cmp != NULL);
-  
-  g_list_free (cmp->items);
-  cmp->items = NULL;
-  g_list_free (cmp->cache);
-  cmp->cache = NULL;
-  g_free (cmp->prefix);
-  cmp->prefix = NULL;
-}
-
-static void   
-completion_check_cache (GCompletion* cmp,
-			gchar**	     new_prefix)
-{
-  register GList* list;
-  register gint len;
-  register gint i;
-  register gint plen;
-  gchar* postfix;
-  gchar* s;
-  
-  if (!new_prefix)
-    return;
-  if (!cmp->cache)
-    {
-      *new_prefix = NULL;
-      return;
-    }
-  
-  len = strlen(cmp->prefix);
-  list = cmp->cache;
-  s = cmp->func ? cmp->func (list->data) : (gchar*) list->data;
-  postfix = s + len;
-  plen = strlen (postfix);
-  list = list->next;
-  
-  while (list && plen)
-    {
-      s = cmp->func ? cmp->func (list->data) : (gchar*) list->data;
-      s += len;
-      for (i = 0; i < plen; ++i)
-	{
-	  if (postfix[i] != s[i])
-	    break;
-	}
-      plen = i;
-      list = list->next;
-    }
-  
-  *new_prefix = g_new0 (gchar, len + plen + 1);
-  strncpy (*new_prefix, cmp->prefix, len);
-  strncpy (*new_prefix + len, postfix, plen);
-}
-
-GList* 
-g_completion_complete (GCompletion* cmp,
-		       gchar*	    prefix,
-		       gchar**	    new_prefix)
-{
-  gint plen, len;
-  gint done = 0;
-  GList* list;
-  
-  g_return_val_if_fail (cmp != NULL, NULL);
-  g_return_val_if_fail (prefix != NULL, NULL);
-  
-  len = strlen (prefix);
-  if (cmp->prefix && cmp->cache)
-    {
-      plen = strlen (cmp->prefix);
-      if (plen <= len && !strncmp (prefix, cmp->prefix, plen))
-	{ 
-	  /* use the cache */
-	  list = cmp->cache;
-	  while (list)
-	    {
-	      if (strncmp (prefix,
-			   cmp->func ? cmp->func (list->data) : (gchar*) list->data,
-			   len))
-		{
-		  list = g_list_remove_link (cmp->cache, list);
-		  if (list != cmp->cache)
-		    cmp->cache = list;
-		}
-	      else
-		list = list->next;
-	    }
-	  done = 1;
-	}
-    }
-  
-  if (!done)
-    {
-      /* normal code */
-      g_list_free (cmp->cache);
-      cmp->cache = NULL;
-      list = cmp->items;
-      while (*prefix && list)
-	{
-	  if (!strncmp (prefix,
-			cmp->func ? cmp->func (list->data) : (gchar*) list->data,
-			len))
-	    cmp->cache = g_list_prepend (cmp->cache, list->data);
-	  list = list->next;
-	}
-    }
-  if (cmp->prefix)
-    {
-      g_free (cmp->prefix);
-      cmp->prefix = NULL;
-    }
-  if (cmp->cache)
-    cmp->prefix = g_strdup (prefix);
-  completion_check_cache (cmp, new_prefix);
-  
-  return *prefix ? cmp->cache : cmp->items;
-}
-
-void 
-g_completion_free (GCompletion* cmp)
-{
-  g_return_if_fail (cmp != NULL);
-  
-  g_completion_clear_items (cmp);
-  g_free (cmp);
-}
-
-#ifdef TEST_COMPLETION
-#include <stdio.h>
-int
-main (int   argc,
-      char* argv[])
-{
-  FILE *file;
-  gchar buf[1024];
-  GList *list;
-  GList *result;
-  GList *tmp;
-  GCompletion *cmp;
-  gint i;
-  gchar *longp = NULL;
-  
-  if (argc < 3)
-    {
-      g_warning ("Usage: %s filename prefix1 [prefix2 ...]\n", argv[0]);
-      return 1;
-    }
-  
-  file = fopen (argv[1], "r");
-  if (!file)
-    {
-      g_warning ("Cannot open %s\n", argv[1]);
-      return 1;
-    }
-  
-  cmp = g_completion_new (NULL);
-  list = g_list_alloc ();
-  while (fgets (buf, 1024, file))
-    {
-      list->data = g_strdup (buf);
-      g_completion_add_items (cmp, list);
-    }
-  fclose (file);
-  
-  for (i = 2; i < argc; ++i)
-    {
-      printf ("COMPLETING: %s\n", argv[i]);
-      result = g_completion_complete (cmp, argv[i], &longp);
-      g_list_foreach (result, (GFunc) printf, NULL);
-      printf ("LONG MATCH: %s\n", longp);
-      g_free (longp);
-      longp = NULL;
-    }
-  
-  g_list_foreach (cmp->items, (GFunc) g_free, NULL);
-  g_completion_free (cmp);
-  g_list_free (list);
-  
-  return 0;
-}
-#endif
diff --git a/glib/gdataset.c b/glib/gdataset.c
deleted file mode 100644
index 2aa4032..0000000
--- a/glib/gdataset.c
+++ /dev/null
@@ -1,611 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * gdataset.c: Generic dataset mechanism, similar to GtkObject data.
- * Copyright (C) 1998 Tim Janik
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe ; FIXME: might still freeze, watch out, not thoroughly
- * looked at yet.  
- */
-
-#include        <string.h>
-#include	"glib.h"
-
-
-
-/* --- defines --- */
-#define	G_QUARK_BLOCK_SIZE			(512)
-#define	G_DATA_MEM_CHUNK_PREALLOC		(128)
-#define	G_DATA_CACHE_MAX			(512)
-#define	G_DATASET_MEM_CHUNK_PREALLOC		(32)
-
-
-/* --- structures --- */
-typedef struct _GDataset GDataset;
-struct _GData
-{
-  GData *next;
-  GQuark id;
-  gpointer data;
-  GDestroyNotify destroy_func;
-};
-
-struct _GDataset
-{
-  gconstpointer location;
-  GData        *datalist;
-};
-
-
-/* --- prototypes --- */
-static inline GDataset*	g_dataset_lookup		(gconstpointer	  dataset_location);
-static inline void	g_datalist_clear_i		(GData		**datalist);
-static void		g_dataset_destroy_internal	(GDataset	 *dataset);
-static inline void	g_data_set_internal		(GData     	**datalist,
-							 GQuark   	  key_id,
-							 gpointer         data,
-							 GDestroyNotify   destroy_func,
-							 GDataset	 *dataset);
-static void		g_data_initialize		(void);
-static inline GQuark	g_quark_new			(gchar  	*string);
-
-
-/* --- variables --- */
-G_LOCK_DEFINE_STATIC (g_dataset_global);
-static GHashTable   *g_dataset_location_ht = NULL;
-static GDataset     *g_dataset_cached = NULL; /* should this be
-						 threadspecific? */
-static GMemChunk    *g_dataset_mem_chunk = NULL;
-static GMemChunk    *g_data_mem_chunk = NULL;
-static GData	    *g_data_cache = NULL;
-static guint	     g_data_cache_length = 0;
-
-G_LOCK_DEFINE_STATIC (g_quark_global);
-static GHashTable   *g_quark_ht = NULL;
-static gchar       **g_quarks = NULL;
-static GQuark        g_quark_seq_id = 0;
-
-
-/* --- functions --- */
-
-/* HOLDS: g_dataset_global_lock */
-static inline void
-g_datalist_clear_i (GData **datalist)
-{
-  register GData *list;
-  
-  /* unlink *all* items before walking their destructors
-   */
-  list = *datalist;
-  *datalist = NULL;
-  
-  while (list)
-    {
-      register GData *prev;
-      
-      prev = list;
-      list = prev->next;
-      
-      if (prev->destroy_func)
-	{
-	  G_UNLOCK (g_dataset_global);
-	  prev->destroy_func (prev->data);
-	  G_LOCK (g_dataset_global);
-	}
-      
-      if (g_data_cache_length < G_DATA_CACHE_MAX)
-	{
-	  prev->next = g_data_cache;
-	  g_data_cache = prev;
-	  g_data_cache_length++;
-	}
-      else
-	g_mem_chunk_free (g_data_mem_chunk, prev);
-    }
-}
-
-void
-g_datalist_clear (GData **datalist)
-{
-  g_return_if_fail (datalist != NULL);
-  
-  G_LOCK (g_dataset_global);
-  if (!g_dataset_location_ht)
-    g_data_initialize ();
-
-  while (*datalist)
-    g_datalist_clear_i (datalist);
-  G_UNLOCK (g_dataset_global);
-}
-
-/* HOLDS: g_dataset_global_lock */
-static inline GDataset*
-g_dataset_lookup (gconstpointer	dataset_location)
-{
-  register GDataset *dataset;
-  
-  if (g_dataset_cached && g_dataset_cached->location == dataset_location)
-    return g_dataset_cached;
-  
-  dataset = g_hash_table_lookup (g_dataset_location_ht, dataset_location);
-  if (dataset)
-    g_dataset_cached = dataset;
-  
-  return dataset;
-}
-
-/* HOLDS: g_dataset_global_lock */
-static void
-g_dataset_destroy_internal (GDataset *dataset)
-{
-  register gconstpointer dataset_location;
-  
-  dataset_location = dataset->location;
-  while (dataset)
-    {
-      if (!dataset->datalist)
-	{
-	  if (dataset == g_dataset_cached)
-	    g_dataset_cached = NULL;
-	  g_hash_table_remove (g_dataset_location_ht, dataset_location);
-	  g_mem_chunk_free (g_dataset_mem_chunk, dataset);
-	  break;
-	}
-      
-      g_datalist_clear_i (&dataset->datalist);
-      dataset = g_dataset_lookup (dataset_location);
-    }
-}
-
-void
-g_dataset_destroy (gconstpointer  dataset_location)
-{
-  g_return_if_fail (dataset_location != NULL);
-  
-  G_LOCK (g_dataset_global);
-  if (g_dataset_location_ht)
-    {
-      register GDataset *dataset;
-
-      dataset = g_dataset_lookup (dataset_location);
-      if (dataset)
-	g_dataset_destroy_internal (dataset);
-    }
-  G_UNLOCK (g_dataset_global);
-}
-
-/* HOLDS: g_dataset_global_lock */
-static inline void
-g_data_set_internal (GData	  **datalist,
-		     GQuark         key_id,
-		     gpointer       data,
-		     GDestroyNotify destroy_func,
-		     GDataset	   *dataset)
-{
-  register GData *list;
-  
-  list = *datalist;
-  if (!data)
-    {
-      register GData *prev;
-      
-      prev = NULL;
-      while (list)
-	{
-	  if (list->id == key_id)
-	    {
-	      if (prev)
-		prev->next = list->next;
-	      else
-		{
-		  *datalist = list->next;
-		  
-		  /* the dataset destruction *must* be done
-		   * prior to invokation of the data destroy function
-		   */
-		  if (!*datalist && dataset)
-		    g_dataset_destroy_internal (dataset);
-		}
-	      
-	      /* the GData struct *must* already be unlinked
-	       * when invoking the destroy function.
-	       * we use (data==NULL && destroy_func!=NULL) as
-	       * a special hint combination to "steal"
-	       * data without destroy notification
-	       */
-	      if (list->destroy_func && !destroy_func)
-		{
-		  G_UNLOCK (g_dataset_global);
-		  list->destroy_func (list->data);
-		  G_LOCK (g_dataset_global);
-		}
-	      
-	      if (g_data_cache_length < G_DATA_CACHE_MAX)
-		{
-		  list->next = g_data_cache;
-		  g_data_cache = list;
-		  g_data_cache_length++;
-		}
-	      else
-		g_mem_chunk_free (g_data_mem_chunk, list);
-	      
-	      return;
-	    }
-	  
-	  prev = list;
-	  list = list->next;
-	}
-    }
-  else
-    {
-      while (list)
-	{
-	  if (list->id == key_id)
-	    {
-	      if (!list->destroy_func)
-		{
-		  list->data = data;
-		  list->destroy_func = destroy_func;
-		}
-	      else
-		{
-		  register GDestroyNotify dfunc;
-		  register gpointer ddata;
-		  
-		  dfunc = list->destroy_func;
-		  ddata = list->data;
-		  list->data = data;
-		  list->destroy_func = destroy_func;
-		  
-		  /* we need to have updated all structures prior to
-		   * invokation of the destroy function
-		   */
-		  G_UNLOCK (g_dataset_global);
-		  dfunc (ddata);
-		  G_LOCK (g_dataset_global);
-		}
-	      
-	      return;
-	    }
-	  
-	  list = list->next;
-	}
-      
-      if (g_data_cache)
-	{
-	  list = g_data_cache;
-	  g_data_cache = list->next;
-	  g_data_cache_length--;
-	}
-      else
-	list = g_chunk_new (GData, g_data_mem_chunk);
-      list->next = *datalist;
-      list->id = key_id;
-      list->data = data;
-      list->destroy_func = destroy_func;
-      *datalist = list;
-    }
-}
-
-void
-g_dataset_id_set_data_full (gconstpointer  dataset_location,
-			    GQuark         key_id,
-			    gpointer       data,
-			    GDestroyNotify destroy_func)
-{
-  register GDataset *dataset;
-  
-  g_return_if_fail (dataset_location != NULL);
-  if (!data)
-    g_return_if_fail (destroy_func == NULL);
-  if (!key_id)
-    {
-      if (data)
-	g_return_if_fail (key_id > 0);
-      else
-	return;
-    }
-  
-  G_LOCK (g_dataset_global);
-  if (!g_dataset_location_ht)
-    g_data_initialize ();
- 
-  dataset = g_dataset_lookup (dataset_location);
-  if (!dataset)
-    {
-      dataset = g_chunk_new (GDataset, g_dataset_mem_chunk);
-      dataset->location = dataset_location;
-      g_datalist_init (&dataset->datalist);
-      g_hash_table_insert (g_dataset_location_ht, 
-			   (gpointer) dataset->location,
-			   dataset);
-    }
-  
-  g_data_set_internal (&dataset->datalist, key_id, data, destroy_func, dataset);
-  G_UNLOCK (g_dataset_global);
-}
-
-void
-g_datalist_id_set_data_full (GData	  **datalist,
-			     GQuark         key_id,
-			     gpointer       data,
-			     GDestroyNotify destroy_func)
-{
-  g_return_if_fail (datalist != NULL);
-  if (!data)
-    g_return_if_fail (destroy_func == NULL);
-  if (!key_id)
-    {
-      if (data)
-	g_return_if_fail (key_id > 0);
-      else
-	return;
-    }
-
-  G_LOCK (g_dataset_global);
-  if (!g_dataset_location_ht)
-    g_data_initialize ();
-  
-  g_data_set_internal (datalist, key_id, data, destroy_func, NULL);
-  G_UNLOCK (g_dataset_global);
-}
-
-void
-g_dataset_id_remove_no_notify (gconstpointer  dataset_location,
-			       GQuark         key_id)
-{
-  g_return_if_fail (dataset_location != NULL);
-  
-  G_LOCK (g_dataset_global);
-  if (key_id && g_dataset_location_ht)
-    {
-      GDataset *dataset;
-  
-      dataset = g_dataset_lookup (dataset_location);
-      if (dataset)
-	g_data_set_internal (&dataset->datalist, key_id, NULL, (GDestroyNotify) 42, dataset);
-    } 
-  G_UNLOCK (g_dataset_global);
-}
-
-void
-g_datalist_id_remove_no_notify (GData	**datalist,
-				GQuark    key_id)
-{
-  g_return_if_fail (datalist != NULL);
-
-  G_LOCK (g_dataset_global);
-  if (key_id && g_dataset_location_ht)
-    g_data_set_internal (datalist, key_id, NULL, (GDestroyNotify) 42, NULL);
-  G_UNLOCK (g_dataset_global);
-}
-
-gpointer
-g_dataset_id_get_data (gconstpointer  dataset_location,
-		       GQuark         key_id)
-{
-  g_return_val_if_fail (dataset_location != NULL, NULL);
-  
-  G_LOCK (g_dataset_global);
-  if (key_id && g_dataset_location_ht)
-    {
-      register GDataset *dataset;
-      
-      dataset = g_dataset_lookup (dataset_location);
-      if (dataset)
-	{
-	  register GData *list;
-	  
-	  for (list = dataset->datalist; list; list = list->next)
-	    if (list->id == key_id)
-	      {
-		G_UNLOCK (g_dataset_global);
-		return list->data;
-	      }
-	}
-    }
-  G_UNLOCK (g_dataset_global);
- 
-  return NULL;
-}
-
-gpointer
-g_datalist_id_get_data (GData	 **datalist,
-			GQuark     key_id)
-{
-  g_return_val_if_fail (datalist != NULL, NULL);
-  
-  if (key_id)
-    {
-      register GData *list;
-      
-      for (list = *datalist; list; list = list->next)
-	if (list->id == key_id)
-	  return list->data;
-    }
-  
-  return NULL;
-}
-
-void
-g_dataset_foreach (gconstpointer    dataset_location,
-		   GDataForeachFunc func,
-		   gpointer         user_data)
-{
-  register GDataset *dataset;
-  
-  g_return_if_fail (dataset_location != NULL);
-  g_return_if_fail (func != NULL);
-
-  G_LOCK (g_dataset_global);
-  if (g_dataset_location_ht)
-    {
-      dataset = g_dataset_lookup (dataset_location);
-      G_UNLOCK (g_dataset_global);
-      if (dataset)
-	{
-	  register GData *list;
-	  
-	  for (list = dataset->datalist; list; list = list->next)
-	      func (list->id, list->data, user_data);
-	}
-    }
-  else
-    {
-      G_UNLOCK (g_dataset_global);
-    }
-}
-
-void
-g_datalist_foreach (GData	   **datalist,
-		    GDataForeachFunc func,
-		    gpointer         user_data)
-{
-  register GData *list;
-
-  g_return_if_fail (datalist != NULL);
-  g_return_if_fail (func != NULL);
-  
-  for (list = *datalist; list; list = list->next)
-    func (list->id, list->data, user_data);
-}
-
-void
-g_datalist_init (GData **datalist)
-{
-  g_return_if_fail (datalist != NULL);
-  
-  *datalist = NULL;
-}
-
-/* HOLDS: g_dataset_global_lock */
-static void
-g_data_initialize (void)
-{
-  g_return_if_fail (g_dataset_location_ht == NULL);
-
-  g_dataset_location_ht = g_hash_table_new (g_direct_hash, NULL);
-  g_dataset_cached = NULL;
-  g_dataset_mem_chunk =
-    g_mem_chunk_new ("GDataset MemChunk",
-		     sizeof (GDataset),
-		     sizeof (GDataset) * G_DATASET_MEM_CHUNK_PREALLOC,
-		     G_ALLOC_AND_FREE);
-  g_data_mem_chunk =
-    g_mem_chunk_new ("GData MemChunk",
-		     sizeof (GData),
-		     sizeof (GData) * G_DATA_MEM_CHUNK_PREALLOC,
-		     G_ALLOC_AND_FREE);
-}
-
-GQuark
-g_quark_try_string (const gchar *string)
-{
-  GQuark quark = 0;
-  g_return_val_if_fail (string != NULL, 0);
-  
-  G_LOCK (g_quark_global);
-  if (g_quark_ht)
-    quark = GPOINTER_TO_UINT (g_hash_table_lookup (g_quark_ht, string));
-  G_UNLOCK (g_quark_global);
-  
-  return quark;
-}
-
-GQuark
-g_quark_from_string (const gchar *string)
-{
-  GQuark quark;
-  
-  g_return_val_if_fail (string != NULL, 0);
-  
-  G_LOCK (g_quark_global);
-  if (g_quark_ht)
-    quark = (gulong) g_hash_table_lookup (g_quark_ht, string);
-  else
-    {
-      g_quark_ht = g_hash_table_new (g_str_hash, g_str_equal);
-      quark = 0;
-    }
-  
-  if (!quark)
-    quark = g_quark_new (g_strdup (string));
-  G_UNLOCK (g_quark_global);
-  
-  return quark;
-}
-
-GQuark
-g_quark_from_static_string (const gchar *string)
-{
-  GQuark quark;
-  
-  g_return_val_if_fail (string != NULL, 0);
-  
-  G_LOCK (g_quark_global);
-  if (g_quark_ht)
-    quark = (gulong) g_hash_table_lookup (g_quark_ht, string);
-  else
-    {
-      g_quark_ht = g_hash_table_new (g_str_hash, g_str_equal);
-      quark = 0;
-    }
-
-  if (!quark)
-    quark = g_quark_new ((gchar*) string);
-  G_UNLOCK (g_quark_global);
- 
-  return quark;
-}
-
-gchar*
-g_quark_to_string (GQuark quark)
-{
-  gchar* result = NULL;
-  G_LOCK (g_quark_global);
-  if (quark > 0 && quark <= g_quark_seq_id)
-    result = g_quarks[quark - 1];
-  G_UNLOCK (g_quark_global);
-
-  return result;
-}
-
-/* HOLDS: g_quark_global_lock */
-static inline GQuark
-g_quark_new (gchar *string)
-{
-  GQuark quark;
-  
-  if (g_quark_seq_id % G_QUARK_BLOCK_SIZE == 0)
-    g_quarks = g_renew (gchar*, g_quarks, g_quark_seq_id + G_QUARK_BLOCK_SIZE);
-  
-  g_quarks[g_quark_seq_id] = string;
-  g_quark_seq_id++;
-  quark = g_quark_seq_id;
-  g_hash_table_insert (g_quark_ht, string, GUINT_TO_POINTER (quark));
-  
-  return quark;
-}
diff --git a/glib/gdate.c b/glib/gdate.c
deleted file mode 100644
index b278a5a..0000000
--- a/glib/gdate.c
+++ /dev/null
@@ -1,1294 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "glib.h"
-
-#include <time.h>
-#include <string.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <locale.h>
-
-GDate*
-g_date_new ()
-{
-  GDate *d = g_new0 (GDate, 1); /* happily, 0 is the invalid flag for everything. */
-  
-  return d;
-}
-
-GDate*
-g_date_new_dmy (GDateDay day, GDateMonth m, GDateYear y)
-{
-  GDate *d;
-  g_return_val_if_fail (g_date_valid_dmy (day, m, y), NULL);
-  
-  d = g_new (GDate, 1);
-  
-  d->julian = FALSE;
-  d->dmy    = TRUE;
-  
-  d->month = m;
-  d->day   = day;
-  d->year  = y;
-  
-  g_assert (g_date_valid (d));
-  
-  return d;
-}
-
-GDate*
-g_date_new_julian (guint32 j)
-{
-  GDate *d;
-  g_return_val_if_fail (g_date_valid_julian (j), NULL);
-  
-  d = g_new (GDate, 1);
-  
-  d->julian = TRUE;
-  d->dmy    = FALSE;
-  
-  d->julian_days = j;
-  
-  g_assert (g_date_valid (d));
-  
-  return d;
-}
-
-void
-g_date_free (GDate *d)
-{
-  g_return_if_fail (d != NULL);
-  
-  g_free (d);
-}
-
-gboolean     
-g_date_valid (GDate       *d)
-{
-  g_return_val_if_fail (d != NULL, FALSE);
-  
-  return (d->julian || d->dmy);
-}
-
-static const guint8 days_in_months[2][13] = 
-{  /* error, jan feb mar apr may jun jul aug sep oct nov dec */
-  {  0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, 
-  {  0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } /* leap year */
-};
-
-static const guint16 days_in_year[2][14] = 
-{  /* 0, jan feb mar apr may  jun  jul  aug  sep  oct  nov  dec */
-  {  0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, 
-  {  0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
-};
-
-gboolean     
-g_date_valid_month (GDateMonth   m)
-{ 
-  return ( (m > G_DATE_BAD_MONTH) && (m < 13) );
-}
-
-gboolean     
-g_date_valid_year (GDateYear    y)
-{
-  return ( y > G_DATE_BAD_YEAR );
-}
-
-gboolean     
-g_date_valid_day (GDateDay     d)
-{
-  return ( (d > G_DATE_BAD_DAY) && (d < 32) );
-}
-
-gboolean     
-g_date_valid_weekday (GDateWeekday w)
-{
-  return ( (w > G_DATE_BAD_WEEKDAY) && (w < 8) );
-}
-
-gboolean     
-g_date_valid_julian (guint32      j)
-{
-  return (j > G_DATE_BAD_JULIAN);
-}
-
-gboolean     
-g_date_valid_dmy (GDateDay     d, 
-                  GDateMonth   m, 
-		  GDateYear    y)
-{
-  return ( (m > G_DATE_BAD_MONTH) &&
-           (m < 13)               && 
-           (d > G_DATE_BAD_DAY)   && 
-           (y > G_DATE_BAD_YEAR)  &&   /* must check before using g_date_is_leap_year */
-           (d <=  (g_date_is_leap_year (y) ? 
-		   days_in_months[1][m] : days_in_months[0][m])) );
-}
-
-
-/* "Julian days" just means an absolute number of days, where Day 1 ==
- *   Jan 1, Year 1
- */
-static void
-g_date_update_julian (GDate *d)
-{
-  GDateYear year;
-  gint index;
-  
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (d->dmy);
-  g_return_if_fail (!d->julian);
-  g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year));
-  
-  /* What we actually do is: multiply years * 365 days in the year,
-   *  add the number of years divided by 4, subtract the number of
-   *  years divided by 100 and add the number of years divided by 400,
-   *  which accounts for leap year stuff. Code from Steffen Beyer's
-   *  DateCalc. 
-   */
-  
-  year = d->year - 1; /* we know d->year > 0 since it's valid */
-  
-  d->julian_days = year * 365U;
-  d->julian_days += (year >>= 2); /* divide by 4 and add */
-  d->julian_days -= (year /= 25); /* divides original # years by 100 */
-  d->julian_days += year >> 2;    /* divides by 4, which divides original by 400 */
-  
-  index = g_date_is_leap_year (d->year) ? 1 : 0;
-  
-  d->julian_days += days_in_year[index][d->month] + d->day;
-  
-  g_return_if_fail (g_date_valid_julian (d->julian_days));
-  
-  d->julian = TRUE;
-}
-
-static void 
-g_date_update_dmy (GDate *d)
-{
-  GDateYear y;
-  GDateMonth m;
-  GDateDay day;
-  
-  guint32 A, B, C, D, E, M;
-  
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (d->julian);
-  g_return_if_fail (!d->dmy);
-  g_return_if_fail (g_date_valid_julian (d->julian_days));
-  
-  /* Formula taken from the Calendar FAQ; the formula was for the
-   *  Julian Period which starts on 1 January 4713 BC, so we add
-   *  1,721,425 to the number of days before doing the formula.
-   *
-   * I'm sure this can be simplified for our 1 January 1 AD period
-   * start, but I can't figure out how to unpack the formula.  
-   */
-  
-  A = d->julian_days + 1721425 + 32045;
-  B = ( 4 *(A + 36524) )/ 146097 - 1;
-  C = A - (146097 * B)/4;
-  D = ( 4 * (C + 365) ) / 1461 - 1;
-  E = C - ((1461*D) / 4);
-  M = (5 * (E - 1) + 2)/153;
-  
-  m = M + 3 - (12*(M/10));
-  day = E - (153*M + 2)/5;
-  y = 100 * B + D - 4800 + (M/10);
-  
-#ifdef G_ENABLE_DEBUG
-  if (!g_date_valid_dmy (day, m, y)) 
-    {
-      g_warning ("\nOOPS julian: %u  computed dmy: %u %u %u\n", 
-		 d->julian_days, day, m, y);
-    }
-#endif
-  
-  d->month = m;
-  d->day   = day;
-  d->year  = y;
-  
-  d->dmy = TRUE;
-}
-
-GDateWeekday 
-g_date_weekday (GDate *d)
-{
-  g_return_val_if_fail (d != NULL, G_DATE_BAD_WEEKDAY);
-  g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_WEEKDAY);
-  
-  if (!d->julian) 
-    {
-      g_date_update_julian (d);
-    }
-  g_return_val_if_fail (d->julian, G_DATE_BAD_WEEKDAY);
-  
-  return ((d->julian_days - 1) % 7) + 1;
-}
-
-GDateMonth   
-g_date_month (GDate *d)
-{
-  g_return_val_if_fail (d != NULL, G_DATE_BAD_MONTH);
-  g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_MONTH);
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_val_if_fail (d->dmy, G_DATE_BAD_MONTH);
-  
-  return d->month;
-}
-
-GDateYear    
-g_date_year (GDate *d)
-{
-  g_return_val_if_fail (d != NULL, G_DATE_BAD_YEAR);
-  g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_YEAR);
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_val_if_fail (d->dmy, G_DATE_BAD_YEAR);  
-  
-  return d->year;
-}
-
-GDateDay     
-g_date_day (GDate *d)
-{
-  g_return_val_if_fail (d != NULL, G_DATE_BAD_DAY);
-  g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_DAY);
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_val_if_fail (d->dmy, G_DATE_BAD_DAY);  
-  
-  return d->day;
-}
-
-guint32      
-g_date_julian (GDate *d)
-{
-  g_return_val_if_fail (d != NULL, G_DATE_BAD_JULIAN);
-  g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN);
-  
-  if (!d->julian) 
-    {
-      g_date_update_julian (d);
-    }
-  g_return_val_if_fail (d->julian, G_DATE_BAD_JULIAN);  
-  
-  return d->julian_days;
-}
-
-guint        
-g_date_day_of_year (GDate *d)
-{
-  gint index;
-  
-  g_return_val_if_fail (d != NULL, 0);
-  g_return_val_if_fail (g_date_valid (d), 0);
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_val_if_fail (d->dmy, 0);  
-  
-  index = g_date_is_leap_year (d->year) ? 1 : 0;
-  
-  return (days_in_year[index][d->month] + d->day);
-}
-
-guint        
-g_date_monday_week_of_year (GDate *d)
-{
-  GDateWeekday wd;
-  guint day;
-  GDate first;
-  
-  g_return_val_if_fail (d != NULL, 0);
-  g_return_val_if_fail (g_date_valid (d), 0);
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_val_if_fail (d->dmy, 0);  
-  
-  g_date_clear (&first, 1);
-  
-  g_date_set_dmy (&first, 1, 1, d->year);
-  
-  wd = g_date_weekday (&first) - 1; /* make Monday day 0 */
-  day = g_date_day_of_year (d) - 1;
-  
-  return ((day + wd)/7U + (wd == 0 ? 1 : 0));
-}
-
-guint        
-g_date_sunday_week_of_year (GDate *d)
-{
-  GDateWeekday wd;
-  guint day;
-  GDate first;
-  
-  g_return_val_if_fail (d != NULL, 0);
-  g_return_val_if_fail (g_date_valid (d), 0);
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_val_if_fail (d->dmy, 0);  
-  
-  g_date_clear (&first, 1);
-  
-  g_date_set_dmy (&first, 1, 1, d->year);
-  
-  wd = g_date_weekday (&first);
-  if (wd == 7) wd = 0; /* make Sunday day 0 */
-  day = g_date_day_of_year (d) - 1;
-  
-  return ((day + wd)/7U + (wd == 0 ? 1 : 0));
-}
-
-void         
-g_date_clear (GDate       *d, guint ndates)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (ndates != 0);
-  
-  memset (d, 0x0, ndates*sizeof (GDate)); 
-}
-
-G_LOCK_DEFINE_STATIC (g_date_global);
-
-/* These are for the parser, output to the user should use *
- * g_date_strftime () - this creates more never-freed memory to annoy
- * all those memory debugger users. :-) 
- */
-
-static gchar *long_month_names[13] = 
-{ 
-  "Error", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL 
-};
-
-static gchar *short_month_names[13] = 
-{
-  "Error", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL 
-};
-
-/* This tells us if we need to update the parse info */
-static gchar *current_locale = NULL;
-
-/* order of these in the current locale */
-static GDateDMY dmy_order[3] = 
-{
-   G_DATE_DAY, G_DATE_MONTH, G_DATE_YEAR
-};
-
-/* Where to chop two-digit years: i.e., for the 1930 default, numbers
- * 29 and below are counted as in the year 2000, numbers 30 and above
- * are counted as in the year 1900.  
- */
-
-static GDateYear twodigit_start_year = 1930;
-
-/* It is impossible to enter a year between 1 AD and 99 AD with this
- * in effect.  
- */
-static gboolean using_twodigit_years = FALSE;
-
-struct _GDateParseTokens {
-  gint num_ints;
-  gint n[3];
-  guint month;
-};
-
-typedef struct _GDateParseTokens GDateParseTokens;
-
-#define NUM_LEN 10
-
-/* HOLDS: g_date_global_lock */
-static void
-g_date_fill_parse_tokens (const gchar *str, GDateParseTokens *pt)
-{
-  gchar num[4][NUM_LEN+1];
-  gint i;
-  const guchar *s;
-  
-  /* We count 4, but store 3; so we can give an error
-   * if there are 4.
-   */
-  num[0][0] = num[1][0] = num[2][0] = num[3][0] = '\0';
-  
-  s = str;
-  pt->num_ints = 0;
-  while (*s && pt->num_ints < 4) 
-    {
-      
-      i = 0;
-      while (*s && isdigit (*s) && i <= NUM_LEN)
-        {
-          num[pt->num_ints][i] = *s;
-          ++s; 
-          ++i;
-        }
-      
-      if (i > 0) 
-        {
-          num[pt->num_ints][i] = '\0';
-          ++(pt->num_ints);
-        }
-      
-      if (*s == '\0') break;
-      
-      ++s;
-    }
-  
-  pt->n[0] = pt->num_ints > 0 ? atoi (num[0]) : 0;
-  pt->n[1] = pt->num_ints > 1 ? atoi (num[1]) : 0;
-  pt->n[2] = pt->num_ints > 2 ? atoi (num[2]) : 0;
-  
-  pt->month = G_DATE_BAD_MONTH;
-  
-  if (pt->num_ints < 3)
-    {
-      gchar lcstr[128];
-      int i = 1;
-      
-      strncpy (lcstr, str, 127);
-      g_strdown (lcstr);
-      
-      while (i < 13)
-        {
-          if (long_month_names[i] != NULL) 
-            {
-              const gchar *found = strstr (lcstr, long_month_names[i]);
-	      
-              if (found != NULL)
-                {
-                  pt->month = i;
-		  return;
-                }
-            }
-	  
-          if (short_month_names[i] != NULL) 
-            {
-              const gchar *found = strstr (lcstr, short_month_names[i]);
-	      
-              if (found != NULL)
-                {
-                  pt->month = i;
-                  return;
-                }
-            }
-
-          ++i;
-        }      
-    }
-}
-
-/* HOLDS: g_date_global_lock */
-static void
-g_date_prepare_to_parse (const gchar *str, GDateParseTokens *pt)
-{
-  const gchar *locale = setlocale (LC_TIME, NULL);
-  gboolean recompute_localeinfo = FALSE;
-  GDate d;
-  
-  g_return_if_fail (locale != NULL); /* should not happen */
-  
-  g_date_clear (&d, 1);              /* clear for scratch use */
-  
-  if ( (current_locale == NULL) || (strcmp (locale, current_locale) != 0) ) 
-    {
-      recompute_localeinfo = TRUE;  /* Uh, there used to be a reason for the temporary */
-    }
-  
-  if (recompute_localeinfo)
-    {
-      int i = 1;
-      GDateParseTokens testpt;
-      gchar buf[128];
-      
-      g_free (current_locale); /* still works if current_locale == NULL */
-      
-      current_locale = g_strdup (locale);
-      
-      while (i < 13) 
-        {
-          g_date_set_dmy (&d, 1, i, 1);
-	  
-          g_return_if_fail (g_date_valid (&d));
-	  
-          g_date_strftime (buf, 127, "%b", &d);
-          g_free (short_month_names[i]);
-          g_strdown (buf);
-          short_month_names[i] = g_strdup (buf);
-	  
-          
-	  
-          g_date_strftime (buf, 127, "%B", &d);
-          g_free (long_month_names[i]);
-          g_strdown (buf);
-          long_month_names[i] = g_strdup (buf);
-          
-          ++i;
-        }
-      
-      /* Determine DMY order */
-      
-      /* had to pick a random day - don't change this, some strftimes
-       * are broken on some days, and this one is good so far. */
-      g_date_set_dmy (&d, 4, 7, 1976);
-      
-      g_date_strftime (buf, 127, "%x", &d);
-      
-      g_date_fill_parse_tokens (buf, &testpt);
-      
-      i = 0;
-      while (i < testpt.num_ints)
-        {
-          switch (testpt.n[i])
-            {
-            case 7:
-              dmy_order[i] = G_DATE_MONTH;
-              break;
-            case 4:
-              dmy_order[i] = G_DATE_DAY;
-              break;
-            case 76:
-              using_twodigit_years = TRUE; /* FALL THRU */
-            case 1976:
-              dmy_order[i] = G_DATE_YEAR;
-              break;
-            default:
-              /* leave it unchanged */
-              break;
-            }
-          ++i;
-        }
-      
-#ifdef G_ENABLE_DEBUG
-      g_message ("**GDate prepared a new set of locale-specific parse rules.");
-      i = 1;
-      while (i < 13) 
-        {
-          g_message ("  %s   %s", long_month_names[i], short_month_names[i]);
-          ++i;
-        }
-      if (using_twodigit_years)
-        {
-          g_message ("**Using twodigit years with cutoff year: %u", twodigit_start_year);
-        }
-      { 
-        gchar *strings[3];
-        i = 0;
-        while (i < 3)
-          {
-            switch (dmy_order[i])
-              {
-              case G_DATE_MONTH:
-                strings[i] = "Month";
-                break;
-              case G_DATE_YEAR:
-                strings[i] = "Year";
-                break;
-              case G_DATE_DAY:
-                strings[i] = "Day";
-                break;
-              default:
-                strings[i] = NULL;
-                break;
-              }
-            ++i;
-          }
-        g_message ("**Order: %s, %s, %s", strings[0], strings[1], strings[2]);
-        g_message ("**Sample date in this locale: `%s'", buf);
-      }
-#endif
-    }
-  
-  g_date_fill_parse_tokens (str, pt);
-}
-
-void         
-g_date_set_parse (GDate       *d, 
-                  const gchar *str)
-{
-  GDateParseTokens pt;
-  guint m = G_DATE_BAD_MONTH, day = G_DATE_BAD_DAY, y = G_DATE_BAD_YEAR;
-  
-  g_return_if_fail (d != NULL);
-  
-  /* set invalid */
-  g_date_clear (d, 1);
-  
-  G_LOCK (g_date_global);
-
-  g_date_prepare_to_parse (str, &pt);
-  
-#ifdef G_ENABLE_DEBUG
-  g_message ("Found %d ints, `%d' `%d' `%d' and written out month %d", 
-	     pt.num_ints, pt.n[0], pt.n[1], pt.n[2], pt.month);
-#endif
-  
-  
-  if (pt.num_ints == 4) 
-    {
-      G_UNLOCK (g_date_global);
-      return; /* presumably a typo; bail out. */
-    }
-  
-  if (pt.num_ints > 1)
-    {
-      int i = 0;
-      int j = 0;
-      
-      g_assert (pt.num_ints < 4); /* i.e., it is 2 or 3 */
-      
-      while (i < pt.num_ints && j < 3) 
-        {
-          switch (dmy_order[j])
-            {
-            case G_DATE_MONTH:
-	    {
-	      if (pt.num_ints == 2 && pt.month != G_DATE_BAD_MONTH)
-		{
-		  m = pt.month;
-		  ++j;      /* skip months, but don't skip this number */
-		  continue;
-		}
-	      else 
-		m = pt.n[i];
-	    }
-	    break;
-            case G_DATE_DAY:
-	    {
-	      if (pt.num_ints == 2 && pt.month == G_DATE_BAD_MONTH)
-		{
-		  day = 1;
-		  ++j;      /* skip days, since we may have month/year */
-		  continue;
-		}
-	      day = pt.n[i];
-	    }
-	    break;
-            case G_DATE_YEAR:
-	    {
-	      y  = pt.n[i];
-	      
-	      if (using_twodigit_years && y < 100)
-		{
-		  guint two     =  twodigit_start_year % 100;
-		  guint century = (twodigit_start_year / 100) * 100;
-		  
-		  if (y < two)
-		    century += 100;
-		  
-		  y += century;
-		}
-	    }
-	    break;
-            default:
-              break;
-            }
-	  
-          ++i;
-          ++j;
-        }
-      
-      
-      if (pt.num_ints == 3 && !g_date_valid_dmy (day, m, y))
-        {
-          /* Try YYYY MM DD */
-          y   = pt.n[0];
-          m   = pt.n[1];
-          day = pt.n[2];
-          
-          if (using_twodigit_years && y < 100) 
-            y = G_DATE_BAD_YEAR; /* avoids ambiguity */
-        }
-    }
-  else if (pt.num_ints == 1) 
-    {
-      if (pt.month != G_DATE_BAD_MONTH)
-        {
-          /* Month name and year? */
-          m    = pt.month;
-          day  = 1;
-          y = pt.n[0];
-        }
-      else
-        {
-          /* Try yyyymmdd and yymmdd */
-	  
-          m   = (pt.n[0]/100) % 100;
-          day = pt.n[0] % 100;
-          y   = pt.n[0]/10000;
-	  
-          /* FIXME move this into a separate function */
-          if (using_twodigit_years && y < 100)
-            {
-              guint two     =  twodigit_start_year % 100;
-              guint century = (twodigit_start_year / 100) * 100;
-              
-              if (y < two)
-                century += 100;
-              
-              y += century;
-            }
-        }
-    }
-  
-  /* See if we got anything valid out of all this. */
-  /* y < 8000 is to catch 19998 style typos; the library is OK up to 65535 or so */
-  if (y < 8000 && g_date_valid_dmy (day, m, y)) 
-    {
-      d->month = m;
-      d->day   = day;
-      d->year  = y;
-      d->dmy   = TRUE;
-    }
-#ifdef G_ENABLE_DEBUG
-  else 
-    g_message ("Rejected DMY %u %u %u", day, m, y);
-#endif
-  G_UNLOCK (g_date_global);
-}
-
-void         
-g_date_set_time (GDate *d,
-		 GTime  time)
-{
-  time_t t = time;
-  struct tm tm;
-  
-  g_return_if_fail (d != NULL);
-  
-#ifdef HAVE_LOCALTIME_R
-  localtime_r (&t, &tm);
-#else
-  {
-    struct tm *ptm = localtime (&t);
-    g_assert (ptm);
-    memcpy ((void *) &tm, (void *) ptm, sizeof(struct tm));
-  }
-#endif
-  
-  d->julian = FALSE;
-  
-  d->month = tm.tm_mon + 1;
-  d->day   = tm.tm_mday;
-  d->year  = tm.tm_year + 1900;
-  
-  g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year));
-  
-  d->dmy    = TRUE;
-}
-
-void         
-g_date_set_month (GDate     *d, 
-                  GDateMonth m)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid_month (m));
-
-  if (d->julian && !d->dmy) g_date_update_dmy(d);
-  d->julian = FALSE;
-  
-  d->month = m;
-  
-  if (g_date_valid_dmy (d->day, d->month, d->year))
-    d->dmy = TRUE;
-  else 
-    d->dmy = FALSE;
-}
-
-void         
-g_date_set_day (GDate     *d, 
-                GDateDay day)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid_day (day));
-  
-  if (d->julian && !d->dmy) g_date_update_dmy(d);
-  d->julian = FALSE;
-  
-  d->day = day;
-  
-  if (g_date_valid_dmy (d->day, d->month, d->year))
-    d->dmy = TRUE;
-  else 
-    d->dmy = FALSE;
-}
-
-void         
-g_date_set_year (GDate     *d, 
-                 GDateYear  y)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid_year (y));
-  
-  if (d->julian && !d->dmy) g_date_update_dmy(d);
-  d->julian = FALSE;
-  
-  d->year = y;
-  
-  if (g_date_valid_dmy (d->day, d->month, d->year))
-    d->dmy = TRUE;
-  else 
-    d->dmy = FALSE;
-}
-
-void         
-g_date_set_dmy (GDate     *d, 
-                GDateDay   day, 
-                GDateMonth m, 
-                GDateYear  y)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid_dmy (day, m, y));
-  
-  d->julian = FALSE;
-  
-  d->month = m;
-  d->day   = day;
-  d->year  = y;
-  
-  d->dmy = TRUE;
-}
-
-void         
-g_date_set_julian (GDate *d, guint32 j)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid_julian (j));
-  
-  d->julian_days = j;
-  d->julian = TRUE;
-  d->dmy = FALSE;
-}
-
-
-gboolean     
-g_date_is_first_of_month (GDate *d)
-{
-  g_return_val_if_fail (d != NULL, FALSE);
-  g_return_val_if_fail (g_date_valid (d), FALSE);
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_val_if_fail (d->dmy, FALSE);  
-  
-  if (d->day == 1) return TRUE;
-  else return FALSE;
-}
-
-gboolean     
-g_date_is_last_of_month (GDate *d)
-{
-  gint index;
-  
-  g_return_val_if_fail (d != NULL, FALSE);
-  g_return_val_if_fail (g_date_valid (d), FALSE);
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_val_if_fail (d->dmy, FALSE);  
-  
-  index = g_date_is_leap_year (d->year) ? 1 : 0;
-  
-  if (d->day == days_in_months[index][d->month]) return TRUE;
-  else return FALSE;
-}
-
-void         
-g_date_add_days (GDate *d, guint ndays)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid (d));
-  
-  if (!d->julian)
-    {
-      g_date_update_julian (d);
-    }
-  g_return_if_fail (d->julian);
-  
-  d->julian_days += ndays;
-  d->dmy = FALSE;
-}
-
-void         
-g_date_subtract_days (GDate *d, guint ndays)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid (d));
-  
-  if (!d->julian)
-    {
-      g_date_update_julian (d);
-    }
-  g_return_if_fail (d->julian);
-  g_return_if_fail (d->julian_days > ndays);
-  
-  d->julian_days -= ndays;
-  d->dmy = FALSE;
-}
-
-void         
-g_date_add_months (GDate       *d, 
-                   guint        nmonths)
-{
-  guint years, months;
-  gint index;
-  
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid (d));
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_if_fail (d->dmy);  
-  
-  nmonths += d->month - 1;
-  
-  years  = nmonths/12;
-  months = nmonths%12;
-  
-  d->month = months + 1;
-  d->year  += years;
-  
-  index = g_date_is_leap_year (d->year) ? 1 : 0;
-  
-  if (d->day > days_in_months[index][d->month])
-    d->day = days_in_months[index][d->month];
-  
-  d->julian = FALSE;
-  
-  g_return_if_fail (g_date_valid (d));
-}
-
-void         
-g_date_subtract_months (GDate       *d, 
-                        guint        nmonths)
-{
-  guint years, months;
-  gint index;
-  
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid (d));
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_if_fail (d->dmy);  
-  
-  years  = nmonths/12;
-  months = nmonths%12;
-  
-  g_return_if_fail (d->year > years);
-  
-  d->year  -= years;
-  
-  if (d->month > months) d->month -= months;
-  else 
-    {
-      months -= d->month;
-      d->month = 12 - months;
-      d->year -= 1;
-    }
-  
-  index = g_date_is_leap_year (d->year) ? 1 : 0;
-  
-  if (d->day > days_in_months[index][d->month])
-    d->day = days_in_months[index][d->month];
-  
-  d->julian = FALSE;
-  
-  g_return_if_fail (g_date_valid (d));
-}
-
-void         
-g_date_add_years (GDate       *d, 
-                  guint        nyears)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid (d));
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_if_fail (d->dmy);  
-  
-  d->year += nyears;
-  
-  if (d->month == 2 && d->day == 29)
-    {
-      if (!g_date_is_leap_year (d->year))
-        {
-          d->day = 28;
-        }
-    }
-  
-  d->julian = FALSE;
-}
-
-void         
-g_date_subtract_years (GDate       *d, 
-                       guint        nyears)
-{
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid (d));
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_if_fail (d->dmy);  
-  g_return_if_fail (d->year > nyears);
-  
-  d->year -= nyears;
-  
-  if (d->month == 2 && d->day == 29)
-    {
-      if (!g_date_is_leap_year (d->year))
-        {
-          d->day = 28;
-        }
-    }
-  
-  d->julian = FALSE;
-}
-
-
-gboolean     
-g_date_is_leap_year (GDateYear  year)
-{
-  g_return_val_if_fail (g_date_valid_year (year), FALSE);
-  
-  return ( (((year % 4) == 0) && ((year % 100) != 0)) ||
-           (year % 400) == 0 );
-}
-
-guint8         
-g_date_days_in_month (GDateMonth month, 
-                      GDateYear  year)
-{
-  gint index;
-  
-  g_return_val_if_fail (g_date_valid_year (year), 0);
-  g_return_val_if_fail (g_date_valid_month (month), 0);
-  
-  index = g_date_is_leap_year (year) ? 1 : 0;
-  
-  return days_in_months[index][month];
-}
-
-guint8       
-g_date_monday_weeks_in_year (GDateYear  year)
-{
-  GDate d;
-  
-  g_return_val_if_fail (g_date_valid_year (year), 0);
-  
-  g_date_clear (&d, 1);
-  g_date_set_dmy (&d, 1, 1, year);
-  if (g_date_weekday (&d) == G_DATE_MONDAY) return 53;
-  g_date_set_dmy (&d, 31, 12, year);
-  if (g_date_weekday (&d) == G_DATE_MONDAY) return 53;
-  if (g_date_is_leap_year (year)) 
-    {
-      g_date_set_dmy (&d, 2, 1, year);
-      if (g_date_weekday (&d) == G_DATE_MONDAY) return 53;
-      g_date_set_dmy (&d, 30, 12, year);
-      if (g_date_weekday (&d) == G_DATE_MONDAY) return 53;
-    }
-  return 52;
-}
-
-guint8       
-g_date_sunday_weeks_in_year (GDateYear  year)
-{
-  GDate d;
-  
-  g_return_val_if_fail (g_date_valid_year (year), 0);
-  
-  g_date_clear (&d, 1);
-  g_date_set_dmy (&d, 1, 1, year);
-  if (g_date_weekday (&d) == G_DATE_SUNDAY) return 53;
-  g_date_set_dmy (&d, 31, 12, year);
-  if (g_date_weekday (&d) == G_DATE_SUNDAY) return 53;
-  if (g_date_is_leap_year (year)) 
-    {
-      g_date_set_dmy (&d, 2, 1, year);
-      if (g_date_weekday (&d) == G_DATE_SUNDAY) return 53;
-      g_date_set_dmy (&d, 30, 12, year);
-      if (g_date_weekday (&d) == G_DATE_SUNDAY) return 53;
-    }
-  return 52;
-}
-
-gint         
-g_date_compare (GDate     *lhs, 
-                GDate     *rhs)
-{
-  g_return_val_if_fail (lhs != NULL, 0);
-  g_return_val_if_fail (rhs != NULL, 0);
-  g_return_val_if_fail (g_date_valid (lhs), 0);
-  g_return_val_if_fail (g_date_valid (rhs), 0);
-  
-  /* Remember the self-comparison case! I think it works right now. */
-  
-  while (TRUE)
-    {
-      
-      if (lhs->julian && rhs->julian) 
-        {
-          if (lhs->julian_days < rhs->julian_days) return -1;
-          else if (lhs->julian_days > rhs->julian_days) return 1;
-          else                                          return 0;
-        }
-      else if (lhs->dmy && rhs->dmy) 
-        {
-          if (lhs->year < rhs->year)               return -1;
-          else if (lhs->year > rhs->year)               return 1;
-          else 
-            {
-              if (lhs->month < rhs->month)         return -1;
-              else if (lhs->month > rhs->month)         return 1;
-              else 
-                {
-                  if (lhs->day < rhs->day)              return -1;
-                  else if (lhs->day > rhs->day)              return 1;
-                  else                                       return 0;
-                }
-              
-            }
-          
-        }
-      else
-        {
-          if (!lhs->julian) g_date_update_julian (lhs);
-          if (!rhs->julian) g_date_update_julian (rhs);
-          g_return_val_if_fail (lhs->julian, 0);
-          g_return_val_if_fail (rhs->julian, 0);
-        }
-      
-    }
-  return 0; /* warnings */
-}
-
-
-void        
-g_date_to_struct_tm (GDate      *d, 
-                     struct tm   *tm)
-{
-  GDateWeekday day;
-     
-  g_return_if_fail (d != NULL);
-  g_return_if_fail (g_date_valid (d));
-  g_return_if_fail (tm != NULL);
-  
-  if (!d->dmy) 
-    {
-      g_date_update_dmy (d);
-    }
-  g_return_if_fail (d->dmy);
-  
-  /* zero all the irrelevant fields to be sure they're valid */
-  
-  /* On Linux and maybe other systems, there are weird non-POSIX
-   * fields on the end of struct tm that choke strftime if they
-   * contain garbage.  So we need to 0 the entire struct, not just the
-   * fields we know to exist. 
-   */
-  
-  memset (tm, 0x0, sizeof (struct tm));
-  
-  tm->tm_mday = d->day;
-  tm->tm_mon  = d->month - 1; /* 0-11 goes in tm */
-  tm->tm_year = ((int)d->year) - 1900; /* X/Open says tm_year can be negative */
-  
-  day = g_date_weekday (d);
-  if (day == 7) day = 0; /* struct tm wants days since Sunday, so Sunday is 0 */
-  
-  tm->tm_wday = (int)day;
-  
-  tm->tm_yday = g_date_day_of_year (d) - 1; /* 0 to 365 */
-  tm->tm_isdst = -1; /* -1 means "information not available" */
-}
-
-gsize     
-g_date_strftime (gchar       *s, 
-                 gsize        slen, 
-                 const gchar *format, 
-                 GDate       *d)
-{
-  struct tm tm;
-  gsize retval;
-  
-  g_return_val_if_fail (d != NULL, 0);
-  g_return_val_if_fail (g_date_valid (d), 0);
-  g_return_val_if_fail (slen > 0, 0); 
-  g_return_val_if_fail (format != 0, 0);
-  g_return_val_if_fail (s != 0, 0);
-  
-  g_date_to_struct_tm (d, &tm);
-  
-  retval = strftime (s, slen, format, &tm);
-  if (retval == 0)
-    {
-      /* If retval == 0, the contents of s are undefined.  We define
-       *  them. 
-       */
-      s[0] = '\0';
-    }
-  return retval;
-}
diff --git a/glib/gerror.c b/glib/gerror.c
deleted file mode 100644
index ba81b5f..0000000
--- a/glib/gerror.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe ; except for g_on_error_stack_trace, but who wants thread safety 
- * then
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "glib.h"
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-#ifdef HAVE_SYS_TIMES_H
-#include <sys/times.h>
-#endif
-#include <sys/types.h>
-
-#include <time.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif /* HAVE_SYS_SELECT_H */
-
-#ifdef STDC_HEADERS
-#include <string.h> /* for bzero on BSD systems */
-#endif
-
-#ifdef _MSC_VER
-#include <process.h>		/* For _getpid() */
-#endif
-
-#ifndef NO_FD_SET
-#  define SELECT_MASK fd_set
-#else
-#  ifndef _AIX
-     typedef long fd_mask;
-#  endif
-#  if defined(_IBMR2)
-#    define SELECT_MASK void
-#  else
-#    define SELECT_MASK int
-#  endif
-#endif
-
-
-static void stack_trace (char **args);
-
-extern volatile gboolean glib_on_error_halt;
-volatile gboolean glib_on_error_halt = TRUE;
-
-void
-g_on_error_query (const gchar *prg_name)
-{
-  static const gchar *query1 = "[E]xit, [H]alt";
-  static const gchar *query2 = ", show [S]tack trace";
-  static const gchar *query3 = " or [P]roceed";
-  gchar buf[16];
-
-  if (!prg_name)
-    prg_name = g_get_prgname ();
-  
- retry:
-  
-  if (prg_name)
-    fprintf (stdout,
-	     "%s (pid:%u): %s%s%s: ",
-	     prg_name,
-	     (guint) getpid (),
-	     query1,
-	     query2,
-	     query3);
-  else
-    fprintf (stdout,
-	     "(process:%u): %s%s: ",
-	     (guint) getpid (),
-	     query1,
-	     query3);
-  fflush (stdout);
-  
-#ifndef NATIVE_WIN32
-  if (isatty(0) && isatty(1))
-    fgets (buf, 8, stdin); 
-  else
-    strcpy (buf, "E\n");
-#else
-  fgets (buf, 8, stdin); 
-#endif
-
-  if ((buf[0] == 'E' || buf[0] == 'e')
-      && buf[1] == '\n')
-    _exit (0);
-  else if ((buf[0] == 'P' || buf[0] == 'p')
-	   && buf[1] == '\n')
-    return;
-  else if (prg_name
-	   && (buf[0] == 'S' || buf[0] == 's')
-	   && buf[1] == '\n')
-    {
-      g_on_error_stack_trace (prg_name);
-      goto retry;
-    }
-  else if ((buf[0] == 'H' || buf[0] == 'h')
-	   && buf[1] == '\n')
-    {
-      while (glib_on_error_halt)
-	;
-      glib_on_error_halt = TRUE;
-      return;
-    }
-  else
-    goto retry;
-}
-
-void
-g_on_error_stack_trace (const gchar *prg_name)
-{
-#ifndef NATIVE_WIN32
-  pid_t pid;
-  gchar buf[16];
-  gchar *args[4] = { "gdb", NULL, NULL, NULL };
-
-  if (!prg_name)
-    return;
-
-  sprintf (buf, "%u", (guint) getpid ());
-
-  args[1] = (gchar*) prg_name;
-  args[2] = buf;
-
-  pid = fork ();
-  if (pid == 0)
-    {
-      stack_trace (args);
-      _exit (0);
-    }
-  else if (pid == (pid_t) -1)
-    {
-      perror ("unable to fork gdb");
-      return;
-    }
-  
-  while (glib_on_error_halt)
-    ;
-  glib_on_error_halt = TRUE;
-#else
-  abort ();
-#endif
-}
-
-static gboolean stack_trace_done = FALSE;
-
-static void
-stack_trace_sigchld (int signum)
-{
-  stack_trace_done = TRUE;
-}
-
-static void
-stack_trace (char **args)
-{
-#ifndef NATIVE_WIN32
-  pid_t pid;
-  int in_fd[2];
-  int out_fd[2];
-  SELECT_MASK fdset;
-  SELECT_MASK readset;
-  struct timeval tv;
-  int sel, index, state;
-  char buffer[256];
-  char c;
-
-  stack_trace_done = FALSE;
-  signal (SIGCHLD, stack_trace_sigchld);
-
-  if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1))
-    {
-      perror ("unable to open pipe");
-      _exit (0);
-    }
-
-  pid = fork ();
-  if (pid == 0)
-    {
-      close (0); dup (in_fd[0]);   /* set the stdin to the in pipe */
-      close (1); dup (out_fd[1]);  /* set the stdout to the out pipe */
-      close (2); dup (out_fd[1]);  /* set the stderr to the out pipe */
-
-      execvp (args[0], args);      /* exec gdb */
-      perror ("exec failed");
-      _exit (0);
-    }
-  else if (pid == (pid_t) -1)
-    {
-      perror ("unable to fork");
-      _exit (0);
-    }
-
-  FD_ZERO (&fdset);
-  FD_SET (out_fd[0], &fdset);
-
-  write (in_fd[1], "backtrace\n", 10);
-  write (in_fd[1], "p x = 0\n", 8);
-  write (in_fd[1], "quit\n", 5);
-
-  index = 0;
-  state = 0;
-
-  while (1)
-    {
-      readset = fdset;
-      tv.tv_sec = 1;
-      tv.tv_usec = 0;
-
-      sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv);
-      if (sel == -1)
-        break;
-
-      if ((sel > 0) && (FD_ISSET (out_fd[0], &readset)))
-        {
-          if (read (out_fd[0], &c, 1))
-            {
-              switch (state)
-                {
-                case 0:
-                  if (c == '#')
-                    {
-                      state = 1;
-                      index = 0;
-                      buffer[index++] = c;
-                    }
-                  break;
-                case 1:
-                  buffer[index++] = c;
-                  if ((c == '\n') || (c == '\r'))
-                    {
-                      buffer[index] = 0;
-                      fprintf (stdout, "%s", buffer);
-                      state = 0;
-                      index = 0;
-                    }
-                  break;
-                default:
-                  break;
-                }
-            }
-        }
-      else if (stack_trace_done)
-        break;
-    }
-
-  close (in_fd[0]);
-  close (in_fd[1]);
-  close (out_fd[0]);
-  close (out_fd[1]);
-  _exit (0);
-#else
-  abort ();
-#endif
-}
diff --git a/glib/ghash.c b/glib/ghash.c
deleted file mode 100644
index 331a1ab..0000000
--- a/glib/ghash.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-
-
-#define HASH_TABLE_MIN_SIZE 11
-#define HASH_TABLE_MAX_SIZE 13845163
-
-
-typedef struct _GHashNode      GHashNode;
-
-struct _GHashNode
-{
-  gpointer key;
-  gpointer value;
-  GHashNode *next;
-};
-
-struct _GHashTable
-{
-  gint size;
-  gint nnodes;
-  guint frozen;
-  GHashNode **nodes;
-  GHashFunc hash_func;
-  GCompareFunc key_compare_func;
-};
-
-
-static void		g_hash_table_resize	 (GHashTable	*hash_table);
-static GHashNode**	g_hash_table_lookup_node (GHashTable	*hash_table,
-						  gconstpointer	 key);
-static GHashNode*	g_hash_node_new		 (gpointer	 key,
-						  gpointer	 value);
-static void		g_hash_node_destroy	 (GHashNode	*hash_node);
-static void		g_hash_nodes_destroy	 (GHashNode	*hash_node);
-
-
-G_LOCK_DEFINE_STATIC (g_hash_global);
-
-static GMemChunk *node_mem_chunk = NULL;
-static GHashNode *node_free_list = NULL;
-
-
-GHashTable*
-g_hash_table_new (GHashFunc    hash_func,
-		  GCompareFunc key_compare_func)
-{
-  GHashTable *hash_table;
-  guint i;
-  
-  hash_table = g_new (GHashTable, 1);
-  hash_table->size = HASH_TABLE_MIN_SIZE;
-  hash_table->nnodes = 0;
-  hash_table->frozen = FALSE;
-  hash_table->hash_func = hash_func ? hash_func : g_direct_hash;
-  hash_table->key_compare_func = key_compare_func;
-  hash_table->nodes = g_new (GHashNode*, hash_table->size);
-  
-  for (i = 0; i < hash_table->size; i++)
-    hash_table->nodes[i] = NULL;
-  
-  return hash_table;
-}
-
-void
-g_hash_table_destroy (GHashTable *hash_table)
-{
-  guint i;
-  
-  g_return_if_fail (hash_table != NULL);
-  
-  for (i = 0; i < hash_table->size; i++)
-    g_hash_nodes_destroy (hash_table->nodes[i]);
-  
-  g_free (hash_table->nodes);
-  g_free (hash_table);
-}
-
-static inline GHashNode**
-g_hash_table_lookup_node (GHashTable	*hash_table,
-			  gconstpointer	 key)
-{
-  GHashNode **node;
-  
-  node = &hash_table->nodes
-    [(* hash_table->hash_func) (key) % hash_table->size];
-  
-  /* Hash table lookup needs to be fast.
-   *  We therefore remove the extra conditional of testing
-   *  whether to call the key_compare_func or not from
-   *  the inner loop.
-   */
-  if (hash_table->key_compare_func)
-    while (*node && !(*hash_table->key_compare_func) ((*node)->key, key))
-      node = &(*node)->next;
-  else
-    while (*node && (*node)->key != key)
-      node = &(*node)->next;
-  
-  return node;
-}
-
-gpointer
-g_hash_table_lookup (GHashTable	  *hash_table,
-		     gconstpointer key)
-{
-  GHashNode *node;
-  
-  g_return_val_if_fail (hash_table != NULL, NULL);
-  
-  node = *g_hash_table_lookup_node (hash_table, key);
-  
-  return node ? node->value : NULL;
-}
-
-void
-g_hash_table_insert (GHashTable *hash_table,
-		     gpointer	 key,
-		     gpointer	 value)
-{
-  GHashNode **node;
-  
-  g_return_if_fail (hash_table != NULL);
-  
-  node = g_hash_table_lookup_node (hash_table, key);
-  
-  if (*node)
-    {
-      /* do not reset node->key in this place, keeping
-       * the old key might be intended.
-       * a g_hash_table_remove/g_hash_table_insert pair
-       * can be used otherwise.
-       *
-       * node->key = key; */
-      (*node)->value = value;
-    }
-  else
-    {
-      *node = g_hash_node_new (key, value);
-      hash_table->nnodes++;
-      if (!hash_table->frozen)
-	g_hash_table_resize (hash_table);
-    }
-}
-
-void
-g_hash_table_remove (GHashTable	     *hash_table,
-		     gconstpointer    key)
-{
-  GHashNode **node, *dest;
-  
-  g_return_if_fail (hash_table != NULL);
-  
-  node = g_hash_table_lookup_node (hash_table, key);
-
-  if (*node)
-    {
-      dest = *node;
-      (*node) = dest->next;
-      g_hash_node_destroy (dest);
-      hash_table->nnodes--;
-  
-      if (!hash_table->frozen)
-        g_hash_table_resize (hash_table);
-    }
-}
-
-gboolean
-g_hash_table_lookup_extended (GHashTable	*hash_table,
-			      gconstpointer	 lookup_key,
-			      gpointer		*orig_key,
-			      gpointer		*value)
-{
-  GHashNode *node;
-  
-  g_return_val_if_fail (hash_table != NULL, FALSE);
-  
-  node = *g_hash_table_lookup_node (hash_table, lookup_key);
-  
-  if (node)
-    {
-      if (orig_key)
-	*orig_key = node->key;
-      if (value)
-	*value = node->value;
-      return TRUE;
-    }
-  else
-    return FALSE;
-}
-
-void
-g_hash_table_freeze (GHashTable *hash_table)
-{
-  g_return_if_fail (hash_table != NULL);
-  
-  hash_table->frozen++;
-}
-
-void
-g_hash_table_thaw (GHashTable *hash_table)
-{
-  g_return_if_fail (hash_table != NULL);
-  
-  if (hash_table->frozen)
-    if (!(--hash_table->frozen))
-      g_hash_table_resize (hash_table);
-}
-
-guint
-g_hash_table_foreach_remove (GHashTable	*hash_table,
-			     GHRFunc	 func,
-			     gpointer	 user_data)
-{
-  GHashNode *node, *prev;
-  guint i;
-  guint deleted = 0;
-  
-  g_return_val_if_fail (hash_table != NULL, 0);
-  g_return_val_if_fail (func != NULL, 0);
-  
-  for (i = 0; i < hash_table->size; i++)
-    {
-    restart:
-      
-      prev = NULL;
-      
-      for (node = hash_table->nodes[i]; node; prev = node, node = node->next)
-	{
-	  if ((* func) (node->key, node->value, user_data))
-	    {
-	      deleted += 1;
-	      
-	      hash_table->nnodes -= 1;
-	      
-	      if (prev)
-		{
-		  prev->next = node->next;
-		  g_hash_node_destroy (node);
-		  node = prev;
-		}
-	      else
-		{
-		  hash_table->nodes[i] = node->next;
-		  g_hash_node_destroy (node);
-		  goto restart;
-		}
-	    }
-	}
-    }
-  
-  if (!hash_table->frozen)
-    g_hash_table_resize (hash_table);
-  
-  return deleted;
-}
-
-void
-g_hash_table_foreach (GHashTable *hash_table,
-		      GHFunc	  func,
-		      gpointer	  user_data)
-{
-  GHashNode *node;
-  gint i;
-  
-  g_return_if_fail (hash_table != NULL);
-  g_return_if_fail (func != NULL);
-  
-  for (i = 0; i < hash_table->size; i++)
-    for (node = hash_table->nodes[i]; node; node = node->next)
-      (* func) (node->key, node->value, user_data);
-}
-
-/* Returns the number of elements contained in the hash table. */
-guint
-g_hash_table_size (GHashTable *hash_table)
-{
-  g_return_val_if_fail (hash_table != NULL, 0);
-  
-  return hash_table->nnodes;
-}
-
-static void
-g_hash_table_resize (GHashTable *hash_table)
-{
-  GHashNode **new_nodes;
-  GHashNode *node;
-  GHashNode *next;
-  gfloat nodes_per_list;
-  guint hash_val;
-  gint new_size;
-  gint i;
-  
-  nodes_per_list = (gfloat) hash_table->nnodes / (gfloat) hash_table->size;
-  
-  if ((nodes_per_list > 0.3 || hash_table->size <= HASH_TABLE_MIN_SIZE) &&
-      (nodes_per_list < 3.0 || hash_table->size >= HASH_TABLE_MAX_SIZE))
-    return;
-  
-  new_size = CLAMP(g_spaced_primes_closest (hash_table->nnodes),
-		   HASH_TABLE_MIN_SIZE,
-		   HASH_TABLE_MAX_SIZE);
-  new_nodes = g_new0 (GHashNode*, new_size);
-  
-  for (i = 0; i < hash_table->size; i++)
-    for (node = hash_table->nodes[i]; node; node = next)
-      {
-	next = node->next;
-
-	hash_val = (* hash_table->hash_func) (node->key) % new_size;
-
-	node->next = new_nodes[hash_val];
-	new_nodes[hash_val] = node;
-      }
-  
-  g_free (hash_table->nodes);
-  hash_table->nodes = new_nodes;
-  hash_table->size = new_size;
-}
-
-static GHashNode*
-g_hash_node_new (gpointer key,
-		 gpointer value)
-{
-  GHashNode *hash_node;
-  
-  G_LOCK (g_hash_global);
-  if (node_free_list)
-    {
-      hash_node = node_free_list;
-      node_free_list = node_free_list->next;
-    }
-  else
-    {
-      if (!node_mem_chunk)
-	node_mem_chunk = g_mem_chunk_new ("hash node mem chunk",
-					  sizeof (GHashNode),
-					  1024, G_ALLOC_ONLY);
-      
-      hash_node = g_chunk_new (GHashNode, node_mem_chunk);
-    }
-  G_UNLOCK (g_hash_global);
-  
-  hash_node->key = key;
-  hash_node->value = value;
-  hash_node->next = NULL;
-  
-  return hash_node;
-}
-
-static void
-g_hash_node_destroy (GHashNode *hash_node)
-{
-  G_LOCK (g_hash_global);
-  hash_node->next = node_free_list;
-  node_free_list = hash_node;
-  G_UNLOCK (g_hash_global);
-}
-
-static void
-g_hash_nodes_destroy (GHashNode *hash_node)
-{
-  if (hash_node)
-    {
-      GHashNode *node = hash_node;
-  
-      while (node->next)
-        node = node->next;
-  
-      G_LOCK (g_hash_global);
-      node->next = node_free_list;
-      node_free_list = hash_node;
-      G_UNLOCK (g_hash_global);
-    }
-}
diff --git a/glib/ghook.c b/glib/ghook.c
deleted file mode 100644
index 09e8883..0000000
--- a/glib/ghook.c
+++ /dev/null
@@ -1,633 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * GHook: Callback maintenance functions
- * Copyright (C) 1998 Tim Janik
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include	"glib.h"
-
-
-/* --- defines --- */
-#define	G_HOOKS_PREALLOC	(16)
-
-
-/* --- functions --- */
-void
-g_hook_list_init (GHookList *hook_list,
-		  guint	     hook_size)
-{
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook_size >= sizeof (GHook));
-  
-  hook_list->seq_id = 1;
-  hook_list->hook_size = hook_size;
-  hook_list->is_setup = TRUE;
-  hook_list->hooks = NULL;
-  hook_list->hook_memchunk = g_mem_chunk_new ("GHook Memchunk",
-					      hook_size,
-					      hook_size * G_HOOKS_PREALLOC,
-					      G_ALLOC_AND_FREE);
-  hook_list->hook_free = NULL;
-  hook_list->hook_destroy = NULL;
-}
-
-void
-g_hook_list_clear (GHookList *hook_list)
-{
-  g_return_if_fail (hook_list != NULL);
-  
-  if (hook_list->is_setup)
-    {
-      GHook *hook;
-      
-      hook_list->is_setup = FALSE;
-      
-      hook = hook_list->hooks;
-      if (!hook)
-	{
-	  g_mem_chunk_destroy (hook_list->hook_memchunk);
-	  hook_list->hook_memchunk = NULL;
-	}
-      else
-	do
-	  {
-	    GHook *tmp;
-	    
-	    g_hook_ref (hook_list, hook);
-	    g_hook_destroy_link (hook_list, hook);
-	    tmp = hook->next;
-	    g_hook_unref (hook_list, hook);
-	    hook = tmp;
-	  }
-	while (hook);
-    }
-}
-
-GHook*
-g_hook_alloc (GHookList *hook_list)
-{
-  GHook *hook;
-  
-  g_return_val_if_fail (hook_list != NULL, NULL);
-  g_return_val_if_fail (hook_list->is_setup, NULL);
-  
-  hook = g_chunk_new0 (GHook, hook_list->hook_memchunk);
-  hook->data = NULL;
-  hook->next = NULL;
-  hook->prev = NULL;
-  hook->flags = G_HOOK_FLAG_ACTIVE;
-  hook->ref_count = 0;
-  hook->hook_id = 0;
-  hook->func = NULL;
-  hook->destroy = NULL;
-  
-  return hook;
-}
-
-void
-g_hook_free (GHookList *hook_list,
-	     GHook     *hook)
-{
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook_list->is_setup);
-  g_return_if_fail (hook != NULL);
-  g_return_if_fail (G_HOOK_IS_UNLINKED (hook));
-
-  if (hook_list->hook_free)
-    hook_list->hook_free (hook_list, hook);
-  
-  g_chunk_free (hook, hook_list->hook_memchunk);
-}
-
-void
-g_hook_destroy_link (GHookList *hook_list,
-		     GHook     *hook)
-{
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook != NULL);
-  
-  if (hook->hook_id)
-    {
-      hook->hook_id = 0;
-      hook->flags &= ~G_HOOK_FLAG_ACTIVE;
-      if (hook_list->hook_destroy)
-	{
-	  if (hook_list->hook_destroy != G_HOOK_DEFERRED_DESTROY)
-	    hook_list->hook_destroy (hook_list, hook);
-	}
-      else if (hook->destroy)
-	{
-	  hook->destroy (hook->data);
-	  hook->data = NULL;
-	  hook->func = NULL;
-	  hook->destroy = NULL;
-	}
-      g_hook_unref (hook_list, hook); /* counterpart to g_hook_insert_before */
-    }
-}
-
-gboolean
-g_hook_destroy (GHookList   *hook_list,
-		guint	     hook_id)
-{
-  GHook *hook;
-  
-  g_return_val_if_fail (hook_list != NULL, FALSE);
-  g_return_val_if_fail (hook_id > 0, FALSE);
-  
-  hook = g_hook_get (hook_list, hook_id);
-  if (hook)
-    {
-      g_hook_destroy_link (hook_list, hook);
-      return TRUE;
-    }
-  
-  return FALSE;
-}
-
-void
-g_hook_unref (GHookList *hook_list,
-	      GHook	*hook)
-{
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook_list->hook_memchunk != NULL);
-  g_return_if_fail (hook != NULL);
-  g_return_if_fail (hook->ref_count > 0);
-  
-  hook->ref_count--;
-  if (!hook->ref_count)
-    {
-      g_return_if_fail (hook->hook_id == 0);
-      g_return_if_fail (!G_HOOK_IN_CALL (hook));
-      
-      if (hook->prev)
-	hook->prev->next = hook->next;
-      else
-	hook_list->hooks = hook->next;
-      if (hook->next)
-	{
-	  hook->next->prev = hook->prev;
-	  hook->next = NULL;
-	}
-      hook->prev = NULL;
-
-      if (!hook_list->is_setup)
-	{
-	  hook_list->is_setup = TRUE;
-	  g_hook_free (hook_list, hook);
-	  hook_list->is_setup = FALSE;
-      
-	  if (!hook_list->hooks)
-	    {
-	      g_mem_chunk_destroy (hook_list->hook_memchunk);
-	      hook_list->hook_memchunk = NULL;
-	    }
-	}
-      else
-	g_hook_free (hook_list, hook);
-    }
-}
-
-void
-g_hook_ref (GHookList *hook_list,
-	    GHook     *hook)
-{
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook != NULL);
-  g_return_if_fail (hook->ref_count > 0);
-  
-  hook->ref_count++;
-}
-
-void
-g_hook_prepend (GHookList *hook_list,
-		GHook	  *hook)
-{
-  g_return_if_fail (hook_list != NULL);
-  
-  g_hook_insert_before (hook_list, hook_list->hooks, hook);
-}
-
-void
-g_hook_insert_before (GHookList *hook_list,
-		      GHook	*sibling,
-		      GHook	*hook)
-{
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook_list->is_setup);
-  g_return_if_fail (hook != NULL);
-  g_return_if_fail (G_HOOK_IS_UNLINKED (hook));
-  g_return_if_fail (hook->func != NULL);
-  
-  hook->hook_id = hook_list->seq_id++;
-  hook->ref_count = 1; /* counterpart to g_hook_destroy_link */
-  
-  if (sibling)
-    {
-      if (sibling->prev)
-	{
-	  hook->prev = sibling->prev;
-	  hook->prev->next = hook;
-	  hook->next = sibling;
-	  sibling->prev = hook;
-	}
-      else
-	{
-	  hook_list->hooks = hook;
-	  hook->next = sibling;
-	  sibling->prev = hook;
-	}
-    }
-  else
-    {
-      if (hook_list->hooks)
-	{
-	  sibling = hook_list->hooks;
-	  while (sibling->next)
-	    sibling = sibling->next;
-	  hook->prev = sibling;
-	  sibling->next = hook;
-	}
-      else
-	hook_list->hooks = hook;
-    }
-}
-
-void
-g_hook_list_invoke (GHookList *hook_list,
-		    gboolean   may_recurse)
-{
-  GHook *hook;
-  
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook_list->is_setup);
-
-  hook = g_hook_first_valid (hook_list, may_recurse);
-  while (hook)
-    {
-      GHookFunc func;
-      gboolean was_in_call;
-      
-      func = (GHookFunc) hook->func;
-      
-      was_in_call = G_HOOK_IN_CALL (hook);
-      hook->flags |= G_HOOK_FLAG_IN_CALL;
-      func (hook->data);
-      if (!was_in_call)
-	hook->flags &= ~G_HOOK_FLAG_IN_CALL;
-      
-      hook = g_hook_next_valid (hook_list, hook, may_recurse);
-    }
-}
-
-void
-g_hook_list_invoke_check (GHookList *hook_list,
-			  gboolean   may_recurse)
-{
-  GHook *hook;
-  
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook_list->is_setup);
-  
-  hook = g_hook_first_valid (hook_list, may_recurse);
-  while (hook)
-    {
-      GHookCheckFunc func;
-      gboolean was_in_call;
-      gboolean need_destroy;
-      
-      func = (GHookCheckFunc) hook->func;
-      
-      was_in_call = G_HOOK_IN_CALL (hook);
-      hook->flags |= G_HOOK_FLAG_IN_CALL;
-      need_destroy = !func (hook->data);
-      if (!was_in_call)
-	hook->flags &= ~G_HOOK_FLAG_IN_CALL;
-      if (need_destroy)
-	g_hook_destroy_link (hook_list, hook);
-      
-      hook = g_hook_next_valid (hook_list, hook, may_recurse);
-    }
-}
-
-void
-g_hook_list_marshal_check (GHookList	       *hook_list,
-			   gboolean		may_recurse,
-			   GHookCheckMarshaller marshaller,
-			   gpointer		data)
-{
-  GHook *hook;
-  
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook_list->is_setup);
-  g_return_if_fail (marshaller != NULL);
-  
-  hook = g_hook_first_valid (hook_list, may_recurse);
-  while (hook)
-    {
-      gboolean was_in_call;
-      gboolean need_destroy;
-      
-      was_in_call = G_HOOK_IN_CALL (hook);
-      hook->flags |= G_HOOK_FLAG_IN_CALL;
-      need_destroy = !marshaller (hook, data);
-      if (!was_in_call)
-	hook->flags &= ~G_HOOK_FLAG_IN_CALL;
-      if (need_destroy)
-	g_hook_destroy_link (hook_list, hook);
-      
-      hook = g_hook_next_valid (hook_list, hook, may_recurse);
-    }
-}
-
-void
-g_hook_list_marshal (GHookList		     *hook_list,
-		     gboolean		      may_recurse,
-		     GHookMarshaller	      marshaller,
-		     gpointer		      data)
-{
-  GHook *hook;
-  
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook_list->is_setup);
-  g_return_if_fail (marshaller != NULL);
-  
-  hook = g_hook_first_valid (hook_list, may_recurse);
-  while (hook)
-    {
-      gboolean was_in_call;
-      
-      was_in_call = G_HOOK_IN_CALL (hook);
-      hook->flags |= G_HOOK_FLAG_IN_CALL;
-      marshaller (hook, data);
-      if (!was_in_call)
-	hook->flags &= ~G_HOOK_FLAG_IN_CALL;
-      
-      hook = g_hook_next_valid (hook_list, hook, may_recurse);
-    }
-}
-
-GHook*
-g_hook_first_valid (GHookList *hook_list,
-		    gboolean   may_be_in_call)
-{
-  g_return_val_if_fail (hook_list != NULL, NULL);
-  
-  if (hook_list->is_setup)
-    {
-      GHook *hook;
-      
-      hook = hook_list->hooks;
-      if (hook)
-	{
-	  g_hook_ref (hook_list, hook);
-	  if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook)))
-	    return hook;
-	  else
-	    return g_hook_next_valid (hook_list, hook, may_be_in_call);
-	}
-    }
-  
-  return NULL;
-}
-
-GHook*
-g_hook_next_valid (GHookList *hook_list,
-		   GHook     *hook,
-		   gboolean   may_be_in_call)
-{
-  GHook *ohook = hook;
-
-  g_return_val_if_fail (hook_list != NULL, NULL);
-
-  if (!hook)
-    return NULL;
-  
-  hook = hook->next;
-  while (hook)
-    {
-      if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook)))
-	{
-	  g_hook_ref (hook_list, hook);
-	  g_hook_unref (hook_list, ohook);
-	  
-	  return hook;
-	}
-      hook = hook->next;
-    }
-  g_hook_unref (hook_list, ohook);
-
-  return NULL;
-}
-
-GHook*
-g_hook_get (GHookList *hook_list,
-	    guint      hook_id)
-{
-  GHook *hook;
-  
-  g_return_val_if_fail (hook_list != NULL, NULL);
-  g_return_val_if_fail (hook_id > 0, NULL);
-  
-  hook = hook_list->hooks;
-  while (hook)
-    {
-      if (hook->hook_id == hook_id)
-	return hook;
-      hook = hook->next;
-    }
-  
-  return NULL;
-}
-
-GHook*
-g_hook_find (GHookList	  *hook_list,
-	     gboolean	   need_valids,
-	     GHookFindFunc func,
-	     gpointer	   data)
-{
-  GHook *hook;
-  
-  g_return_val_if_fail (hook_list != NULL, NULL);
-  g_return_val_if_fail (func != NULL, NULL);
-  
-  hook = hook_list->hooks;
-  while (hook)
-    {
-      GHook *tmp;
-
-      /* test only non-destroyed hooks */
-      if (!hook->hook_id)
-	{
-	  hook = hook->next;
-	  continue;
-	}
-      
-      g_hook_ref (hook_list, hook);
-      
-      if (func (hook, data) && hook->hook_id && (!need_valids || G_HOOK_ACTIVE (hook)))
-	{
-	  g_hook_unref (hook_list, hook);
-	  
-	  return hook;
-	}
-
-      tmp = hook->next;
-      g_hook_unref (hook_list, hook);
-      hook = tmp;
-    }
-  
-  return NULL;
-}
-
-GHook*
-g_hook_find_data (GHookList *hook_list,
-		  gboolean   need_valids,
-		  gpointer   data)
-{
-  GHook *hook;
-  
-  g_return_val_if_fail (hook_list != NULL, NULL);
-  
-  hook = hook_list->hooks;
-  while (hook)
-    {
-      /* test only non-destroyed hooks */
-      if (hook->data == data &&
-	  hook->hook_id &&
-	  (!need_valids || G_HOOK_ACTIVE (hook)))
-	return hook;
-
-      hook = hook->next;
-    }
-  
-  return NULL;
-}
-
-GHook*
-g_hook_find_func (GHookList *hook_list,
-		  gboolean   need_valids,
-		  gpointer   func)
-{
-  GHook *hook;
-  
-  g_return_val_if_fail (hook_list != NULL, NULL);
-  g_return_val_if_fail (func != NULL, NULL);
-  
-  hook = hook_list->hooks;
-  while (hook)
-    {
-      /* test only non-destroyed hooks */
-      if (hook->func == func &&
-	  hook->hook_id &&
-	  (!need_valids || G_HOOK_ACTIVE (hook)))
-	return hook;
-
-      hook = hook->next;
-    }
-  
-  return NULL;
-}
-
-GHook*
-g_hook_find_func_data (GHookList *hook_list,
-		       gboolean	  need_valids,
-		       gpointer	  func,
-		       gpointer	  data)
-{
-  GHook *hook;
-  
-  g_return_val_if_fail (hook_list != NULL, NULL);
-  g_return_val_if_fail (func != NULL, NULL);
-  
-  hook = hook_list->hooks;
-  while (hook)
-    {
-      /* test only non-destroyed hooks */
-      if (hook->data == data &&
-	  hook->func == func &&
-	  hook->hook_id &&
-	  (!need_valids || G_HOOK_ACTIVE (hook)))
-	return hook;
-
-      hook = hook->next;
-    }
-  
-  return NULL;
-}
-
-void
-g_hook_insert_sorted (GHookList	      *hook_list,
-		      GHook	      *hook,
-		      GHookCompareFunc func)
-{
-  GHook *sibling;
-  
-  g_return_if_fail (hook_list != NULL);
-  g_return_if_fail (hook_list->is_setup);
-  g_return_if_fail (hook != NULL);
-  g_return_if_fail (G_HOOK_IS_UNLINKED (hook));
-  g_return_if_fail (hook->func != NULL);
-  g_return_if_fail (func != NULL);
-
-  /* first non-destroyed hook */
-  sibling = hook_list->hooks;
-  while (sibling && !sibling->hook_id)
-    sibling = sibling->next;
-  
-  while (sibling)
-    {
-      GHook *tmp;
-      
-      g_hook_ref (hook_list, sibling);
-      if (func (hook, sibling) <= 0 && sibling->hook_id)
-	{
-	  g_hook_unref (hook_list, sibling);
-	  break;
-	}
-
-      /* next non-destroyed hook */
-      tmp = sibling->next;
-      while (tmp && !tmp->hook_id)
-	tmp = tmp->next;
-
-      g_hook_unref (hook_list, sibling);
-      sibling = tmp;
-    }
-  
-  g_hook_insert_before (hook_list, sibling, hook);
-}
-
-gint
-g_hook_compare_ids (GHook *new_hook,
-		    GHook *sibling)
-{
-  return ((glong) new_hook->hook_id) - ((glong) sibling->hook_id);
-}
diff --git a/glib/giochannel.c b/glib/giochannel.c
deleted file mode 100644
index 8556f0d..0000000
--- a/glib/giochannel.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * giochannel.c: IO Channel abstraction
- * Copyright 1998 Owen Taylor
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "config.h"
-
-#include "glib.h"
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-void
-g_io_channel_init (GIOChannel *channel)
-{
-  channel->channel_flags = 0;
-  channel->ref_count = 1;
-}
-
-
-void 
-g_io_channel_ref (GIOChannel *channel)
-{
-  g_return_if_fail (channel != NULL);
-
-  channel->ref_count++;
-}
-
-void 
-g_io_channel_unref (GIOChannel *channel)
-{
-  g_return_if_fail (channel != NULL);
-
-  channel->ref_count--;
-  if (channel->ref_count == 0)
-    channel->funcs->io_free (channel);
-}
-
-GIOError 
-g_io_channel_read (GIOChannel *channel, 
-		   gchar      *buf, 
-		   guint       count,
-		   guint      *bytes_read)
-{
-  g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
-
-  return channel->funcs->io_read (channel, buf, count, bytes_read);
-}
-
-GIOError 
-g_io_channel_write (GIOChannel *channel, 
-		    gchar      *buf, 
-		    guint       count,
-		    guint      *bytes_written)
-{
-  g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
-
-  return channel->funcs->io_write (channel, buf, count, bytes_written);
-}
-
-GIOError 
-g_io_channel_seek  (GIOChannel   *channel,
-		    gint        offset, 
-		    GSeekType   type)
-{
-  g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
-
-  return channel->funcs->io_seek (channel, offset, type);
-}
-     
-void
-g_io_channel_close (GIOChannel *channel)
-{
-  g_return_if_fail (channel != NULL);
-
-  channel->funcs->io_close (channel);
-}
-
-guint 
-g_io_add_watch_full (GIOChannel    *channel,
-		     gint           priority,
-		     GIOCondition   condition,
-		     GIOFunc        func,
-		     gpointer       user_data,
-		     GDestroyNotify notify)
-{
-  g_return_val_if_fail (channel != NULL, 0);
-
-  return channel->funcs->io_add_watch (channel, priority, condition,
-				       func, user_data, notify);
-}
-
-guint 
-g_io_add_watch (GIOChannel    *channel,
-		GIOCondition   condition,
-		GIOFunc        func,
-		gpointer       user_data)
-{
-  return g_io_add_watch_full (channel, 0, condition, func, user_data, NULL);
-}
diff --git a/glib/giounix.c b/glib/giounix.c
deleted file mode 100644
index 1085275..0000000
--- a/glib/giounix.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * giounix.c: IO Channels using unix file descriptors
- * Copyright 1998 Owen Taylor
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-#include <sys/types.h>
-#include <unistd.h>
-#include <errno.h>
-
-/*
- * Unix IO Channels
- */
-
-typedef struct _GIOUnixChannel GIOUnixChannel;
-typedef struct _GIOUnixWatch GIOUnixWatch;
-
-struct _GIOUnixChannel {
-  GIOChannel channel;
-  gint fd;
-};
-
-struct _GIOUnixWatch {
-  GPollFD       pollfd;
-  GIOChannel   *channel;
-  GIOCondition  condition;
-  GIOFunc       callback;
-};
-
-
-static GIOError g_io_unix_read (GIOChannel *channel, 
-		       gchar     *buf, 
-		       guint      count,
-		       guint     *bytes_written);
-		       
-static GIOError g_io_unix_write(GIOChannel *channel, 
-				gchar     *buf, 
-				guint      count,
-				guint     *bytes_written);
-static GIOError g_io_unix_seek (GIOChannel *channel,
-				gint      offset, 
-				GSeekType type);
-static void g_io_unix_close    (GIOChannel *channel);
-static void g_io_unix_free     (GIOChannel *channel);
-static guint  g_io_unix_add_watch (GIOChannel      *channel,
-				   gint           priority,
-				   GIOCondition   condition,
-				   GIOFunc        func,
-				   gpointer       user_data,
-				   GDestroyNotify notify);
-static gboolean g_io_unix_prepare  (gpointer source_data, 
-				    GTimeVal *current_time,
-				    gint *timeout,
-				    gpointer user_data);
-static gboolean g_io_unix_check    (gpointer source_data,
-				    GTimeVal *current_time,
-				    gpointer user_data);
-static gboolean g_io_unix_dispatch (gpointer source_data,
-				    GTimeVal *current_time,
-				    gpointer user_data);
-static void g_io_unix_destroy  (gpointer source_data);
-
-GSourceFuncs unix_watch_funcs = {
-  g_io_unix_prepare,
-  g_io_unix_check,
-  g_io_unix_dispatch,
-  g_io_unix_destroy
-};
-
-GIOFuncs unix_channel_funcs = {
-  g_io_unix_read,
-  g_io_unix_write,
-  g_io_unix_seek,
-  g_io_unix_close,
-  g_io_unix_add_watch,
-  g_io_unix_free,
-};
-
-static gboolean 
-g_io_unix_prepare  (gpointer source_data, 
-		    GTimeVal *current_time,
-		    gint     *timeout,
-		    gpointer user_data)
-{
-  *timeout = -1;
-  return FALSE;
-}
-
-static gboolean 
-g_io_unix_check    (gpointer source_data,
-		    GTimeVal *current_time,
-		    gpointer user_data)
-{
-  GIOUnixWatch *data = source_data;
-
-  return (data->pollfd.revents & data->condition);
-}
-
-static gboolean
-g_io_unix_dispatch (gpointer source_data, 
-		    GTimeVal *current_time,
-		    gpointer user_data)
-
-{
-  GIOUnixWatch *data = source_data;
-
-  return (*data->callback)(data->channel,
-			   data->pollfd.revents & data->condition,
-			   user_data);
-}
-
-static void 
-g_io_unix_destroy (gpointer source_data)
-{
-  GIOUnixWatch *data = source_data;
-
-  g_main_remove_poll (&data->pollfd);
-  g_io_channel_unref (data->channel);
-  g_free (data);
-}
-
-static GIOError 
-g_io_unix_read (GIOChannel *channel, 
-		gchar     *buf, 
-		guint      count,
-		guint     *bytes_read)
-{
-  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
-  gint result;
-
-  result = read (unix_channel->fd, buf, count);
-
-  if (result < 0)
-    {
-      *bytes_read = 0;
-      switch (errno)
-	{
-	case EINVAL:
-	  return G_IO_ERROR_INVAL;
-	case EAGAIN:
-	  return G_IO_ERROR_AGAIN;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    {
-      *bytes_read = result;
-      return G_IO_ERROR_NONE;
-    }
-}
-		       
-static GIOError 
-g_io_unix_write(GIOChannel *channel, 
-		gchar     *buf, 
-		guint      count,
-		guint     *bytes_written)
-{
-  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
-  gint result;
-
-  result = write (unix_channel->fd, buf, count);
-
-  if (result < 0)
-    {
-      *bytes_written = 0;
-      switch (errno)
-	{
-	case EINVAL:
-	  return G_IO_ERROR_INVAL;
-	case EAGAIN:
-	  return G_IO_ERROR_AGAIN;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    {
-      *bytes_written = result;
-      return G_IO_ERROR_NONE;
-    }
-}
-
-static GIOError 
-g_io_unix_seek (GIOChannel *channel,
-		gint      offset, 
-		GSeekType type)
-{
-  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
-  int whence;
-  off_t result;
-
-  switch (type)
-    {
-    case G_SEEK_SET:
-      whence = SEEK_SET;
-      break;
-    case G_SEEK_CUR:
-      whence = SEEK_CUR;
-      break;
-    case G_SEEK_END:
-      whence = SEEK_END;
-      break;
-    default:
-      g_warning ("g_io_unix_seek: unknown seek type");
-      return G_IO_ERROR_UNKNOWN;
-    }
-
-  result = lseek (unix_channel->fd, offset, whence);
-
-  if (result < 0)
-    {
-      switch (errno)
-	{
-	case EINVAL:
-	  return G_IO_ERROR_INVAL;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    return G_IO_ERROR_NONE;
-}
-
-
-static void 
-g_io_unix_close (GIOChannel *channel)
-{
-  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
-
-  close (unix_channel->fd);
-}
-
-static void 
-g_io_unix_free (GIOChannel *channel)
-{
-  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
-
-  g_free (unix_channel);
-}
-
-static guint 
-g_io_unix_add_watch (GIOChannel    *channel,
-		     gint           priority,
-		     GIOCondition   condition,
-		     GIOFunc        func,
-		     gpointer       user_data,
-		     GDestroyNotify notify)
-{
-  GIOUnixWatch *watch = g_new (GIOUnixWatch, 1);
-  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
-  
-  watch->channel = channel;
-  g_io_channel_ref (channel);
-
-  watch->callback = func;
-  watch->condition = condition;
-
-  watch->pollfd.fd = unix_channel->fd;
-  watch->pollfd.events = condition;
-
-  g_main_add_poll (&watch->pollfd, priority);
-
-  return g_source_add (priority, TRUE, &unix_watch_funcs, watch, user_data, notify);
-}
-
-GIOChannel *
-g_io_channel_unix_new (gint fd)
-{
-  GIOUnixChannel *unix_channel = g_new (GIOUnixChannel, 1);
-  GIOChannel *channel = (GIOChannel *)unix_channel;
-
-  g_io_channel_init (channel);
-  channel->funcs = &unix_channel_funcs;
-
-  unix_channel->fd = fd;
-  return channel;
-}
-
-gint
-g_io_channel_unix_get_fd (GIOChannel *channel)
-{
-  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
-  return unix_channel->fd;
-}
diff --git a/glib/giowin32.c b/glib/giowin32.c
deleted file mode 100644
index d5e467e..0000000
--- a/glib/giowin32.c
+++ /dev/null
@@ -1,1035 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * giowin32.c: IO Channels for Win32.
- * Copyright 1998 Owen Taylor and Tor Lillqvist
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-
-#include "config.h"
-#include "glib.h"
-#include <windows.h>
-#include <winsock.h>		/* Not everybody has winsock2 */
-#include <fcntl.h>
-#include <io.h>
-#include <errno.h>
-#include <sys/types.h>
-
-#include <stdio.h>
-
-typedef struct _GIOWin32Channel GIOWin32Channel;
-typedef struct _GIOWin32Watch GIOWin32Watch;
-
-guint g_pipe_readable_msg;
-
-typedef enum {
-  G_IO_WINDOWS_MESSAGES,	/* Windows messages */
-  G_IO_FILE_DESC,		/* Unix-like file descriptors from _open*/
-  G_IO_PIPE,			/* pipe, with windows messages for signalling */
-  G_IO_STREAM_SOCKET		/* Stream sockets */
-} GIOWin32ChannelType;
-
-struct _GIOWin32Channel {
-  GIOChannel channel;
-  gint fd;			/* Either a Unix-like file handle as provided
-				 * by the Microsoft C runtime, or a SOCKET
-				 * as provided by WinSock.
-				 */
-  GIOWin32ChannelType type;
-
-  /* This is used by G_IO_WINDOWS_MESSAGES channels */
-  HWND hwnd;			/* handle of window, or NULL */
-
-  /* This is used by G_IO_PIPE channels */
-  guint peer;			/* thread id of reader */
-  guint peer_fd;		/* fd in the reader */
-  guint offset;			/* counter of accumulated bytes */
-  guint need_wakeups;		/* in output channels whether the
-				 * reader needs wakeups
-				 */
-};
-
-struct _GIOWin32Watch {
-  GPollFD       pollfd;
-  GIOChannel   *channel;
-  GIOCondition  condition;
-  GIOFunc       callback;
-};
-
-static gboolean g_io_win32_msg_prepare  (gpointer  source_data, 
-					 GTimeVal *current_time,
-					 gint     *timeout);
-static gboolean g_io_win32_msg_check    (gpointer  source_data,
-					 GTimeVal *current_time);
-static gboolean g_io_win32_msg_dispatch (gpointer  source_data,
-					 GTimeVal *current_time,
-					 gpointer  user_data);
-
-static gboolean g_io_win32_fd_prepare  (gpointer  source_data, 
-					GTimeVal *current_time,
-					gint     *timeout);
-static gboolean g_io_win32_fd_check    (gpointer  source_data,
-					GTimeVal *current_time);
-static gboolean g_io_win32_fd_dispatch (gpointer  source_data,
-					GTimeVal *current_time,
-					gpointer  user_data);
-
-static gboolean g_io_win32_pipe_prepare  (gpointer  source_data, 
-					  GTimeVal *current_time,
-					  gint     *timeout);
-static gboolean g_io_win32_pipe_check    (gpointer  source_data,
-					  GTimeVal *current_time);
-static gboolean g_io_win32_pipe_dispatch (gpointer  source_data,
-					  GTimeVal *current_time,
-					  gpointer  user_data);
-static void g_io_win32_pipe_destroy	 (gpointer source_data);
-
-static gboolean g_io_win32_sock_prepare  (gpointer  source_data, 
-					  GTimeVal *current_time,
-					  gint     *timeout);
-static gboolean g_io_win32_sock_check    (gpointer  source_data,
-					  GTimeVal *current_time);
-static gboolean g_io_win32_sock_dispatch (gpointer  source_data,
-					  GTimeVal *current_time,
-					  gpointer  user_data);
-
-static void g_io_win32_destroy (gpointer source_data);
-
-static GIOError g_io_win32_msg_read (GIOChannel *channel, 
-				     gchar      *buf, 
-				     guint       count,
-				     guint      *bytes_written);
-
-static GIOError g_io_win32_msg_write(GIOChannel *channel, 
-				     gchar      *buf, 
-				     guint       count,
-				     guint      *bytes_written);
-static GIOError g_io_win32_msg_seek (GIOChannel *channel,
-				     gint        offset, 
-				     GSeekType   type);
-static void g_io_win32_msg_close    (GIOChannel *channel);
-static guint g_io_win32_msg_add_watch (GIOChannel      *channel,
-				       gint             priority,
-				       GIOCondition     condition,
-				       GIOFunc          func,
-				       gpointer         user_data,
-				       GDestroyNotify   notify);
-
-static GIOError g_io_win32_fd_read (GIOChannel *channel, 
-				    gchar      *buf, 
-				    guint       count,
-				    guint      *bytes_written);
-static GIOError g_io_win32_fd_write(GIOChannel *channel, 
-				    gchar      *buf, 
-				    guint       count,
-				    guint      *bytes_written);
-static GIOError g_io_win32_fd_seek (GIOChannel *channel,
-				    gint        offset, 
-				    GSeekType   type);
-static void g_io_win32_fd_close (GIOChannel *channel);
-
-static void g_io_win32_free (GIOChannel *channel);
-
-static guint g_io_win32_fd_add_watch (GIOChannel      *channel,
-				      gint             priority,
-				      GIOCondition     condition,
-				      GIOFunc          func,
-				      gpointer         user_data,
-				      GDestroyNotify   notify);
-
-static GIOError g_io_win32_no_seek (GIOChannel *channel,
-				    gint        offset, 
-				    GSeekType   type);
-
-static GIOError g_io_win32_pipe_read (GIOChannel *channel, 
-				      gchar      *buf, 
-				      guint       count,
-				      guint      *bytes_written);
-static GIOError g_io_win32_pipe_write (GIOChannel *channel, 
-				       gchar      *buf, 
-				       guint       count,
-				       guint      *bytes_written);
-static void g_io_win32_pipe_close    (GIOChannel *channel);
-static guint g_io_win32_pipe_add_watch (GIOChannel      *channel,
-					gint             priority,
-					GIOCondition     condition,
-					GIOFunc          func,
-					gpointer         user_data,
-					GDestroyNotify   notify);
-static void g_io_win32_pipe_free (GIOChannel *channel);
-
-static GIOError g_io_win32_sock_read (GIOChannel *channel, 
-				      gchar      *buf, 
-				      guint       count,
-				      guint      *bytes_written);
-static GIOError g_io_win32_sock_write(GIOChannel *channel, 
-				      gchar      *buf, 
-				      guint       count,
-				      guint      *bytes_written);
-static void g_io_win32_sock_close    (GIOChannel *channel);
-static guint g_io_win32_sock_add_watch (GIOChannel      *channel,
-					gint             priority,
-					GIOCondition     condition,
-					GIOFunc          func,
-					gpointer         user_data,
-					GDestroyNotify   notify);
-
-GSourceFuncs win32_watch_msg_funcs = {
-  g_io_win32_msg_prepare,
-  g_io_win32_msg_check,
-  g_io_win32_msg_dispatch,
-  g_io_win32_destroy
-};
-
-GSourceFuncs win32_watch_fd_funcs = {
-  g_io_win32_fd_prepare,
-  g_io_win32_fd_check,
-  g_io_win32_fd_dispatch,
-  g_io_win32_destroy
-};
-
-GSourceFuncs win32_watch_pipe_funcs = {
-  g_io_win32_pipe_prepare,
-  g_io_win32_pipe_check,
-  g_io_win32_pipe_dispatch,
-  g_io_win32_pipe_destroy
-};
-
-GSourceFuncs win32_watch_sock_funcs = {
-  g_io_win32_sock_prepare,
-  g_io_win32_sock_check,
-  g_io_win32_sock_dispatch,
-  g_io_win32_destroy
-};
-
-GIOFuncs win32_channel_msg_funcs = {
-  g_io_win32_msg_read,
-  g_io_win32_msg_write,
-  g_io_win32_no_seek,
-  g_io_win32_msg_close,
-  g_io_win32_msg_add_watch,
-  g_io_win32_free
-};
-
-GIOFuncs win32_channel_fd_funcs = {
-  g_io_win32_fd_read,
-  g_io_win32_fd_write,
-  g_io_win32_fd_seek,
-  g_io_win32_fd_close,
-  g_io_win32_fd_add_watch,
-  g_io_win32_free
-};
-
-GIOFuncs win32_channel_pipe_funcs = {
-  g_io_win32_pipe_read,
-  g_io_win32_pipe_write,
-  g_io_win32_no_seek,
-  g_io_win32_pipe_close,
-  g_io_win32_pipe_add_watch,
-  g_io_win32_pipe_free
-};
-
-GIOFuncs win32_channel_sock_funcs = {
-  g_io_win32_sock_read,
-  g_io_win32_sock_write,
-  g_io_win32_no_seek,
-  g_io_win32_sock_close,
-  g_io_win32_sock_add_watch,
-  g_io_win32_free
-};
-
-#define N_WATCHED_PIPES 4
-
-static struct {
-  gint fd;
-  GIOWin32Watch *watch;
-  GIOWin32Channel *channel;
-  gpointer user_data;
-} watched_pipes[N_WATCHED_PIPES];
-
-static gint n_watched_pipes = 0;
-
-static gboolean
-g_io_win32_msg_prepare  (gpointer source_data, 
-			 GTimeVal *current_time,
-			 gint    *timeout)
-{
-  GIOWin32Watch *data = source_data;
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) data->channel;
-  MSG msg;
-
-  *timeout = -1;
-
-  return PeekMessage (&msg, win32_channel->hwnd, 0, 0, PM_NOREMOVE) == TRUE;
-}
-
-static gboolean 
-g_io_win32_msg_check    (gpointer source_data,
-			 GTimeVal *current_time)
-{
-  GIOWin32Watch *data = source_data;
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) data->channel;
-  MSG msg;
-
-  return PeekMessage (&msg, win32_channel->hwnd, 0, 0, PM_NOREMOVE) == TRUE;
-}
-
-static gboolean
-g_io_win32_msg_dispatch (gpointer source_data, 
-			 GTimeVal *current_time,
-			 gpointer user_data)
-
-{
-  GIOWin32Watch *data = source_data;
-
-  return (*data->callback)(data->channel,
-			   data->pollfd.revents & data->condition,
-			   user_data);
-}
-
-static void
-g_io_win32_destroy (gpointer source_data)
-{
-  GIOWin32Watch *data = source_data;
-
-  g_main_remove_poll (&data->pollfd);
-  g_io_channel_unref (data->channel);
-  g_free (data);
-}
-
-static gboolean
-g_io_win32_fd_prepare  (gpointer source_data, 
-			GTimeVal *current_time,
-			gint    *timeout)
-{
-  *timeout = -1;
-
-  return FALSE;
-}
-
-static gboolean 
-g_io_win32_fd_check    (gpointer source_data,
-			GTimeVal *current_time)
-{
-  GIOWin32Watch *data = source_data;
-
-  return (data->pollfd.revents & data->condition);
-}
-
-static gboolean
-g_io_win32_fd_dispatch (gpointer source_data, 
-			GTimeVal *current_time,
-			gpointer user_data)
-
-{
-  GIOWin32Watch *data = source_data;
-
-  return (*data->callback)(data->channel,
-			   data->pollfd.revents & data->condition,
-			   user_data);
-}
-
-static GIOError
-g_io_win32_msg_read (GIOChannel *channel, 
-		     gchar     *buf, 
-		     guint      count,
-		     guint     *bytes_read)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  MSG msg;			/* In case of alignment problems */
-
-  if (count < sizeof (MSG))
-    return G_IO_ERROR_INVAL;
-  
-  if (!PeekMessage (&msg, win32_channel->hwnd, 0, 0, PM_REMOVE))
-    return G_IO_ERROR_AGAIN;
-
-  memmove (buf, &msg, sizeof (MSG));
-  *bytes_read = sizeof (MSG);
-  return G_IO_ERROR_NONE;
-}
-		       
-static GIOError 
-g_io_win32_msg_write(GIOChannel *channel, 
-		     gchar     *buf, 
-		     guint      count,
-		     guint     *bytes_written)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  MSG msg;
-  gint result;
-
-  if (count != sizeof (MSG))
-    return G_IO_ERROR_INVAL;
-
-  /* In case of alignment problems */
-  memmove (&msg, buf, sizeof (MSG));
-  if (!PostMessage (win32_channel->hwnd, msg.message, msg.wParam, msg.lParam))
-    return G_IO_ERROR_UNKNOWN;
-
-  *bytes_written = sizeof (MSG);
-  return G_IO_ERROR_NONE; 
-}
-
-static GIOError 
-g_io_win32_no_seek (GIOChannel *channel,
-		    gint      offset, 
-		    GSeekType type)
-{
-  g_warning ("g_io_win32_no_seek: unseekable IO channel type");
-  return G_IO_ERROR_UNKNOWN;
-}
-
-
-static void 
-g_io_win32_msg_close (GIOChannel *channel)
-{
-  /* Nothing to be done. Or should we set hwnd to some invalid value? */
-}
-
-static void 
-g_io_win32_free (GIOChannel *channel)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-
-  g_free (win32_channel);
-}
-
-static guint 
-g_io_win32_msg_add_watch (GIOChannel    *channel,
-			  gint           priority,
-			  GIOCondition   condition,
-			  GIOFunc        func,
-			  gpointer       user_data,
-			  GDestroyNotify notify)
-{
-  GIOWin32Watch *watch = g_new (GIOWin32Watch, 1);
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  
-  watch->channel = channel;
-  g_io_channel_ref (channel);
-
-  watch->callback = func;
-  watch->condition = condition;
-
-  watch->pollfd.fd = G_WIN32_MSG_HANDLE;
-  watch->pollfd.events = condition;
-
-  g_main_add_poll (&watch->pollfd, priority);
-
-  return g_source_add (priority, TRUE, &win32_watch_msg_funcs,
-		       watch, user_data, notify);
-}
-
-static gboolean
-g_io_win32_pipe_prepare  (gpointer source_data, 
-			  GTimeVal *current_time,
-			  gint    *timeout)
-{
-  *timeout = -1;
-
-  return FALSE;
-}
-
-static gboolean 
-g_io_win32_pipe_check    (gpointer source_data,
-			  GTimeVal *current_time)
-{
-  GIOWin32Watch *data = source_data;
-  return FALSE;
-}
-
-static gboolean
-g_io_win32_pipe_dispatch (gpointer source_data, 
-			  GTimeVal *current_time,
-			  gpointer user_data)
-
-{
-  GIOWin32Watch *data = source_data;
-
-  return (*data->callback)(data->channel,
-			   data->pollfd.revents & data->condition,
-			   user_data);
-}
-
-static void
-g_io_win32_pipe_destroy (gpointer source_data)
-{
-  GIOWin32Watch *data = source_data;
-
-  g_io_channel_unref (data->channel);
-  g_free (data);
-}
-
-static gboolean
-g_io_win32_sock_prepare  (gpointer source_data, 
-			GTimeVal *current_time,
-			gint    *timeout)
-{
-  *timeout = -1;
-
-  return FALSE;
-}
-
-static gboolean 
-g_io_win32_sock_check    (gpointer source_data,
-			GTimeVal *current_time)
-{
-  GIOWin32Watch *data = source_data;
-
-  return (data->pollfd.revents & data->condition);
-}
-
-static gboolean
-g_io_win32_sock_dispatch (gpointer source_data, 
-			GTimeVal *current_time,
-			gpointer user_data)
-
-{
-  GIOWin32Watch *data = source_data;
-
-  return (*data->callback)(data->channel,
-			   data->pollfd.revents & data->condition,
-			   user_data);
-}
-
-static GIOError
-g_io_win32_fd_read (GIOChannel *channel, 
-		    gchar     *buf, 
-		    guint      count,
-		    guint     *bytes_read)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  gint result;
-
-  result = read (win32_channel->fd, buf, count);
-  if (result < 0)
-    {
-      *bytes_read = 0;
-      switch (errno)
-	{
-	case EINVAL:
-	  return G_IO_ERROR_INVAL;
-	case EAGAIN:
-	  return G_IO_ERROR_AGAIN;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    {
-      *bytes_read = result;
-      return G_IO_ERROR_NONE;
-    }
-}
-		       
-static GIOError 
-g_io_win32_fd_write(GIOChannel *channel, 
-		    gchar     *buf, 
-		    guint      count,
-		    guint     *bytes_written)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  gint result;
-
-  result = write (win32_channel->fd, buf, count);
-      
-  if (result < 0)
-    {
-      *bytes_written = 0;
-      switch (errno)
-	{
-	case EINVAL:
-	  return G_IO_ERROR_INVAL;
-	case EAGAIN:
-	  return G_IO_ERROR_AGAIN;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    {
-      *bytes_written = result;
-      return G_IO_ERROR_NONE;
-    }
-}
-
-static GIOError 
-g_io_win32_fd_seek (GIOChannel *channel,
-		    gint      offset, 
-		    GSeekType type)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  int whence;
-  off_t result;
-
-  switch (type)
-    {
-    case G_SEEK_SET:
-      whence = SEEK_SET;
-      break;
-    case G_SEEK_CUR:
-      whence = SEEK_CUR;
-      break;
-    case G_SEEK_END:
-      whence = SEEK_END;
-      break;
-    default:
-      g_warning ("g_io_win32_fd_seek: unknown seek type");
-      return G_IO_ERROR_UNKNOWN;
-    }
-  
-  result = lseek (win32_channel->fd, offset, whence);
-  
-  if (result < 0)
-    {
-      switch (errno)
-	{
-	case EINVAL:
-	  return G_IO_ERROR_INVAL;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    return G_IO_ERROR_NONE;
-}
-
-static void 
-g_io_win32_fd_close (GIOChannel *channel)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-
-  close (win32_channel->fd);
-  return;
-}
-
-static guint 
-g_io_win32_fd_add_watch (GIOChannel    *channel,
-			 gint           priority,
-			 GIOCondition   condition,
-			 GIOFunc        func,
-			 gpointer       user_data,
-			 GDestroyNotify notify)
-{
-  GIOWin32Watch *watch = g_new (GIOWin32Watch, 1);
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  
-  watch->channel = channel;
-  g_io_channel_ref (channel);
-
-  watch->callback = func;
-  watch->condition = condition;
-
-  /* This probably does not work, except for CONIN$. */
-  watch->pollfd.fd = _get_osfhandle (win32_channel->fd);
-  watch->pollfd.events = condition;
-
-  g_main_add_poll (&watch->pollfd, priority);
-
-  return g_source_add (priority, TRUE, &win32_watch_fd_funcs,
-		       watch, user_data, notify);
-}
-
-static GIOError
-g_io_win32_pipe_read (GIOChannel *channel, 
-		      gchar     *buf, 
-		      guint      count,
-		      guint     *bytes_read)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  HANDLE handle;
-  DWORD avail;
-  gint result;
-
-  handle = (HANDLE) _get_osfhandle (win32_channel->fd);
-  if (!PeekNamedPipe (handle, NULL, 0, NULL, &avail, NULL))
-    {
-      return G_IO_ERROR_UNKNOWN;
-    }
-
-  count = MIN (count, avail);
-
-  count = MAX (count, 1);	/* Must read at least one byte, or
-				 * caller will think it's EOF.
-				 */
-  /* g_print ("g_io_win32_pipe_read: %d %d\n", win32_channel->fd, count); */
-  if (count == 0)
-    result = 0;
-  else
-    result = read (win32_channel->fd, buf, count);
-  if (result < 0)
-    {
-      *bytes_read = 0;
-      switch (errno)
-	{
-	case EINVAL:
-	  return G_IO_ERROR_INVAL;
-	case EAGAIN:
-	  return G_IO_ERROR_AGAIN;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    {
-      *bytes_read = result;
-      win32_channel->offset += result;
-      /* g_print ("=%d (%d)\n", result, win32_channel->offset); */
-      return G_IO_ERROR_NONE;
-    }
-}
-		       
-static GIOError 
-g_io_win32_pipe_write(GIOChannel *channel, 
-		      gchar     *buf, 
-		      guint      count,
-		      guint     *bytes_written)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  LONG prevcnt;
-  gint result;
-
-  /* g_print ("g_io_win32_pipe_write: %d %d\n", win32_channel->fd, count); */
-  result = write (win32_channel->fd, buf, count);
-  if (result < 0)
-    {
-      *bytes_written = 0;
-      switch (errno)
-	{
-	case EINVAL:
-	  return G_IO_ERROR_INVAL;
-	case EAGAIN:
-	  return G_IO_ERROR_AGAIN;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    {
-      if (g_pipe_readable_msg == 0)
-	g_pipe_readable_msg = RegisterWindowMessage ("g-pipe-readable");
-
-      win32_channel->offset += result;
-      /* g_print ("=%d (%d)\n", result, win32_channel->offset); */
-      if (win32_channel->need_wakeups)
-	{
-	  PostThreadMessage (win32_channel->peer,
-			     g_pipe_readable_msg,
-			     win32_channel->peer_fd,
-			     win32_channel->offset);
-	}
-      *bytes_written = result;
-      return G_IO_ERROR_NONE;
-    }
-}
-
-static void 
-g_io_win32_pipe_close (GIOChannel *channel)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-
-  /* g_print ("g_io_win32_pipe_close: %#x %d\n", channel, win32_channel->fd); */
-
-  close (win32_channel->fd);
-  return;
-}
-
-static guint 
-g_io_win32_pipe_add_watch (GIOChannel    *channel,
-			   gint           priority,
-			   GIOCondition   condition,
-			   GIOFunc        func,
-			   gpointer       user_data,
-			   GDestroyNotify notify)
-{
-  GIOWin32Watch *watch = g_new (GIOWin32Watch, 1);
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  gint i;
-  
-  /* g_print ("g_io_win32_pipe_add_watch: %d\n", win32_channel->fd); */
-
-  watch->channel = channel;
-  g_io_channel_ref (channel);
-
-  watch->callback = func;
-  watch->condition = condition;
-
-  watch->pollfd.fd = win32_channel->fd;
-  watch->pollfd.events = condition;
-
-  for (i = 0; i < n_watched_pipes; i++)
-    if (watched_pipes[i].fd == -1)
-      break;
-  if (i == N_WATCHED_PIPES)
-    g_error ("Too many watched pipes");
-  else
-    {
-      watched_pipes[i].fd = win32_channel->fd;
-      watched_pipes[i].watch = watch;
-      watched_pipes[i].channel = win32_channel;
-      watched_pipes[i].user_data = user_data;
-      n_watched_pipes = MAX (i + 1, n_watched_pipes);
-    }
-  return g_source_add (priority, FALSE, &win32_watch_pipe_funcs, watch, user_data, notify);
-}
-
-static void
-g_io_win32_pipe_free (GIOChannel *channel)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  gint i;
-
-  /* g_print ("g_io_win32_pipe_free: %#x %#x\n", channel, channel->channel_data); */
-
-  for (i = 0; i < n_watched_pipes; i++)
-    if (watched_pipes[i].fd == win32_channel->fd)
-      {
-	watched_pipes[i].fd = -1;
-	break;
-      }
-  g_io_win32_free (channel);
-}
-
-static GIOError 
-g_io_win32_sock_read (GIOChannel *channel, 
-		      gchar      *buf, 
-		      guint       count,
-		      guint      *bytes_read)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  gint result;
-
-  result = recv (win32_channel->fd, buf, count, 0);
-  if (result == SOCKET_ERROR)
-    {
-      *bytes_read = 0;
-      switch (WSAGetLastError ())
-	{
-	case WSAEINVAL:
-	  return G_IO_ERROR_INVAL;
-	case WSAEWOULDBLOCK:
-	case WSAEINTR:
-	  return G_IO_ERROR_AGAIN;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    {
-      *bytes_read = result;
-      return G_IO_ERROR_NONE;
-    }
-}
-		       
-static GIOError 
-g_io_win32_sock_write(GIOChannel *channel, 
-		      gchar      *buf, 
-		      guint       count,
-		      guint      *bytes_written)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  gint result;
-
-  result = send (win32_channel->fd, buf, count, 0);
-      
-  if (result == SOCKET_ERROR)
-    {
-      *bytes_written = 0;
-      switch (WSAGetLastError ())
-	{
-	case WSAEINVAL:
-	  return G_IO_ERROR_INVAL;
-	case WSAEWOULDBLOCK:
-	case WSAEINTR:
-	  return G_IO_ERROR_AGAIN;
-	default:
-	  return G_IO_ERROR_UNKNOWN;
-	}
-    }
-  else
-    {
-      *bytes_written = result;
-      return G_IO_ERROR_NONE;
-    }
-}
-
-static void 
-g_io_win32_sock_close (GIOChannel *channel)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-
-  closesocket (win32_channel->fd);
-  return;
-}
-
-static guint 
-g_io_win32_sock_add_watch (GIOChannel    *channel,
-			   gint           priority,
-			   GIOCondition   condition,
-			   GIOFunc        func,
-			   gpointer       user_data,
-			   GDestroyNotify notify)
-{
-  GIOWin32Watch *watch = g_new (GIOWin32Watch, 1);
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-  
-  watch->channel = channel;
-  g_io_channel_ref (channel);
-
-  watch->callback = func;
-  watch->condition = condition;
-
-  watch->pollfd.fd = win32_channel->fd;
-  watch->pollfd.events = condition;
-
-  g_main_add_poll (&watch->pollfd, priority);
-
-  return g_source_add (priority, TRUE, &win32_watch_sock_funcs, watch, user_data, notify);
-}
-
-GIOChannel *
-g_io_channel_win32_new_messages (guint hwnd)
-{
-  GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1);
-  GIOChannel *channel = (GIOChannel *) win32_channel;
-
-  g_io_channel_init (channel);
-  channel->funcs = &win32_channel_msg_funcs;
-  win32_channel->fd = -1;
-  win32_channel->type = G_IO_WINDOWS_MESSAGES;
-  win32_channel->hwnd = (HWND) hwnd;
-
-  return channel;
-}
-
-GIOChannel *
-g_io_channel_unix_new (gint fd)
-{
-  GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1);
-  GIOChannel *channel = (GIOChannel *) win32_channel;
-
-  g_io_channel_init (channel);
-  channel->funcs = &win32_channel_fd_funcs;
-  win32_channel->fd = fd;
-  win32_channel->type = G_IO_FILE_DESC;
-
-  return channel;
-}
-
-gint
-g_io_channel_unix_get_fd (GIOChannel *channel)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-
-  return win32_channel->fd;
-}
-
-GIOChannel *
-g_io_channel_win32_new_pipe_with_wakeups (int   fd,
-					  guint peer,
-					  int   peer_fd)
-{
-  GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1);
-  GIOChannel *channel = (GIOChannel *) win32_channel;
-
-  /* g_print ("g_io_channel_win32_new_pipe_with_wakeups %d %#x %d\n", fd, peer, peer_fd); */
-
-  g_io_channel_init (channel);
-  channel->funcs = &win32_channel_pipe_funcs;
-  win32_channel->fd = fd;
-  win32_channel->type = G_IO_PIPE;
-  win32_channel->peer = peer;
-  win32_channel->peer_fd = peer_fd;
-  win32_channel->offset = 0;
-  win32_channel->need_wakeups = TRUE;
-
-  return channel;
-}
-
-GIOChannel *
-g_io_channel_win32_new_pipe (int fd)
-{
-  GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1);
-  GIOChannel *channel = (GIOChannel *) win32_channel;
-
-  g_io_channel_init (channel);
-  channel->funcs = &win32_channel_pipe_funcs;
-  win32_channel->fd = fd;
-  win32_channel->type = G_IO_PIPE;
-  win32_channel->offset = 0;
-  win32_channel->need_wakeups = FALSE;
-
-  return channel;
-}
-
-GIOChannel *
-g_io_channel_win32_new_stream_socket (int socket)
-{
-  GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1);
-  GIOChannel *channel = (GIOChannel *) win32_channel;
-
-  g_io_channel_init (channel);
-  channel->funcs = &win32_channel_sock_funcs;
-  win32_channel->fd = socket;
-  win32_channel->type = G_IO_STREAM_SOCKET;
-
-  return channel;
-}
-
-gint
-g_io_channel_win32_get_fd (GIOChannel *channel)
-{
-  return g_io_channel_unix_get_fd (channel);
-}
-
-void
-g_io_channel_win32_pipe_request_wakeups (GIOChannel *channel,
-					 guint       peer,
-					 int         peer_fd)
-{
-  GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
-
-  win32_channel->peer = peer;
-  win32_channel->peer_fd = peer_fd;
-  win32_channel->need_wakeups = TRUE;
-}
-
-void
-g_io_channel_win32_pipe_readable (gint  fd,
-				  guint offset)
-{
-  gint i;
-
-  for (i = 0; i < n_watched_pipes; i++)
-    if (watched_pipes[i].fd == fd)
-      {
-	if (watched_pipes[i].channel->offset < offset)
-	  (*watched_pipes[i].watch->callback) (watched_pipes[i].watch->channel,
-					       G_IO_IN,
-					       watched_pipes[i].user_data);
-	break;
-      }
-}
diff --git a/glib/glib.h b/glib/glib.h
deleted file mode 100644
index b83cf5d..0000000
--- a/glib/glib.h
+++ /dev/null
@@ -1,2827 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-#ifndef __G_LIB_H__
-#define __G_LIB_H__
-
-/* system specific config file glibconfig.h provides definitions for
- * the extrema of many of the standard types. These are:
- *
- *  G_MINSHORT, G_MAXSHORT
- *  G_MININT, G_MAXINT
- *  G_MINLONG, G_MAXLONG
- *  G_MINFLOAT, G_MAXFLOAT
- *  G_MINDOUBLE, G_MAXDOUBLE
- *
- * It also provides the following typedefs:
- *
- *  gint8, guint8
- *  gint16, guint16
- *  gint32, guint32
- *  gint64, guint64
- *
- * It defines the G_BYTE_ORDER symbol to one of G_*_ENDIAN (see later in
- * this file). 
- *
- * And it provides a way to store and retrieve a `gint' in/from a `gpointer'.
- * This is useful to pass an integer instead of a pointer to a callback.
- *
- *  GINT_TO_POINTER(i), GUINT_TO_POINTER(i)
- *  GPOINTER_TO_INT(p), GPOINTER_TO_UINT(p)
- *
- * Finally, it provide the following wrappers to STDC functions:
- *
- *  g_ATEXIT
- *    To register hooks which are executed on exit().
- *    Usually a wrapper for STDC atexit.
- *
- *  void *g_memmove(void *dest, const void *src, guint count);
- *    A wrapper for STDC memmove, or an implementation, if memmove doesn't
- *    exist.  The prototype looks like the above, give or take a const,
- *    or size_t.
- */
-#include <glibconfig.h>
-
-/* include varargs functions for assertment macros
- */
-#include <stdarg.h>
-
-/* optionally feature DMALLOC memory allocation debugger
- */
-#ifdef USE_DMALLOC
-#include "dmalloc.h"
-#endif
-
-
-#ifdef NATIVE_WIN32
-
-/* On native Win32, directory separator is the backslash, and search path
- * separator is the semicolon.
- */
-#define G_DIR_SEPARATOR '\\'
-#define G_DIR_SEPARATOR_S "\\"
-#define G_SEARCHPATH_SEPARATOR ';'
-#define G_SEARCHPATH_SEPARATOR_S ";"
-
-#else  /* !NATIVE_WIN32 */
-
-#ifndef __EMX__
-/* Unix */
-
-#define G_DIR_SEPARATOR '/'
-#define G_DIR_SEPARATOR_S "/"
-#define G_SEARCHPATH_SEPARATOR ':'
-#define G_SEARCHPATH_SEPARATOR_S ":"
-
-#else
-/* EMX/OS2 */
-
-#define G_DIR_SEPARATOR '/'
-#define G_DIR_SEPARATOR_S "/"
-#define G_SEARCHPATH_SEPARATOR ';'
-#define G_SEARCHPATH_SEPARATOR_S ";"
-
-#endif
-
-#endif /* !NATIVE_WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-/* Provide definitions for some commonly used macros.
- *  Some of them are only provided if they haven't already
- *  been defined. It is assumed that if they are already
- *  defined then the current definition is correct.
- */
-#ifndef	NULL
-#define	NULL	((void*) 0)
-#endif
-
-#ifndef	FALSE
-#define	FALSE	(0)
-#endif
-
-#ifndef	TRUE
-#define	TRUE	(!FALSE)
-#endif
-
-#undef	MAX
-#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
-
-#undef	MIN
-#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
-
-#undef	ABS
-#define ABS(a)	   (((a) < 0) ? -(a) : (a))
-
-#undef	CLAMP
-#define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
-
-
-/* Define G_VA_COPY() to do the right thing for copying va_list variables.
- * glibconfig.h may have already defined G_VA_COPY as va_copy or __va_copy.
- */
-#if !defined (G_VA_COPY)
-#  if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32))
-#  define G_VA_COPY(ap1, ap2)	  (*(ap1) = *(ap2))
-#  elif defined (G_VA_COPY_AS_ARRAY)
-#  define G_VA_COPY(ap1, ap2)	  g_memmove ((ap1), (ap2), sizeof (va_list))
-#  else /* va_list is a pointer */
-#  define G_VA_COPY(ap1, ap2)	  ((ap1) = (ap2))
-#  endif /* va_list is a pointer */
-#endif /* !G_VA_COPY */
-
-
-/* Provide convenience macros for handling structure
- * fields through their offsets.
- */
-#define G_STRUCT_OFFSET(struct_type, member)	\
-    ((gulong) ((gchar*) &((struct_type*) 0)->member))
-#define G_STRUCT_MEMBER_P(struct_p, struct_offset)   \
-    ((gpointer) ((gchar*) (struct_p) + (gulong) (struct_offset)))
-#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset)   \
-    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
-
-
-/* inlining hassle. for compilers that don't allow the `inline' keyword,
- * mostly because of strict ANSI C compliance or dumbness, we try to fall
- * back to either `__inline__' or `__inline'.
- * we define G_CAN_INLINE, if the compiler seems to be actually
- * *capable* to do function inlining, in which case inline function bodys
- * do make sense. we also define G_INLINE_FUNC to properly export the
- * function prototypes if no inlining can be performed.
- * we special case most of the stuff, so inline functions can have a normal
- * implementation by defining G_INLINE_FUNC to extern and G_CAN_INLINE to 1.
- */
-#ifndef G_INLINE_FUNC
-#  define G_CAN_INLINE 1
-#endif
-#ifdef G_HAVE_INLINE
-#  if defined (__GNUC__) && defined (__STRICT_ANSI__)
-#    undef inline
-#    define inline __inline__
-#  endif
-#else /* !G_HAVE_INLINE */
-#  undef inline
-#  if defined (G_HAVE___INLINE__)
-#    define inline __inline__
-#  else /* !inline && !__inline__ */
-#    if defined (G_HAVE___INLINE)
-#      define inline __inline
-#    else /* !inline && !__inline__ && !__inline */
-#      define inline /* don't inline, then */
-#      ifndef G_INLINE_FUNC
-#	 undef G_CAN_INLINE
-#      endif
-#    endif
-#  endif
-#endif
-#ifndef G_INLINE_FUNC
-#  ifdef __GNUC__
-#    ifdef __OPTIMIZE__
-#      define G_INLINE_FUNC extern inline
-#    else
-#      undef G_CAN_INLINE
-#      define G_INLINE_FUNC extern
-#    endif
-#  else /* !__GNUC__ */
-#    ifdef G_CAN_INLINE
-#      define G_INLINE_FUNC static inline
-#    else
-#      define G_INLINE_FUNC extern
-#    endif
-#  endif /* !__GNUC__ */
-#endif /* !G_INLINE_FUNC */
-
-
-/* Provide simple macro statement wrappers (adapted from Perl):
- *  G_STMT_START { statements; } G_STMT_END;
- *  can be used as a single statement, as in
- *  if (x) G_STMT_START { ... } G_STMT_END; else ...
- *
- *  For gcc we will wrap the statements within `({' and `})' braces.
- *  For SunOS they will be wrapped within `if (1)' and `else (void) 0',
- *  and otherwise within `do' and `while (0)'.
- */
-#if !(defined (G_STMT_START) && defined (G_STMT_END))
-#  if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
-#    define G_STMT_START	(void)(
-#    define G_STMT_END		)
-#  else
-#    if (defined (sun) || defined (__sun__))
-#      define G_STMT_START	if (1)
-#      define G_STMT_END	else (void)0
-#    else
-#      define G_STMT_START	do
-#      define G_STMT_END	while (0)
-#    endif
-#  endif
-#endif
-
-
-/* Provide macros to feature the GCC function attribute.
- */
-#if	__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
-#define G_GNUC_PRINTF( format_idx, arg_idx )	\
-  __attribute__((format (printf, format_idx, arg_idx)))
-#define G_GNUC_SCANF( format_idx, arg_idx )	\
-  __attribute__((format (scanf, format_idx, arg_idx)))
-#define G_GNUC_FORMAT( arg_idx )		\
-  __attribute__((format_arg (arg_idx)))
-#define G_GNUC_NORETURN				\
-  __attribute__((noreturn))
-#define G_GNUC_CONST				\
-  __attribute__((const))
-#define G_GNUC_UNUSED				\
-  __attribute__((unused))
-#else	/* !__GNUC__ */
-#define G_GNUC_PRINTF( format_idx, arg_idx )
-#define G_GNUC_SCANF( format_idx, arg_idx )
-#define G_GNUC_FORMAT( arg_idx )
-#define G_GNUC_NORETURN
-#define G_GNUC_CONST
-#define	G_GNUC_UNUSED
-#endif	/* !__GNUC__ */
-
-
-/* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with
- * macros, so we can refer to them as strings unconditionally.
- */
-#ifdef	__GNUC__
-#define	G_GNUC_FUNCTION		__FUNCTION__
-#define	G_GNUC_PRETTY_FUNCTION	__PRETTY_FUNCTION__
-#else	/* !__GNUC__ */
-#define	G_GNUC_FUNCTION		""
-#define	G_GNUC_PRETTY_FUNCTION	""
-#endif	/* !__GNUC__ */
-
-/* we try to provide a usefull equivalent for ATEXIT if it is
- * not defined, but use is actually abandoned. people should
- * use g_atexit() instead.
- */
-#ifndef ATEXIT
-# define ATEXIT(proc)	g_ATEXIT(proc)
-#else
-# define G_NATIVE_ATEXIT
-#endif /* ATEXIT */
-
-/* Hacker macro to place breakpoints for elected machines.
- * Actual use is strongly deprecated of course ;)
- */
-#if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2
-#define	G_BREAKPOINT()		G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END
-#elif defined (__alpha__) && defined (__GNUC__) && __GNUC__ >= 2
-#define	G_BREAKPOINT()		G_STMT_START{ __asm__ __volatile__ ("bpt"); }G_STMT_END
-#else	/* !__i386__ && !__alpha__ */
-#define	G_BREAKPOINT()
-#endif	/* __i386__ */
-
-
-/* Provide macros for easily allocating memory. The macros
- *  will cast the allocated memory to the specified type
- *  in order to avoid compiler warnings. (Makes the code neater).
- */
-
-#ifdef __DMALLOC_H__
-#  define g_new(type, count)		(ALLOC (type, count))
-#  define g_new0(type, count)		(CALLOC (type, count))
-#  define g_renew(type, mem, count)	(REALLOC (mem, type, count))
-#else /* __DMALLOC_H__ */
-#  define g_new(type, count)	  \
-      ((type *) g_malloc ((unsigned) sizeof (type) * (count)))
-#  define g_new0(type, count)	  \
-      ((type *) g_malloc0 ((unsigned) sizeof (type) * (count)))
-#  define g_renew(type, mem, count)	  \
-      ((type *) g_realloc (mem, (unsigned) sizeof (type) * (count)))
-#endif /* __DMALLOC_H__ */
-
-#define g_mem_chunk_create(type, pre_alloc, alloc_type)	( \
-  g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \
-		   sizeof (type), \
-		   sizeof (type) * (pre_alloc), \
-		   (alloc_type)) \
-)
-#define g_chunk_new(type, chunk)	( \
-  (type *) g_mem_chunk_alloc (chunk) \
-)
-#define g_chunk_new0(type, chunk)	( \
-  (type *) g_mem_chunk_alloc0 (chunk) \
-)
-#define g_chunk_free(mem, mem_chunk)	G_STMT_START { \
-  g_mem_chunk_free ((mem_chunk), (mem)); \
-} G_STMT_END
-
-
-#define g_string(x) #x
-
-
-/* Provide macros for error handling. The "assert" macros will
- *  exit on failure. The "return" macros will exit the current
- *  function. Two different definitions are given for the macros
- *  if G_DISABLE_ASSERT is not defined, in order to support gcc's
- *  __PRETTY_FUNCTION__ capability.
- */
-
-#ifdef G_DISABLE_ASSERT
-
-#define g_assert(expr)
-#define g_assert_not_reached()
-
-#else /* !G_DISABLE_ASSERT */
-
-#ifdef __GNUC__
-
-#define g_assert(expr)			G_STMT_START{		\
-     if (!(expr))						\
-       g_log (G_LOG_DOMAIN,					\
-	      G_LOG_LEVEL_ERROR,				\
-	      "file %s: line %d (%s): assertion failed: (%s)",	\
-	      __FILE__,						\
-	      __LINE__,						\
-	      __PRETTY_FUNCTION__,				\
-	      #expr);			}G_STMT_END
-
-#define g_assert_not_reached()		G_STMT_START{		\
-     g_log (G_LOG_DOMAIN,					\
-	    G_LOG_LEVEL_ERROR,					\
-	    "file %s: line %d (%s): should not be reached",	\
-	    __FILE__,						\
-	    __LINE__,						\
-	    __PRETTY_FUNCTION__);	}G_STMT_END
-
-#else /* !__GNUC__ */
-
-#define g_assert(expr)			G_STMT_START{		\
-     if (!(expr))						\
-       g_log (G_LOG_DOMAIN,					\
-	      G_LOG_LEVEL_ERROR,				\
-	      "file %s: line %d: assertion failed: (%s)",	\
-	      __FILE__,						\
-	      __LINE__,						\
-	      #expr);			}G_STMT_END
-
-#define g_assert_not_reached()		G_STMT_START{	\
-     g_log (G_LOG_DOMAIN,				\
-	    G_LOG_LEVEL_ERROR,				\
-	    "file %s: line %d: should not be reached",	\
-	    __FILE__,					\
-	    __LINE__);		}G_STMT_END
-
-#endif /* __GNUC__ */
-
-#endif /* !G_DISABLE_ASSERT */
-
-
-#ifdef G_DISABLE_CHECKS
-
-#define g_return_if_fail(expr)
-#define g_return_val_if_fail(expr,val)
-
-#else /* !G_DISABLE_CHECKS */
-
-#ifdef __GNUC__
-
-#define g_return_if_fail(expr)		G_STMT_START{			\
-     if (!(expr))							\
-       {								\
-	 g_log (G_LOG_DOMAIN,						\
-		G_LOG_LEVEL_CRITICAL,					\
-		"file %s: line %d (%s): assertion `%s' failed.",	\
-		__FILE__,						\
-		__LINE__,						\
-		__PRETTY_FUNCTION__,					\
-		#expr);							\
-	 return;							\
-       };				}G_STMT_END
-
-#define g_return_val_if_fail(expr,val)	G_STMT_START{			\
-     if (!(expr))							\
-       {								\
-	 g_log (G_LOG_DOMAIN,						\
-		G_LOG_LEVEL_CRITICAL,					\
-		"file %s: line %d (%s): assertion `%s' failed.",	\
-		__FILE__,						\
-		__LINE__,						\
-		__PRETTY_FUNCTION__,					\
-		#expr);							\
-	 return val;							\
-       };				}G_STMT_END
-
-#else /* !__GNUC__ */
-
-#define g_return_if_fail(expr)		G_STMT_START{		\
-     if (!(expr))						\
-       {							\
-	 g_log (G_LOG_DOMAIN,					\
-		G_LOG_LEVEL_CRITICAL,				\
-		"file %s: line %d: assertion `%s' failed.",	\
-		__FILE__,					\
-		__LINE__,					\
-		#expr);						\
-	 return;						\
-       };				}G_STMT_END
-
-#define g_return_val_if_fail(expr, val)	G_STMT_START{		\
-     if (!(expr))						\
-       {							\
-	 g_log (G_LOG_DOMAIN,					\
-		G_LOG_LEVEL_CRITICAL,				\
-		"file %s: line %d: assertion `%s' failed.",	\
-		__FILE__,					\
-		__LINE__,					\
-		#expr);						\
-	 return val;						\
-       };				}G_STMT_END
-
-#endif /* !__GNUC__ */
-
-#endif /* !G_DISABLE_CHECKS */
-
-
-/* Provide type definitions for commonly used types.
- *  These are useful because a "gint8" can be adjusted
- *  to be 1 byte (8 bits) on all platforms. Similarly and
- *  more importantly, "gint32" can be adjusted to be
- *  4 bytes (32 bits) on all platforms.
- */
-
-typedef char   gchar;
-typedef short  gshort;
-typedef long   glong;
-typedef int    gint;
-typedef gint   gboolean;
-
-typedef unsigned char	guchar;
-typedef unsigned short	gushort;
-typedef unsigned long	gulong;
-typedef unsigned int	guint;
-
-typedef float	gfloat;
-typedef double	gdouble;
-
-/* HAVE_LONG_DOUBLE doesn't work correctly on all platforms.
- * Since gldouble isn't used anywhere, just disable it for now */
-
-#if 0
-#ifdef HAVE_LONG_DOUBLE
-typedef long double gldouble;
-#else /* HAVE_LONG_DOUBLE */
-typedef double gldouble;
-#endif /* HAVE_LONG_DOUBLE */
-#endif /* 0 */
-
-typedef void* gpointer;
-typedef const void *gconstpointer;
-
-
-typedef gint32	gssize;
-typedef guint32 gsize;
-typedef guint32 GQuark;
-typedef gint32	GTime;
-
-
-/* Portable endian checks and conversions
- *
- * glibconfig.h defines G_BYTE_ORDER which expands to one of
- * the below macros.
- */
-#define G_LITTLE_ENDIAN 1234
-#define G_BIG_ENDIAN    4321
-#define G_PDP_ENDIAN    3412		/* unused, need specific PDP check */	
-
-
-/* Basic bit swapping functions
- */
-#define GUINT16_SWAP_LE_BE_CONSTANT(val)	((guint16) ( \
-    (((guint16) (val) & (guint16) 0x00ffU) << 8) | \
-    (((guint16) (val) & (guint16) 0xff00U) >> 8)))
-#define GUINT32_SWAP_LE_BE_CONSTANT(val)	((guint32) ( \
-    (((guint32) (val) & (guint32) 0x000000ffU) << 24) | \
-    (((guint32) (val) & (guint32) 0x0000ff00U) <<  8) | \
-    (((guint32) (val) & (guint32) 0x00ff0000U) >>  8) | \
-    (((guint32) (val) & (guint32) 0xff000000U) >> 24)))
-
-/* Intel specific stuff for speed
- */
-#if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2
-#  define GUINT16_SWAP_LE_BE_X86(val) \
-     (__extension__					\
-      ({ register guint16 __v;				\
-	 if (__builtin_constant_p (val))		\
-	   __v = GUINT16_SWAP_LE_BE_CONSTANT (val);	\
-	 else						\
-	   __asm__ __const__ ("rorw $8, %w0"		\
-			      : "=r" (__v)		\
-			      : "0" ((guint16) (val)));	\
-	__v; }))
-#  define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_X86 (val))
-#  if !defined(__i486__) && !defined(__i586__) \
-      && !defined(__pentium__) && !defined(__i686__) && !defined(__pentiumpro__)
-#     define GUINT32_SWAP_LE_BE_X86(val) \
-        (__extension__						\
-         ({ register guint32 __v;				\
-	    if (__builtin_constant_p (val))			\
-	      __v = GUINT32_SWAP_LE_BE_CONSTANT (val);		\
-	  else							\
-	    __asm__ __const__ ("rorw $8, %w0\n\t"		\
-			       "rorl $16, %0\n\t"		\
-			       "rorw $8, %w0"			\
-			       : "=r" (__v)			\
-			       : "0" ((guint32) (val)));	\
-	__v; }))
-#  else /* 486 and higher has bswap */
-#     define GUINT32_SWAP_LE_BE_X86(val) \
-        (__extension__						\
-         ({ register guint32 __v;				\
-	    if (__builtin_constant_p (val))			\
-	      __v = GUINT32_SWAP_LE_BE_CONSTANT (val);		\
-	  else							\
-	    __asm__ __const__ ("bswap %0"			\
-			       : "=r" (__v)			\
-			       : "0" ((guint32) (val)));	\
-	__v; }))
-#  endif /* processor specific 32-bit stuff */
-#  define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86 (val))
-#else /* !__i386__ */
-#  define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val))
-#  define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val))
-#endif /* __i386__ */
-
-#ifdef G_HAVE_GINT64
-#  define GUINT64_SWAP_LE_BE_CONSTANT(val)	((guint64) ( \
-      (((guint64) (val) &						\
-	(guint64) G_GINT64_CONSTANT(0x00000000000000ffU)) << 56) |	\
-      (((guint64) (val) &						\
-	(guint64) G_GINT64_CONSTANT(0x000000000000ff00U)) << 40) |	\
-      (((guint64) (val) &						\
-	(guint64) G_GINT64_CONSTANT(0x0000000000ff0000U)) << 24) |	\
-      (((guint64) (val) &						\
-	(guint64) G_GINT64_CONSTANT(0x00000000ff000000U)) <<  8) |	\
-      (((guint64) (val) &						\
-	(guint64) G_GINT64_CONSTANT(0x000000ff00000000U)) >>  8) |	\
-      (((guint64) (val) &						\
-	(guint64) G_GINT64_CONSTANT(0x0000ff0000000000U)) >> 24) |	\
-      (((guint64) (val) &						\
-	(guint64) G_GINT64_CONSTANT(0x00ff000000000000U)) >> 40) |	\
-      (((guint64) (val) &						\
-	(guint64) G_GINT64_CONSTANT(0xff00000000000000U)) >> 56)))
-#  if defined (__i386__) && defined (__GNUC__) && __GNUC__ >= 2
-#    define GUINT64_SWAP_LE_BE_X86(val) \
-	(__extension__						\
-	 ({ union { guint64 __ll;				\
-		    guint32 __l[2]; } __r;			\
-	    if (__builtin_constant_p (val))			\
-	      __r.__ll = GUINT64_SWAP_LE_BE_CONSTANT (val);	\
-	    else						\
-	      {							\
-	 	union { guint64 __ll;				\
-			guint32 __l[2]; } __w;			\
-		__w.__ll = ((guint64) val);			\
-		__r.__l[0] = GUINT32_SWAP_LE_BE (__w.__l[1]);	\
-		__r.__l[1] = GUINT32_SWAP_LE_BE (__w.__l[0]);	\
-	      }							\
-	  __r.__ll; }))
-#    define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86 (val))
-#  else /* !__i386__ */
-#    define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT(val))
-#  endif
-#endif
-
-#define GUINT16_SWAP_LE_PDP(val)	((guint16) (val))
-#define GUINT16_SWAP_BE_PDP(val)	(GUINT16_SWAP_LE_BE (val))
-#define GUINT32_SWAP_LE_PDP(val)	((guint32) ( \
-    (((guint32) (val) & (guint32) 0x0000ffffU) << 16) | \
-    (((guint32) (val) & (guint32) 0xffff0000U) >> 16)))
-#define GUINT32_SWAP_BE_PDP(val)	((guint32) ( \
-    (((guint32) (val) & (guint32) 0x00ff00ffU) << 8) | \
-    (((guint32) (val) & (guint32) 0xff00ff00U) >> 8)))
-
-/* The G*_TO_?E() macros are defined in glibconfig.h.
- * The transformation is symmetric, so the FROM just maps to the TO.
- */
-#define GINT16_FROM_LE(val)	(GINT16_TO_LE (val))
-#define GUINT16_FROM_LE(val)	(GUINT16_TO_LE (val))
-#define GINT16_FROM_BE(val)	(GINT16_TO_BE (val))
-#define GUINT16_FROM_BE(val)	(GUINT16_TO_BE (val))
-#define GINT32_FROM_LE(val)	(GINT32_TO_LE (val))
-#define GUINT32_FROM_LE(val)	(GUINT32_TO_LE (val))
-#define GINT32_FROM_BE(val)	(GINT32_TO_BE (val))
-#define GUINT32_FROM_BE(val)	(GUINT32_TO_BE (val))
-
-#ifdef G_HAVE_GINT64
-#define GINT64_FROM_LE(val)	(GINT64_TO_LE (val))
-#define GUINT64_FROM_LE(val)	(GUINT64_TO_LE (val))
-#define GINT64_FROM_BE(val)	(GINT64_TO_BE (val))
-#define GUINT64_FROM_BE(val)	(GUINT64_TO_BE (val))
-#endif
-
-#define GLONG_FROM_LE(val)	(GLONG_TO_LE (val))
-#define GULONG_FROM_LE(val)	(GULONG_TO_LE (val))
-#define GLONG_FROM_BE(val)	(GLONG_TO_BE (val))
-#define GULONG_FROM_BE(val)	(GULONG_TO_BE (val))
-
-#define GINT_FROM_LE(val)	(GINT_TO_LE (val))
-#define GUINT_FROM_LE(val)	(GUINT_TO_LE (val))
-#define GINT_FROM_BE(val)	(GINT_TO_BE (val))
-#define GUINT_FROM_BE(val)	(GUINT_TO_BE (val))
-
-
-/* Portable versions of host-network order stuff
- */
-#define g_ntohl(val) (GUINT32_FROM_BE (val))
-#define g_ntohs(val) (GUINT16_FROM_BE (val))
-#define g_htonl(val) (GUINT32_TO_BE (val))
-#define g_htons(val) (GUINT16_TO_BE (val))
-
-
-/* Glib version.
- * we prefix variable declarations so they can
- * properly get exported in windows dlls.
- */
-#ifdef NATIVE_WIN32
-#  ifdef GLIB_COMPILATION
-#    define GUTILS_C_VAR __declspec(dllexport)
-#  else /* !GLIB_COMPILATION */
-#    define GUTILS_C_VAR extern __declspec(dllimport)
-#  endif /* !GLIB_COMPILATION */
-#else /* !NATIVE_WIN32 */
-#  define GUTILS_C_VAR extern
-#endif /* !NATIVE_WIN32 */
-
-GUTILS_C_VAR const guint glib_major_version;
-GUTILS_C_VAR const guint glib_minor_version;
-GUTILS_C_VAR const guint glib_micro_version;
-GUTILS_C_VAR const guint glib_interface_age;
-GUTILS_C_VAR const guint glib_binary_age;
-
-#define GLIB_CHECK_VERSION(major,minor,micro)    \
-    (GLIB_MAJOR_VERSION > (major) || \
-     (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION > (minor)) || \
-     (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION == (minor) && \
-      GLIB_MICRO_VERSION >= (micro)))
-
-/* Forward declarations of glib types.
- */
-typedef struct _GAllocator	GAllocator;
-typedef struct _GArray		GArray;
-typedef struct _GByteArray	GByteArray;
-typedef struct _GCache		GCache;
-typedef struct _GCompletion	GCompletion;
-typedef	struct _GData		GData;
-typedef struct _GDebugKey	GDebugKey;
-typedef struct _GHashTable	GHashTable;
-typedef struct _GHook		GHook;
-typedef struct _GHookList	GHookList;
-typedef struct _GList		GList;
-typedef struct _GMemChunk	GMemChunk;
-typedef struct _GNode		GNode;
-typedef struct _GPtrArray	GPtrArray;
-typedef struct _GRelation	GRelation;
-typedef struct _GScanner	GScanner;
-typedef struct _GScannerConfig	GScannerConfig;
-typedef struct _GSList		GSList;
-typedef struct _GString		GString;
-typedef struct _GStringChunk	GStringChunk;
-typedef struct _GTimer		GTimer;
-typedef struct _GTree		GTree;
-typedef struct _GTuples		GTuples;
-typedef union  _GTokenValue	GTokenValue;
-typedef struct _GIOChannel	GIOChannel;
-
-/* Tree traverse flags */
-typedef enum
-{
-  G_TRAVERSE_LEAFS	= 1 << 0,
-  G_TRAVERSE_NON_LEAFS	= 1 << 1,
-  G_TRAVERSE_ALL	= G_TRAVERSE_LEAFS | G_TRAVERSE_NON_LEAFS,
-  G_TRAVERSE_MASK	= 0x03
-} GTraverseFlags;
-
-/* Tree traverse orders */
-typedef enum
-{
-  G_IN_ORDER,
-  G_PRE_ORDER,
-  G_POST_ORDER,
-  G_LEVEL_ORDER
-} GTraverseType;
-
-/* Log level shift offset for user defined
- * log levels (0-7 are used by GLib).
- */
-#define	G_LOG_LEVEL_USER_SHIFT	(8)
-
-/* Glib log levels and flags.
- */
-typedef enum
-{
-  /* log flags */
-  G_LOG_FLAG_RECURSION		= 1 << 0,
-  G_LOG_FLAG_FATAL		= 1 << 1,
-  
-  /* GLib log levels */
-  G_LOG_LEVEL_ERROR		= 1 << 2,	/* always fatal */
-  G_LOG_LEVEL_CRITICAL		= 1 << 3,
-  G_LOG_LEVEL_WARNING		= 1 << 4,
-  G_LOG_LEVEL_MESSAGE		= 1 << 5,
-  G_LOG_LEVEL_INFO		= 1 << 6,
-  G_LOG_LEVEL_DEBUG		= 1 << 7,
-  
-  G_LOG_LEVEL_MASK		= ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL)
-} GLogLevelFlags;
-
-/* GLib log levels that are considered fatal by default */
-#define	G_LOG_FATAL_MASK	(G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR)
-
-
-typedef gpointer	(*GCacheNewFunc)	(gpointer	key);
-typedef gpointer	(*GCacheDupFunc)	(gpointer	value);
-typedef void		(*GCacheDestroyFunc)	(gpointer	value);
-typedef gint		(*GCompareFunc)		(gconstpointer	a,
-						 gconstpointer	b);
-typedef gchar*		(*GCompletionFunc)	(gpointer);
-typedef void		(*GDestroyNotify)	(gpointer	data);
-typedef void		(*GDataForeachFunc)	(GQuark		key_id,
-						 gpointer	data,
-						 gpointer	user_data);
-typedef void		(*GFunc)		(gpointer	data,
-						 gpointer	user_data);
-typedef guint		(*GHashFunc)		(gconstpointer	key);
-typedef void		(*GFreeFunc)		(gpointer	data);
-typedef void		(*GHFunc)		(gpointer	key,
-						 gpointer	value,
-						 gpointer	user_data);
-typedef gboolean	(*GHRFunc)		(gpointer	key,
-						 gpointer	value,
-						 gpointer	user_data);
-typedef gint		(*GHookCompareFunc)	(GHook		*new_hook,
-						 GHook		*sibling);
-typedef gboolean	(*GHookFindFunc)	(GHook		*hook,
-						 gpointer	 data);
-typedef void		(*GHookMarshaller)	(GHook		*hook,
-						 gpointer	 data);
-typedef gboolean	(*GHookCheckMarshaller)	(GHook		*hook,
-						 gpointer	 data);
-typedef void		(*GHookFunc)		(gpointer	 data);
-typedef gboolean	(*GHookCheckFunc)	(gpointer	 data);
-typedef void		(*GHookFreeFunc)	(GHookList      *hook_list,
-						 GHook          *hook);
-typedef void		(*GLogFunc)		(const gchar   *log_domain,
-						 GLogLevelFlags	log_level,
-						 const gchar   *message,
-						 gpointer	user_data);
-typedef gboolean	(*GNodeTraverseFunc)	(GNode	       *node,
-						 gpointer	data);
-typedef void		(*GNodeForeachFunc)	(GNode	       *node,
-						 gpointer	data);
-typedef gint		(*GSearchFunc)		(gpointer	key,
-						 gpointer	data);
-typedef void		(*GScannerMsgFunc)	(GScanner      *scanner,
-						 gchar	       *message,
-						 gint		error);
-typedef gint		(*GTraverseFunc)	(gpointer	key,
-						 gpointer	value,
-						 gpointer	data);
-typedef	void		(*GVoidFunc)		(void);
-
-
-struct _GList
-{
-  gpointer data;
-  GList *next;
-  GList *prev;
-};
-
-struct _GSList
-{
-  gpointer data;
-  GSList *next;
-};
-
-struct _GString
-{
-  gchar *str;
-  gint len;
-};
-
-struct _GArray
-{
-  gchar *data;
-  guint len;
-};
-
-struct _GByteArray
-{
-  guint8 *data;
-  guint	  len;
-};
-
-struct _GPtrArray
-{
-  gpointer *pdata;
-  guint	    len;
-};
-
-struct _GTuples
-{
-  guint len;
-};
-
-struct _GDebugKey
-{
-  gchar *key;
-  guint	 value;
-};
-
-
-/* Doubly linked lists
- */
-void   g_list_push_allocator    (GAllocator     *allocator);
-void   g_list_pop_allocator     (void);
-GList* g_list_alloc		(void);
-void   g_list_free		(GList		*list);
-void   g_list_free_1		(GList		*list);
-GList* g_list_append		(GList		*list,
-				 gpointer	 data);
-GList* g_list_prepend		(GList		*list,
-				 gpointer	 data);
-GList* g_list_insert		(GList		*list,
-				 gpointer	 data,
-				 gint		 position);
-GList* g_list_insert_sorted	(GList		*list,
-				 gpointer	 data,
-				 GCompareFunc	 func);
-GList* g_list_concat		(GList		*list1,
-				 GList		*list2);
-GList* g_list_remove		(GList		*list,
-				 gpointer	 data);
-GList* g_list_remove_link	(GList		*list,
-				 GList		*llink);
-GList* g_list_reverse		(GList		*list);
-GList* g_list_copy		(GList		*list);
-GList* g_list_nth		(GList		*list,
-				 guint		 n);
-GList* g_list_find		(GList		*list,
-				 gpointer	 data);
-GList* g_list_find_custom	(GList		*list,
-				 gpointer	 data,
-				 GCompareFunc	 func);
-gint   g_list_position		(GList		*list,
-				 GList		*llink);
-gint   g_list_index		(GList		*list,
-				 gpointer	 data);
-GList* g_list_last		(GList		*list);
-GList* g_list_first		(GList		*list);
-guint  g_list_length		(GList		*list);
-void   g_list_foreach		(GList		*list,
-				 GFunc		 func,
-				 gpointer	 user_data);
-GList* g_list_sort              (GList          *list,
-		                 GCompareFunc    compare_func);
-gpointer g_list_nth_data	(GList		*list,
-				 guint		 n);
-#define g_list_previous(list)	((list) ? (((GList *)(list))->prev) : NULL)
-#define g_list_next(list)	((list) ? (((GList *)(list))->next) : NULL)
-
-
-/* Singly linked lists
- */
-void    g_slist_push_allocator  (GAllocator     *allocator);
-void    g_slist_pop_allocator   (void);
-GSList* g_slist_alloc		(void);
-void	g_slist_free		(GSList		*list);
-void	g_slist_free_1		(GSList		*list);
-GSList* g_slist_append		(GSList		*list,
-				 gpointer	 data);
-GSList* g_slist_prepend		(GSList		*list,
-				 gpointer	 data);
-GSList* g_slist_insert		(GSList		*list,
-				 gpointer	 data,
-				 gint		 position);
-GSList* g_slist_insert_sorted	(GSList		*list,
-				 gpointer	 data,
-				 GCompareFunc	 func);
-GSList* g_slist_concat		(GSList		*list1,
-				 GSList		*list2);
-GSList* g_slist_remove		(GSList		*list,
-				 gpointer	 data);
-GSList* g_slist_remove_link	(GSList		*list,
-				 GSList		*llink);
-GSList* g_slist_reverse		(GSList		*list);
-GSList*	g_slist_copy		(GSList		*list);
-GSList* g_slist_nth		(GSList		*list,
-				 guint		 n);
-GSList* g_slist_find		(GSList		*list,
-				 gpointer	 data);
-GSList* g_slist_find_custom	(GSList		*list,
-				 gpointer	 data,
-				 GCompareFunc	 func);
-gint	g_slist_position	(GSList		*list,
-				 GSList		*llink);
-gint	g_slist_index		(GSList		*list,
-				 gpointer	 data);
-GSList* g_slist_last		(GSList		*list);
-guint	g_slist_length		(GSList		*list);
-void	g_slist_foreach		(GSList		*list,
-				 GFunc		 func,
-				 gpointer	 user_data);
-GSList*  g_slist_sort           (GSList          *list,
-		                 GCompareFunc    compare_func);
-gpointer g_slist_nth_data	(GSList		*list,
-				 guint		 n);
-#define g_slist_next(slist)	((slist) ? (((GSList *)(slist))->next) : NULL)
-
-
-/* Hash tables
- */
-GHashTable* g_hash_table_new		(GHashFunc	 hash_func,
-					 GCompareFunc	 key_compare_func);
-void	    g_hash_table_destroy	(GHashTable	*hash_table);
-void	    g_hash_table_insert		(GHashTable	*hash_table,
-					 gpointer	 key,
-					 gpointer	 value);
-void	    g_hash_table_remove		(GHashTable	*hash_table,
-					 gconstpointer	 key);
-gpointer    g_hash_table_lookup		(GHashTable	*hash_table,
-					 gconstpointer	 key);
-gboolean    g_hash_table_lookup_extended(GHashTable	*hash_table,
-					 gconstpointer	 lookup_key,
-					 gpointer	*orig_key,
-					 gpointer	*value);
-void	    g_hash_table_freeze		(GHashTable	*hash_table);
-void	    g_hash_table_thaw		(GHashTable	*hash_table);
-void	    g_hash_table_foreach	(GHashTable	*hash_table,
-					 GHFunc		 func,
-					 gpointer	 user_data);
-guint	    g_hash_table_foreach_remove	(GHashTable	*hash_table,
-					 GHRFunc	 func,
-					 gpointer	 user_data);
-guint	    g_hash_table_size		(GHashTable	*hash_table);
-
-
-/* Caches
- */
-GCache*	 g_cache_new	       (GCacheNewFunc	   value_new_func,
-				GCacheDestroyFunc  value_destroy_func,
-				GCacheDupFunc	   key_dup_func,
-				GCacheDestroyFunc  key_destroy_func,
-				GHashFunc	   hash_key_func,
-				GHashFunc	   hash_value_func,
-				GCompareFunc	   key_compare_func);
-void	 g_cache_destroy       (GCache		  *cache);
-gpointer g_cache_insert	       (GCache		  *cache,
-				gpointer	   key);
-void	 g_cache_remove	       (GCache		  *cache,
-				gpointer	   value);
-void	 g_cache_key_foreach   (GCache		  *cache,
-				GHFunc		   func,
-				gpointer	   user_data);
-void	 g_cache_value_foreach (GCache		  *cache,
-				GHFunc		   func,
-				gpointer	   user_data);
-
-
-/* Balanced binary trees
- */
-GTree*	 g_tree_new	 (GCompareFunc	 key_compare_func);
-void	 g_tree_destroy	 (GTree		*tree);
-void	 g_tree_insert	 (GTree		*tree,
-			  gpointer	 key,
-			  gpointer	 value);
-void	 g_tree_remove	 (GTree		*tree,
-			  gpointer	 key);
-gpointer g_tree_lookup	 (GTree		*tree,
-			  gpointer	 key);
-void	 g_tree_traverse (GTree		*tree,
-			  GTraverseFunc	 traverse_func,
-			  GTraverseType	 traverse_type,
-			  gpointer	 data);
-gpointer g_tree_search	 (GTree		*tree,
-			  GSearchFunc	 search_func,
-			  gpointer	 data);
-gint	 g_tree_height	 (GTree		*tree);
-gint	 g_tree_nnodes	 (GTree		*tree);
-
-
-
-/* N-way tree implementation
- */
-struct _GNode
-{
-  gpointer data;
-  GNode	  *next;
-  GNode	  *prev;
-  GNode	  *parent;
-  GNode	  *children;
-};
-
-#define	 G_NODE_IS_ROOT(node)	(((GNode*) (node))->parent == NULL && \
-				 ((GNode*) (node))->prev == NULL && \
-				 ((GNode*) (node))->next == NULL)
-#define	 G_NODE_IS_LEAF(node)	(((GNode*) (node))->children == NULL)
-
-void     g_node_push_allocator  (GAllocator       *allocator);
-void     g_node_pop_allocator   (void);
-GNode*	 g_node_new		(gpointer	   data);
-void	 g_node_destroy		(GNode		  *root);
-void	 g_node_unlink		(GNode		  *node);
-GNode*	 g_node_insert		(GNode		  *parent,
-				 gint		   position,
-				 GNode		  *node);
-GNode*	 g_node_insert_before	(GNode		  *parent,
-				 GNode		  *sibling,
-				 GNode		  *node);
-GNode*	 g_node_prepend		(GNode		  *parent,
-				 GNode		  *node);
-guint	 g_node_n_nodes		(GNode		  *root,
-				 GTraverseFlags	   flags);
-GNode*	 g_node_get_root	(GNode		  *node);
-gboolean g_node_is_ancestor	(GNode		  *node,
-				 GNode		  *descendant);
-guint	 g_node_depth		(GNode		  *node);
-GNode*	 g_node_find		(GNode		  *root,
-				 GTraverseType	   order,
-				 GTraverseFlags	   flags,
-				 gpointer	   data);
-
-/* convenience macros */
-#define g_node_append(parent, node)				\
-     g_node_insert_before ((parent), NULL, (node))
-#define	g_node_insert_data(parent, position, data)		\
-     g_node_insert ((parent), (position), g_node_new (data))
-#define	g_node_insert_data_before(parent, sibling, data)	\
-     g_node_insert_before ((parent), (sibling), g_node_new (data))
-#define	g_node_prepend_data(parent, data)			\
-     g_node_prepend ((parent), g_node_new (data))
-#define	g_node_append_data(parent, data)			\
-     g_node_insert_before ((parent), NULL, g_node_new (data))
-
-/* traversal function, assumes that `node' is root
- * (only traverses `node' and its subtree).
- * this function is just a high level interface to
- * low level traversal functions, optimized for speed.
- */
-void	 g_node_traverse	(GNode		  *root,
-				 GTraverseType	   order,
-				 GTraverseFlags	   flags,
-				 gint		   max_depth,
-				 GNodeTraverseFunc func,
-				 gpointer	   data);
-
-/* return the maximum tree height starting with `node', this is an expensive
- * operation, since we need to visit all nodes. this could be shortened by
- * adding `guint height' to struct _GNode, but then again, this is not very
- * often needed, and would make g_node_insert() more time consuming.
- */
-guint	 g_node_max_height	 (GNode *root);
-
-void	 g_node_children_foreach (GNode		  *node,
-				  GTraverseFlags   flags,
-				  GNodeForeachFunc func,
-				  gpointer	   data);
-void	 g_node_reverse_children (GNode		  *node);
-guint	 g_node_n_children	 (GNode		  *node);
-GNode*	 g_node_nth_child	 (GNode		  *node,
-				  guint		   n);
-GNode*	 g_node_last_child	 (GNode		  *node);
-GNode*	 g_node_find_child	 (GNode		  *node,
-				  GTraverseFlags   flags,
-				  gpointer	   data);
-gint	 g_node_child_position	 (GNode		  *node,
-				  GNode		  *child);
-gint	 g_node_child_index	 (GNode		  *node,
-				  gpointer	   data);
-
-GNode*	 g_node_first_sibling	 (GNode		  *node);
-GNode*	 g_node_last_sibling	 (GNode		  *node);
-
-#define	 g_node_prev_sibling(node)	((node) ? \
-					 ((GNode*) (node))->prev : NULL)
-#define	 g_node_next_sibling(node)	((node) ? \
-					 ((GNode*) (node))->next : NULL)
-#define	 g_node_first_child(node)	((node) ? \
-					 ((GNode*) (node))->children : NULL)
-
-
-/* Callback maintenance functions
- */
-#define G_HOOK_FLAG_USER_SHIFT	(4)
-typedef enum
-{
-  G_HOOK_FLAG_ACTIVE	= 1 << 0,
-  G_HOOK_FLAG_IN_CALL	= 1 << 1,
-  G_HOOK_FLAG_MASK	= 0x0f
-} GHookFlagMask;
-
-#define	G_HOOK_DEFERRED_DESTROY	((GHookFreeFunc) 0x01)
-
-struct _GHookList
-{
-  guint		 seq_id;
-  guint		 hook_size;
-  guint		 is_setup : 1;
-  GHook		*hooks;
-  GMemChunk	*hook_memchunk;
-  GHookFreeFunc	 hook_free; /* virtual function */
-  GHookFreeFunc	 hook_destroy; /* virtual function */
-};
-
-struct _GHook
-{
-  gpointer	 data;
-  GHook		*next;
-  GHook		*prev;
-  guint		 ref_count;
-  guint		 hook_id;
-  guint		 flags;
-  gpointer	 func;
-  GDestroyNotify destroy;
-};
-
-#define	G_HOOK_ACTIVE(hook)		((((GHook*) hook)->flags & \
-					  G_HOOK_FLAG_ACTIVE) != 0)
-#define	G_HOOK_IN_CALL(hook)		((((GHook*) hook)->flags & \
-					  G_HOOK_FLAG_IN_CALL) != 0)
-#define G_HOOK_IS_VALID(hook)		(((GHook*) hook)->hook_id != 0 && \
-					 G_HOOK_ACTIVE (hook))
-#define G_HOOK_IS_UNLINKED(hook)	(((GHook*) hook)->next == NULL && \
-					 ((GHook*) hook)->prev == NULL && \
-					 ((GHook*) hook)->hook_id == 0 && \
-					 ((GHook*) hook)->ref_count == 0)
-
-void	 g_hook_list_init		(GHookList		*hook_list,
-					 guint			 hook_size);
-void	 g_hook_list_clear		(GHookList		*hook_list);
-GHook*	 g_hook_alloc			(GHookList		*hook_list);
-void	 g_hook_free			(GHookList		*hook_list,
-					 GHook			*hook);
-void	 g_hook_ref			(GHookList		*hook_list,
-					 GHook			*hook);
-void	 g_hook_unref			(GHookList		*hook_list,
-					 GHook			*hook);
-gboolean g_hook_destroy			(GHookList		*hook_list,
-					 guint			 hook_id);
-void	 g_hook_destroy_link		(GHookList		*hook_list,
-					 GHook			*hook);
-void	 g_hook_prepend			(GHookList		*hook_list,
-					 GHook			*hook);
-void	 g_hook_insert_before		(GHookList		*hook_list,
-					 GHook			*sibling,
-					 GHook			*hook);
-void	 g_hook_insert_sorted		(GHookList		*hook_list,
-					 GHook			*hook,
-					 GHookCompareFunc	 func);
-GHook*	 g_hook_get			(GHookList		*hook_list,
-					 guint			 hook_id);
-GHook*	 g_hook_find			(GHookList		*hook_list,
-					 gboolean		 need_valids,
-					 GHookFindFunc		 func,
-					 gpointer		 data);
-GHook*	 g_hook_find_data		(GHookList		*hook_list,
-					 gboolean		 need_valids,
-					 gpointer		 data);
-GHook*	 g_hook_find_func		(GHookList		*hook_list,
-					 gboolean		 need_valids,
-					 gpointer		 func);
-GHook*	 g_hook_find_func_data		(GHookList		*hook_list,
-					 gboolean		 need_valids,
-					 gpointer		 func,
-					 gpointer		 data);
-/* return the first valid hook, and increment its reference count */
-GHook*	 g_hook_first_valid		(GHookList		*hook_list,
-					 gboolean		 may_be_in_call);
-/* return the next valid hook with incremented reference count, and
- * decrement the reference count of the original hook
- */
-GHook*	 g_hook_next_valid		(GHookList		*hook_list,
-					 GHook			*hook,
-					 gboolean		 may_be_in_call);
-
-/* GHookCompareFunc implementation to insert hooks sorted by their id */
-gint	 g_hook_compare_ids		(GHook			*new_hook,
-					 GHook			*sibling);
-
-/* convenience macros */
-#define	 g_hook_append( hook_list, hook )  \
-     g_hook_insert_before ((hook_list), NULL, (hook))
-
-/* invoke all valid hooks with the (*GHookFunc) signature.
- */
-void	 g_hook_list_invoke		(GHookList		*hook_list,
-					 gboolean		 may_recurse);
-/* invoke all valid hooks with the (*GHookCheckFunc) signature,
- * and destroy the hook if FALSE is returned.
- */
-void	 g_hook_list_invoke_check	(GHookList		*hook_list,
-					 gboolean		 may_recurse);
-/* invoke a marshaller on all valid hooks.
- */
-void	 g_hook_list_marshal		(GHookList		*hook_list,
-					 gboolean		 may_recurse,
-					 GHookMarshaller	 marshaller,
-					 gpointer		 data);
-void	 g_hook_list_marshal_check	(GHookList		*hook_list,
-					 gboolean		 may_recurse,
-					 GHookCheckMarshaller	 marshaller,
-					 gpointer		 data);
-
-
-/* Fatal error handlers.
- * g_on_error_query() will prompt the user to either
- * [E]xit, [H]alt, [P]roceed or show [S]tack trace.
- * g_on_error_stack_trace() invokes gdb, which attaches to the current
- * process and shows a stack trace.
- * These function may cause different actions on non-unix platforms.
- * The prg_name arg is required by gdb to find the executable, if it is
- * passed as NULL, g_on_error_query() will try g_get_prgname().
- */
-void g_on_error_query (const gchar *prg_name);
-void g_on_error_stack_trace (const gchar *prg_name);
-
-
-/* Logging mechanism
- */
-extern	        const gchar		*g_log_domain_glib;
-guint		g_log_set_handler	(const gchar	*log_domain,
-					 GLogLevelFlags	 log_levels,
-					 GLogFunc	 log_func,
-					 gpointer	 user_data);
-void		g_log_remove_handler	(const gchar	*log_domain,
-					 guint		 handler_id);
-void		g_log_default_handler	(const gchar	*log_domain,
-					 GLogLevelFlags	 log_level,
-					 const gchar	*message,
-					 gpointer	 unused_data);
-void		g_log			(const gchar	*log_domain,
-					 GLogLevelFlags	 log_level,
-					 const gchar	*format,
-					 ...) G_GNUC_PRINTF (3, 4);
-void		g_logv			(const gchar	*log_domain,
-					 GLogLevelFlags	 log_level,
-					 const gchar	*format,
-					 va_list	 args);
-GLogLevelFlags	g_log_set_fatal_mask	(const gchar	*log_domain,
-					 GLogLevelFlags	 fatal_mask);
-GLogLevelFlags	g_log_set_always_fatal	(GLogLevelFlags	 fatal_mask);
-#ifndef	G_LOG_DOMAIN
-#define	G_LOG_DOMAIN	((gchar*) 0)
-#endif	/* G_LOG_DOMAIN */
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-#define	g_error(...)	g_log (G_LOG_DOMAIN,         \
-			       G_LOG_LEVEL_ERROR,    \
-			       __VA_ARGS__)
-#define	g_message(...)	g_log (G_LOG_DOMAIN,         \
-			       G_LOG_LEVEL_MESSAGE,  \
-			       __VA_ARGS__)
-#define	g_critical(...)	g_log (G_LOG_DOMAIN,         \
-			       G_LOG_LEVEL_CRITICAL, \
-			       __VA_ARGS__)
-#define	g_warning(...)	g_log (G_LOG_DOMAIN,         \
-			       G_LOG_LEVEL_WARNING,  \
-			       __VA_ARGS__)
-#elif defined (__GNUC__)
-#define	g_error(format...)	g_log (G_LOG_DOMAIN,         \
-				       G_LOG_LEVEL_ERROR,    \
-				       format)
-#define	g_message(format...)	g_log (G_LOG_DOMAIN,         \
-				       G_LOG_LEVEL_MESSAGE,  \
-				       format)
-#define	g_critical(format...)	g_log (G_LOG_DOMAIN,         \
-				       G_LOG_LEVEL_CRITICAL, \
-				       format)
-#define	g_warning(format...)	g_log (G_LOG_DOMAIN,         \
-				       G_LOG_LEVEL_WARNING,  \
-				       format)
-#else	/* !__GNUC__ */
-static void
-g_error (const gchar *format,
-	 ...)
-{
-  va_list args;
-  va_start (args, format);
-  g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args);
-  va_end (args);
-}
-static void
-g_message (const gchar *format,
-	   ...)
-{
-  va_list args;
-  va_start (args, format);
-  g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, args);
-  va_end (args);
-}
-static void
-g_warning (const gchar *format,
-	   ...)
-{
-  va_list args;
-  va_start (args, format);
-  g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args);
-  va_end (args);
-}
-#endif	/* !__GNUC__ */
-
-typedef void	(*GPrintFunc)		(const gchar	*string);
-void		g_print			(const gchar	*format,
-					 ...) G_GNUC_PRINTF (1, 2);
-GPrintFunc	g_set_print_handler	(GPrintFunc	 func);
-void		g_printerr		(const gchar	*format,
-					 ...) G_GNUC_PRINTF (1, 2);
-GPrintFunc	g_set_printerr_handler	(GPrintFunc	 func);
-
-/* deprecated compatibility functions, use g_log_set_handler() instead */
-typedef void		(*GErrorFunc)		(const gchar *str);
-typedef void		(*GWarningFunc)		(const gchar *str);
-GErrorFunc   g_set_error_handler   (GErrorFunc	 func);
-GWarningFunc g_set_warning_handler (GWarningFunc func);
-GPrintFunc   g_set_message_handler (GPrintFunc func);
-
-
-/* Memory allocation and debugging
- */
-#ifdef USE_DMALLOC
-
-#define g_malloc(size)	     ((gpointer) MALLOC (size))
-#define g_malloc0(size)	     ((gpointer) CALLOC (char, size))
-#define g_realloc(mem,size)  ((gpointer) REALLOC (mem, char, size))
-#define g_free(mem)	     FREE (mem)
-
-#else /* !USE_DMALLOC */
-
-gpointer g_malloc      (gulong	  size);
-gpointer g_malloc0     (gulong	  size);
-gpointer g_realloc     (gpointer  mem,
-			gulong	  size);
-void	 g_free	       (gpointer  mem);
-
-#endif /* !USE_DMALLOC */
-
-void	 g_mem_profile (void);
-void	 g_mem_check   (gpointer  mem);
-
-/* Generic allocators
- */
-GAllocator* g_allocator_new   (const gchar  *name,
-			       guint         n_preallocs);
-void        g_allocator_free  (GAllocator   *allocator);
-
-#define	G_ALLOCATOR_LIST	(1)
-#define	G_ALLOCATOR_SLIST	(2)
-#define	G_ALLOCATOR_NODE	(3)
-
-
-/* "g_mem_chunk_new" creates a new memory chunk.
- * Memory chunks are used to allocate pieces of memory which are
- *  always the same size. Lists are a good example of such a data type.
- * The memory chunk allocates and frees blocks of memory as needed.
- *  Just be sure to call "g_mem_chunk_free" and not "g_free" on data
- *  allocated in a mem chunk. ("g_free" will most likely cause a seg
- *  fault...somewhere).
- *
- * Oh yeah, GMemChunk is an opaque data type. (You don't really
- *  want to know what's going on inside do you?)
- */
-
-/* ALLOC_ONLY MemChunk's can only allocate memory. The free operation
- *  is interpreted as a no op. ALLOC_ONLY MemChunk's save 4 bytes per
- *  atom. (They are also useful for lists which use MemChunk to allocate
- *  memory but are also part of the MemChunk implementation).
- * ALLOC_AND_FREE MemChunk's can allocate and free memory.
- */
-
-#define G_ALLOC_ONLY	  1
-#define G_ALLOC_AND_FREE  2
-
-GMemChunk* g_mem_chunk_new     (gchar	  *name,
-				gint	   atom_size,
-				gulong	   area_size,
-				gint	   type);
-void	   g_mem_chunk_destroy (GMemChunk *mem_chunk);
-gpointer   g_mem_chunk_alloc   (GMemChunk *mem_chunk);
-gpointer   g_mem_chunk_alloc0  (GMemChunk *mem_chunk);
-void	   g_mem_chunk_free    (GMemChunk *mem_chunk,
-				gpointer   mem);
-void	   g_mem_chunk_clean   (GMemChunk *mem_chunk);
-void	   g_mem_chunk_reset   (GMemChunk *mem_chunk);
-void	   g_mem_chunk_print   (GMemChunk *mem_chunk);
-void	   g_mem_chunk_info    (void);
-
-/* Ah yes...we have a "g_blow_chunks" function.
- * "g_blow_chunks" simply compresses all the chunks. This operation
- *  consists of freeing every memory area that should be freed (but
- *  which we haven't gotten around to doing yet). And, no,
- *  "g_blow_chunks" doesn't follow the naming scheme, but it is a
- *  much better name than "g_mem_chunk_clean_all" or something
- *  similar.
- */
-void g_blow_chunks (void);
-
-
-/* Timer
- */
-GTimer* g_timer_new	(void);
-void	g_timer_destroy (GTimer	 *timer);
-void	g_timer_start	(GTimer	 *timer);
-void	g_timer_stop	(GTimer	 *timer);
-void	g_timer_reset	(GTimer	 *timer);
-gdouble g_timer_elapsed (GTimer	 *timer,
-			 gulong	 *microseconds);
-
-
-/* String utility functions that modify a string argument or
- * return a constant string that must not be freed.
- */
-#define	 G_STR_DELIMITERS	"_-|> <."
-gchar*	 g_strdelimit		(gchar	     *string,
-				 const gchar *delimiters,
-				 gchar	      new_delimiter);
-gdouble	 g_strtod		(const gchar *nptr,
-				 gchar	    **endptr);
-gchar*	 g_strerror		(gint	      errnum);
-gchar*	 g_strsignal		(gint	      signum);
-gint	 g_strcasecmp		(const gchar *s1,
-				 const gchar *s2);
-gint	 g_strncasecmp		(const gchar *s1,
-				 const gchar *s2,
-				 guint 	      n);
-void	 g_strdown		(gchar	     *string);
-void	 g_strup		(gchar	     *string);
-void	 g_strreverse		(gchar	     *string);
-/* removes leading spaces */
-gchar*   g_strchug              (gchar        *string);
-/* removes trailing spaces */
-gchar*  g_strchomp              (gchar        *string);
-/* removes leading & trailing spaces */
-#define g_strstrip( string )	g_strchomp (g_strchug (string))
-
-/* String utility functions that return a newly allocated string which
- * ought to be freed from the caller at some point.
- */
-gchar*	 g_strdup		(const gchar *str);
-gchar*	 g_strdup_printf	(const gchar *format,
-				 ...) G_GNUC_PRINTF (1, 2);
-gchar*	 g_strdup_vprintf	(const gchar *format,
-				 va_list      args);
-gchar*	 g_strndup		(const gchar *str,
-				 guint	      n);
-gchar*	 g_strnfill		(guint	      length,
-				 gchar	      fill_char);
-gchar*	 g_strconcat		(const gchar *string1,
-				 ...); /* NULL terminated */
-gchar*   g_strjoin		(const gchar  *separator,
-				 ...); /* NULL terminated */
-gchar*	 g_strescape		(gchar	      *string);
-gpointer g_memdup		(gconstpointer mem,
-				 guint	       byte_size);
-
-/* NULL terminated string arrays.
- * g_strsplit() splits up string into max_tokens tokens at delim and
- * returns a newly allocated string array.
- * g_strjoinv() concatenates all of str_array's strings, sliding in an
- * optional separator, the returned string is newly allocated.
- * g_strfreev() frees the array itself and all of its strings.
- */
-gchar**	 g_strsplit		(const gchar  *string,
-				 const gchar  *delimiter,
-				 gint          max_tokens);
-gchar*   g_strjoinv		(const gchar  *separator,
-				 gchar       **str_array);
-void     g_strfreev		(gchar       **str_array);
-
-
-
-/* calculate a string size, guarranteed to fit format + args.
- */
-guint	g_printf_string_upper_bound (const gchar* format,
-				     va_list	  args);
-
-
-/* Retrive static string info
- */
-gchar*	g_get_user_name		(void);
-gchar*	g_get_real_name		(void);
-gchar*	g_get_home_dir		(void);
-gchar*	g_get_tmp_dir		(void);
-gchar*	g_get_prgname		(void);
-void	g_set_prgname		(const gchar *prgname);
-
-
-/* Miscellaneous utility functions
- */
-guint	g_parse_debug_string	(const gchar *string,
-				 GDebugKey   *keys,
-				 guint	      nkeys);
-gint	g_snprintf		(gchar	     *string,
-				 gulong	      n,
-				 gchar const *format,
-				 ...) G_GNUC_PRINTF (3, 4);
-gint	g_vsnprintf		(gchar	     *string,
-				 gulong	      n,
-				 gchar const *format,
-				 va_list      args);
-gchar*	g_basename		(const gchar *file_name);
-/* Check if a file name is an absolute path */
-gboolean g_path_is_absolute	(const gchar *file_name);
-/* In case of absolute paths, skip the root part */
-gchar*  g_path_skip_root	(gchar       *file_name);
-
-/* strings are newly allocated with g_malloc() */
-gchar*	g_dirname		(const gchar *file_name);
-gchar*	g_get_current_dir	(void);
-
-/* return the environment string for the variable. The returned memory
- * must not be freed. */
-gchar*  g_getenv		(const gchar *variable);
-
-
-/* we use a GLib function as a replacement for ATEXIT, so
- * the programmer is not required to check the return value
- * (if there is any in the implementation) and doesn't encounter
- * missing include files.
- */
-void	g_atexit		(GVoidFunc    func);
-
-
-/* Bit tests
- */
-G_INLINE_FUNC gint	g_bit_nth_lsf (guint32 mask,
-				       gint    nth_bit);
-#ifdef	G_CAN_INLINE
-G_INLINE_FUNC gint
-g_bit_nth_lsf (guint32 mask,
-	       gint    nth_bit)
-{
-  do
-    {
-      nth_bit++;
-      if (mask & (1 << (guint) nth_bit))
-	return nth_bit;
-    }
-  while (nth_bit < 32);
-  return -1;
-}
-#endif	/* G_CAN_INLINE */
-
-G_INLINE_FUNC gint	g_bit_nth_msf (guint32 mask,
-				       gint    nth_bit);
-#ifdef G_CAN_INLINE
-G_INLINE_FUNC gint
-g_bit_nth_msf (guint32 mask,
-	       gint    nth_bit)
-{
-  if (nth_bit < 0)
-    nth_bit = 32;
-  do
-    {
-      nth_bit--;
-      if (mask & (1 << (guint) nth_bit))
-	return nth_bit;
-    }
-  while (nth_bit > 0);
-  return -1;
-}
-#endif	/* G_CAN_INLINE */
-
-G_INLINE_FUNC guint	g_bit_storage (guint number);
-#ifdef G_CAN_INLINE
-G_INLINE_FUNC guint
-g_bit_storage (guint number)
-{
-  register guint n_bits = 0;
-  
-  do
-    {
-      n_bits++;
-      number >>= 1;
-    }
-  while (number);
-  return n_bits;
-}
-#endif	/* G_CAN_INLINE */
-
-/* String Chunks
- */
-GStringChunk* g_string_chunk_new	   (gint size);
-void	      g_string_chunk_free	   (GStringChunk *chunk);
-gchar*	      g_string_chunk_insert	   (GStringChunk *chunk,
-					    const gchar	 *string);
-gchar*	      g_string_chunk_insert_const  (GStringChunk *chunk,
-					    const gchar	 *string);
-
-
-/* Strings
- */
-GString* g_string_new	    (const gchar *init);
-GString* g_string_sized_new (guint	  dfl_size);
-void	 g_string_free	    (GString	 *string,
-			     gint	  free_segment);
-GString* g_string_assign    (GString	 *lval,
-			     const gchar *rval);
-GString* g_string_truncate  (GString	 *string,
-			     gint	  len);
-GString* g_string_append    (GString	 *string,
-			     const gchar *val);
-GString* g_string_append_c  (GString	 *string,
-			     gchar	  c);
-GString* g_string_prepend   (GString	 *string,
-			     const gchar *val);
-GString* g_string_prepend_c (GString	 *string,
-			     gchar	  c);
-GString* g_string_insert    (GString	 *string,
-			     gint	  pos,
-			     const gchar *val);
-GString* g_string_insert_c  (GString	 *string,
-			     gint	  pos,
-			     gchar	  c);
-GString* g_string_erase	    (GString	 *string,
-			     gint	  pos,
-			     gint	  len);
-GString* g_string_down	    (GString	 *string);
-GString* g_string_up	    (GString	 *string);
-void	 g_string_sprintf   (GString	 *string,
-			     const gchar *format,
-			     ...) G_GNUC_PRINTF (2, 3);
-void	 g_string_sprintfa  (GString	 *string,
-			     const gchar *format,
-			     ...) G_GNUC_PRINTF (2, 3);
-
-
-/* Resizable arrays, remove fills any cleared spot and shortens the
- * array, while preserving the order. remove_fast will distort the
- * order by moving the last element to the position of the removed 
- */
-
-#define g_array_append_val(a,v)	  g_array_append_vals (a, &(v), 1)
-#define g_array_prepend_val(a,v)  g_array_prepend_vals (a, &(v), 1)
-#define g_array_insert_val(a,i,v) g_array_insert_vals (a, i, &(v), 1)
-#define g_array_index(a,t,i)      (((t*) (a)->data) [(i)])
-
-GArray* g_array_new	          (gboolean	    zero_terminated,
-				   gboolean	    clear,
-				   guint	    element_size);
-void	g_array_free	          (GArray	   *array,
-				   gboolean	    free_segment);
-GArray* g_array_append_vals       (GArray	   *array,
-				   gconstpointer    data,
-				   guint	    len);
-GArray* g_array_prepend_vals      (GArray	   *array,
-				   gconstpointer    data,
-				   guint	    len);
-GArray* g_array_insert_vals       (GArray          *array,
-				   guint            index,
-				   gconstpointer    data,
-				   guint            len);
-GArray* g_array_set_size          (GArray	   *array,
-				   guint	    length);
-GArray* g_array_remove_index	  (GArray	   *array,
-				   guint	    index);
-GArray* g_array_remove_index_fast (GArray	   *array,
-				   guint	    index);
-
-/* Resizable pointer array.  This interface is much less complicated
- * than the above.  Add appends appends a pointer.  Remove fills any
- * cleared spot and shortens the array. remove_fast will again distort
- * order.  
- */
-#define	    g_ptr_array_index(array,index) (array->pdata)[index]
-GPtrArray*  g_ptr_array_new		   (void);
-void	    g_ptr_array_free		   (GPtrArray	*array,
-					    gboolean	 free_seg);
-void	    g_ptr_array_set_size	   (GPtrArray	*array,
-					    gint	 length);
-gpointer    g_ptr_array_remove_index	   (GPtrArray	*array,
-					    guint	 index);
-gpointer    g_ptr_array_remove_index_fast  (GPtrArray	*array,
-					    guint	 index);
-gboolean    g_ptr_array_remove		   (GPtrArray	*array,
-					    gpointer	 data);
-gboolean    g_ptr_array_remove_fast        (GPtrArray	*array,
-					    gpointer	 data);
-void	    g_ptr_array_add		   (GPtrArray	*array,
-					    gpointer	 data);
-
-/* Byte arrays, an array of guint8.  Implemented as a GArray,
- * but type-safe.
- */
-
-GByteArray* g_byte_array_new	           (void);
-void	    g_byte_array_free	           (GByteArray	 *array,
-					    gboolean	  free_segment);
-GByteArray* g_byte_array_append	           (GByteArray	 *array,
-					    const guint8 *data,
-					    guint	  len);
-GByteArray* g_byte_array_prepend           (GByteArray	 *array,
-					    const guint8 *data,
-					    guint	  len);
-GByteArray* g_byte_array_set_size          (GByteArray	 *array,
-					    guint	  length);
-GByteArray* g_byte_array_remove_index	   (GByteArray	 *array,
-					    guint	  index);
-GByteArray* g_byte_array_remove_index_fast (GByteArray	 *array,
-					    guint	  index);
-
-
-/* Hash Functions
- */
-gint  g_str_equal (gconstpointer   v,
-		   gconstpointer   v2);
-guint g_str_hash  (gconstpointer   v);
-
-gint  g_int_equal (gconstpointer   v,
-		   gconstpointer   v2);
-guint g_int_hash  (gconstpointer   v);
-
-/* This "hash" function will just return the key's adress as an
- * unsigned integer. Useful for hashing on plain adresses or
- * simple integer values.
- * passing NULL into g_hash_table_new() as GHashFunc has the
- * same effect as passing g_direct_hash().
- */
-guint g_direct_hash  (gconstpointer v);
-gint  g_direct_equal (gconstpointer v,
-		      gconstpointer v2);
-
-
-/* Quarks (string<->id association)
- */
-GQuark	  g_quark_try_string		(const gchar	*string);
-GQuark	  g_quark_from_static_string	(const gchar	*string);
-GQuark	  g_quark_from_string		(const gchar	*string);
-gchar*	  g_quark_to_string		(GQuark		 quark);
-
-
-/* Keyed Data List
- * NOTE: these functions are scheduled for a rename in GLib 1.3
- */
-void	  g_datalist_init		 (GData		 **datalist);
-void	  g_datalist_clear		 (GData		 **datalist);
-gpointer  g_datalist_id_get_data	 (GData		 **datalist,
-					  GQuark	   key_id);
-void	  g_datalist_id_set_data_full	 (GData		 **datalist,
-					  GQuark	   key_id,
-					  gpointer	   data,
-					  GDestroyNotify   destroy_func);
-void	  g_datalist_id_remove_no_notify (GData		 **datalist,
-					  GQuark	   key_id);
-void	  g_datalist_foreach		 (GData		 **datalist,
-					  GDataForeachFunc func,
-					  gpointer	   user_data);
-#define	  g_datalist_id_set_data(dl, q, d)	\
-     g_datalist_id_set_data_full ((dl), (q), (d), NULL)
-#define	  g_datalist_id_remove_data(dl, q)	\
-     g_datalist_id_set_data ((dl), (q), NULL)
-#define	  g_datalist_get_data(dl, k)		\
-     (g_datalist_id_get_data ((dl), g_quark_try_string (k)))
-#define	  g_datalist_set_data_full(dl, k, d, f)	\
-     g_datalist_id_set_data_full ((dl), g_quark_from_string (k), (d), (f))
-#define	  g_datalist_remove_no_notify(dl, k)	\
-     g_datalist_id_remove_no_notify ((dl), g_quark_try_string (k))
-#define	  g_datalist_set_data(dl, k, d)		\
-     g_datalist_set_data_full ((dl), (k), (d), NULL)
-#define	  g_datalist_remove_data(dl, k)		\
-     g_datalist_id_set_data ((dl), g_quark_try_string (k), NULL)
-
-
-/* Location Associated Keyed Data
- * NOTE: these functions are scheduled for a rename in GLib 1.3
- */
-void	  g_dataset_destroy		(gconstpointer	  dataset_location);
-gpointer  g_dataset_id_get_data		(gconstpointer	  dataset_location,
-					 GQuark		  key_id);
-void	  g_dataset_id_set_data_full	(gconstpointer	  dataset_location,
-					 GQuark		  key_id,
-					 gpointer	  data,
-					 GDestroyNotify	  destroy_func);
-void	  g_dataset_id_remove_no_notify	(gconstpointer	  dataset_location,
-					 GQuark		  key_id);
-void	  g_dataset_foreach		(gconstpointer	  dataset_location,
-					 GDataForeachFunc func,
-					 gpointer	  user_data);
-#define	  g_dataset_id_set_data(l, k, d)	\
-     g_dataset_id_set_data_full ((l), (k), (d), NULL)
-#define	  g_dataset_id_remove_data(l, k)	\
-     g_dataset_id_set_data ((l), (k), NULL)
-#define	  g_dataset_get_data(l, k)		\
-     (g_dataset_id_get_data ((l), g_quark_try_string (k)))
-#define	  g_dataset_set_data_full(l, k, d, f)	\
-     g_dataset_id_set_data_full ((l), g_quark_from_string (k), (d), (f))
-#define	  g_dataset_remove_no_notify(l, k)	\
-     g_dataset_id_remove_no_notify ((l), g_quark_try_string (k))
-#define	  g_dataset_set_data(l, k, d)		\
-     g_dataset_set_data_full ((l), (k), (d), NULL)
-#define	  g_dataset_remove_data(l, k)		\
-     g_dataset_id_set_data ((l), g_quark_try_string (k), NULL)
-
-
-/* GScanner: Flexible lexical scanner for general purpose.
- */
-
-/* Character sets */
-#define G_CSET_A_2_Z	"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-#define G_CSET_a_2_z	"abcdefghijklmnopqrstuvwxyz"
-#define G_CSET_LATINC	"\300\301\302\303\304\305\306"\
-			"\307\310\311\312\313\314\315\316\317\320"\
-			"\321\322\323\324\325\326"\
-			"\330\331\332\333\334\335\336"
-#define G_CSET_LATINS	"\337\340\341\342\343\344\345\346"\
-			"\347\350\351\352\353\354\355\356\357\360"\
-			"\361\362\363\364\365\366"\
-			"\370\371\372\373\374\375\376\377"
-
-/* Error types */
-typedef enum
-{
-  G_ERR_UNKNOWN,
-  G_ERR_UNEXP_EOF,
-  G_ERR_UNEXP_EOF_IN_STRING,
-  G_ERR_UNEXP_EOF_IN_COMMENT,
-  G_ERR_NON_DIGIT_IN_CONST,
-  G_ERR_DIGIT_RADIX,
-  G_ERR_FLOAT_RADIX,
-  G_ERR_FLOAT_MALFORMED
-} GErrorType;
-
-/* Token types */
-typedef enum
-{
-  G_TOKEN_EOF			=   0,
-  
-  G_TOKEN_LEFT_PAREN		= '(',
-  G_TOKEN_RIGHT_PAREN		= ')',
-  G_TOKEN_LEFT_CURLY		= '{',
-  G_TOKEN_RIGHT_CURLY		= '}',
-  G_TOKEN_LEFT_BRACE		= '[',
-  G_TOKEN_RIGHT_BRACE		= ']',
-  G_TOKEN_EQUAL_SIGN		= '=',
-  G_TOKEN_COMMA			= ',',
-  
-  G_TOKEN_NONE			= 256,
-  
-  G_TOKEN_ERROR,
-  
-  G_TOKEN_CHAR,
-  G_TOKEN_BINARY,
-  G_TOKEN_OCTAL,
-  G_TOKEN_INT,
-  G_TOKEN_HEX,
-  G_TOKEN_FLOAT,
-  G_TOKEN_STRING,
-  
-  G_TOKEN_SYMBOL,
-  G_TOKEN_IDENTIFIER,
-  G_TOKEN_IDENTIFIER_NULL,
-  
-  G_TOKEN_COMMENT_SINGLE,
-  G_TOKEN_COMMENT_MULTI,
-  G_TOKEN_LAST
-} GTokenType;
-
-union	_GTokenValue
-{
-  gpointer	v_symbol;
-  gchar		*v_identifier;
-  gulong	v_binary;
-  gulong	v_octal;
-  gulong	v_int;
-  gdouble	v_float;
-  gulong	v_hex;
-  gchar		*v_string;
-  gchar		*v_comment;
-  guchar	v_char;
-  guint		v_error;
-};
-
-struct	_GScannerConfig
-{
-  /* Character sets
-   */
-  gchar		*cset_skip_characters;		/* default: " \t\n" */
-  gchar		*cset_identifier_first;
-  gchar		*cset_identifier_nth;
-  gchar		*cpair_comment_single;		/* default: "#\n" */
-  
-  /* Should symbol lookup work case sensitive?
-   */
-  guint		case_sensitive : 1;
-  
-  /* Boolean values to be adjusted "on the fly"
-   * to configure scanning behaviour.
-   */
-  guint		skip_comment_multi : 1;		/* C like comment */
-  guint		skip_comment_single : 1;	/* single line comment */
-  guint		scan_comment_multi : 1;		/* scan multi line comments? */
-  guint		scan_identifier : 1;
-  guint		scan_identifier_1char : 1;
-  guint		scan_identifier_NULL : 1;
-  guint		scan_symbols : 1;
-  guint		scan_binary : 1;
-  guint		scan_octal : 1;
-  guint		scan_float : 1;
-  guint		scan_hex : 1;			/* `0x0ff0' */
-  guint		scan_hex_dollar : 1;		/* `$0ff0' */
-  guint		scan_string_sq : 1;		/* string: 'anything' */
-  guint		scan_string_dq : 1;		/* string: "\\-escapes!\n" */
-  guint		numbers_2_int : 1;		/* bin, octal, hex => int */
-  guint		int_2_float : 1;		/* int => G_TOKEN_FLOAT? */
-  guint		identifier_2_string : 1;
-  guint		char_2_token : 1;		/* return G_TOKEN_CHAR? */
-  guint		symbol_2_token : 1;
-  guint		scope_0_fallback : 1;		/* try scope 0 on lookups? */
-};
-
-struct	_GScanner
-{
-  /* unused fields */
-  gpointer		user_data;
-  guint			max_parse_errors;
-  
-  /* g_scanner_error() increments this field */
-  guint			parse_errors;
-  
-  /* name of input stream, featured by the default message handler */
-  const gchar		*input_name;
-  
-  /* data pointer for derived structures */
-  gpointer		derived_data;
-  
-  /* link into the scanner configuration */
-  GScannerConfig	*config;
-  
-  /* fields filled in after g_scanner_get_next_token() */
-  GTokenType		token;
-  GTokenValue		value;
-  guint			line;
-  guint			position;
-  
-  /* fields filled in after g_scanner_peek_next_token() */
-  GTokenType		next_token;
-  GTokenValue		next_value;
-  guint			next_line;
-  guint			next_position;
-  
-  /* to be considered private */
-  GHashTable		*symbol_table;
-  gint			input_fd;
-  const gchar		*text;
-  const gchar		*text_end;
-  gchar			*buffer;
-  guint			scope_id;
-  
-  /* handler function for _warn and _error */
-  GScannerMsgFunc	msg_handler;
-};
-
-GScanner*	g_scanner_new			(GScannerConfig *config_templ);
-void		g_scanner_destroy		(GScanner	*scanner);
-void		g_scanner_input_file		(GScanner	*scanner,
-						 gint		input_fd);
-void		g_scanner_sync_file_offset	(GScanner	*scanner);
-void		g_scanner_input_text		(GScanner	*scanner,
-						 const	gchar	*text,
-						 guint		text_len);
-GTokenType	g_scanner_get_next_token	(GScanner	*scanner);
-GTokenType	g_scanner_peek_next_token	(GScanner	*scanner);
-GTokenType	g_scanner_cur_token		(GScanner	*scanner);
-GTokenValue	g_scanner_cur_value		(GScanner	*scanner);
-guint		g_scanner_cur_line		(GScanner	*scanner);
-guint		g_scanner_cur_position		(GScanner	*scanner);
-gboolean	g_scanner_eof			(GScanner	*scanner);
-guint		g_scanner_set_scope		(GScanner	*scanner,
-						 guint		 scope_id);
-void		g_scanner_scope_add_symbol	(GScanner	*scanner,
-						 guint		 scope_id,
-						 const gchar	*symbol,
-						 gpointer	value);
-void		g_scanner_scope_remove_symbol	(GScanner	*scanner,
-						 guint		 scope_id,
-						 const gchar	*symbol);
-gpointer	g_scanner_scope_lookup_symbol	(GScanner	*scanner,
-						 guint		 scope_id,
-						 const gchar	*symbol);
-void		g_scanner_scope_foreach_symbol	(GScanner	*scanner,
-						 guint		 scope_id,
-						 GHFunc		 func,
-						 gpointer	 user_data);
-gpointer	g_scanner_lookup_symbol		(GScanner	*scanner,
-						 const gchar	*symbol);
-void		g_scanner_freeze_symbol_table	(GScanner	*scanner);
-void		g_scanner_thaw_symbol_table	(GScanner	*scanner);
-void		g_scanner_unexp_token		(GScanner	*scanner,
-						 GTokenType	expected_token,
-						 const gchar	*identifier_spec,
-						 const gchar	*symbol_spec,
-						 const gchar	*symbol_name,
-						 const gchar	*message,
-						 gint		 is_error);
-void		g_scanner_error			(GScanner	*scanner,
-						 const gchar	*format,
-						 ...) G_GNUC_PRINTF (2,3);
-void		g_scanner_warn			(GScanner	*scanner,
-						 const gchar	*format,
-						 ...) G_GNUC_PRINTF (2,3);
-gint		g_scanner_stat_mode		(const gchar	*filename);
-/* keep downward source compatibility */
-#define		g_scanner_add_symbol( scanner, symbol, value )	G_STMT_START { \
-  g_scanner_scope_add_symbol ((scanner), 0, (symbol), (value)); \
-} G_STMT_END
-#define		g_scanner_remove_symbol( scanner, symbol )	G_STMT_START { \
-  g_scanner_scope_remove_symbol ((scanner), 0, (symbol)); \
-} G_STMT_END
-#define		g_scanner_foreach_symbol( scanner, func, data )	G_STMT_START { \
-  g_scanner_scope_foreach_symbol ((scanner), 0, (func), (data)); \
-} G_STMT_END
-
-
-/* GCompletion
- */
-
-struct _GCompletion
-{
-  GList* items;
-  GCompletionFunc func;
-  
-  gchar* prefix;
-  GList* cache;
-};
-
-GCompletion* g_completion_new	       (GCompletionFunc func);
-void	     g_completion_add_items    (GCompletion*	cmp,
-					GList*		items);
-void	     g_completion_remove_items (GCompletion*	cmp,
-					GList*		items);
-void	     g_completion_clear_items  (GCompletion*	cmp);
-GList*	     g_completion_complete     (GCompletion*	cmp,
-					gchar*		prefix,
-					gchar**		new_prefix);
-void	     g_completion_free	       (GCompletion*	cmp);
-
-
-/* GDate
- *
- * Date calculations (not time for now, to be resolved). These are a
- * mutant combination of Steffen Beyer's DateCalc routines
- * (http://www.perl.com/CPAN/authors/id/STBEY/) and Jon Trowbridge's
- * date routines (written for in-house software).  Written by Havoc
- * Pennington <hp@pobox.com> 
- */
-
-typedef guint16 GDateYear;
-typedef guint8  GDateDay;   /* day of the month */
-typedef struct _GDate GDate;
-/* make struct tm known without having to include time.h */
-struct tm;
-
-/* enum used to specify order of appearance in parsed date strings */
-typedef enum
-{
-  G_DATE_DAY   = 0,
-  G_DATE_MONTH = 1,
-  G_DATE_YEAR  = 2
-} GDateDMY;
-
-/* actual week and month values */
-typedef enum
-{
-  G_DATE_BAD_WEEKDAY  = 0,
-  G_DATE_MONDAY       = 1,
-  G_DATE_TUESDAY      = 2,
-  G_DATE_WEDNESDAY    = 3,
-  G_DATE_THURSDAY     = 4,
-  G_DATE_FRIDAY       = 5,
-  G_DATE_SATURDAY     = 6,
-  G_DATE_SUNDAY       = 7
-} GDateWeekday;
-typedef enum
-{
-  G_DATE_BAD_MONTH = 0,
-  G_DATE_JANUARY   = 1,
-  G_DATE_FEBRUARY  = 2,
-  G_DATE_MARCH     = 3,
-  G_DATE_APRIL     = 4,
-  G_DATE_MAY       = 5,
-  G_DATE_JUNE      = 6,
-  G_DATE_JULY      = 7,
-  G_DATE_AUGUST    = 8,
-  G_DATE_SEPTEMBER = 9,
-  G_DATE_OCTOBER   = 10,
-  G_DATE_NOVEMBER  = 11,
-  G_DATE_DECEMBER  = 12
-} GDateMonth;
-
-#define G_DATE_BAD_JULIAN 0U
-#define G_DATE_BAD_DAY    0U
-#define G_DATE_BAD_YEAR   0U
-
-/* Note: directly manipulating structs is generally a bad idea, but
- * in this case it's an *incredibly* bad idea, because all or part
- * of this struct can be invalid at any given time. Use the functions,
- * or you will get hosed, I promise.
- */
-struct _GDate
-{ 
-  guint julian_days : 32; /* julian days representation - we use a
-                           *  bitfield hoping that 64 bit platforms
-                           *  will pack this whole struct in one big
-                           *  int 
-                           */
-
-  guint julian : 1;    /* julian is valid */
-  guint dmy    : 1;    /* dmy is valid */
-
-  /* DMY representation */
-  guint day    : 6;  
-  guint month  : 4; 
-  guint year   : 16; 
-};
-
-/* g_date_new() returns an invalid date, you then have to _set() stuff 
- * to get a usable object. You can also allocate a GDate statically,
- * then call g_date_clear() to initialize.
- */
-GDate*       g_date_new                   (void);
-GDate*       g_date_new_dmy               (GDateDay     day, 
-                                           GDateMonth   month, 
-                                           GDateYear    year);
-GDate*       g_date_new_julian            (guint32      julian_day);
-void         g_date_free                  (GDate       *date);
-
-/* check g_date_valid() after doing an operation that might fail, like
- * _parse.  Almost all g_date operations are undefined on invalid
- * dates (the exceptions are the mutators, since you need those to
- * return to validity).  
- */
-gboolean     g_date_valid                 (GDate       *date);
-gboolean     g_date_valid_day             (GDateDay     day);
-gboolean     g_date_valid_month           (GDateMonth   month);
-gboolean     g_date_valid_year            (GDateYear    year);
-gboolean     g_date_valid_weekday         (GDateWeekday weekday);
-gboolean     g_date_valid_julian          (guint32      julian_date);
-gboolean     g_date_valid_dmy             (GDateDay     day,
-                                           GDateMonth   month,
-                                           GDateYear    year);
-
-GDateWeekday g_date_weekday               (GDate       *date);
-GDateMonth   g_date_month                 (GDate       *date);
-GDateYear    g_date_year                  (GDate       *date);
-GDateDay     g_date_day                   (GDate       *date);
-guint32      g_date_julian                (GDate       *date);
-guint        g_date_day_of_year           (GDate       *date);
-
-/* First monday/sunday is the start of week 1; if we haven't reached
- * that day, return 0. These are not ISO weeks of the year; that
- * routine needs to be added.
- * these functions return the number of weeks, starting on the
- * corrsponding day
- */
-guint        g_date_monday_week_of_year   (GDate      *date);
-guint        g_date_sunday_week_of_year   (GDate      *date);
-
-/* If you create a static date struct you need to clear it to get it
- * in a sane state before use. You can clear a whole array at
- * once with the ndates argument.
- */
-void         g_date_clear                 (GDate       *date, 
-                                           guint        n_dates);
-
-/* The parse routine is meant for dates typed in by a user, so it
- * permits many formats but tries to catch common typos. If your data
- * needs to be strictly validated, it is not an appropriate function.
- */
-void         g_date_set_parse             (GDate       *date,
-                                           const gchar *str);
-void         g_date_set_time              (GDate       *date, 
-                                           GTime        time);
-void         g_date_set_month             (GDate       *date, 
-                                           GDateMonth   month);
-void         g_date_set_day               (GDate       *date, 
-                                           GDateDay     day);
-void         g_date_set_year              (GDate       *date,
-                                           GDateYear    year);
-void         g_date_set_dmy               (GDate       *date,
-                                           GDateDay     day,
-                                           GDateMonth   month,
-                                           GDateYear    y);
-void         g_date_set_julian            (GDate       *date,
-                                           guint32      julian_date);
-gboolean     g_date_is_first_of_month     (GDate       *date);
-gboolean     g_date_is_last_of_month      (GDate       *date);
-
-/* To go forward by some number of weeks just go forward weeks*7 days */
-void         g_date_add_days              (GDate       *date, 
-                                           guint        n_days);
-void         g_date_subtract_days         (GDate       *date, 
-                                           guint        n_days);
-
-/* If you add/sub months while day > 28, the day might change */
-void         g_date_add_months            (GDate       *date,
-                                           guint        n_months);
-void         g_date_subtract_months       (GDate       *date,
-                                           guint        n_months);
-
-/* If it's feb 29, changing years can move you to the 28th */
-void         g_date_add_years             (GDate       *date,
-                                           guint        n_years);
-void         g_date_subtract_years        (GDate       *date,
-                                           guint        n_years);
-gboolean     g_date_is_leap_year          (GDateYear    year);
-guint8       g_date_days_in_month         (GDateMonth   month, 
-                                           GDateYear    year);
-guint8       g_date_monday_weeks_in_year  (GDateYear    year);
-guint8       g_date_sunday_weeks_in_year  (GDateYear    year);
-
-/* qsort-friendly (with a cast...) */
-gint         g_date_compare               (GDate       *lhs,
-                                           GDate       *rhs);
-void         g_date_to_struct_tm          (GDate       *date,
-                                           struct tm   *tm);
-
-/* Just like strftime() except you can only use date-related formats.
- *   Using a time format is undefined.
- */
-gsize        g_date_strftime              (gchar       *s,
-                                           gsize        slen,
-                                           const gchar *format,
-                                           GDate       *date);
-
-
-/* GRelation
- *
- * Indexed Relations.  Imagine a really simple table in a
- * database.  Relations are not ordered.  This data type is meant for
- * maintaining a N-way mapping.
- *
- * g_relation_new() creates a relation with FIELDS fields
- *
- * g_relation_destroy() frees all resources
- * g_tuples_destroy() frees the result of g_relation_select()
- *
- * g_relation_index() indexes relation FIELD with the provided
- *   equality and hash functions.  this must be done before any
- *   calls to insert are made.
- *
- * g_relation_insert() inserts a new tuple.  you are expected to
- *   provide the right number of fields.
- *
- * g_relation_delete() deletes all relations with KEY in FIELD
- * g_relation_select() returns ...
- * g_relation_count() counts ...
- */
-
-GRelation* g_relation_new     (gint	    fields);
-void	   g_relation_destroy (GRelation   *relation);
-void	   g_relation_index   (GRelation   *relation,
-			       gint	    field,
-			       GHashFunc    hash_func,
-			       GCompareFunc key_compare_func);
-void	   g_relation_insert  (GRelation   *relation,
-			       ...);
-gint	   g_relation_delete  (GRelation   *relation,
-			       gconstpointer  key,
-			       gint	    field);
-GTuples*   g_relation_select  (GRelation   *relation,
-			       gconstpointer  key,
-			       gint	    field);
-gint	   g_relation_count   (GRelation   *relation,
-			       gconstpointer  key,
-			       gint	    field);
-gboolean   g_relation_exists  (GRelation   *relation,
-			       ...);
-void	   g_relation_print   (GRelation   *relation);
-
-void	   g_tuples_destroy   (GTuples	   *tuples);
-gpointer   g_tuples_index     (GTuples	   *tuples,
-			       gint	    index,
-			       gint	    field);
-
-
-/* Prime numbers.
- */
-
-/* This function returns prime numbers spaced by approximately 1.5-2.0
- * and is for use in resizing data structures which prefer
- * prime-valued sizes.	The closest spaced prime function returns the
- * next largest prime, or the highest it knows about which is about
- * MAXINT/4.
- */
-guint	   g_spaced_primes_closest (guint num);
-
-
-/* GIOChannel
- */
-
-typedef struct _GIOFuncs GIOFuncs;
-typedef enum
-{
-  G_IO_ERROR_NONE,
-  G_IO_ERROR_AGAIN,
-  G_IO_ERROR_INVAL,
-  G_IO_ERROR_UNKNOWN
-} GIOError;
-typedef enum
-{
-  G_SEEK_CUR,
-  G_SEEK_SET,
-  G_SEEK_END
-} GSeekType;
-typedef enum
-{
-  G_IO_IN	GLIB_SYSDEF_POLLIN,
-  G_IO_OUT	GLIB_SYSDEF_POLLOUT,
-  G_IO_PRI	GLIB_SYSDEF_POLLPRI,
-  G_IO_ERR	GLIB_SYSDEF_POLLERR,
-  G_IO_HUP	GLIB_SYSDEF_POLLHUP,
-  G_IO_NVAL	GLIB_SYSDEF_POLLNVAL
-} GIOCondition;
-
-struct _GIOChannel
-{
-  guint channel_flags;
-  guint ref_count;
-  GIOFuncs *funcs;
-};
-
-typedef gboolean (*GIOFunc) (GIOChannel   *source,
-			     GIOCondition  condition,
-			     gpointer      data);
-struct _GIOFuncs
-{
-  GIOError (*io_read)   (GIOChannel 	*channel, 
-		         gchar      	*buf, 
-		         guint      	 count,
-			 guint      	*bytes_read);
-  GIOError (*io_write)  (GIOChannel 	*channel, 
-		 	 gchar      	*buf, 
-			 guint      	 count,
-			 guint      	*bytes_written);
-  GIOError (*io_seek)   (GIOChannel   	*channel, 
-		 	 gint       	 offset, 
-		  	 GSeekType  	 type);
-  void (*io_close)      (GIOChannel	*channel);
-  guint (*io_add_watch) (GIOChannel     *channel,
-			 gint            priority,
-			 GIOCondition    condition,
-			 GIOFunc         func,
-			 gpointer        user_data,
-			 GDestroyNotify  notify);
-  void (*io_free)       (GIOChannel	*channel);
-};
-
-void        g_io_channel_init   (GIOChannel    *channel);
-void        g_io_channel_ref    (GIOChannel    *channel);
-void        g_io_channel_unref  (GIOChannel    *channel);
-GIOError    g_io_channel_read   (GIOChannel    *channel, 
-			         gchar         *buf, 
-			         guint          count,
-			         guint         *bytes_read);
-GIOError  g_io_channel_write    (GIOChannel    *channel, 
-			         gchar         *buf, 
-			         guint          count,
-			         guint         *bytes_written);
-GIOError  g_io_channel_seek     (GIOChannel    *channel,
-			         gint           offset, 
-			         GSeekType      type);
-void      g_io_channel_close    (GIOChannel    *channel);
-guint     g_io_add_watch_full   (GIOChannel    *channel,
-			         gint           priority,
-			         GIOCondition   condition,
-			         GIOFunc        func,
-			         gpointer       user_data,
-			         GDestroyNotify notify);
-guint    g_io_add_watch         (GIOChannel    *channel,
-			         GIOCondition   condition,
-			         GIOFunc        func,
-			         gpointer       user_data);
-
-
-/* Main loop
- */
-typedef struct _GTimeVal	GTimeVal;
-typedef struct _GSourceFuncs	GSourceFuncs;
-typedef struct _GMainLoop	GMainLoop;	/* Opaque */
-
-struct _GTimeVal
-{
-  glong tv_sec;
-  glong tv_usec;
-};
-struct _GSourceFuncs
-{
-  gboolean (*prepare)  (gpointer  source_data, 
-			GTimeVal *current_time,
-			gint     *timeout,
-			gpointer  user_data);
-  gboolean (*check)    (gpointer  source_data,
-			GTimeVal *current_time,
-			gpointer  user_data);
-  gboolean (*dispatch) (gpointer  source_data, 
-			GTimeVal *dispatch_time,
-			gpointer  user_data);
-  GDestroyNotify destroy;
-};
-
-/* Standard priorities */
-
-#define G_PRIORITY_HIGH            -100
-#define G_PRIORITY_DEFAULT          0
-#define G_PRIORITY_HIGH_IDLE        100
-#define G_PRIORITY_DEFAULT_IDLE     200
-#define G_PRIORITY_LOW	            300
-
-typedef gboolean (*GSourceFunc) (gpointer data);
-
-/* Hooks for adding to the main loop */
-guint    g_source_add                        (gint           priority, 
-					      gboolean       can_recurse,
-					      GSourceFuncs  *funcs,
-					      gpointer       source_data, 
-					      gpointer       user_data,
-					      GDestroyNotify notify);
-gboolean g_source_remove                     (guint          tag);
-gboolean g_source_remove_by_user_data        (gpointer       user_data);
-gboolean g_source_remove_by_source_data      (gpointer       source_data);
-gboolean g_source_remove_by_funcs_user_data  (GSourceFuncs  *funcs,
-					      gpointer       user_data);
-
-void g_get_current_time		        (GTimeVal	*result);
-
-/* Running the main loop */
-GMainLoop*	g_main_new		(gboolean	 is_running);
-void		g_main_run		(GMainLoop	*loop);
-void		g_main_quit		(GMainLoop	*loop);
-void		g_main_destroy		(GMainLoop	*loop);
-gboolean	g_main_is_running	(GMainLoop	*loop);
-
-/* Run a single iteration of the mainloop. If block is FALSE,
- * will never block
- */
-gboolean	g_main_iteration	(gboolean	may_block);
-
-/* See if any events are pending */
-gboolean	g_main_pending		(void);
-
-/* Idles and timeouts */
-guint		g_timeout_add_full	(gint           priority,
-					 guint          interval, 
-					 GSourceFunc    function,
-					 gpointer       data,
-					 GDestroyNotify notify);
-guint		g_timeout_add		(guint          interval,
-					 GSourceFunc    function,
-					 gpointer       data);
-guint		g_idle_add	   	(GSourceFunc	function,
-					 gpointer	data);
-guint	   	g_idle_add_full		(gint   	priority,
-					 GSourceFunc	function,
-					 gpointer	data,
-					 GDestroyNotify destroy);
-gboolean	g_idle_remove_by_data	(gpointer	data);
-
-/* GPollFD
- *
- * System-specific IO and main loop calls
- *
- * On Win32, the fd in a GPollFD should be Win32 HANDLE (*not* a file
- * descriptor as provided by the C runtime) that can be used by
- * MsgWaitForMultipleObjects. This does *not* include file handles
- * from CreateFile, SOCKETs, nor pipe handles. (But you can use
- * WSAEventSelect to signal events when a SOCKET is readable).
- *
- * On Win32, fd can also be the special value G_WIN32_MSG_HANDLE to
- * indicate polling for messages. These message queue GPollFDs should
- * be added with the g_main_poll_win32_msg_add function.
- *
- * But note that G_WIN32_MSG_HANDLE GPollFDs should not be used by GDK
- * (GTK) programs, as GDK itself wants to read messages and convert them
- * to GDK events.
- *
- * So, unless you really know what you are doing, it's best not to try
- * to use the main loop polling stuff for your own needs on
- * Win32. It's really only written for the GIMP's needs so
- * far.
- */
-
-typedef struct _GPollFD GPollFD;
-typedef gint	(*GPollFunc)	(GPollFD *ufds,
-				 guint	  nfsd,
-				 gint     timeout);
-struct _GPollFD
-{
-  gint		fd;
-  gushort 	events;
-  gushort 	revents;
-};
-
-void        g_main_add_poll          (GPollFD    *fd,
-				      gint        priority);
-void        g_main_remove_poll       (GPollFD    *fd);
-void        g_main_set_poll_func     (GPollFunc   func);
-
-/* On Unix, IO channels created with this function for any file
- * descriptor or socket.
- *
- * On Win32, use this only for plain files opened with the MSVCRT (the
- * Microsoft run-time C library) _open(), including file descriptors
- * 0, 1 and 2 (corresponding to stdin, stdout and stderr).
- * Actually, don't do even that, this code isn't done yet.
- *
- * The term file descriptor as used in the context of Win32 refers to
- * the emulated Unix-like file descriptors MSVCRT provides.
- */
-GIOChannel* g_io_channel_unix_new    (int         fd);
-gint        g_io_channel_unix_get_fd (GIOChannel *channel);
-
-#ifdef NATIVE_WIN32
-
-GUTILS_C_VAR guint g_pipe_readable_msg;
-
-#define G_WIN32_MSG_HANDLE 19981206
-
-/* This is used to add polling for Windows messages. GDK (GTk+) programs
- * should *not* use this. (In fact, I can't think of any program that
- * would want to use this, but it's here just for completeness's sake.
- */
-void        g_main_poll_win32_msg_add(gint        priority,
-				      GPollFD    *fd,
-				      guint       hwnd);
-
-/* An IO channel for Windows messages for window handle hwnd. */
-GIOChannel *g_io_channel_win32_new_messages (guint hwnd);
-
-/* An IO channel for an anonymous pipe as returned from the MSVCRT
- * _pipe(), with no mechanism for the writer to tell the reader when
- * there is data in the pipe.
- *
- * This is not really implemented yet.
- */
-GIOChannel *g_io_channel_win32_new_pipe (int fd);
-
-/* An IO channel for a pipe as returned from the MSVCRT _pipe(), with
- * Windows user messages used to signal data in the pipe for the
- * reader.
- *
- * fd is the file descriptor. For the write end, peer is the thread id
- * of the reader, and peer_fd is his file descriptor for the read end
- * of the pipe.
- *
- * This is used by the GIMP, and works.
- */
-GIOChannel *g_io_channel_win32_new_pipe_with_wakeups (int   fd,
-						      guint peer,
-						      int   peer_fd);
-
-void        g_io_channel_win32_pipe_request_wakeups (GIOChannel *channel,
-						     guint       peer,
-						     int         peer_fd);
-
-void        g_io_channel_win32_pipe_readable (int   fd,
-					      guint offset);
-
-/* Get the C runtime file descriptor of a channel. */
-gint        g_io_channel_win32_get_fd (GIOChannel *channel);
-
-/* An IO channel for a SOCK_STREAM winsock socket. The parameter is
- * actually a SOCKET.
- */
-GIOChannel *g_io_channel_win32_new_stream_socket (int socket);
-
-#endif
-
-/* Windows emulation stubs for common Unix functions
- */
-#ifdef NATIVE_WIN32
-#  define MAXPATHLEN 1024
-#  ifdef _MSC_VER
-typedef int pid_t;
-
-/* These POSIXish functions are available in the Microsoft C library
- * prefixed with underscore (which of course technically speaking is
- * the Right Thing, as they are non-ANSI. Not that being non-ANSI
- * prevents Microsoft from practically requiring you to include
- * <windows.h> every now and then...).
- *
- * You still need to include the appropriate headers to get the
- * prototypes, <io.h> or <direct.h>.
- *
- * For some functions, we provide emulators in glib, which are prefixed
- * with gwin_.
- */
-#    define getcwd		_getcwd
-#    define getpid		_getpid
-#    define access		_access
-#    define open		_open
-#    define read		_read
-#    define write		_write
-#    define lseek		_lseek
-#    define close		_close
-#    define pipe(phandles)	_pipe (phandles, 4096, _O_BINARY)
-#    define popen		_popen
-#    define pclose		_pclose
-#    define fdopen		_fdopen
-#    define ftruncate(fd, size)	gwin_ftruncate (fd, size)
-#    define opendir		gwin_opendir
-#    define readdir		gwin_readdir
-#    define rewinddir		gwin_rewinddir
-#    define closedir		gwin_closedir
-#    define NAME_MAX 255
-struct DIR
-{
-  gchar    *dir_name;
-  gboolean  just_opened;
-  guint     find_file_handle;
-  gpointer  find_file_data;
-};
-typedef struct DIR DIR;
-struct dirent
-{
-  gchar  d_name[NAME_MAX + 1];
-};
-/* emulation functions */
-extern int	gwin_ftruncate	(gint		 f,
-				 guint		 size);
-DIR*		gwin_opendir	(const gchar	*dirname);
-struct dirent*	gwin_readdir  	(DIR		*dir);
-void		gwin_rewinddir 	(DIR		*dir);
-gint		gwin_closedir  	(DIR		*dir);
-#  endif /* _MSC_VER */
-#endif	 /* NATIVE_WIN32 */
-
-
-/* GLib Thread support
- */
-typedef struct _GMutex		GMutex;
-typedef struct _GCond		GCond;
-typedef struct _GPrivate	GPrivate;
-typedef struct _GStaticPrivate	GStaticPrivate;
-typedef struct _GThreadFunctions GThreadFunctions;
-struct _GThreadFunctions
-{
-  GMutex*  (*mutex_new)       (void);
-  void     (*mutex_lock)      (GMutex		*mutex);
-  gboolean (*mutex_trylock)   (GMutex		*mutex);
-  void     (*mutex_unlock)    (GMutex		*mutex);
-  void     (*mutex_free)      (GMutex		*mutex);
-  GCond*   (*cond_new)        (void);
-  void     (*cond_signal)     (GCond		*cond);
-  void     (*cond_broadcast)  (GCond		*cond);
-  void     (*cond_wait)       (GCond		*cond,
-			       GMutex		*mutex);
-  gboolean (*cond_timed_wait) (GCond		*cond,
-			       GMutex		*mutex, 
-			       GTimeVal 	*end_time);
-  void      (*cond_free)      (GCond		*cond);
-  GPrivate* (*private_new)    (GDestroyNotify	 destructor);
-  gpointer  (*private_get)    (GPrivate		*private_key);
-  void      (*private_set)    (GPrivate		*private_key,
-			       gpointer		 data);
-};
-
-GUTILS_C_VAR GThreadFunctions	g_thread_functions_for_glib_use;
-GUTILS_C_VAR gboolean		g_thread_use_default_impl;
-GUTILS_C_VAR gboolean		g_threads_got_initialized;
-
-/* initializes the mutex/cond/private implementation for glib, might
- * only be called once, and must not be called directly or indirectly
- * from another glib-function, e.g. as a callback.
- */
-void   g_thread_init   (GThreadFunctions       *vtable);
-
-/* internal function for fallback static mutex implementation */
-GMutex*	g_static_mutex_get_mutex_impl	(GMutex	**mutex);
-
-/* shorthands for conditional and unconditional function calls */
-#define G_THREAD_UF(name, arglist) \
-    (*g_thread_functions_for_glib_use . name) arglist
-#define G_THREAD_CF(name, fail, arg) \
-    (g_thread_supported () ? G_THREAD_UF (name, arg) : (fail))
-/* keep in mind, all those mutexes and static mutexes are not 
- * recursive in general, don't rely on that
- */
-#define	g_thread_supported()	(g_threads_got_initialized)
-#define g_mutex_new()            G_THREAD_UF (mutex_new,      ())
-#define g_mutex_lock(mutex)      G_THREAD_CF (mutex_lock,     (void)0, (mutex))
-#define g_mutex_trylock(mutex)   G_THREAD_CF (mutex_trylock,  TRUE,    (mutex))
-#define g_mutex_unlock(mutex)    G_THREAD_CF (mutex_unlock,   (void)0, (mutex))
-#define g_mutex_free(mutex)      G_THREAD_CF (mutex_free,     (void)0, (mutex))
-#define g_cond_new()             G_THREAD_UF (cond_new,       ())
-#define g_cond_signal(cond)      G_THREAD_CF (cond_signal,    (void)0, (cond))
-#define g_cond_broadcast(cond)   G_THREAD_CF (cond_broadcast, (void)0, (cond))
-#define g_cond_wait(cond, mutex) G_THREAD_CF (cond_wait,      (void)0, (cond, \
-                                                                        mutex))
-#define g_cond_free(cond)        G_THREAD_CF (cond_free,      (void)0, (cond))
-#define g_cond_timed_wait(cond, mutex, abs_time) G_THREAD_CF (cond_timed_wait, \
-                                                              TRUE, \
-                                                              (cond, mutex, \
-							       abs_time))
-#define g_private_new(destructor)	  G_THREAD_UF (private_new, (destructor))
-#define g_private_get(private_key)	  G_THREAD_CF (private_get, \
-                                                       ((gpointer)private_key), \
-                                                       (private_key))
-#define g_private_set(private_key, value) G_THREAD_CF (private_set, \
-                                                       (void) (private_key = \
-                                                        (GPrivate*) (value)), \
-                                                       (private_key, value))
-/* GStaticMutexes can be statically initialized with the value
- * G_STATIC_MUTEX_INIT, and then they can directly be used, that is
- * much easier, than having to explicitly allocate the mutex before
- * use
- */
-#define g_static_mutex_lock(mutex) \
-    g_mutex_lock (g_static_mutex_get_mutex (mutex))
-#define g_static_mutex_trylock(mutex) \
-    g_mutex_trylock (g_static_mutex_get_mutex (mutex))
-#define g_static_mutex_unlock(mutex) \
-    g_mutex_unlock (g_static_mutex_get_mutex (mutex)) 
-struct _GStaticPrivate
-{
-  guint index;
-};
-#define G_STATIC_PRIVATE_INIT { 0 }
-gpointer g_static_private_get (GStaticPrivate	*private_key);
-void     g_static_private_set (GStaticPrivate	*private_key, 
-			       gpointer        	 data,
-			       GDestroyNotify    notify);
-
-/* these are some convenience macros that expand to nothing if GLib
- * was configured with --disable-threads. for using StaticMutexes,
- * you define them with G_LOCK_DEFINE_STATIC (name) or G_LOCK_DEFINE (name)
- * if you need to export the mutex. With G_LOCK_EXTERN (name) you can
- * declare such an globally defined lock. name is a unique identifier
- * for the protected varibale or code portion. locking, testing and
- * unlocking of such mutexes can be done with G_LOCK(), G_UNLOCK() and
- * G_TRYLOCK() respectively.  
- */
-extern void glib_dummy_decl (void);
-#define G_LOCK_NAME(name)		(g__ ## name ## _lock)
-#ifdef	G_THREADS_ENABLED
-#  define G_LOCK_DEFINE_STATIC(name)	static G_LOCK_DEFINE (name)
-#  define G_LOCK_DEFINE(name)		\
-    GStaticMutex G_LOCK_NAME (name) = G_STATIC_MUTEX_INIT 
-#  define G_LOCK_EXTERN(name)		extern GStaticMutex G_LOCK_NAME (name)
-
-#  ifdef G_DEBUG_LOCKS
-#    define G_LOCK(name)		G_STMT_START{		  \
-        g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,			  \
-	       "file %s: line %d (%s): locking: %s ",	          \
-	       __FILE__,	__LINE__, G_GNUC_PRETTY_FUNCTION, \
-               #name);                                            \
-        g_static_mutex_lock (&G_LOCK_NAME (name));                \
-     }G_STMT_END
-#    define G_UNLOCK(name)		G_STMT_START{		  \
-        g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,			  \
-	       "file %s: line %d (%s): unlocking: %s ",	          \
-	       __FILE__,	__LINE__, G_GNUC_PRETTY_FUNCTION, \
-               #name);                                            \
-       g_static_mutex_unlock (&G_LOCK_NAME (name));               \
-     }G_STMT_END
-#    define G_TRYLOCK(name)		G_STMT_START{		  \
-        g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,			  \
-	       "file %s: line %d (%s): try locking: %s ",         \
-	       __FILE__,	__LINE__, G_GNUC_PRETTY_FUNCTION, \
-               #name);                                            \
-     }G_STMT_END,	g_static_mutex_trylock (&G_LOCK_NAME (name))
-#  else	 /* !G_DEBUG_LOCKS */
-#    define G_LOCK(name) g_static_mutex_lock	   (&G_LOCK_NAME (name)) 
-#    define G_UNLOCK(name) g_static_mutex_unlock   (&G_LOCK_NAME (name))
-#    define G_TRYLOCK(name) g_static_mutex_trylock (&G_LOCK_NAME (name))
-#  endif /* !G_DEBUG_LOCKS */
-#else	/* !G_THREADS_ENABLED */
-#  define G_LOCK_DEFINE_STATIC(name)	extern void glib_dummy_decl (void)
-#  define G_LOCK_DEFINE(name)		extern void glib_dummy_decl (void)
-#  define G_LOCK_EXTERN(name)		extern void glib_dummy_decl (void)
-#  define G_LOCK(name)
-#  define G_UNLOCK(name)
-#  define G_TRYLOCK(name)		(FALSE)
-#endif	/* !G_THREADS_ENABLED */
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __G_LIB_H__ */
diff --git a/glib/glist.c b/glib/glist.c
deleted file mode 100644
index ca37b8d..0000000
--- a/glib/glist.c
+++ /dev/null
@@ -1,670 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-
-
-struct _GAllocator /* from gmem.c */
-{
-  gchar         *name;
-  guint16        n_preallocs;
-  guint          is_unused : 1;
-  guint          type : 4;
-  GAllocator    *last;
-  GMemChunk     *mem_chunk;
-  GList		*free_lists; /* implementation specific */
-};
-
-static GAllocator	*current_allocator = NULL;
-G_LOCK_DEFINE_STATIC (current_allocator);
-
-/* HOLDS: current_allocator_lock */
-static void
-g_list_validate_allocator (GAllocator *allocator)
-{
-  g_return_if_fail (allocator != NULL);
-  g_return_if_fail (allocator->is_unused == TRUE);
-
-  if (allocator->type != G_ALLOCATOR_LIST)
-    {
-      allocator->type = G_ALLOCATOR_LIST;
-      if (allocator->mem_chunk)
-	{
-	  g_mem_chunk_destroy (allocator->mem_chunk);
-	  allocator->mem_chunk = NULL;
-	}
-    }
-
-  if (!allocator->mem_chunk)
-    {
-      allocator->mem_chunk = g_mem_chunk_new (allocator->name,
-					      sizeof (GList),
-					      sizeof (GList) * allocator->n_preallocs,
-					      G_ALLOC_ONLY);
-      allocator->free_lists = NULL;
-    }
-
-  allocator->is_unused = FALSE;
-}
-
-void
-g_list_push_allocator(GAllocator *allocator)
-{
-  G_LOCK (current_allocator);
-  g_list_validate_allocator ( allocator );
-  allocator->last = current_allocator;
-  current_allocator = allocator;
-  G_UNLOCK (current_allocator);
-}
-
-void
-g_list_pop_allocator (void)
-{
-  G_LOCK (current_allocator);
-  if (current_allocator)
-    {
-      GAllocator *allocator;
-
-      allocator = current_allocator;
-      current_allocator = allocator->last;
-      allocator->last = NULL;
-      allocator->is_unused = TRUE;
-    }
-  G_UNLOCK (current_allocator);
-}
-
-GList*
-g_list_alloc (void)
-{
-  GList *list;
-
-  G_LOCK (current_allocator);
-  if (!current_allocator)
-    {
-      GAllocator *allocator = g_allocator_new ("GLib default GList allocator",
-					       128);
-      g_list_validate_allocator (allocator);
-      allocator->last = NULL;
-      current_allocator = allocator;
-    }
-  if (!current_allocator->free_lists)
-    {
-      list = g_chunk_new (GList, current_allocator->mem_chunk);
-      list->data = NULL;
-    }
-  else
-    {
-      if (current_allocator->free_lists->data)
-	{
-	  list = current_allocator->free_lists->data;
-	  current_allocator->free_lists->data = list->next;
-	  list->data = NULL;
-	}
-      else
-	{
-	  list = current_allocator->free_lists;
-	  current_allocator->free_lists = list->next;
-	}
-    }
-  G_UNLOCK (current_allocator);
-  list->next = NULL;
-  list->prev = NULL;
-  
-  return list;
-}
-
-void
-g_list_free (GList *list)
-{
-  if (list)
-    {
-      list->data = list->next;  
-      G_LOCK (current_allocator);
-      list->next = current_allocator->free_lists;
-      current_allocator->free_lists = list;
-      G_UNLOCK (current_allocator);
-    }
-}
-
-void
-g_list_free_1 (GList *list)
-{
-  if (list)
-    {
-      list->data = NULL;  
-      G_LOCK (current_allocator);
-      list->next = current_allocator->free_lists;
-      current_allocator->free_lists = list;
-      G_UNLOCK (current_allocator);
-    }
-}
-
-GList*
-g_list_append (GList	*list,
-	       gpointer	 data)
-{
-  GList *new_list;
-  GList *last;
-  
-  new_list = g_list_alloc ();
-  new_list->data = data;
-  
-  if (list)
-    {
-      last = g_list_last (list);
-      /* g_assert (last != NULL); */
-      last->next = new_list;
-      new_list->prev = last;
-
-      return list;
-    }
-  else
-    return new_list;
-}
-
-GList*
-g_list_prepend (GList	 *list,
-		gpointer  data)
-{
-  GList *new_list;
-  
-  new_list = g_list_alloc ();
-  new_list->data = data;
-  
-  if (list)
-    {
-      if (list->prev)
-	{
-	  list->prev->next = new_list;
-	  new_list->prev = list->prev;
-	}
-      list->prev = new_list;
-      new_list->next = list;
-    }
-  
-  return new_list;
-}
-
-GList*
-g_list_insert (GList	*list,
-	       gpointer	 data,
-	       gint	 position)
-{
-  GList *new_list;
-  GList *tmp_list;
-  
-  if (position < 0)
-    return g_list_append (list, data);
-  else if (position == 0)
-    return g_list_prepend (list, data);
-  
-  tmp_list = g_list_nth (list, position);
-  if (!tmp_list)
-    return g_list_append (list, data);
-  
-  new_list = g_list_alloc ();
-  new_list->data = data;
-  
-  if (tmp_list->prev)
-    {
-      tmp_list->prev->next = new_list;
-      new_list->prev = tmp_list->prev;
-    }
-  new_list->next = tmp_list;
-  tmp_list->prev = new_list;
-  
-  if (tmp_list == list)
-    return new_list;
-  else
-    return list;
-}
-
-GList *
-g_list_concat (GList *list1, GList *list2)
-{
-  GList *tmp_list;
-  
-  if (list2)
-    {
-      tmp_list = g_list_last (list1);
-      if (tmp_list)
-	tmp_list->next = list2;
-      else
-	list1 = list2;
-      list2->prev = tmp_list;
-    }
-  
-  return list1;
-}
-
-GList*
-g_list_remove (GList	*list,
-	       gpointer	 data)
-{
-  GList *tmp;
-  
-  tmp = list;
-  while (tmp)
-    {
-      if (tmp->data != data)
-	tmp = tmp->next;
-      else
-	{
-	  if (tmp->prev)
-	    tmp->prev->next = tmp->next;
-	  if (tmp->next)
-	    tmp->next->prev = tmp->prev;
-	  
-	  if (list == tmp)
-	    list = list->next;
-	  
-	  g_list_free_1 (tmp);
-	  
-	  break;
-	}
-    }
-  return list;
-}
-
-GList*
-g_list_remove_link (GList *list,
-		    GList *link)
-{
-  if (link)
-    {
-      if (link->prev)
-	link->prev->next = link->next;
-      if (link->next)
-	link->next->prev = link->prev;
-      
-      if (link == list)
-	list = list->next;
-      
-      link->next = NULL;
-      link->prev = NULL;
-    }
-  
-  return list;
-}
-
-GList*
-g_list_copy (GList *list)
-{
-  GList *new_list = NULL;
-
-  if (list)
-    {
-      GList *last;
-
-      new_list = g_list_alloc ();
-      new_list->data = list->data;
-      last = new_list;
-      list = list->next;
-      while (list)
-	{
-	  last->next = g_list_alloc ();
-	  last->next->prev = last;
-	  last = last->next;
-	  last->data = list->data;
-	  list = list->next;
-	}
-    }
-
-  return new_list;
-}
-
-GList*
-g_list_reverse (GList *list)
-{
-  GList *last;
-  
-  last = NULL;
-  while (list)
-    {
-      last = list;
-      list = last->next;
-      last->next = last->prev;
-      last->prev = list;
-    }
-  
-  return last;
-}
-
-GList*
-g_list_nth (GList *list,
-	    guint  n)
-{
-  while ((n-- > 0) && list)
-    list = list->next;
-  
-  return list;
-}
-
-gpointer
-g_list_nth_data (GList     *list,
-		 guint      n)
-{
-  while ((n-- > 0) && list)
-    list = list->next;
-  
-  return list ? list->data : NULL;
-}
-
-GList*
-g_list_find (GList    *list,
-	     gpointer  data)
-{
-  while (list)
-    {
-      if (list->data == data)
-	break;
-      list = list->next;
-    }
-  
-  return list;
-}
-
-GList*
-g_list_find_custom (GList       *list,
-		    gpointer     data,
-		    GCompareFunc func)
-{
-  g_return_val_if_fail (func != NULL, list);
-
-  while (list)
-    {
-      if (! func (list->data, data))
-	return list;
-      list = list->next;
-    }
-
-  return NULL;
-}
-
-
-gint
-g_list_position (GList *list,
-		 GList *link)
-{
-  gint i;
-
-  i = 0;
-  while (list)
-    {
-      if (list == link)
-	return i;
-      i++;
-      list = list->next;
-    }
-
-  return -1;
-}
-
-gint
-g_list_index (GList   *list,
-	      gpointer data)
-{
-  gint i;
-
-  i = 0;
-  while (list)
-    {
-      if (list->data == data)
-	return i;
-      i++;
-      list = list->next;
-    }
-
-  return -1;
-}
-
-GList*
-g_list_last (GList *list)
-{
-  if (list)
-    {
-      while (list->next)
-	list = list->next;
-    }
-  
-  return list;
-}
-
-GList*
-g_list_first (GList *list)
-{
-  if (list)
-    {
-      while (list->prev)
-	list = list->prev;
-    }
-  
-  return list;
-}
-
-guint
-g_list_length (GList *list)
-{
-  guint length;
-  
-  length = 0;
-  while (list)
-    {
-      length++;
-      list = list->next;
-    }
-  
-  return length;
-}
-
-void
-g_list_foreach (GList	 *list,
-		GFunc	  func,
-		gpointer  user_data)
-{
-  while (list)
-    {
-      (*func) (list->data, user_data);
-      list = list->next;
-    }
-}
-
-
-GList*
-g_list_insert_sorted (GList        *list,
-                      gpointer      data,
-                      GCompareFunc  func)
-{
-  GList *tmp_list = list;
-  GList *new_list;
-  gint cmp;
-
-  g_return_val_if_fail (func != NULL, list);
-  
-  if (!list) 
-    {
-      new_list = g_list_alloc();
-      new_list->data = data;
-      return new_list;
-    }
-  
-  cmp = (*func) (data, tmp_list->data);
-  
-  while ((tmp_list->next) && (cmp > 0))
-    {
-      tmp_list = tmp_list->next;
-      cmp = (*func) (data, tmp_list->data);
-    }
-
-  new_list = g_list_alloc();
-  new_list->data = data;
-
-  if ((!tmp_list->next) && (cmp > 0))
-    {
-      tmp_list->next = new_list;
-      new_list->prev = tmp_list;
-      return list;
-    }
-   
-  if (tmp_list->prev)
-    {
-      tmp_list->prev->next = new_list;
-      new_list->prev = tmp_list->prev;
-    }
-  new_list->next = tmp_list;
-  tmp_list->prev = new_list;
- 
-  if (tmp_list == list)
-    return new_list;
-  else
-    return list;
-}
-
-static GList *
-g_list_sort_merge (GList       *l1, 
-		   GList       *l2,
-		   GCompareFunc compare_func)
-{
-  GList list, *l, *lprev;
-
-  l = &list; 
-  lprev = NULL;
-
-  while (l1 && l2)
-    {
-      if (compare_func (l1->data, l2->data) < 0)
-        {
-	  l->next = l1;
-	  l = l->next;
-	  l->prev = lprev; 
-	  lprev = l;
-	  l1 = l1->next;
-        } 
-      else 
-	{
-	  l->next = l2;
-	  l = l->next;
-	  l->prev = lprev; 
-	  lprev = l;
-	  l2 = l2->next;
-        }
-    }
-  l->next = l1 ? l1 : l2;
-  l->next->prev = l;
-
-  return list.next;
-}
-
-GList* 
-g_list_sort (GList       *list,
-	     GCompareFunc compare_func)
-{
-  GList *l1, *l2;
-  
-  if (!list) 
-    return NULL;
-  if (!list->next) 
-    return list;
-  
-  l1 = list; 
-  l2 = list->next;
-
-  while ((l2 = l2->next) != NULL)
-    {
-      if ((l2 = l2->next) == NULL) 
-	break;
-      l1 = l1->next;
-    }
-  l2 = l1->next; 
-  l1->next = NULL; 
-
-  return g_list_sort_merge (g_list_sort (list, compare_func),
-			    g_list_sort (l2,   compare_func),
-			    compare_func);
-}
-
-GList* 
-g_list_sort2 (GList       *list,
-	      GCompareFunc compare_func)
-{
-  GSList *runs = NULL;
-  GList *tmp;
-
-  /* Degenerate case.  */
-  if (!list) return NULL;
-
-  /* Assume: list = [12,2,4,11,2,4,6,1,1,12].  */
-  for (tmp = list; tmp; )
-    {
-      GList *tmp2;
-      for (tmp2 = tmp;
-	   tmp2->next && compare_func (tmp2->data, tmp2->next->data) <= 0;
-	   tmp2 = tmp2->next)
-	/* Nothing */;
-      runs = g_slist_append (runs, tmp);
-      tmp = tmp2->next;
-      tmp2->next = NULL;
-    }
-  /* Now: runs = [[12],[2,4,11],[2,4,6],[1,1,12]].  */
-  
-  while (runs->next)
-    {
-      /* We have more than one run.  Merge pairwise.  */
-      GSList *dst, *src, *dstprev = NULL;
-      dst = src = runs;
-      while (src && src->next)
-	{
-	  dst->data = g_list_sort_merge (src->data,
-					 src->next->data,
-					 compare_func);
-	  dstprev = dst;
-	  dst = dst->next;
-	  src = src->next->next;
-	}
-
-      /* If number of runs was odd, just keep the last.  */
-      if (src)
-	{
-	  dst->data = src->data;
-	  dstprev = dst;
-	  dst = dst->next;
-	}
-
-      dstprev->next = NULL;
-      g_slist_free (dst);
-    }
-
-  /* After 1st loop: runs = [[2,4,11,12],[1,1,2,4,6,12]].  */
-  /* After 2nd loop: runs = [[1,1,2,2,4,4,6,11,12,12]].  */
-
-  list = runs->data;
-  g_slist_free (runs);
-  return list;
-}
diff --git a/glib/gmain.c b/glib/gmain.c
deleted file mode 100644
index 8ead8a0..0000000
--- a/glib/gmain.c
+++ /dev/null
@@ -1,1392 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * gmain.c: Main loop abstraction, timeouts, and idle functions
- * Copyright 1998 Owen Taylor
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "config.h"
-
-/* uncomment the next line to get poll() debugging info */
-/* #define G_MAIN_POLL_DEBUG */
-
-
-
-#include "glib.h"
-#include <sys/types.h>
-#include <time.h>
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif /* HAVE_SYS_TIME_H */
-#ifdef GLIB_HAVE_SYS_POLL_H
-#  include <sys/poll.h>
-#  undef events	 /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */
-#  undef revents /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */
-#endif /* GLIB_HAVE_SYS_POLL_H */
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif /* HAVE_UNISTD_H */
-#include <errno.h>
-
-#ifdef NATIVE_WIN32
-#define STRICT
-#include <windows.h>
-#endif /* NATIVE_WIN32 */
-
-#ifdef _MSC_VER
-#include <fcntl.h>
-#include <io.h>
-#endif /* _MSC_VER */
-
-/* Types */
-
-typedef struct _GTimeoutData GTimeoutData;
-typedef struct _GSource GSource;
-typedef struct _GPollRec GPollRec;
-
-typedef enum
-{
-  G_SOURCE_READY = 1 << G_HOOK_FLAG_USER_SHIFT,
-  G_SOURCE_CAN_RECURSE = 1 << (G_HOOK_FLAG_USER_SHIFT + 1)
-} GSourceFlags;
-
-struct _GSource
-{
-  GHook hook;
-  gint priority;
-  gpointer source_data;
-};
-
-struct _GMainLoop
-{
-  gboolean is_running;
-};
-
-struct _GTimeoutData
-{
-  GTimeVal    expiration;
-  gint        interval;
-  GSourceFunc callback;
-};
-
-struct _GPollRec
-{
-  gint priority;
-  GPollFD *fd;
-  GPollRec *next;
-};
-
-/* Forward declarations */
-
-static gint     g_source_compare          (GHook      *a,
-					   GHook      *b);
-static void     g_source_destroy_func     (GHookList  *hook_list,
-					   GHook      *hook);
-static void     g_main_poll               (gint      timeout,
-					   gboolean  use_priority, 
-					   gint      priority);
-static void     g_main_add_poll_unlocked  (gint      priority,
-					   GPollFD  *fd);
-static void     g_main_wakeup             (void);
-
-static gboolean g_timeout_prepare      (gpointer  source_data, 
-					GTimeVal *current_time,
-					gint     *timeout,
-					gpointer  user_data);
-static gboolean g_timeout_check        (gpointer  source_data,
-					GTimeVal *current_time,
-					gpointer  user_data);
-static gboolean g_timeout_dispatch     (gpointer  source_data,
-					GTimeVal *dispatch_time,
-					gpointer  user_data);
-static gboolean g_idle_prepare         (gpointer  source_data, 
-					GTimeVal *current_time,
-					gint     *timeout,
-					gpointer  user_data);
-static gboolean g_idle_check           (gpointer  source_data,
-					GTimeVal *current_time,
-					gpointer  user_data);
-static gboolean g_idle_dispatch        (gpointer  source_data,
-					GTimeVal *dispatch_time,
-					gpointer  user_data);
-
-/* Data */
-
-static GSList *pending_dispatches = NULL;
-static GHookList source_list = { 0 };
-static gint in_check_or_prepare = 0;
-
-/* The following lock is used for both the list of sources
- * and the list of poll records
- */
-G_LOCK_DEFINE_STATIC (main_loop);
-
-static GSourceFuncs timeout_funcs =
-{
-  g_timeout_prepare,
-  g_timeout_check,
-  g_timeout_dispatch,
-  g_free,
-};
-
-static GSourceFuncs idle_funcs =
-{
-  g_idle_prepare,
-  g_idle_check,
-  g_idle_dispatch,
-  NULL,
-};
-
-static GPollRec *poll_records = NULL;
-static GPollRec *poll_free_list = NULL;
-static GMemChunk *poll_chunk;
-static guint n_poll_records = 0;
-
-#ifdef G_THREADS_ENABLED
-#ifndef NATIVE_WIN32
-/* this pipe is used to wake up the main loop when a source is added.
- */
-static gint wake_up_pipe[2] = { -1, -1 };
-#else /* NATIVE_WIN32 */
-static HANDLE wake_up_semaphore = NULL;
-#endif /* NATIVE_WIN32 */
-static GPollFD wake_up_rec;
-static gboolean poll_waiting = FALSE;
-
-/* Flag indicating whether the set of fd's changed during a poll */
-static gboolean poll_changed = FALSE;
-#endif /* G_THREADS_ENABLED */
-
-#ifdef HAVE_POLL
-/* SunOS has poll, but doesn't provide a prototype. */
-#  if defined (sun) && !defined (__SVR4)
-extern gint poll (GPollFD *ufds, guint nfsd, gint timeout);
-#  endif  /* !sun */
-static GPollFunc poll_func = (GPollFunc) poll;
-#else	/* !HAVE_POLL */
-#ifdef NATIVE_WIN32
-
-static gint
-g_poll (GPollFD *fds, guint nfds, gint timeout)
-{
-  HANDLE handles[MAXIMUM_WAIT_OBJECTS];
-  GPollFD *f;
-  DWORD ready;
-  MSG msg;
-  UINT timer;
-  LONG prevcnt;
-  gint poll_msgs = -1;
-  gint nhandles = 0;
-
-  for (f = fds; f < &fds[nfds]; ++f)
-    if (f->fd >= 0)
-      {
-	if (f->events & G_IO_IN)
-	  if (f->fd == G_WIN32_MSG_HANDLE)
-	    poll_msgs = f - fds;
-	  else
-	    {
-	      /* g_print ("g_poll: waiting for handle %#x\n", f->fd); */
-	      handles[nhandles++] = (HANDLE) f->fd;
-	    }
-      }
-
-  if (timeout == -1)
-    timeout = INFINITE;
-
-  if (poll_msgs >= 0)
-    {
-      /* Waiting for messages, and maybe events */
-      if (nhandles == 0)
-	{
-	  if (timeout == INFINITE)
-	    {
-	      /* Waiting just for messages, infinite timeout
-	       * -> Use PeekMessage, then WaitMessage
-	       */
-	      /* g_print ("WaitMessage, PeekMessage\n"); */
-	      if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
-		ready = WAIT_OBJECT_0;
-	      else if (!WaitMessage ())
-		g_warning ("g_poll: WaitMessage failed");
-	      ready = WAIT_OBJECT_0;
-	    }
-	  else if (timeout == 0)
-	    {
-	      /* Waiting just for messages, zero timeout
-	       * -> Use PeekMessage
-	       */
-	      /* g_print ("PeekMessage\n"); */
-	      if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
-		ready = WAIT_OBJECT_0;
-	      else
-		ready = WAIT_TIMEOUT;
-	    }
-	  else
-	    {
-	      /* Waiting just for messages, some timeout
-	       * -> First try PeekMessage, then set a timer, wait for message,
-	       * kill timer, use PeekMessage
-	       */
-	      /* g_print ("PeekMessage\n"); */
-	      if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
-		ready = WAIT_OBJECT_0;
-	      else if ((timer = SetTimer (NULL, 0, timeout, NULL)) == 0)
-		g_warning ("g_poll: SetTimer failed");
-	      else
-		{
-		  /* g_print ("WaitMessage\n"); */
-		  WaitMessage ();
-		  KillTimer (NULL, timer);
-		  if (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
-		    ready = WAIT_OBJECT_0;
-		  else
-		    ready = WAIT_TIMEOUT;
-		}
-	    }
-	}
-      else
-	{
-	  /* Wait for either message or event
-	   * -> Use MsgWaitForMultipleObjects
-	   */
-	  /* g_print ("MsgWaitForMultipleObjects(%d, %d)\n", nhandles, timeout); */
-	  ready = MsgWaitForMultipleObjects (nhandles, handles, FALSE,
-					     timeout, QS_ALLINPUT);
-	  /* g_print("=%d\n", ready); */
-	  if (ready == WAIT_FAILED)
-	    g_warning ("g_poll: MsgWaitForMultipleObjects failed");
-	}
-    }
-  else if (nhandles == 0)
-    {
-      /* Wait for nothing (huh?) */
-      return 0;
-    }
-  else
-    {
-      /* Wait for just events
-       * -> Use WaitForMultipleObjects
-       */
-      /* g_print ("WaitForMultipleObjects(%d, %d)\n", nhandles, timeout); */
-      ready = WaitForMultipleObjects (nhandles, handles, FALSE, timeout);
-      /* g_print("=%d\n", ready); */
-      if (ready == WAIT_FAILED)
-	g_warning ("g_poll: WaitForMultipleObjects failed");
-    }
-
-  for (f = fds; f < &fds[nfds]; ++f)
-    f->revents = 0;
-
-  if (ready == WAIT_FAILED)
-    return -1;
-  else if (poll_msgs >= 0 && ready == WAIT_OBJECT_0 + nhandles)
-    {
-      fds[poll_msgs].revents |= G_IO_IN;
-    }
-  else if (ready >= WAIT_OBJECT_0 && ready < WAIT_OBJECT_0 + nhandles)
-    for (f = fds; f < &fds[nfds]; ++f)
-      {
-	if ((f->events & G_IO_IN)
-	    && f->fd == (gint) handles[ready - WAIT_OBJECT_0])
-	  {
-	    f->revents |= G_IO_IN;
-	    /* g_print ("event %#x\n", f->fd); */
-	    ResetEvent ((HANDLE) f->fd);
-	  }
-      }
-    
-  if (ready == WAIT_TIMEOUT)
-    return 0;
-  else
-    return 1;
-}
-
-#else  /* !NATIVE_WIN32 */
-
-/* The following implementation of poll() comes from the GNU C Library.
- * Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
- */
-
-#include <string.h> /* for bzero on BSD systems */
-
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif /* HAVE_SYS_SELECT_H_ */
-
-#ifndef NO_FD_SET
-#  define SELECT_MASK fd_set
-#else /* !NO_FD_SET */
-#  ifndef _AIX
-typedef long fd_mask;
-#  endif /* _AIX */
-#  ifdef _IBMR2
-#    define SELECT_MASK void
-#  else /* !_IBMR2 */
-#    define SELECT_MASK int
-#  endif /* !_IBMR2 */
-#endif /* !NO_FD_SET */
-
-static gint 
-g_poll (GPollFD *fds,
-	guint    nfds,
-	gint     timeout)
-{
-  struct timeval tv;
-  SELECT_MASK rset, wset, xset;
-  GPollFD *f;
-  int ready;
-  int maxfd = 0;
-
-  FD_ZERO (&rset);
-  FD_ZERO (&wset);
-  FD_ZERO (&xset);
-
-  for (f = fds; f < &fds[nfds]; ++f)
-    if (f->fd >= 0)
-      {
-	if (f->events & G_IO_IN)
-	  FD_SET (f->fd, &rset);
-	if (f->events & G_IO_OUT)
-	  FD_SET (f->fd, &wset);
-	if (f->events & G_IO_PRI)
-	  FD_SET (f->fd, &xset);
-	if (f->fd > maxfd && (f->events & (G_IO_IN|G_IO_OUT|G_IO_PRI)))
-	  maxfd = f->fd;
-      }
-
-  tv.tv_sec = timeout / 1000;
-  tv.tv_usec = (timeout % 1000) * 1000;
-
-  ready = select (maxfd + 1, &rset, &wset, &xset,
-		  timeout == -1 ? NULL : &tv);
-  if (ready > 0)
-    for (f = fds; f < &fds[nfds]; ++f)
-      {
-	f->revents = 0;
-	if (f->fd >= 0)
-	  {
-	    if (FD_ISSET (f->fd, &rset))
-	      f->revents |= G_IO_IN;
-	    if (FD_ISSET (f->fd, &wset))
-	      f->revents |= G_IO_OUT;
-	    if (FD_ISSET (f->fd, &xset))
-	      f->revents |= G_IO_PRI;
-	  }
-      }
-
-  return ready;
-}
-
-#endif /* !NATIVE_WIN32 */
-
-static GPollFunc poll_func = g_poll;
-#endif	/* !HAVE_POLL */
-
-/* Hooks for adding to the main loop */
-
-/* Use knowledge of insert_sorted algorithm here to make
- * sure we insert at the end of equal priority items
- */
-static gint
-g_source_compare (GHook *a,
-		  GHook *b)
-{
-  GSource *source_a = (GSource *)a;
-  GSource *source_b = (GSource *)b;
-
-  return (source_a->priority < source_b->priority) ? -1 : 1;
-}
-
-/* HOLDS: main_loop lock */
-static void
-g_source_destroy_func (GHookList *hook_list,
-		       GHook     *hook)
-{
-  GSource *source = (GSource*) hook;
-  GDestroyNotify destroy;
-
-  G_UNLOCK (main_loop);
-
-  destroy = hook->destroy;
-  if (destroy)
-    destroy (hook->data);
-
-  destroy = ((GSourceFuncs*) hook->func)->destroy;
-  if (destroy)
-    destroy (source->source_data);
-
-  G_LOCK (main_loop);
-}
-
-guint 
-g_source_add (gint           priority,
-	      gboolean       can_recurse,
-	      GSourceFuncs  *funcs,
-	      gpointer       source_data, 
-	      gpointer       user_data,
-	      GDestroyNotify notify)
-{
-  guint return_val;
-  GSource *source;
-
-  G_LOCK (main_loop);
-
-  if (!source_list.is_setup)
-    {
-      g_hook_list_init (&source_list, sizeof (GSource));
-
-      source_list.hook_destroy = G_HOOK_DEFERRED_DESTROY;
-      source_list.hook_free = g_source_destroy_func;
-    }
-
-  source = (GSource*) g_hook_alloc (&source_list);
-  source->priority = priority;
-  source->source_data = source_data;
-  source->hook.func = funcs;
-  source->hook.data = user_data;
-  source->hook.destroy = notify;
-  
-  g_hook_insert_sorted (&source_list, 
-			(GHook *)source, 
-			g_source_compare);
-
-  if (can_recurse)
-    source->hook.flags |= G_SOURCE_CAN_RECURSE;
-
-  return_val = source->hook.hook_id;
-
-#ifdef G_THREADS_ENABLED
-  /* Now wake up the main loop if it is waiting in the poll() */
-  g_main_wakeup ();
-#endif
-
-  G_UNLOCK (main_loop);
-
-  return return_val;
-}
-
-gboolean
-g_source_remove (guint tag)
-{
-  GHook *hook;
-
-  g_return_val_if_fail (tag > 0, FALSE);
-
-  G_LOCK (main_loop);
-
-  hook = g_hook_get (&source_list, tag);
-  if (hook)
-    g_hook_destroy_link (&source_list, hook);
-
-  G_UNLOCK (main_loop);
-
-  return hook != NULL;
-}
-
-gboolean
-g_source_remove_by_user_data (gpointer user_data)
-{
-  GHook *hook;
-  
-  G_LOCK (main_loop);
-  
-  hook = g_hook_find_data (&source_list, TRUE, user_data);
-  if (hook)
-    g_hook_destroy_link (&source_list, hook);
-
-  G_UNLOCK (main_loop);
-
-  return hook != NULL;
-}
-
-static gboolean
-g_source_find_source_data (GHook	*hook,
-			   gpointer	 data)
-{
-  GSource *source = (GSource *)hook;
-
-  return (source->source_data == data);
-}
-
-gboolean
-g_source_remove_by_source_data (gpointer source_data)
-{
-  GHook *hook;
-
-  G_LOCK (main_loop);
-
-  hook = g_hook_find (&source_list, TRUE, 
-		      g_source_find_source_data, source_data);
-  if (hook)
-    g_hook_destroy_link (&source_list, hook);
-
-  G_UNLOCK (main_loop);
-
-  return hook != NULL;
-}
-
-static gboolean
-g_source_find_funcs_user_data (GHook   *hook,
-			       gpointer data)
-{
-  gpointer *d = data;
-
-  return hook->func == d[0] && hook->data == d[1];
-}
-
-gboolean
-g_source_remove_by_funcs_user_data (GSourceFuncs *funcs,
-				    gpointer      user_data)
-{
-  gpointer d[2];
-  GHook *hook;
-
-  g_return_val_if_fail (funcs != NULL, FALSE);
-
-  G_LOCK (main_loop);
-
-  d[0] = funcs;
-  d[1] = user_data;
-
-  hook = g_hook_find (&source_list, TRUE,
-		      g_source_find_funcs_user_data, d);
-  if (hook)
-    g_hook_destroy_link (&source_list, hook);
-
-  G_UNLOCK (main_loop);
-
-  return hook != NULL;
-}
-
-void
-g_get_current_time (GTimeVal *result)
-{
-#ifndef _MSC_VER
-  struct timeval r;
-  g_return_if_fail (result != NULL);
-
-  /*this is required on alpha, there the timeval structs are int's
-    not longs and a cast only would fail horribly*/
-  gettimeofday (&r, NULL);
-  result->tv_sec = r.tv_sec;
-  result->tv_usec = r.tv_usec;
-#else
-  /* Avoid calling time() except for the first time.
-   * GetTickCount() should be pretty fast and low-level?
-   * I could also use ftime() but it seems unnecessarily overheady.
-   */
-  static DWORD start_tick = 0;
-  static time_t start_time;
-  DWORD tick;
-  time_t t;
-
-  g_return_if_fail (result != NULL);
- 
-  if (start_tick == 0)
-    {
-      start_tick = GetTickCount ();
-      time (&start_time);
-    }
-
-  tick = GetTickCount ();
-
-  result->tv_sec = (tick - start_tick) / 1000 + start_time;
-  result->tv_usec = ((tick - start_tick) % 1000) * 1000;
-#endif
-}
-
-/* Running the main loop */
-
-/* HOLDS: main_loop_lock */
-static void
-g_main_dispatch (GTimeVal *dispatch_time)
-{
-  while (pending_dispatches != NULL)
-    {
-      gboolean need_destroy;
-      GSource *source = pending_dispatches->data;
-      GSList *tmp_list;
-
-      tmp_list = pending_dispatches;
-      pending_dispatches = g_slist_remove_link (pending_dispatches, pending_dispatches);
-      g_slist_free_1 (tmp_list);
-
-      if (G_HOOK_IS_VALID (source))
-	{
-	  gboolean was_in_call;
-	  gpointer hook_data = source->hook.data;
-	  gpointer source_data = source->source_data;
-	  gboolean (*dispatch) (gpointer,
-				GTimeVal *,
-				gpointer);
-
-	  dispatch = ((GSourceFuncs *) source->hook.func)->dispatch;
-	  
-	  was_in_call = G_HOOK_IN_CALL (source);
-	  source->hook.flags |= G_HOOK_FLAG_IN_CALL;
-
-	  G_UNLOCK (main_loop);
-	  need_destroy = ! dispatch (source_data,
-				     dispatch_time,
-				     hook_data);
-	  G_LOCK (main_loop);
-
-	  if (!was_in_call)
-	    source->hook.flags &= ~G_HOOK_FLAG_IN_CALL;
-	  
-	  if (need_destroy && G_HOOK_IS_VALID (source))
-	    g_hook_destroy_link (&source_list, (GHook *) source);
-	}
-
-      g_hook_unref (&source_list, (GHook*) source);
-    }
-}
-
-/* g_main_iterate () runs a single iteration of the mainloop, or,
- * if !dispatch checks to see if any sources need dispatching.
- * basic algorithm for dispatch=TRUE:
- *
- * 1) while the list of currently pending sources is non-empty,
- *    we call (*dispatch) on those that are !IN_CALL or can_recurse,
- *    removing sources from the list after each returns.
- *    the return value of (*dispatch) determines whether the source
- *    itself is kept alive.
- *
- * 2) call (*prepare) for sources that are not yet SOURCE_READY and
- *    are !IN_CALL or can_recurse. a return value of TRUE determines
- *    that the source would like to be dispatched immediatedly, it
- *    is then flagged as SOURCE_READY.
- *
- * 3) poll with the pollfds from all sources at the priority of the
- *    first source flagged as SOURCE_READY. if there are any sources
- *    flagged as SOURCE_READY, we use a timeout of 0 or the minimum
- *    of all timouts otherwise.
- *
- * 4) for each source !IN_CALL or can_recurse, if SOURCE_READY or
- *    (*check) returns true, add the source to the pending list.
- *    once one source returns true, stop after checking all sources
- *    at that priority.
- *
- * 5) while the list of currently pending sources is non-empty,
- *    call (*dispatch) on each source, removing the source
- *    after the call.
- *
- */
-static gboolean
-g_main_iterate (gboolean block,
-		gboolean dispatch)
-{
-  GHook *hook;
-  GTimeVal current_time  = { 0, 0 };
-  gint n_ready = 0;
-  gint current_priority = 0;
-  gint timeout;
-  gboolean retval = FALSE;
-
-  g_return_val_if_fail (!block || dispatch, FALSE);
-
-  g_get_current_time (&current_time);
-
-  G_LOCK (main_loop);
-
-#ifdef G_THREADS_ENABLED
-  if (poll_waiting)
-    {
-      g_warning("g_main_iterate(): main loop already active in another thread");
-      G_UNLOCK (main_loop);
-      return FALSE;
-    }
-#endif
-  
-  /* If recursing, finish up current dispatch, before starting over */
-  if (pending_dispatches)
-    {
-      if (dispatch)
-	g_main_dispatch (&current_time);
-      
-      G_UNLOCK (main_loop);
-
-      return TRUE;
-    }
-
-  /* Prepare all sources */
-
-  timeout = block ? -1 : 0;
-  
-  hook = g_hook_first_valid (&source_list, TRUE);
-  while (hook)
-    {
-      GSource *source = (GSource*) hook;
-      gint source_timeout = -1;
-
-      if ((n_ready > 0) && (source->priority > current_priority))
-	{
-	  g_hook_unref (&source_list, hook);
-	  break;
-	}
-      if (G_HOOK_IN_CALL (hook) && !(hook->flags & G_SOURCE_CAN_RECURSE))
-	{
-	  hook = g_hook_next_valid (&source_list, hook, TRUE);
-	  continue;
-	}
-
-      if (!(hook->flags & G_SOURCE_READY))
-	{
-	  gboolean (*prepare)  (gpointer  source_data, 
-				GTimeVal *current_time,
-				gint     *timeout,
-				gpointer  user_data);
-
-	  prepare = ((GSourceFuncs *) hook->func)->prepare;
-	  in_check_or_prepare++;
-	  G_UNLOCK (main_loop);
-
-	  if ((*prepare) (source->source_data, &current_time, &source_timeout, source->hook.data))
-	    hook->flags |= G_SOURCE_READY;
-	  
-	  G_LOCK (main_loop);
-	  in_check_or_prepare--;
-	}
-
-      if (hook->flags & G_SOURCE_READY)
-	{
-	  if (!dispatch)
-	    {
-	      g_hook_unref (&source_list, hook);
-	      G_UNLOCK (main_loop);
-
-	      return TRUE;
-	    }
-	  else
-	    {
-	      n_ready++;
-	      current_priority = source->priority;
-	      timeout = 0;
-	    }
-	}
-      
-      if (source_timeout >= 0)
-	{
-	  if (timeout < 0)
-	    timeout = source_timeout;
-	  else
-	    timeout = MIN (timeout, source_timeout);
-	}
-
-      hook = g_hook_next_valid (&source_list, hook, TRUE);
-    }
-
-  /* poll(), if necessary */
-
-  g_main_poll (timeout, n_ready > 0, current_priority);
-
-  if (timeout != 0)
-    g_get_current_time (&current_time);
-  
-  /* Check to see what sources need to be dispatched */
-
-  n_ready = 0;
-  
-  hook = g_hook_first_valid (&source_list, TRUE);
-  while (hook)
-    {
-      GSource *source = (GSource *)hook;
-
-      if ((n_ready > 0) && (source->priority > current_priority))
-	{
-	  g_hook_unref (&source_list, hook);
-	  break;
-	}
-      if (G_HOOK_IN_CALL (hook) && !(hook->flags & G_SOURCE_CAN_RECURSE))
-	{
-	  hook = g_hook_next_valid (&source_list, hook, TRUE);
-	  continue;
-	}
-
-      if (!(hook->flags & G_SOURCE_READY))
-	{
-	  gboolean (*check) (gpointer  source_data,
-			     GTimeVal *current_time,
-			     gpointer  user_data);
-
-	  check = ((GSourceFuncs *) hook->func)->check;
-	  in_check_or_prepare++;
-	  G_UNLOCK (main_loop);
-	  
-	  if ((*check) (source->source_data, &current_time, source->hook.data))
-	    hook->flags |= G_SOURCE_READY;
-
-	  G_LOCK (main_loop);
-	  in_check_or_prepare--;
-	}
-
-      if (hook->flags & G_SOURCE_READY)
-	{
-	  if (dispatch)
-	    {
-	      hook->flags &= ~G_SOURCE_READY;
-	      g_hook_ref (&source_list, hook);
-	      pending_dispatches = g_slist_prepend (pending_dispatches, source);
-	      current_priority = source->priority;
-	      n_ready++;
-	    }
-	  else
-	    {
-	      g_hook_unref (&source_list, hook);
-	      G_UNLOCK (main_loop);
-
-	      return TRUE;
-	    }
-	}
-      
-      hook = g_hook_next_valid (&source_list, hook, TRUE);
-    }
- 
-  /* Now invoke the callbacks */
-
-  if (pending_dispatches)
-    {
-      pending_dispatches = g_slist_reverse (pending_dispatches);
-      g_main_dispatch (&current_time);
-      retval = TRUE;
-    }
-
-  G_UNLOCK (main_loop);
-
-  return retval;
-}
-
-/* See if any events are pending
- */
-gboolean 
-g_main_pending (void)
-{
-  return in_check_or_prepare ? FALSE : g_main_iterate (FALSE, FALSE);
-}
-
-/* Run a single iteration of the mainloop. If block is FALSE,
- * will never block
- */
-gboolean
-g_main_iteration (gboolean block)
-{
-  if (in_check_or_prepare)
-    {
-      g_warning ("g_main_iteration(): called recursively from within a source's check() or "
-		 "prepare() member or from a second thread, iteration not possible");
-      return FALSE;
-    }
-  else
-    return g_main_iterate (block, TRUE);
-}
-
-GMainLoop*
-g_main_new (gboolean is_running)
-{
-  GMainLoop *loop;
-
-  loop = g_new0 (GMainLoop, 1);
-  loop->is_running = is_running != FALSE;
-
-  return loop;
-}
-
-void 
-g_main_run (GMainLoop *loop)
-{
-  g_return_if_fail (loop != NULL);
-
-  if (in_check_or_prepare)
-    {
-      g_warning ("g_main_run(): called recursively from within a source's check() or "
-		 "prepare() member or from a second thread, iteration not possible");
-      return;
-    }
-  
-  loop->is_running = TRUE;
-  while (loop->is_running)
-    g_main_iterate (TRUE, TRUE);
-}
-
-void 
-g_main_quit (GMainLoop *loop)
-{
-  g_return_if_fail (loop != NULL);
-
-  loop->is_running = FALSE;
-}
-
-void 
-g_main_destroy (GMainLoop *loop)
-{
-  g_return_if_fail (loop != NULL);
-
-  g_free (loop);
-}
-
-gboolean
-g_main_is_running (GMainLoop *loop)
-{
-  g_return_val_if_fail (loop != NULL, FALSE);
-
-  return loop->is_running;
-}
-
-/* HOLDS: main_loop_lock */
-static void
-g_main_poll (gint     timeout,
-	     gboolean use_priority,
-	     gint     priority)
-{
-#ifdef  G_MAIN_POLL_DEBUG
-  GTimer *poll_timer;
-#endif
-  GPollFD *fd_array;
-  GPollRec *pollrec;
-  gint i;
-  gint npoll;
-
-#ifdef G_THREADS_ENABLED
-#ifndef NATIVE_WIN32
-  if (wake_up_pipe[0] < 0)
-    {
-      if (pipe (wake_up_pipe) < 0)
-	g_error ("Cannot create pipe main loop wake-up: %s\n",
-		 g_strerror (errno));
-
-      wake_up_rec.fd = wake_up_pipe[0];
-      wake_up_rec.events = G_IO_IN;
-      g_main_add_poll_unlocked (0, &wake_up_rec);
-    }
-#else
-  if (wake_up_semaphore == NULL)
-    {
-      if ((wake_up_semaphore = CreateSemaphore (NULL, 0, 100, NULL)) == NULL)
-	g_error ("Cannot create wake-up semaphore: %d", GetLastError ());
-      wake_up_rec.fd = (gint) wake_up_semaphore;
-      wake_up_rec.events = G_IO_IN;
-      g_main_add_poll_unlocked (0, &wake_up_rec);
-    }
-#endif
-#endif
-  fd_array = g_new (GPollFD, n_poll_records);
- 
-  pollrec = poll_records;
-  i = 0;
-  while (pollrec && (!use_priority || priority >= pollrec->priority))
-    {
-      if (pollrec->fd->events)
-	{
-	  fd_array[i].fd = pollrec->fd->fd;
-	  /* In direct contradiction to the Unix98 spec, IRIX runs into
-	   * difficulty if you pass in POLLERR, POLLHUP or POLLNVAL
-	   * flags in the events field of the pollfd while it should
-	   * just ignoring them. So we mask them out here.
-	   */
-	  fd_array[i].events = pollrec->fd->events & ~(G_IO_ERR|G_IO_HUP|G_IO_NVAL);
-	  fd_array[i].revents = 0;
-	  i++;
-	}
-      
-      pollrec = pollrec->next;
-    }
-#ifdef G_THREADS_ENABLED
-  poll_waiting = TRUE;
-  poll_changed = FALSE;
-#endif
-  
-  npoll = i;
-  if (npoll || timeout != 0)
-    {
-#ifdef	G_MAIN_POLL_DEBUG
-      g_print ("g_main_poll(%d) timeout: %d\r", npoll, timeout);
-      poll_timer = g_timer_new ();
-#endif
-      
-      G_UNLOCK (main_loop);
-      (*poll_func) (fd_array, npoll, timeout);
-      G_LOCK (main_loop);
-      
-#ifdef	G_MAIN_POLL_DEBUG
-      g_print ("g_main_poll(%d) timeout: %d - elapsed %12.10f seconds",
-	       npoll,
-	       timeout,
-	       g_timer_elapsed (poll_timer, NULL));
-      g_timer_destroy (poll_timer);
-      pollrec = poll_records;
-      i = 0;
-      while (i < npoll)
-	{
-	  if (pollrec->fd->events)
-	    {
-	      if (fd_array[i].revents)
-		{
-		  g_print (" [%d:", fd_array[i].fd);
-		  if (fd_array[i].revents & G_IO_IN)
-		    g_print ("i");
-		  if (fd_array[i].revents & G_IO_OUT)
-		    g_print ("o");
-		  if (fd_array[i].revents & G_IO_PRI)
-		    g_print ("p");
-		  if (fd_array[i].revents & G_IO_ERR)
-		    g_print ("e");
-		  if (fd_array[i].revents & G_IO_HUP)
-		    g_print ("h");
-		  if (fd_array[i].revents & G_IO_NVAL)
-		    g_print ("n");
-		  g_print ("]");
-		}
-	      i++;
-	    }
-	  pollrec = pollrec->next;
-	}
-      g_print ("\n");
-#endif
-    } /* if (npoll || timeout != 0) */
-  
-#ifdef G_THREADS_ENABLED
-  if (!poll_waiting)
-    {
-#ifndef NATIVE_WIN32
-      gchar c;
-      read (wake_up_pipe[0], &c, 1);
-#endif
-    }
-  else
-    poll_waiting = FALSE;
-
-  /* If the set of poll file descriptors changed, bail out
-   * and let the main loop rerun
-   */
-  if (poll_changed)
-    {
-      g_free (fd_array);
-      return;
-    }
-#endif
-
-  pollrec = poll_records;
-  i = 0;
-  while (i < npoll)
-    {
-      if (pollrec->fd->events)
-	{
-	  pollrec->fd->revents = fd_array[i].revents;
-	  i++;
-	}
-      pollrec = pollrec->next;
-    }
-
-  g_free (fd_array);
-}
-
-void 
-g_main_add_poll (GPollFD *fd,
-		 gint     priority)
-{
-  G_LOCK (main_loop);
-  g_main_add_poll_unlocked (priority, fd);
-  G_UNLOCK (main_loop);
-}
-
-/* HOLDS: main_loop_lock */
-static void 
-g_main_add_poll_unlocked (gint     priority,
-			  GPollFD *fd)
-{
-  GPollRec *lastrec, *pollrec, *newrec;
-
-  if (!poll_chunk)
-    poll_chunk = g_mem_chunk_create (GPollRec, 32, G_ALLOC_ONLY);
-
-  if (poll_free_list)
-    {
-      newrec = poll_free_list;
-      poll_free_list = newrec->next;
-    }
-  else
-    newrec = g_chunk_new (GPollRec, poll_chunk);
-
-  /* This file descriptor may be checked before we ever poll */
-  fd->revents = 0;
-  newrec->fd = fd;
-  newrec->priority = priority;
-
-  lastrec = NULL;
-  pollrec = poll_records;
-  while (pollrec && priority >= pollrec->priority)
-    {
-      lastrec = pollrec;
-      pollrec = pollrec->next;
-    }
-  
-  if (lastrec)
-    lastrec->next = newrec;
-  else
-    poll_records = newrec;
-
-  newrec->next = pollrec;
-
-  n_poll_records++;
-
-#ifdef G_THREADS_ENABLED
-  poll_changed = TRUE;
-
-  /* Now wake up the main loop if it is waiting in the poll() */
-  g_main_wakeup ();
-#endif
-}
-
-void 
-g_main_remove_poll (GPollFD *fd)
-{
-  GPollRec *pollrec, *lastrec;
-
-  G_LOCK (main_loop);
-  
-  lastrec = NULL;
-  pollrec = poll_records;
-
-  while (pollrec)
-    {
-      if (pollrec->fd == fd)
-	{
-	  if (lastrec != NULL)
-	    lastrec->next = pollrec->next;
-	  else
-	    poll_records = pollrec->next;
-
-	  pollrec->next = poll_free_list;
-	  poll_free_list = pollrec;
-
-	  n_poll_records--;
-	  break;
-	}
-      lastrec = pollrec;
-      pollrec = pollrec->next;
-    }
-
-#ifdef G_THREADS_ENABLED
-  poll_changed = TRUE;
-  
-  /* Now wake up the main loop if it is waiting in the poll() */
-  g_main_wakeup ();
-#endif
-
-  G_UNLOCK (main_loop);
-}
-
-void 
-g_main_set_poll_func (GPollFunc func)
-{
-  if (func)
-    poll_func = func;
-  else
-#ifdef HAVE_POLL
-    poll_func = (GPollFunc) poll;
-#else
-    poll_func = (GPollFunc) g_poll;
-#endif
-}
-
-/* Wake the main loop up from a poll() */
-static void
-g_main_wakeup (void)
-{
-#ifdef G_THREADS_ENABLED
-  if (poll_waiting)
-    {
-      poll_waiting = FALSE;
-#ifndef NATIVE_WIN32
-      write (wake_up_pipe[1], "A", 1);
-#else
-      ReleaseSemaphore (wake_up_semaphore, 1, NULL);
-#endif
-    }
-#endif
-}
-
-/* Timeouts */
-
-static void
-g_timeout_set_expiration (GTimeoutData *data,
-			  GTimeVal     *current_time)
-{
-  guint seconds = data->interval / 1000;
-  guint msecs = data->interval - seconds * 1000;
-
-  data->expiration.tv_sec = current_time->tv_sec + seconds;
-  data->expiration.tv_usec = current_time->tv_usec + msecs * 1000;
-  if (data->expiration.tv_usec >= 1000000)
-    {
-      data->expiration.tv_usec -= 1000000;
-      data->expiration.tv_sec++;
-    }
-}
-
-static gboolean 
-g_timeout_prepare  (gpointer  source_data, 
-		    GTimeVal *current_time,
-		    gint     *timeout,
-		    gpointer  user_data)
-{
-  glong msec;
-  GTimeoutData *data = source_data;
-
-  msec = (data->expiration.tv_sec  - current_time->tv_sec) * 1000 +
-         (data->expiration.tv_usec - current_time->tv_usec) / 1000;
-
-  if (msec < 0)
-    msec = 0;
-  else if (msec > data->interval)
-    {
-      /* The system time has been set backwards, so we 
-       * reset the expiration time to now + data->interval;
-       * this at least avoids hanging for long periods of time.
-       */
-      g_timeout_set_expiration (data, current_time);
-      msec = data->interval;
-    }
-
-  *timeout = msec;
-
-  return (msec == 0);
-}
-
-static gboolean 
-g_timeout_check (gpointer  source_data,
-		 GTimeVal *current_time,
-		 gpointer  user_data)
-{
-  GTimeoutData *data = source_data;
-
-  return (data->expiration.tv_sec < current_time->tv_sec) ||
-         ((data->expiration.tv_sec == current_time->tv_sec) &&
-	  (data->expiration.tv_usec <= current_time->tv_usec));
-}
-
-static gboolean
-g_timeout_dispatch (gpointer source_data, 
-		    GTimeVal *dispatch_time,
-		    gpointer user_data)
-{
-  GTimeoutData *data = source_data;
-
-  if (data->callback (user_data))
-    {
-      g_timeout_set_expiration (data, dispatch_time);
-      return TRUE;
-    }
-  else
-    return FALSE;
-}
-
-guint 
-g_timeout_add_full (gint           priority,
-		    guint          interval, 
-		    GSourceFunc    function,
-		    gpointer       data,
-		    GDestroyNotify notify)
-{
-  GTimeoutData *timeout_data = g_new (GTimeoutData, 1);
-  GTimeVal current_time;
-
-  timeout_data->interval = interval;
-  timeout_data->callback = function;
-  g_get_current_time (&current_time);
-
-  g_timeout_set_expiration (timeout_data, &current_time);
-
-  return g_source_add (priority, FALSE, &timeout_funcs, timeout_data, data, notify);
-}
-
-guint 
-g_timeout_add (guint32        interval,
-	       GSourceFunc    function,
-	       gpointer       data)
-{
-  return g_timeout_add_full (G_PRIORITY_DEFAULT, 
-			     interval, function, data, NULL);
-}
-
-/* Idle functions */
-
-static gboolean 
-g_idle_prepare  (gpointer  source_data, 
-		 GTimeVal *current_time,
-		 gint     *timeout,
-		 gpointer  user_data)
-{
-  *timeout = 0;
-
-  return TRUE;
-}
-
-static gboolean 
-g_idle_check    (gpointer  source_data,
-		 GTimeVal *current_time,
-		 gpointer  user_data)
-{
-  return TRUE;
-}
-
-static gboolean
-g_idle_dispatch (gpointer source_data, 
-		 GTimeVal *dispatch_time,
-		 gpointer user_data)
-{
-  GSourceFunc func = (GSourceFunc) source_data;
-
-  return func (user_data);
-}
-
-guint 
-g_idle_add_full (gint           priority,
-		 GSourceFunc    function,
-		 gpointer       data,
-		 GDestroyNotify notify)
-{
-  g_return_val_if_fail (function != NULL, 0);
-
-  return g_source_add (priority, FALSE, &idle_funcs, (gpointer) function, data, notify);
-}
-
-guint 
-g_idle_add (GSourceFunc    function,
-	    gpointer       data)
-{
-  return g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, function, data, NULL);
-}
-
-gboolean
-g_idle_remove_by_data (gpointer data)
-{
-  return g_source_remove_by_funcs_user_data (&idle_funcs, data);
-}
diff --git a/glib/gmem.c b/glib/gmem.c
deleted file mode 100644
index 08f87b1..0000000
--- a/glib/gmem.c
+++ /dev/null
@@ -1,1008 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include "glib.h"
-
-/* #define ENABLE_MEM_PROFILE */
-/* #define ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS */
-/* #define ENABLE_MEM_CHECK */
-#define MEM_PROFILE_TABLE_SIZE 8192
-
-/*
- * This library can check for some attempts to do illegal things to
- * memory (ENABLE_MEM_CHECK), and can do profiling
- * (ENABLE_MEM_PROFILE).  Both features are implemented by storing
- * words before the start of the memory chunk.
- *
- * The first, at offset -2*SIZEOF_LONG, is used only if
- * ENABLE_MEM_CHECK is set, and stores 0 after the memory has been
- * allocated and 1 when it has been freed.  The second, at offset
- * -SIZEOF_LONG, is used if either flag is set and stores the size of
- * the block.
- *
- * The MEM_CHECK flag is checked when memory is realloc'd and free'd,
- * and it can be explicitly checked before using a block by calling
- * g_mem_check().
- */
-
-#if defined(ENABLE_MEM_PROFILE) && defined(ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS)
-#define ENTER_MEM_CHUNK_ROUTINE() \
-  g_private_set (allocating_for_mem_chunk, \
-		g_private_get (allocating_for_mem_chunk) + 1)
-#define LEAVE_MEM_CHUNK_ROUTINE() \
-  g_private_set (allocating_for_mem_chunk, \
-		g_private_get (allocating_for_mem_chunk) - 1) 
-#else
-#define ENTER_MEM_CHUNK_ROUTINE()
-#define LEAVE_MEM_CHUNK_ROUTINE()
-#endif
-
-
-#define MEM_AREA_SIZE 4L
-
-#if SIZEOF_VOID_P > SIZEOF_LONG
-#define MEM_ALIGN     SIZEOF_VOID_P
-#else
-#define MEM_ALIGN     SIZEOF_LONG
-#endif
-
-
-typedef struct _GFreeAtom      GFreeAtom;
-typedef struct _GMemArea       GMemArea;
-typedef struct _GRealMemChunk  GRealMemChunk;
-
-struct _GFreeAtom
-{
-  GFreeAtom *next;
-};
-
-struct _GMemArea
-{
-  GMemArea *next;            /* the next mem area */
-  GMemArea *prev;            /* the previous mem area */
-  gulong index;              /* the current index into the "mem" array */
-  gulong free;               /* the number of free bytes in this mem area */
-  gulong allocated;          /* the number of atoms allocated from this area */
-  gulong mark;               /* is this mem area marked for deletion */
-  gchar mem[MEM_AREA_SIZE];  /* the mem array from which atoms get allocated
-			      * the actual size of this array is determined by
-			      *  the mem chunk "area_size". ANSI says that it
-			      *  must be declared to be the maximum size it
-			      *  can possibly be (even though the actual size
-			      *  may be less).
-			      */
-};
-
-struct _GRealMemChunk
-{
-  gchar *name;               /* name of this MemChunk...used for debugging output */
-  gint type;                 /* the type of MemChunk: ALLOC_ONLY or ALLOC_AND_FREE */
-  gint num_mem_areas;        /* the number of memory areas */
-  gint num_marked_areas;     /* the number of areas marked for deletion */
-  guint atom_size;           /* the size of an atom */
-  gulong area_size;          /* the size of a memory area */
-  GMemArea *mem_area;        /* the current memory area */
-  GMemArea *mem_areas;       /* a list of all the mem areas owned by this chunk */
-  GMemArea *free_mem_area;   /* the free area...which is about to be destroyed */
-  GFreeAtom *free_atoms;     /* the free atoms list */
-  GTree *mem_tree;           /* tree of mem areas sorted by memory address */
-  GRealMemChunk *next;       /* pointer to the next chunk */
-  GRealMemChunk *prev;       /* pointer to the previous chunk */
-};
-
-
-static gulong g_mem_chunk_compute_size (gulong    size,
-					gulong    min_size);
-static gint   g_mem_chunk_area_compare (GMemArea *a,
-					GMemArea *b);
-static gint   g_mem_chunk_area_search  (GMemArea *a,
-					gchar    *addr);
-
-
-/* here we can't use StaticMutexes, as they depend upon a working
- * g_malloc, the same holds true for StaticPrivate */
-static GMutex* mem_chunks_lock = NULL;
-static GRealMemChunk *mem_chunks = NULL;
-
-#ifdef ENABLE_MEM_PROFILE
-static GMutex* mem_profile_lock;
-static gulong allocations[MEM_PROFILE_TABLE_SIZE] = { 0 };
-static gulong allocated_mem = 0;
-static gulong freed_mem = 0;
-static GPrivate* allocating_for_mem_chunk = NULL;
-#define IS_IN_MEM_CHUNK_ROUTINE() \
-  GPOINTER_TO_UINT (g_private_get (allocating_for_mem_chunk))
-#endif /* ENABLE_MEM_PROFILE */
-
-
-#ifndef USE_DMALLOC
-
-gpointer
-g_malloc (gulong size)
-{
-  gpointer p;
-  
-  
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-  gulong *t;
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-  
-  
-  if (size == 0)
-    return NULL;
-  
-  
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-  size += SIZEOF_LONG;
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-  
-#ifdef ENABLE_MEM_CHECK
-  size += SIZEOF_LONG;
-#endif /* ENABLE_MEM_CHECK */
-  
-  
-  p = (gpointer) malloc (size);
-  if (!p)
-    g_error ("could not allocate %ld bytes", size);
-  
-  
-#ifdef ENABLE_MEM_CHECK
-  size -= SIZEOF_LONG;
-  
-  t = p;
-  p = ((guchar*) p + SIZEOF_LONG);
-  *t = 0;
-#endif /* ENABLE_MEM_CHECK */
-  
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-  size -= SIZEOF_LONG;
-  
-  t = p;
-  p = ((guchar*) p + SIZEOF_LONG);
-  *t = size;
-  
-#ifdef ENABLE_MEM_PROFILE
-  g_mutex_lock (mem_profile_lock);
-#  ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
-  if(!IS_IN_MEM_CHUNK_ROUTINE()) {
-#  endif
-    if (size <= MEM_PROFILE_TABLE_SIZE - 1)
-      allocations[size-1] += 1;
-    else
-      allocations[MEM_PROFILE_TABLE_SIZE - 1] += 1;
-    allocated_mem += size;
-#  ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
-  }
-#  endif
-  g_mutex_unlock (mem_profile_lock);
-#endif /* ENABLE_MEM_PROFILE */
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-  
-  
-  return p;
-}
-
-gpointer
-g_malloc0 (gulong size)
-{
-  gpointer p;
-  
-  
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-  gulong *t;
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-  
-  
-  if (size == 0)
-    return NULL;
-  
-  
-#if defined (ENABLE_MEM_PROFILE) || defined (ENABLE_MEM_CHECK)
-  size += SIZEOF_LONG;
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-  
-#ifdef ENABLE_MEM_CHECK
-  size += SIZEOF_LONG;
-#endif /* ENABLE_MEM_CHECK */
-  
-  
-  p = (gpointer) calloc (size, 1);
-  if (!p)
-    g_error ("could not allocate %ld bytes", size);
-  
-  
-#ifdef ENABLE_MEM_CHECK
-  size -= SIZEOF_LONG;
-  
-  t = p;
-  p = ((guchar*) p + SIZEOF_LONG);
-  *t = 0;
-#endif /* ENABLE_MEM_CHECK */
-  
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-  size -= SIZEOF_LONG;
-  
-  t = p;
-  p = ((guchar*) p + SIZEOF_LONG);
-  *t = size;
-  
-#  ifdef ENABLE_MEM_PROFILE
-  g_mutex_lock (mem_profile_lock);
-#    ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
-  if(!IS_IN_MEM_CHUNK_ROUTINE()) {
-#    endif
-    if (size <= (MEM_PROFILE_TABLE_SIZE - 1))
-      allocations[size-1] += 1;
-    else
-      allocations[MEM_PROFILE_TABLE_SIZE - 1] += 1;
-    allocated_mem += size;
-#    ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
-  }
-#    endif
-  g_mutex_unlock (mem_profile_lock);
-#  endif /* ENABLE_MEM_PROFILE */
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-  
-  
-  return p;
-}
-
-gpointer
-g_realloc (gpointer mem,
-	   gulong   size)
-{
-  gpointer p;
-  
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-  gulong *t;
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-  
-  
-  if (size == 0)
-    {
-      g_free (mem);
-    
-      return NULL;
-    }
-  
-  
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-  size += SIZEOF_LONG;
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-  
-#ifdef ENABLE_MEM_CHECK
-  size += SIZEOF_LONG;
-#endif /* ENABLE_MEM_CHECK */
-  
-  
-  if (!mem)
-    {
-#ifdef REALLOC_0_WORKS
-      p = (gpointer) realloc (NULL, size);
-#else /* !REALLOC_0_WORKS */
-      p = (gpointer) malloc (size);
-#endif /* !REALLOC_0_WORKS */
-    }
-  else
-    {
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-      t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
-#ifdef ENABLE_MEM_PROFILE
-      g_mutex_lock (mem_profile_lock);
-      freed_mem += *t;
-      g_mutex_unlock (mem_profile_lock);
-#endif /* ENABLE_MEM_PROFILE */
-      mem = t;
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-      
-#ifdef ENABLE_MEM_CHECK
-      t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
-      if (*t >= 1)
-	g_warning ("trying to realloc freed memory\n");
-      mem = t;
-#endif /* ENABLE_MEM_CHECK */
-      
-      p = (gpointer) realloc (mem, size);
-    }
-  
-  if (!p)
-    g_error ("could not reallocate %lu bytes", (gulong) size);
-  
-  
-#ifdef ENABLE_MEM_CHECK
-  size -= SIZEOF_LONG;
-  
-  t = p;
-  p = ((guchar*) p + SIZEOF_LONG);
-  *t = 0;
-#endif /* ENABLE_MEM_CHECK */
-  
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-  size -= SIZEOF_LONG;
-  
-  t = p;
-  p = ((guchar*) p + SIZEOF_LONG);
-  *t = size;
-  
-#ifdef ENABLE_MEM_PROFILE
-  g_mutex_lock (mem_profile_lock);
-#ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
-  if(!IS_IN_MEM_CHUNK_ROUTINE()) {
-#endif
-    if (size <= (MEM_PROFILE_TABLE_SIZE - 1))
-      allocations[size-1] += 1;
-    else
-      allocations[MEM_PROFILE_TABLE_SIZE - 1] += 1;
-    allocated_mem += size;
-#ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
-  }
-#endif
-  g_mutex_unlock (mem_profile_lock);
-#endif /* ENABLE_MEM_PROFILE */
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-  
-  
-  return p;
-}
-
-void
-g_free (gpointer mem)
-{
-  if (mem)
-    {
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-      gulong *t;
-      gulong size;
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-      
-#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
-      t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
-      size = *t;
-#ifdef ENABLE_MEM_PROFILE     
-      g_mutex_lock (mem_profile_lock);
-      freed_mem += size;
-      g_mutex_unlock (mem_profile_lock);
-#endif /* ENABLE_MEM_PROFILE */
-      mem = t;
-#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
-      
-#ifdef ENABLE_MEM_CHECK
-      t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
-      if (*t >= 1)
-	g_warning ("freeing previously freed (%lu times) memory\n", *t);
-      *t += 1;
-      mem = t;
-      
-      memset ((guchar*) mem + 2 * SIZEOF_LONG, 0, size);
-#else /* ENABLE_MEM_CHECK */
-      free (mem);
-#endif /* ENABLE_MEM_CHECK */
-    }
-}
-
-#endif /* ! USE_DMALLOC */
-
-
-void
-g_mem_profile (void)
-{
-#ifdef ENABLE_MEM_PROFILE
-  gint i;
-  gulong local_allocations[MEM_PROFILE_TABLE_SIZE];
-  gulong local_allocated_mem;
-  gulong local_freed_mem;  
-
-  g_mutex_lock (mem_profile_lock);
-  for (i = 0; i < MEM_PROFILE_TABLE_SIZE; i++)
-    local_allocations[i] = allocations[i];
-  local_allocated_mem = allocated_mem;
-  local_freed_mem = freed_mem;
-  g_mutex_unlock (mem_profile_lock);
-
-  for (i = 0; i < (MEM_PROFILE_TABLE_SIZE - 1); i++)
-    if (local_allocations[i] > 0)
-      g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
-	     "%lu allocations of %d bytes", local_allocations[i], i + 1);
-  
-  if (local_allocations[MEM_PROFILE_TABLE_SIZE - 1] > 0)
-    g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
-	   "%lu allocations of greater than %d bytes",
-	   local_allocations[MEM_PROFILE_TABLE_SIZE - 1], MEM_PROFILE_TABLE_SIZE - 1);
-  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%lu bytes allocated", local_allocated_mem);
-  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%lu bytes freed", local_freed_mem);
-  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%lu bytes in use", local_allocated_mem - local_freed_mem);
-#endif /* ENABLE_MEM_PROFILE */
-}
-
-void
-g_mem_check (gpointer mem)
-{
-#ifdef ENABLE_MEM_CHECK
-  gulong *t;
-  
-  t = (gulong*) ((guchar*) mem - SIZEOF_LONG - SIZEOF_LONG);
-  
-  if (*t >= 1)
-    g_warning ("mem: 0x%08lx has been freed %lu times\n", (gulong) mem, *t);
-#endif /* ENABLE_MEM_CHECK */
-}
-
-GMemChunk*
-g_mem_chunk_new (gchar  *name,
-		 gint    atom_size,
-		 gulong  area_size,
-		 gint    type)
-{
-  GRealMemChunk *mem_chunk;
-  gulong rarea_size;
-
-  g_return_val_if_fail (atom_size > 0, NULL);
-  g_return_val_if_fail (area_size >= atom_size, NULL);
-
-  ENTER_MEM_CHUNK_ROUTINE();
-
-  area_size = (area_size + atom_size - 1) / atom_size;
-  area_size *= atom_size;
-
-  mem_chunk = g_new (struct _GRealMemChunk, 1);
-  mem_chunk->name = name;
-  mem_chunk->type = type;
-  mem_chunk->num_mem_areas = 0;
-  mem_chunk->num_marked_areas = 0;
-  mem_chunk->mem_area = NULL;
-  mem_chunk->free_mem_area = NULL;
-  mem_chunk->free_atoms = NULL;
-  mem_chunk->mem_tree = NULL;
-  mem_chunk->mem_areas = NULL;
-  mem_chunk->atom_size = atom_size;
-  
-  if (mem_chunk->type == G_ALLOC_AND_FREE)
-    mem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare);
-  
-  if (mem_chunk->atom_size % MEM_ALIGN)
-    mem_chunk->atom_size += MEM_ALIGN - (mem_chunk->atom_size % MEM_ALIGN);
-
-  rarea_size = area_size + sizeof (GMemArea) - MEM_AREA_SIZE;
-  rarea_size = g_mem_chunk_compute_size (rarea_size, atom_size + sizeof (GMemArea) - MEM_AREA_SIZE);
-  mem_chunk->area_size = rarea_size - (sizeof (GMemArea) - MEM_AREA_SIZE);
-
-  g_mutex_lock (mem_chunks_lock);
-  mem_chunk->next = mem_chunks;
-  mem_chunk->prev = NULL;
-  if (mem_chunks)
-    mem_chunks->prev = mem_chunk;
-  mem_chunks = mem_chunk;
-  g_mutex_unlock (mem_chunks_lock);
-
-  LEAVE_MEM_CHUNK_ROUTINE();
-
-  return ((GMemChunk*) mem_chunk);
-}
-
-void
-g_mem_chunk_destroy (GMemChunk *mem_chunk)
-{
-  GRealMemChunk *rmem_chunk;
-  GMemArea *mem_areas;
-  GMemArea *temp_area;
-  
-  g_return_if_fail (mem_chunk != NULL);
-
-  ENTER_MEM_CHUNK_ROUTINE();
-
-  rmem_chunk = (GRealMemChunk*) mem_chunk;
-  
-  mem_areas = rmem_chunk->mem_areas;
-  while (mem_areas)
-    {
-      temp_area = mem_areas;
-      mem_areas = mem_areas->next;
-      g_free (temp_area);
-    }
-  
-  if (rmem_chunk->next)
-    rmem_chunk->next->prev = rmem_chunk->prev;
-  if (rmem_chunk->prev)
-    rmem_chunk->prev->next = rmem_chunk->next;
-  
-  g_mutex_lock (mem_chunks_lock);
-  if (rmem_chunk == mem_chunks)
-    mem_chunks = mem_chunks->next;
-  g_mutex_unlock (mem_chunks_lock);
-  
-  if (rmem_chunk->type == G_ALLOC_AND_FREE)
-    g_tree_destroy (rmem_chunk->mem_tree);
-  
-  g_free (rmem_chunk);
-
-  LEAVE_MEM_CHUNK_ROUTINE();
-}
-
-gpointer
-g_mem_chunk_alloc (GMemChunk *mem_chunk)
-{
-  GRealMemChunk *rmem_chunk;
-  GMemArea *temp_area;
-  gpointer mem;
-
-  ENTER_MEM_CHUNK_ROUTINE();
-
-  g_return_val_if_fail (mem_chunk != NULL, NULL);
-  
-  rmem_chunk = (GRealMemChunk*) mem_chunk;
-  
-  while (rmem_chunk->free_atoms)
-    {
-      /* Get the first piece of memory on the "free_atoms" list.
-       * We can go ahead and destroy the list node we used to keep
-       *  track of it with and to update the "free_atoms" list to
-       *  point to its next element.
-       */
-      mem = rmem_chunk->free_atoms;
-      rmem_chunk->free_atoms = rmem_chunk->free_atoms->next;
-      
-      /* Determine which area this piece of memory is allocated from */
-      temp_area = g_tree_search (rmem_chunk->mem_tree,
-				 (GSearchFunc) g_mem_chunk_area_search,
-				 mem);
-      
-      /* If the area has been marked, then it is being destroyed.
-       *  (ie marked to be destroyed).
-       * We check to see if all of the segments on the free list that
-       *  reference this area have been removed. This occurs when
-       *  the ammount of free memory is less than the allocatable size.
-       * If the chunk should be freed, then we place it in the "free_mem_area".
-       * This is so we make sure not to free the mem area here and then
-       *  allocate it again a few lines down.
-       * If we don't allocate a chunk a few lines down then the "free_mem_area"
-       *  will be freed.
-       * If there is already a "free_mem_area" then we'll just free this mem area.
-       */
-      if (temp_area->mark)
-        {
-          /* Update the "free" memory available in that area */
-          temp_area->free += rmem_chunk->atom_size;
-	  
-          if (temp_area->free == rmem_chunk->area_size)
-            {
-              if (temp_area == rmem_chunk->mem_area)
-                rmem_chunk->mem_area = NULL;
-	      
-              if (rmem_chunk->free_mem_area)
-                {
-                  rmem_chunk->num_mem_areas -= 1;
-		  
-                  if (temp_area->next)
-                    temp_area->next->prev = temp_area->prev;
-                  if (temp_area->prev)
-                    temp_area->prev->next = temp_area->next;
-                  if (temp_area == rmem_chunk->mem_areas)
-                    rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
-		  
-		  if (rmem_chunk->type == G_ALLOC_AND_FREE)
-		    g_tree_remove (rmem_chunk->mem_tree, temp_area);
-                  g_free (temp_area);
-                }
-              else
-                rmem_chunk->free_mem_area = temp_area;
-	      
-	      rmem_chunk->num_marked_areas -= 1;
-	    }
-	}
-      else
-        {
-          /* Update the number of allocated atoms count.
-	   */
-          temp_area->allocated += 1;
-	  
-          /* The area wasn't marked...return the memory
-	   */
-	  goto outa_here;
-        }
-    }
-  
-  /* If there isn't a current mem area or the current mem area is out of space
-   *  then allocate a new mem area. We'll first check and see if we can use
-   *  the "free_mem_area". Otherwise we'll just malloc the mem area.
-   */
-  if ((!rmem_chunk->mem_area) ||
-      ((rmem_chunk->mem_area->index + rmem_chunk->atom_size) > rmem_chunk->area_size))
-    {
-      if (rmem_chunk->free_mem_area)
-        {
-          rmem_chunk->mem_area = rmem_chunk->free_mem_area;
-	  rmem_chunk->free_mem_area = NULL;
-        }
-      else
-        {
-	  rmem_chunk->mem_area = (GMemArea*) g_malloc (sizeof (GMemArea) -
-						       MEM_AREA_SIZE +
-						       rmem_chunk->area_size);
-	  
-	  rmem_chunk->num_mem_areas += 1;
-	  rmem_chunk->mem_area->next = rmem_chunk->mem_areas;
-	  rmem_chunk->mem_area->prev = NULL;
-	  
-	  if (rmem_chunk->mem_areas)
-	    rmem_chunk->mem_areas->prev = rmem_chunk->mem_area;
-	  rmem_chunk->mem_areas = rmem_chunk->mem_area;
-	  
-	  if (rmem_chunk->type == G_ALLOC_AND_FREE)
-	    g_tree_insert (rmem_chunk->mem_tree, rmem_chunk->mem_area, rmem_chunk->mem_area);
-        }
-      
-      rmem_chunk->mem_area->index = 0;
-      rmem_chunk->mem_area->free = rmem_chunk->area_size;
-      rmem_chunk->mem_area->allocated = 0;
-      rmem_chunk->mem_area->mark = 0;
-    }
-  
-  /* Get the memory and modify the state variables appropriately.
-   */
-  mem = (gpointer) &rmem_chunk->mem_area->mem[rmem_chunk->mem_area->index];
-  rmem_chunk->mem_area->index += rmem_chunk->atom_size;
-  rmem_chunk->mem_area->free -= rmem_chunk->atom_size;
-  rmem_chunk->mem_area->allocated += 1;
-
-outa_here:
-
-  LEAVE_MEM_CHUNK_ROUTINE();
-
-  return mem;
-}
-
-gpointer
-g_mem_chunk_alloc0 (GMemChunk *mem_chunk)
-{
-  gpointer mem;
-
-  mem = g_mem_chunk_alloc (mem_chunk);
-  if (mem)
-    {
-      GRealMemChunk *rmem_chunk = (GRealMemChunk*) mem_chunk;
-
-      memset (mem, 0, rmem_chunk->atom_size);
-    }
-
-  return mem;
-}
-
-void
-g_mem_chunk_free (GMemChunk *mem_chunk,
-		  gpointer   mem)
-{
-  GRealMemChunk *rmem_chunk;
-  GMemArea *temp_area;
-  GFreeAtom *free_atom;
-  
-  g_return_if_fail (mem_chunk != NULL);
-  g_return_if_fail (mem != NULL);
-
-  ENTER_MEM_CHUNK_ROUTINE();
-
-  rmem_chunk = (GRealMemChunk*) mem_chunk;
-  
-  /* Don't do anything if this is an ALLOC_ONLY chunk
-   */
-  if (rmem_chunk->type == G_ALLOC_AND_FREE)
-    {
-      /* Place the memory on the "free_atoms" list
-       */
-      free_atom = (GFreeAtom*) mem;
-      free_atom->next = rmem_chunk->free_atoms;
-      rmem_chunk->free_atoms = free_atom;
-      
-      temp_area = g_tree_search (rmem_chunk->mem_tree,
-				 (GSearchFunc) g_mem_chunk_area_search,
-				 mem);
-      
-      temp_area->allocated -= 1;
-      
-      if (temp_area->allocated == 0)
-	{
-	  temp_area->mark = 1;
-	  rmem_chunk->num_marked_areas += 1;
-	}
-    }
-
-  LEAVE_MEM_CHUNK_ROUTINE();
-}
-
-/* This doesn't free the free_area if there is one */
-void
-g_mem_chunk_clean (GMemChunk *mem_chunk)
-{
-  GRealMemChunk *rmem_chunk;
-  GMemArea *mem_area;
-  GFreeAtom *prev_free_atom;
-  GFreeAtom *temp_free_atom;
-  gpointer mem;
-  
-  g_return_if_fail (mem_chunk != NULL);
-  
-  rmem_chunk = (GRealMemChunk*) mem_chunk;
-  
-  if (rmem_chunk->type == G_ALLOC_AND_FREE)
-    {
-      prev_free_atom = NULL;
-      temp_free_atom = rmem_chunk->free_atoms;
-      
-      while (temp_free_atom)
-	{
-	  mem = (gpointer) temp_free_atom;
-	  
-	  mem_area = g_tree_search (rmem_chunk->mem_tree,
-				    (GSearchFunc) g_mem_chunk_area_search,
-				    mem);
-	  
-          /* If this mem area is marked for destruction then delete the
-	   *  area and list node and decrement the free mem.
-           */
-	  if (mem_area->mark)
-	    {
-	      if (prev_free_atom)
-		prev_free_atom->next = temp_free_atom->next;
-	      else
-		rmem_chunk->free_atoms = temp_free_atom->next;
-	      temp_free_atom = temp_free_atom->next;
-	      
-	      mem_area->free += rmem_chunk->atom_size;
-	      if (mem_area->free == rmem_chunk->area_size)
-		{
-		  rmem_chunk->num_mem_areas -= 1;
-		  rmem_chunk->num_marked_areas -= 1;
-		  
-		  if (mem_area->next)
-		    mem_area->next->prev = mem_area->prev;
-		  if (mem_area->prev)
-		    mem_area->prev->next = mem_area->next;
-		  if (mem_area == rmem_chunk->mem_areas)
-		    rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
-		  if (mem_area == rmem_chunk->mem_area)
-		    rmem_chunk->mem_area = NULL;
-		  
-		  if (rmem_chunk->type == G_ALLOC_AND_FREE)
-		    g_tree_remove (rmem_chunk->mem_tree, mem_area);
-		  g_free (mem_area);
-		}
-	    }
-	  else
-	    {
-	      prev_free_atom = temp_free_atom;
-	      temp_free_atom = temp_free_atom->next;
-	    }
-	}
-    }
-}
-
-void
-g_mem_chunk_reset (GMemChunk *mem_chunk)
-{
-  GRealMemChunk *rmem_chunk;
-  GMemArea *mem_areas;
-  GMemArea *temp_area;
-  
-  g_return_if_fail (mem_chunk != NULL);
-  
-  rmem_chunk = (GRealMemChunk*) mem_chunk;
-  
-  mem_areas = rmem_chunk->mem_areas;
-  rmem_chunk->num_mem_areas = 0;
-  rmem_chunk->mem_areas = NULL;
-  rmem_chunk->mem_area = NULL;
-  
-  while (mem_areas)
-    {
-      temp_area = mem_areas;
-      mem_areas = mem_areas->next;
-      g_free (temp_area);
-    }
-  
-  rmem_chunk->free_atoms = NULL;
-  
-  if (rmem_chunk->mem_tree)
-    g_tree_destroy (rmem_chunk->mem_tree);
-  rmem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare);
-}
-
-void
-g_mem_chunk_print (GMemChunk *mem_chunk)
-{
-  GRealMemChunk *rmem_chunk;
-  GMemArea *mem_areas;
-  gulong mem;
-  
-  g_return_if_fail (mem_chunk != NULL);
-  
-  rmem_chunk = (GRealMemChunk*) mem_chunk;
-  mem_areas = rmem_chunk->mem_areas;
-  mem = 0;
-  
-  while (mem_areas)
-    {
-      mem += rmem_chunk->area_size - mem_areas->free;
-      mem_areas = mem_areas->next;
-    }
-  
-  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
-	 "%s: %ld bytes using %d mem areas",
-	 rmem_chunk->name, mem, rmem_chunk->num_mem_areas);
-}
-
-void
-g_mem_chunk_info (void)
-{
-  GRealMemChunk *mem_chunk;
-  gint count;
-  
-  count = 0;
-  g_mutex_lock (mem_chunks_lock);
-  mem_chunk = mem_chunks;
-  while (mem_chunk)
-    {
-      count += 1;
-      mem_chunk = mem_chunk->next;
-    }
-  g_mutex_unlock (mem_chunks_lock);
-  
-  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%d mem chunks", count);
-  
-  g_mutex_lock (mem_chunks_lock);
-  mem_chunk = mem_chunks;
-  g_mutex_unlock (mem_chunks_lock);
-
-  while (mem_chunk)
-    {
-      g_mem_chunk_print ((GMemChunk*) mem_chunk);
-      mem_chunk = mem_chunk->next;
-    }  
-}
-
-void
-g_blow_chunks (void)
-{
-  GRealMemChunk *mem_chunk;
-  
-  g_mutex_lock (mem_chunks_lock);
-  mem_chunk = mem_chunks;
-  g_mutex_unlock (mem_chunks_lock);
-  while (mem_chunk)
-    {
-      g_mem_chunk_clean ((GMemChunk*) mem_chunk);
-      mem_chunk = mem_chunk->next;
-    }
-}
-
-
-static gulong
-g_mem_chunk_compute_size (gulong size,
-			  gulong min_size)
-{
-  gulong power_of_2;
-  gulong lower, upper;
-  
-  power_of_2 = 16;
-  while (power_of_2 < size)
-    power_of_2 <<= 1;
-  
-  lower = power_of_2 >> 1;
-  upper = power_of_2;
-  
-  if (size - lower < upper - size && lower >= min_size)
-    return lower;
-  else
-    return upper;
-}
-
-static gint
-g_mem_chunk_area_compare (GMemArea *a,
-			  GMemArea *b)
-{
-  if (a->mem > b->mem)
-	return 1;
-  else if (a->mem < b->mem)
-	return -1;
-  return 0;
-}
-
-static gint
-g_mem_chunk_area_search (GMemArea *a,
-			 gchar    *addr)
-{
-  if (a->mem <= addr)
-    {
-      if (addr < &a->mem[a->index])
-	return 0;
-      return 1;
-    }
-  return -1;
-}
-
-/* generic allocators
- */
-struct _GAllocator /* from gmem.c */
-{
-  gchar		*name;
-  guint16	 n_preallocs;
-  guint		 is_unused : 1;
-  guint		 type : 4;
-  GAllocator	*last;
-  GMemChunk	*mem_chunk;
-  gpointer	 dummy; /* implementation specific */
-};
-
-GAllocator*
-g_allocator_new (const gchar *name,
-		 guint        n_preallocs)
-{
-  GAllocator *allocator;
-
-  g_return_val_if_fail (name != NULL, NULL);
-
-  allocator = g_new0 (GAllocator, 1);
-  allocator->name = g_strdup (name);
-  allocator->n_preallocs = CLAMP (n_preallocs, 1, 65535);
-  allocator->is_unused = TRUE;
-  allocator->type = 0;
-  allocator->last = NULL;
-  allocator->mem_chunk = NULL;
-  allocator->dummy = NULL;
-
-  return allocator;
-}
-
-void
-g_allocator_free (GAllocator *allocator)
-{
-  g_return_if_fail (allocator != NULL);
-  g_return_if_fail (allocator->is_unused == TRUE);
-
-  g_free (allocator->name);
-  if (allocator->mem_chunk)
-    g_mem_chunk_destroy (allocator->mem_chunk);
-
-  g_free (allocator);
-}
-
-void
-g_mem_init (void)
-{
-  mem_chunks_lock = g_mutex_new();
-#ifdef ENABLE_MEM_PROFILE
-  mem_profile_lock = g_mutex_new();
-  allocating_for_mem_chunk = g_private_new(NULL);
-#endif
-}
diff --git a/glib/gmessages.c b/glib/gmessages.c
deleted file mode 100644
index 9c75c4d..0000000
--- a/glib/gmessages.c
+++ /dev/null
@@ -1,756 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include "glib.h"
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef NATIVE_WIN32
-#define STRICT
-#include <windows.h>
-
-/* Just use stdio. If we're out of memory, we're hosed anyway. */
-#undef write
-
-static inline int
-write (FILE       *fd,
-       const char *buf,
-       int         len)
-{
-  fwrite (buf, len, 1, fd);
-
-  return len;
-}
-
-static void
-ensure_stdout_valid (void)
-{
-  HANDLE handle;
-
-  handle = GetStdHandle (STD_OUTPUT_HANDLE);
-  
-  if (handle == INVALID_HANDLE_VALUE)
-    {
-      AllocConsole ();
-      freopen ("CONOUT$", "w", stdout);
-    }
-}
-#else
-#define ensure_stdout_valid()	/* Define as empty */
-#endif
-	
-
-/* --- structures --- */
-typedef struct _GLogDomain	GLogDomain;
-typedef struct _GLogHandler	GLogHandler;
-struct _GLogDomain
-{
-  gchar		*log_domain;
-  GLogLevelFlags fatal_mask;
-  GLogHandler	*handlers;
-  GLogDomain	*next;
-};
-struct _GLogHandler
-{
-  guint		 id;
-  GLogLevelFlags log_level;
-  GLogFunc	 log_func;
-  gpointer	 data;
-  GLogHandler	*next;
-};
-
-
-/* --- variables --- */
-
-static GMutex* g_messages_lock = NULL;
-
-const gchar	     *g_log_domain_glib = "GLib";
-static GLogDomain    *g_log_domains = NULL;
-static GLogLevelFlags g_log_always_fatal = G_LOG_FATAL_MASK;
-static GPrintFunc     glib_print_func = NULL;
-static GPrintFunc     glib_printerr_func = NULL;
-static GErrorFunc     glib_error_func = NULL;
-static GWarningFunc   glib_warning_func = NULL;
-static GPrintFunc     glib_message_func = NULL;
-
-static GPrivate* g_log_depth = NULL;
-
-
-/* --- functions --- */
-static inline GLogDomain*
-g_log_find_domain (const gchar	  *log_domain)
-{
-  register GLogDomain *domain;
-  
-  g_mutex_lock (g_messages_lock);
-  domain = g_log_domains;
-  while (domain)
-    {
-      if (strcmp (domain->log_domain, log_domain) == 0)
-	{
-	  g_mutex_unlock (g_messages_lock);
-	  return domain;
-	}
-      domain = domain->next;
-    }
-  g_mutex_unlock (g_messages_lock);
-  return NULL;
-}
-
-static inline GLogDomain*
-g_log_domain_new (const gchar *log_domain)
-{
-  register GLogDomain *domain;
-
-  domain = g_new (GLogDomain, 1);
-  domain->log_domain = g_strdup (log_domain);
-  domain->fatal_mask = G_LOG_FATAL_MASK;
-  domain->handlers = NULL;
-  
-  g_mutex_lock (g_messages_lock);
-  domain->next = g_log_domains;
-  g_log_domains = domain;
-  g_mutex_unlock (g_messages_lock);
-  
-  return domain;
-}
-
-static inline void
-g_log_domain_check_free (GLogDomain *domain)
-{
-  if (domain->fatal_mask == G_LOG_FATAL_MASK &&
-      domain->handlers == NULL)
-    {
-      register GLogDomain *last, *work;
-      
-      last = NULL;  
-
-      g_mutex_lock (g_messages_lock);
-      work = g_log_domains;
-      while (work)
-	{
-	  if (work == domain)
-	    {
-	      if (last)
-		last->next = domain->next;
-	      else
-		g_log_domains = domain->next;
-	      g_free (domain->log_domain);
-	      g_free (domain);
-	      break;
-	    }
-	  last = work;
-	  work = last->next;
-	}  
-      g_mutex_unlock (g_messages_lock);
-    }
-}
-
-static inline GLogFunc
-g_log_domain_get_handler (GLogDomain	*domain,
-			  GLogLevelFlags log_level,
-			  gpointer	*data)
-{
-  if (domain && log_level)
-    {
-      register GLogHandler *handler;
-      
-      handler = domain->handlers;
-      while (handler)
-	{
-	  if ((handler->log_level & log_level) == log_level)
-	    {
-	      *data = handler->data;
-	      return handler->log_func;
-	    }
-	  handler = handler->next;
-	}
-    }
-  return g_log_default_handler;
-}
-
-GLogLevelFlags
-g_log_set_always_fatal (GLogLevelFlags fatal_mask)
-{
-  GLogLevelFlags old_mask;
-
-  /* restrict the global mask to levels that are known to glib */
-  fatal_mask &= (1 << G_LOG_LEVEL_USER_SHIFT) - 1;
-  /* force errors to be fatal */
-  fatal_mask |= G_LOG_LEVEL_ERROR;
-  /* remove bogus flag */
-  fatal_mask &= ~G_LOG_FLAG_FATAL;
-
-  g_mutex_lock (g_messages_lock);
-  old_mask = g_log_always_fatal;
-  g_log_always_fatal = fatal_mask;
-  g_mutex_unlock (g_messages_lock);
-
-  return old_mask;
-}
-
-GLogLevelFlags
-g_log_set_fatal_mask (const gchar    *log_domain,
-		      GLogLevelFlags  fatal_mask)
-{
-  GLogLevelFlags old_flags;
-  register GLogDomain *domain;
-  
-  if (!log_domain)
-    log_domain = "";
-  
-  /* force errors to be fatal */
-  fatal_mask |= G_LOG_LEVEL_ERROR;
-  /* remove bogus flag */
-  fatal_mask &= ~G_LOG_FLAG_FATAL;
-  
-  domain = g_log_find_domain (log_domain);
-  if (!domain)
-    domain = g_log_domain_new (log_domain);
-  old_flags = domain->fatal_mask;
-  
-  domain->fatal_mask = fatal_mask;
-  g_log_domain_check_free (domain);
-  
-  return old_flags;
-}
-
-guint
-g_log_set_handler (const gchar	  *log_domain,
-		   GLogLevelFlags  log_levels,
-		   GLogFunc	   log_func,
-		   gpointer	   user_data)
-{
-  register GLogDomain *domain;
-  register GLogHandler *handler;
-  static guint handler_id = 0;
-  
-  g_return_val_if_fail ((log_levels & G_LOG_LEVEL_MASK) != 0, 0);
-  g_return_val_if_fail (log_func != NULL, 0);
-  
-  if (!log_domain)
-    log_domain = "";
-  
-  domain = g_log_find_domain (log_domain);
-  if (!domain)
-    domain = g_log_domain_new (log_domain);
-  
-  handler = g_new (GLogHandler, 1);
-  g_mutex_lock (g_messages_lock);
-  handler->id = ++handler_id;
-  g_mutex_unlock (g_messages_lock);
-  handler->log_level = log_levels;
-  handler->log_func = log_func;
-  handler->data = user_data;
-  handler->next = domain->handlers;
-  domain->handlers = handler;
-  
-  return handler_id;
-}
-
-void
-g_log_remove_handler (const gchar    *log_domain,
-		      guint	      handler_id)
-{
-  register GLogDomain *domain;
-  
-  g_return_if_fail (handler_id > 0);
-  
-  if (!log_domain)
-    log_domain = "";
-  
-  domain = g_log_find_domain (log_domain);
-  if (domain)
-    {
-      register GLogHandler *work, *last;
-      
-      last = NULL;
-      work = domain->handlers;
-      while (work)
-	{
-	  if (work->id == handler_id)
-	    {
-	      if (last)
-		last->next = work->next;
-	      else
-		domain->handlers = work->next;
-	      g_free (work);
-	      g_log_domain_check_free (domain);
-	      return;
-	    }
-	  last = work;
-	  work = last->next;
-	}
-    }
-  g_warning ("g_log_remove_handler(): could not find handler with id `%d' for domain \"%s\"",
-	     handler_id,
-	     log_domain);
-}
-
-void
-g_logv (const gchar    *log_domain,
-	GLogLevelFlags	log_level,
-	const gchar    *format,
-	va_list	        args1)
-{
-  va_list args2;
-  gchar buffer[1025];
-  register gint i;
-  
-  log_level &= G_LOG_LEVEL_MASK;
-  if (!log_level)
-    return;
-  
-  /* we use a stack buffer of fixed size, because we might get called
-   * recursively.
-   */
-  G_VA_COPY (args2, args1);
-  if (g_printf_string_upper_bound (format, args1) < 1024)
-    vsprintf (buffer, format, args2);
-  else
-    {
-      /* since we might be out of memory, we can't use g_vsnprintf(). */
-#ifdef  HAVE_VSNPRINTF
-      vsnprintf (buffer, 1024, format, args2);
-#else	/* !HAVE_VSNPRINTF */
-      /* we are out of luck here */
-      strncpy (buffer, format, 1024);
-#endif	/* !HAVE_VSNPRINTF */
-      buffer[1024] = 0;
-    }
-  va_end (args2);
-  
-  for (i = g_bit_nth_msf (log_level, -1); i >= 0; i = g_bit_nth_msf (log_level, i))
-    {
-      register GLogLevelFlags test_level;
-      
-      test_level = 1 << i;
-      if (log_level & test_level)
-	{
-	  guint depth = GPOINTER_TO_UINT (g_private_get (g_log_depth));
-	  GLogDomain *domain;
-	  GLogFunc log_func;
-	  gpointer data = NULL;
-	  
-	  domain = g_log_find_domain (log_domain ? log_domain : "");
-	  
-	  if (depth)
-	    test_level |= G_LOG_FLAG_RECURSION;
-	  
-	  depth++;
-	  g_private_set (g_log_depth, GUINT_TO_POINTER (depth));
-
-	  g_mutex_lock (g_messages_lock);
-	  if ((((domain ? domain->fatal_mask : G_LOG_FATAL_MASK) | 
-		g_log_always_fatal) & test_level) != 0)
-	    test_level |= G_LOG_FLAG_FATAL;  
-	  g_mutex_unlock (g_messages_lock);
-
-	  log_func = g_log_domain_get_handler (domain, test_level, &data);
-	  log_func (log_domain, test_level, buffer, data);
-	  
-	  /* *domain can be cluttered now */
-	  
-	  if (test_level & G_LOG_FLAG_FATAL)
-	    abort ();
-	  
-	  depth--;
-	  g_private_set (g_log_depth, GUINT_TO_POINTER (depth));
-	}
-    }
-}
-
-void
-g_log (const gchar    *log_domain,
-       GLogLevelFlags  log_level,
-       const gchar    *format,
-       ...)
-{
-  va_list args;
-  
-  va_start (args, format);
-  g_logv (log_domain, log_level, format, args);
-  va_end (args);
-}
-
-void
-g_log_default_handler (const gchar    *log_domain,
-		       GLogLevelFlags  log_level,
-		       const gchar    *message,
-		       gpointer	       unused_data)
-{
-#ifdef NATIVE_WIN32
-  FILE *fd;
-#else
-  gint fd;
-#endif
-  gboolean in_recursion;
-  gboolean is_fatal;  
-  GErrorFunc     local_glib_error_func;
-  GWarningFunc   local_glib_warning_func;
-  GPrintFunc     local_glib_message_func;
-
-  in_recursion = (log_level & G_LOG_FLAG_RECURSION) != 0;
-  is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0;
-  log_level &= G_LOG_LEVEL_MASK;
-  
-  if (!message)
-    message = "g_log_default_handler(): (NULL) message";
-  
-#ifdef NATIVE_WIN32
-  /* Use just stdout as stderr is hard to get redirected from the
-   * DOS prompt.
-   */
-  fd = stdout;
-#else
-  fd = (log_level >= G_LOG_LEVEL_MESSAGE) ? 1 : 2;
-#endif
-  
-  g_mutex_lock (g_messages_lock);
-  local_glib_error_func = glib_error_func;
-  local_glib_warning_func = glib_warning_func;
-  local_glib_message_func = glib_message_func;
-  g_mutex_unlock (g_messages_lock);
-
-  switch (log_level)
-    {
-    case G_LOG_LEVEL_ERROR:
-      if (!log_domain && local_glib_error_func)
-	{
-	  /* compatibility code */
-	  local_glib_error_func (message);  
-	  return;
-	}
-      /* use write(2) for output, in case we are out of memeory */
-      ensure_stdout_valid ();
-      if (log_domain)
-	{
-	  write (fd, "\n", 1);
-	  write (fd, log_domain, strlen (log_domain));
-	  write (fd, "-", 1);
-	}
-      else
-	write (fd, "\n** ", 4);
-      if (in_recursion)
-	write (fd, "ERROR (recursed) **: ", 21);
-      else
-	write (fd, "ERROR **: ", 10);
-      write (fd, message, strlen(message));
-      if (is_fatal)
-	write (fd, "\naborting...\n", 13);
-      else
-	write (fd, "\n", 1);
-      break;
-    case G_LOG_LEVEL_CRITICAL:
-      ensure_stdout_valid ();
-      if (log_domain)
-	{
-	  write (fd, "\n", 1);
-	  write (fd, log_domain, strlen (log_domain));
-	  write (fd, "-", 1);
-	}
-      else
-	write (fd, "\n** ", 4);
-      if (in_recursion)
-	write (fd, "CRITICAL (recursed) **: ", 24);
-      else
-	write (fd, "CRITICAL **: ", 13);
-      write (fd, message, strlen(message));
-      if (is_fatal)
-	write (fd, "\naborting...\n", 13);
-      else
-	write (fd, "\n", 1);
-      break;
-    case G_LOG_LEVEL_WARNING:
-      if (!log_domain && local_glib_warning_func)
-	{
-	  /* compatibility code */
-	  local_glib_warning_func (message);
-	  return;
-	}
-      ensure_stdout_valid ();
-      if (log_domain)
-	{
-	  write (fd, "\n", 1);
-	  write (fd, log_domain, strlen (log_domain));
-	  write (fd, "-", 1);
-	}
-      else
-	write (fd, "\n** ", 4);
-      if (in_recursion)
-	write (fd, "WARNING (recursed) **: ", 23);
-      else
-	write (fd, "WARNING **: ", 12);
-      write (fd, message, strlen(message));
-      if (is_fatal)
-	write (fd, "\naborting...\n", 13);
-      else
-	write (fd, "\n", 1);
-      break;
-    case G_LOG_LEVEL_MESSAGE:
-      if (!log_domain && local_glib_message_func)
-	{
-	  /* compatibility code */
-	  local_glib_message_func (message);
-	  return;
-	}
-      ensure_stdout_valid ();
-      if (log_domain)
-	{
-	  write (fd, log_domain, strlen (log_domain));
-	  write (fd, "-", 1);
-	}
-      if (in_recursion)
-	write (fd, "Message (recursed): ", 20);
-      else
-	write (fd, "Message: ", 9);
-      write (fd, message, strlen(message));
-      if (is_fatal)
-	write (fd, "\naborting...\n", 13);
-      else
-	write (fd, "\n", 1);
-      break;
-    case G_LOG_LEVEL_INFO:
-      ensure_stdout_valid ();
-      if (log_domain)
-	{
-	  write (fd, log_domain, strlen (log_domain));
-	  write (fd, "-", 1);
-	}
-      if (in_recursion)
-	write (fd, "INFO (recursed): ", 17);
-      else
-	write (fd, "INFO: ", 6);
-      write (fd, message, strlen(message));
-      if (is_fatal)
-	write (fd, "\naborting...\n", 13);
-      else
-	write (fd, "\n", 1);
-      break;
-    case G_LOG_LEVEL_DEBUG:
-      ensure_stdout_valid ();
-      if (log_domain)
-	{
-	  write (fd, log_domain, strlen (log_domain));
-	  write (fd, "-", 1);
-	}
-      if (in_recursion)
-	write (fd, "DEBUG (recursed): ", 18);
-      else
-	write (fd, "DEBUG: ", 7);
-      write (fd, message, strlen(message));
-      if (is_fatal)
-	write (fd, "\naborting...\n", 13);
-      else
-	write (fd, "\n", 1);
-      break;
-    default:
-      /* we are used for a log level that is not defined by GLib itself,
-       * try to make the best out of it.
-       */
-      ensure_stdout_valid ();
-      if (log_domain)
-	{
-	  write (fd, log_domain, strlen (log_domain));
-	  if (in_recursion)
-	    write (fd, "-LOG (recursed:", 15);
-	  else
-	    write (fd, "-LOG (", 6);
-	}
-      else if (in_recursion)
-	write (fd, "LOG (recursed:", 14);
-      else
-	write (fd, "LOG (", 5);
-      if (log_level)
-	{
-	  gchar string[] = "0x00): ";
-	  gchar *p = string + 2;
-	  guint i;
-	  
-	  i = g_bit_nth_msf (log_level, -1);
-	  *p = i >> 4;
-	  p++;
-	  *p = '0' + (i & 0xf);
-	  if (*p > '9')
-	    *p += 'A' - '9' - 1;
-	  
-	  write (fd, string, 7);
-	}
-      else
-	write (fd, "): ", 3);
-      write (fd, message, strlen(message));
-      if (is_fatal)
-	write (fd, "\naborting...\n", 13);
-      else
-	write (fd, "\n", 1);
-      break;
-    }
-}
-
-GPrintFunc
-g_set_print_handler (GPrintFunc func)
-{
-  GPrintFunc old_print_func;
-  
-  g_mutex_lock (g_messages_lock);
-  old_print_func = glib_print_func;
-  glib_print_func = func;
-  g_mutex_unlock (g_messages_lock);
-  
-  return old_print_func;
-}
-
-void
-g_print (const gchar *format,
-	 ...)
-{
-  va_list args;
-  gchar *string;
-  GPrintFunc local_glib_print_func;
-  
-  g_return_if_fail (format != NULL);
-  
-  va_start (args, format);
-  string = g_strdup_vprintf (format, args);
-  va_end (args);
-  
-  g_mutex_lock (g_messages_lock);
-  local_glib_print_func = glib_print_func;
-  g_mutex_unlock (g_messages_lock);
-
-  if (local_glib_print_func)
-    local_glib_print_func (string);
-  else
-    {
-      ensure_stdout_valid ();
-      fputs (string, stdout);
-      fflush (stdout);
-    }
-  g_free (string);
-}
-
-GPrintFunc
-g_set_printerr_handler (GPrintFunc func)
-{
-  GPrintFunc old_printerr_func;
-  
-  g_mutex_lock (g_messages_lock);
-  old_printerr_func = glib_printerr_func;
-  glib_printerr_func = func;
-  g_mutex_unlock (g_messages_lock);
-  
-  return old_printerr_func;
-}
-
-void
-g_printerr (const gchar *format,
-	    ...)
-{
-  va_list args;
-  gchar *string;
-  GPrintFunc local_glib_printerr_func;
-  
-  g_return_if_fail (format != NULL);
-  
-  va_start (args, format);
-  string = g_strdup_vprintf (format, args);
-  va_end (args);
-  
-  g_mutex_lock (g_messages_lock);
-  local_glib_printerr_func = glib_printerr_func;
-  g_mutex_unlock (g_messages_lock);
-
-  if (local_glib_printerr_func)
-    local_glib_printerr_func (string);
-  else
-    {
-      fputs (string, stderr);
-      fflush (stderr);
-    }
-  g_free (string);
-}
-
-/* compatibility code */
-GErrorFunc
-g_set_error_handler (GErrorFunc func)
-{
-  GErrorFunc old_error_func;
-  
-  g_mutex_lock (g_messages_lock);
-  old_error_func = glib_error_func;
-  glib_error_func = func;
-  g_mutex_unlock (g_messages_lock);
- 
-  return old_error_func;
-}
-
-/* compatibility code */
-GWarningFunc
-g_set_warning_handler (GWarningFunc func)
-{
-  GWarningFunc old_warning_func;
-  
-  g_mutex_lock (g_messages_lock);
-  old_warning_func = glib_warning_func;
-  glib_warning_func = func;
-  g_mutex_unlock (g_messages_lock);
-  
-  return old_warning_func;
-}
-
-/* compatibility code */
-GPrintFunc
-g_set_message_handler (GPrintFunc func)
-{
-  GPrintFunc old_message_func;
-  
-  g_mutex_lock (g_messages_lock);
-  old_message_func = glib_message_func;
-  glib_message_func = func;
-  g_mutex_unlock (g_messages_lock);
-  
-  return old_message_func;
-}
-
-void
-g_messages_init (void)
-{
-  g_messages_lock = g_mutex_new();
-  g_log_depth = g_private_new(NULL);
-}
diff --git a/glib/gnode.c b/glib/gnode.c
deleted file mode 100644
index 5145c6b..0000000
--- a/glib/gnode.c
+++ /dev/null
@@ -1,965 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * GNode: N-way tree implementation.
- * Copyright (C) 1998 Tim Janik
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-
-/* node allocation
- */
-struct _GAllocator /* from gmem.c */
-{
-  gchar         *name;
-  guint16        n_preallocs;
-  guint          is_unused : 1;
-  guint          type : 4;
-  GAllocator    *last;
-  GMemChunk     *mem_chunk;
-  GNode         *free_nodes; /* implementation specific */
-};
-
-G_LOCK_DEFINE_STATIC (current_allocator);
-static GAllocator *current_allocator = NULL;
-
-/* HOLDS: current_allocator_lock */
-static void
-g_node_validate_allocator (GAllocator *allocator)
-{
-  g_return_if_fail (allocator != NULL);
-  g_return_if_fail (allocator->is_unused == TRUE);
-
-  if (allocator->type != G_ALLOCATOR_NODE)
-    {
-      allocator->type = G_ALLOCATOR_NODE;
-      if (allocator->mem_chunk)
-	{
-	  g_mem_chunk_destroy (allocator->mem_chunk);
-	  allocator->mem_chunk = NULL;
-	}
-    }
-
-  if (!allocator->mem_chunk)
-    {
-      allocator->mem_chunk = g_mem_chunk_new (allocator->name,
-					      sizeof (GNode),
-					      sizeof (GNode) * allocator->n_preallocs,
-					      G_ALLOC_ONLY);
-      allocator->free_nodes = NULL;
-    }
-
-  allocator->is_unused = FALSE;
-}
-
-void
-g_node_push_allocator (GAllocator *allocator)
-{
-  G_LOCK (current_allocator);
-  g_node_validate_allocator ( allocator );
-  allocator->last = current_allocator;
-  current_allocator = allocator;
-  G_UNLOCK (current_allocator);
-}
-
-void
-g_node_pop_allocator (void)
-{
-  G_LOCK (current_allocator);
-  if (current_allocator)
-    {
-      GAllocator *allocator;
-
-      allocator = current_allocator;
-      current_allocator = allocator->last;
-      allocator->last = NULL;
-      allocator->is_unused = TRUE;
-    }
-  G_UNLOCK (current_allocator);
-}
-
-
-/* --- functions --- */
-GNode*
-g_node_new (gpointer data)
-{
-  GNode *node;
-
-  G_LOCK (current_allocator);
-  if (!current_allocator)
-    {
-       GAllocator *allocator = g_allocator_new ("GLib default GNode allocator",
-						128);
-       g_node_validate_allocator (allocator);
-       allocator->last = NULL;
-       current_allocator = allocator;
-    }
-  if (!current_allocator->free_nodes)
-    node = g_chunk_new (GNode, current_allocator->mem_chunk);
-  else
-    {
-      node = current_allocator->free_nodes;
-      current_allocator->free_nodes = node->next;
-    }
-  G_UNLOCK (current_allocator);
-  
-  node->data = data;
-  node->next = NULL;
-  node->prev = NULL;
-  node->parent = NULL;
-  node->children = NULL;
-  
-  return node;
-}
-
-static void
-g_nodes_free (GNode *node)
-{
-  GNode *parent;
-
-  parent = node;
-  while (1)
-    {
-      if (parent->children)
-	g_nodes_free (parent->children);
-      if (parent->next)
-	parent = parent->next;
-      else
-	break;
-    }
-  
-  G_LOCK (current_allocator);
-  parent->next = current_allocator->free_nodes;
-  current_allocator->free_nodes = node;
-  G_UNLOCK (current_allocator);
-}
-
-void
-g_node_destroy (GNode *root)
-{
-  g_return_if_fail (root != NULL);
-  
-  if (!G_NODE_IS_ROOT (root))
-    g_node_unlink (root);
-  
-  g_nodes_free (root);
-}
-
-void
-g_node_unlink (GNode *node)
-{
-  g_return_if_fail (node != NULL);
-  
-  if (node->prev)
-    node->prev->next = node->next;
-  else if (node->parent)
-    node->parent->children = node->next;
-  node->parent = NULL;
-  if (node->next)
-    {
-      node->next->prev = node->prev;
-      node->next = NULL;
-    }
-  node->prev = NULL;
-}
-
-GNode*
-g_node_insert (GNode *parent,
-	       gint   position,
-	       GNode *node)
-{
-  g_return_val_if_fail (parent != NULL, node);
-  g_return_val_if_fail (node != NULL, node);
-  g_return_val_if_fail (G_NODE_IS_ROOT (node), node);
-  
-  if (position > 0)
-    return g_node_insert_before (parent,
-				 g_node_nth_child (parent, position),
-				 node);
-  else if (position == 0)
-    return g_node_prepend (parent, node);
-  else /* if (position < 0) */
-    return g_node_append (parent, node);
-}
-
-GNode*
-g_node_insert_before (GNode *parent,
-		      GNode *sibling,
-		      GNode *node)
-{
-  g_return_val_if_fail (parent != NULL, node);
-  g_return_val_if_fail (node != NULL, node);
-  g_return_val_if_fail (G_NODE_IS_ROOT (node), node);
-  if (sibling)
-    g_return_val_if_fail (sibling->parent == parent, node);
-  
-  node->parent = parent;
-  
-  if (sibling)
-    {
-      if (sibling->prev)
-	{
-	  node->prev = sibling->prev;
-	  node->prev->next = node;
-	  node->next = sibling;
-	  sibling->prev = node;
-	}
-      else
-	{
-	  node->parent->children = node;
-	  node->next = sibling;
-	  sibling->prev = node;
-	}
-    }
-  else
-    {
-      if (parent->children)
-	{
-	  sibling = parent->children;
-	  while (sibling->next)
-	    sibling = sibling->next;
-	  node->prev = sibling;
-	  sibling->next = node;
-	}
-      else
-	node->parent->children = node;
-    }
-
-  return node;
-}
-
-GNode*
-g_node_prepend (GNode *parent,
-		GNode *node)
-{
-  g_return_val_if_fail (parent != NULL, node);
-  
-  return g_node_insert_before (parent, parent->children, node);
-}
-
-GNode*
-g_node_get_root (GNode *node)
-{
-  g_return_val_if_fail (node != NULL, NULL);
-  
-  while (node->parent)
-    node = node->parent;
-  
-  return node;
-}
-
-gboolean
-g_node_is_ancestor (GNode *node,
-		    GNode *descendant)
-{
-  g_return_val_if_fail (node != NULL, FALSE);
-  g_return_val_if_fail (descendant != NULL, FALSE);
-  
-  while (descendant)
-    {
-      if (descendant->parent == node)
-	return TRUE;
-      
-      descendant = descendant->parent;
-    }
-  
-  return FALSE;
-}
-
-/* returns 1 for root, 2 for first level children,
- * 3 for children's children...
- */
-guint
-g_node_depth (GNode *node)
-{
-  register guint depth = 0;
-  
-  while (node)
-    {
-      depth++;
-      node = node->parent;
-    }
-  
-  return depth;
-}
-
-void
-g_node_reverse_children (GNode *node)
-{
-  GNode *child;
-  GNode *last;
-  
-  g_return_if_fail (node != NULL);
-  
-  child = node->children;
-  last = NULL;
-  while (child)
-    {
-      last = child;
-      child = last->next;
-      last->next = last->prev;
-      last->prev = child;
-    }
-  node->children = last;
-}
-
-guint
-g_node_max_height (GNode *root)
-{
-  register GNode *child;
-  register guint max_height = 0;
-  
-  if (!root)
-    return 0;
-  
-  child = root->children;
-  while (child)
-    {
-      register guint tmp_height;
-      
-      tmp_height = g_node_max_height (child);
-      if (tmp_height > max_height)
-	max_height = tmp_height;
-      child = child->next;
-    }
-  
-  return max_height + 1;
-}
-
-static gboolean
-g_node_traverse_pre_order (GNode	    *node,
-			   GTraverseFlags    flags,
-			   GNodeTraverseFunc func,
-			   gpointer	     data)
-{
-  if (node->children)
-    {
-      GNode *child;
-      
-      if ((flags & G_TRAVERSE_NON_LEAFS) &&
-	  func (node, data))
-	return TRUE;
-      
-      child = node->children;
-      while (child)
-	{
-	  register GNode *current;
-	  
-	  current = child;
-	  child = current->next;
-	  if (g_node_traverse_pre_order (current, flags, func, data))
-	    return TRUE;
-	}
-    }
-  else if ((flags & G_TRAVERSE_LEAFS) &&
-	   func (node, data))
-    return TRUE;
-  
-  return FALSE;
-}
-
-static gboolean
-g_node_depth_traverse_pre_order (GNode		  *node,
-				 GTraverseFlags	   flags,
-				 guint		   depth,
-				 GNodeTraverseFunc func,
-				 gpointer	   data)
-{
-  if (node->children)
-    {
-      GNode *child;
-      
-      if ((flags & G_TRAVERSE_NON_LEAFS) &&
-	  func (node, data))
-	return TRUE;
-      
-      depth--;
-      if (!depth)
-	return FALSE;
-      
-      child = node->children;
-      while (child)
-	{
-	  register GNode *current;
-	  
-	  current = child;
-	  child = current->next;
-	  if (g_node_depth_traverse_pre_order (current, flags, depth, func, data))
-	    return TRUE;
-	}
-    }
-  else if ((flags & G_TRAVERSE_LEAFS) &&
-	   func (node, data))
-    return TRUE;
-  
-  return FALSE;
-}
-
-static gboolean
-g_node_traverse_post_order (GNode	     *node,
-			    GTraverseFlags    flags,
-			    GNodeTraverseFunc func,
-			    gpointer	      data)
-{
-  if (node->children)
-    {
-      GNode *child;
-      
-      child = node->children;
-      while (child)
-	{
-	  register GNode *current;
-	  
-	  current = child;
-	  child = current->next;
-	  if (g_node_traverse_post_order (current, flags, func, data))
-	    return TRUE;
-	}
-      
-      if ((flags & G_TRAVERSE_NON_LEAFS) &&
-	  func (node, data))
-	return TRUE;
-      
-    }
-  else if ((flags & G_TRAVERSE_LEAFS) &&
-	   func (node, data))
-    return TRUE;
-  
-  return FALSE;
-}
-
-static gboolean
-g_node_depth_traverse_post_order (GNode		   *node,
-				  GTraverseFlags    flags,
-				  guint		    depth,
-				  GNodeTraverseFunc func,
-				  gpointer	    data)
-{
-  if (node->children)
-    {
-      depth--;
-      if (depth)
-	{
-	  GNode *child;
-	  
-	  child = node->children;
-	  while (child)
-	    {
-	      register GNode *current;
-	      
-	      current = child;
-	      child = current->next;
-	      if (g_node_depth_traverse_post_order (current, flags, depth, func, data))
-		return TRUE;
-	    }
-	}
-      
-      if ((flags & G_TRAVERSE_NON_LEAFS) &&
-	  func (node, data))
-	return TRUE;
-      
-    }
-  else if ((flags & G_TRAVERSE_LEAFS) &&
-	   func (node, data))
-    return TRUE;
-  
-  return FALSE;
-}
-
-static gboolean
-g_node_traverse_in_order (GNode		   *node,
-			  GTraverseFlags    flags,
-			  GNodeTraverseFunc func,
-			  gpointer	    data)
-{
-  if (node->children)
-    {
-      GNode *child;
-      register GNode *current;
-      
-      child = node->children;
-      current = child;
-      child = current->next;
-      
-      if (g_node_traverse_in_order (current, flags, func, data))
-	return TRUE;
-      
-      if ((flags & G_TRAVERSE_NON_LEAFS) &&
-	  func (node, data))
-	return TRUE;
-      
-      while (child)
-	{
-	  current = child;
-	  child = current->next;
-	  if (g_node_traverse_in_order (current, flags, func, data))
-	    return TRUE;
-	}
-    }
-  else if ((flags & G_TRAVERSE_LEAFS) &&
-	   func (node, data))
-    return TRUE;
-  
-  return FALSE;
-}
-
-static gboolean
-g_node_depth_traverse_in_order (GNode		 *node,
-				GTraverseFlags	  flags,
-				guint		  depth,
-				GNodeTraverseFunc func,
-				gpointer	  data)
-{
-  if (node->children)
-    {
-      depth--;
-      if (depth)
-	{
-	  GNode *child;
-	  register GNode *current;
-	  
-	  child = node->children;
-	  current = child;
-	  child = current->next;
-	  
-	  if (g_node_depth_traverse_in_order (current, flags, depth, func, data))
-	    return TRUE;
-	  
-	  if ((flags & G_TRAVERSE_NON_LEAFS) &&
-	      func (node, data))
-	    return TRUE;
-	  
-	  while (child)
-	    {
-	      current = child;
-	      child = current->next;
-	      if (g_node_depth_traverse_in_order (current, flags, depth, func, data))
-		return TRUE;
-	    }
-	}
-      else if ((flags & G_TRAVERSE_NON_LEAFS) &&
-	       func (node, data))
-	return TRUE;
-    }
-  else if ((flags & G_TRAVERSE_LEAFS) &&
-	   func (node, data))
-    return TRUE;
-  
-  return FALSE;
-}
-
-static gboolean
-g_node_traverse_children (GNode		    *node,
-			  GTraverseFlags     flags,
-			  GNodeTraverseFunc  func,
-			  gpointer	     data)
-{
-  GNode *child;
-  
-  child = node->children;
-  
-  while (child)
-    {
-      register GNode *current;
-      
-      current = child;
-      child = current->next;
-      
-      if (current->children)
-	{
-	  if ((flags & G_TRAVERSE_NON_LEAFS) &&
-	      func (current, data))
-	    return TRUE;
-	}
-      else if ((flags & G_TRAVERSE_LEAFS) &&
-	       func (current, data))
-	return TRUE;
-    }
-  
-  child = node->children;
-  
-  while (child)
-    {
-      register GNode *current;
-      
-      current = child;
-      child = current->next;
-      
-      if (current->children &&
-	  g_node_traverse_children (current, flags, func, data))
-	return TRUE;
-    }
-  
-  return FALSE;
-}
-
-static gboolean
-g_node_depth_traverse_children (GNode		 *node,
-				GTraverseFlags	  flags,
-				guint		  depth,
-				GNodeTraverseFunc func,
-				gpointer	  data)
-{
-  GNode *child;
-  
-  child = node->children;
-  
-  while (child)
-    {
-      register GNode *current;
-      
-      current = child;
-      child = current->next;
-      
-      if (current->children)
-	{
-	  if ((flags & G_TRAVERSE_NON_LEAFS) &&
-	      func (current, data))
-	    return TRUE;
-	}
-      else if ((flags & G_TRAVERSE_LEAFS) &&
-	       func (current, data))
-	return TRUE;
-    }
-  
-  depth--;
-  if (!depth)
-    return FALSE;
-  
-  child = node->children;
-  
-  while (child)
-    {
-      register GNode *current;
-      
-      current = child;
-      child = current->next;
-      
-      if (current->children &&
-	  g_node_depth_traverse_children (current, flags, depth, func, data))
-	return TRUE;
-    }
-  
-  return FALSE;
-}
-
-void
-g_node_traverse (GNode		  *root,
-		 GTraverseType	   order,
-		 GTraverseFlags	   flags,
-		 gint		   depth,
-		 GNodeTraverseFunc func,
-		 gpointer	   data)
-{
-  g_return_if_fail (root != NULL);
-  g_return_if_fail (func != NULL);
-  g_return_if_fail (order <= G_LEVEL_ORDER);
-  g_return_if_fail (flags <= G_TRAVERSE_MASK);
-  g_return_if_fail (depth == -1 || depth > 0);
-  
-  switch (order)
-    {
-    case G_PRE_ORDER:
-      if (depth < 0)
-	g_node_traverse_pre_order (root, flags, func, data);
-      else
-	g_node_depth_traverse_pre_order (root, flags, depth, func, data);
-      break;
-    case G_POST_ORDER:
-      if (depth < 0)
-	g_node_traverse_post_order (root, flags, func, data);
-      else
-	g_node_depth_traverse_post_order (root, flags, depth, func, data);
-      break;
-    case G_IN_ORDER:
-      if (depth < 0)
-	g_node_traverse_in_order (root, flags, func, data);
-      else
-	g_node_depth_traverse_in_order (root, flags, depth, func, data);
-      break;
-    case G_LEVEL_ORDER:
-      if (root->children)
-	{
-	  if (!((flags & G_TRAVERSE_NON_LEAFS) &&
-		func (root, data)))
-	    {
-	      if (depth < 0)
-		g_node_traverse_children (root, flags, func, data);
-	      else
-		{
-		  depth--;
-		  if (depth)
-		    g_node_depth_traverse_children (root, flags, depth, func, data);
-		}
-	    }
-	}
-      else if (flags & G_TRAVERSE_LEAFS)
-	func (root, data);
-      break;
-    }
-}
-
-static gboolean
-g_node_find_func (GNode	  *node,
-		  gpointer data)
-{
-  register gpointer *d = data;
-  
-  if (*d != node->data)
-    return FALSE;
-  
-  *(++d) = node;
-  
-  return TRUE;
-}
-
-GNode*
-g_node_find (GNode	       *root,
-	     GTraverseType	order,
-	     GTraverseFlags	flags,
-	     gpointer		data)
-{
-  gpointer d[2];
-  
-  g_return_val_if_fail (root != NULL, NULL);
-  g_return_val_if_fail (order <= G_LEVEL_ORDER, NULL);
-  g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL);
-  
-  d[0] = data;
-  d[1] = NULL;
-  
-  g_node_traverse (root, order, flags, -1, g_node_find_func, d);
-  
-  return d[1];
-}
-
-static void
-g_node_count_func (GNode	 *node,
-		   GTraverseFlags flags,
-		   guint	 *n)
-{
-  if (node->children)
-    {
-      GNode *child;
-      
-      if (flags & G_TRAVERSE_NON_LEAFS)
-	(*n)++;
-      
-      child = node->children;
-      while (child)
-	{
-	  g_node_count_func (child, flags, n);
-	  child = child->next;
-	}
-    }
-  else if (flags & G_TRAVERSE_LEAFS)
-    (*n)++;
-}
-
-guint
-g_node_n_nodes (GNode	      *root,
-		GTraverseFlags flags)
-{
-  guint n = 0;
-  
-  g_return_val_if_fail (root != NULL, 0);
-  g_return_val_if_fail (flags <= G_TRAVERSE_MASK, 0);
-  
-  g_node_count_func (root, flags, &n);
-  
-  return n;
-}
-
-GNode*
-g_node_last_child (GNode *node)
-{
-  g_return_val_if_fail (node != NULL, NULL);
-  
-  node = node->children;
-  if (node)
-    while (node->next)
-      node = node->next;
-  
-  return node;
-}
-
-GNode*
-g_node_nth_child (GNode *node,
-		  guint	 n)
-{
-  g_return_val_if_fail (node != NULL, NULL);
-  
-  node = node->children;
-  if (node)
-    while ((n-- > 0) && node)
-      node = node->next;
-  
-  return node;
-}
-
-guint
-g_node_n_children (GNode *node)
-{
-  guint n = 0;
-  
-  g_return_val_if_fail (node != NULL, 0);
-  
-  node = node->children;
-  while (node)
-    {
-      n++;
-      node = node->next;
-    }
-  
-  return n;
-}
-
-GNode*
-g_node_find_child (GNode	 *node,
-		   GTraverseFlags flags,
-		   gpointer	  data)
-{
-  g_return_val_if_fail (node != NULL, NULL);
-  g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL);
-  
-  node = node->children;
-  while (node)
-    {
-      if (node->data == data)
-	{
-	  if (G_NODE_IS_LEAF (node))
-	    {
-	      if (flags & G_TRAVERSE_LEAFS)
-		return node;
-	    }
-	  else
-	    {
-	      if (flags & G_TRAVERSE_NON_LEAFS)
-		return node;
-	    }
-	}
-      node = node->next;
-    }
-  
-  return NULL;
-}
-
-gint
-g_node_child_position (GNode *node,
-		       GNode *child)
-{
-  register guint n = 0;
-  
-  g_return_val_if_fail (node != NULL, -1);
-  g_return_val_if_fail (child != NULL, -1);
-  g_return_val_if_fail (child->parent == node, -1);
-  
-  node = node->children;
-  while (node)
-    {
-      if (node == child)
-	return n;
-      n++;
-      node = node->next;
-    }
-  
-  return -1;
-}
-
-gint
-g_node_child_index (GNode   *node,
-		    gpointer data)
-{
-  register guint n = 0;
-  
-  g_return_val_if_fail (node != NULL, -1);
-  
-  node = node->children;
-  while (node)
-    {
-      if (node->data == data)
-	return n;
-      n++;
-      node = node->next;
-    }
-  
-  return -1;
-}
-
-GNode*
-g_node_first_sibling (GNode *node)
-{
-  g_return_val_if_fail (node != NULL, NULL);
-  
-  while (node->prev)
-    node = node->prev;
-  
-  return node;
-}
-
-GNode*
-g_node_last_sibling (GNode *node)
-{
-  g_return_val_if_fail (node != NULL, NULL);
-  
-  while (node->next)
-    node = node->next;
-  
-  return node;
-}
-
-void
-g_node_children_foreach (GNode		 *node,
-			 GTraverseFlags	  flags,
-			 GNodeForeachFunc func,
-			 gpointer	  data)
-{
-  g_return_if_fail (node != NULL);
-  g_return_if_fail (flags <= G_TRAVERSE_MASK);
-  g_return_if_fail (func != NULL);
-  
-  node = node->children;
-  while (node)
-    {
-      register GNode *current;
-      
-      current = node;
-      node = current->next;
-      if (G_NODE_IS_LEAF (current))
-	{
-	  if (flags & G_TRAVERSE_LEAFS)
-	    func (current, data);
-	}
-      else
-	{
-	  if (flags & G_TRAVERSE_NON_LEAFS)
-	    func (current, data);
-	}
-    }
-}
diff --git a/glib/gprimes.c b/glib/gprimes.c
deleted file mode 100644
index c6109bf..0000000
--- a/glib/gprimes.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-
-static const guint g_primes[] =
-{
-  11,
-  19,
-  37,
-  73,
-  109,
-  163,
-  251,
-  367,
-  557,
-  823,
-  1237,
-  1861,
-  2777,
-  4177,
-  6247,
-  9371,
-  14057,
-  21089,
-  31627,
-  47431,
-  71143,
-  106721,
-  160073,
-  240101,
-  360163,
-  540217,
-  810343,
-  1215497,
-  1823231,
-  2734867,
-  4102283,
-  6153409,
-  9230113,
-  13845163,
-};
-
-static const guint g_nprimes = sizeof (g_primes) / sizeof (g_primes[0]);
-
-guint
-g_spaced_primes_closest (guint num)
-{
-  gint i;
-
-  for (i = 0; i < g_nprimes; i++)
-    if (g_primes[i] > num)
-      return g_primes[i];
-
-  return g_primes[g_nprimes - 1];
-}
diff --git a/glib/grel.c b/glib/grel.c
deleted file mode 100644
index 4358cdc..0000000
--- a/glib/grel.c
+++ /dev/null
@@ -1,459 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-#include <stdarg.h>
-#include <string.h>
-
-typedef struct _GRealRelation      GRealRelation;
-typedef struct _GRealTuples        GRealTuples;
-
-struct _GRealRelation
-{
-  gint fields;
-  gint current_field;
-  
-  GHashTable   *all_tuples;
-  GHashTable  **hashed_tuple_tables;
-  GMemChunk    *tuple_chunk;
-  
-  gint count;
-};
-
-struct _GRealTuples
-{
-  gint      len;
-  gint      width;
-  gpointer *data;
-};
-
-static gboolean
-tuple_equal_2 (gconstpointer v_a,
-	       gconstpointer v_b)
-{
-  gpointer* a = (gpointer*) v_a;
-  gpointer* b = (gpointer*) v_b;
-  
-  return a[0] == b[0] && a[1] == b[1];
-}
-
-static guint
-tuple_hash_2 (gconstpointer v_a)
-{
-  gpointer* a = (gpointer*) v_a;
-  
-  return (gulong)a[0] ^ (gulong)a[1];
-}
-
-static GHashFunc
-tuple_hash (gint fields)
-{
-  switch (fields)
-    {
-    case 2:
-      return tuple_hash_2;
-    default:
-      g_error ("no tuple hash for %d", fields);
-    }
-  
-  return NULL;
-}
-
-static GCompareFunc
-tuple_equal (gint fields)
-{
-  switch (fields)
-    {
-    case 2:
-      return tuple_equal_2;
-    default:
-      g_error ("no tuple equal for %d", fields);
-    }
-  
-  return NULL;
-}
-
-GRelation*
-g_relation_new (gint fields)
-{
-  GRealRelation* rel = g_new0 (GRealRelation, 1);
-  
-  rel->fields = fields;
-  rel->tuple_chunk = g_mem_chunk_new ("Relation Chunk",
-				      fields * sizeof (gpointer),
-				      fields * sizeof (gpointer) * 128,
-				      G_ALLOC_AND_FREE);
-  rel->all_tuples = g_hash_table_new (tuple_hash (fields), tuple_equal (fields));
-  rel->hashed_tuple_tables = g_new0 (GHashTable*, fields);
-  
-  return (GRelation*) rel;
-}
-
-static void
-g_relation_free_array (gpointer key, gpointer value, gpointer user_data)
-{
-  g_hash_table_destroy ((GHashTable*) value);
-}
-
-void
-g_relation_destroy (GRelation *relation)
-{
-  GRealRelation *rel = (GRealRelation *) relation;
-  gint i;
-  
-  if (rel)
-    {
-      g_hash_table_destroy (rel->all_tuples);
-      g_mem_chunk_destroy (rel->tuple_chunk);
-      
-      for (i = 0; i < rel->fields; i += 1)
-	{
-	  if (rel->hashed_tuple_tables[i])
-	    {
-	      g_hash_table_foreach (rel->hashed_tuple_tables[i], g_relation_free_array, NULL);
-	      g_hash_table_destroy (rel->hashed_tuple_tables[i]);
-	    }
-	}
-      
-      g_free (rel->hashed_tuple_tables);
-      g_free (rel);
-    }
-}
-
-void
-g_relation_index (GRelation   *relation,
-		  gint         field,
-		  GHashFunc    hash_func,
-		  GCompareFunc key_compare_func)
-{
-  GRealRelation *rel = (GRealRelation *) relation;
-
-  g_return_if_fail (relation != NULL);
-  
-  g_return_if_fail (rel->count == 0 && rel->hashed_tuple_tables[field] == NULL);
-  
-  rel->hashed_tuple_tables[field] = g_hash_table_new (hash_func, key_compare_func);
-}
-
-void
-g_relation_insert (GRelation   *relation,
-		   ...)
-{
-  GRealRelation *rel = (GRealRelation *) relation;
-  gpointer* tuple = g_chunk_new (gpointer, rel->tuple_chunk);
-  va_list args;
-  gint i;
-  
-  va_start(args, relation);
-  
-  for (i = 0; i < rel->fields; i += 1)
-    tuple[i] = va_arg(args, gpointer);
-  
-  va_end(args);
-  
-  g_hash_table_insert (rel->all_tuples, tuple, tuple);
-  
-  rel->count += 1;
-  
-  for (i = 0; i < rel->fields; i += 1)
-    {
-      GHashTable *table;
-      gpointer    key;
-      GHashTable *per_key_table;
-      
-      table = rel->hashed_tuple_tables[i];
-      
-      if (table == NULL)
-	continue;
-      
-      key = tuple[i];
-      per_key_table = g_hash_table_lookup (table, key);
-      
-      if (per_key_table == NULL)
-	{
-	  per_key_table = g_hash_table_new (tuple_hash (rel->fields), tuple_equal (rel->fields));
-	  g_hash_table_insert (table, key, per_key_table);
-	}
-      
-      g_hash_table_insert (per_key_table, tuple, tuple);
-    }
-}
-
-static void
-g_relation_delete_tuple (gpointer tuple_key,
-			 gpointer tuple_value,
-			 gpointer user_data)
-{
-  gpointer      *tuple = (gpointer*) tuple_value;
-  GRealRelation *rel = (GRealRelation *) user_data;
-  gint           j;
-  
-  g_assert (tuple_key == tuple_value);
-  
-  for (j = 0; j < rel->fields; j += 1)
-    {
-      GHashTable *one_table = rel->hashed_tuple_tables[j];
-      gpointer    one_key;
-      GHashTable *per_key_table;
-      
-      if (one_table == NULL)
-	continue;
-      
-      if (j == rel->current_field)
-	/* can't delete from the table we're foreaching in */
-	continue;
-      
-      one_key = tuple[j];
-      
-      per_key_table = g_hash_table_lookup (one_table, one_key);
-      
-      g_hash_table_remove (per_key_table, tuple);
-    }
-  
-  g_hash_table_remove (rel->all_tuples, tuple);
-  
-  rel->count -= 1;
-}
-
-gint
-g_relation_delete  (GRelation     *relation,
-		    gconstpointer  key,
-		    gint           field)
-{
-  GRealRelation *rel = (GRealRelation *) relation;
-  GHashTable *table = rel->hashed_tuple_tables[field];
-  GHashTable *key_table;
-  gint        count = rel->count;
-  
-  g_return_val_if_fail (relation != NULL, 0);
-  g_return_val_if_fail (table != NULL, 0);
-  
-  key_table = g_hash_table_lookup (table, key);
-  
-  if (!key_table)
-    return 0;
-  
-  rel->current_field = field;
-  
-  g_hash_table_foreach (key_table, g_relation_delete_tuple, rel);
-  
-  g_hash_table_remove (table, key);
-  
-  g_hash_table_destroy (key_table);
-  
-  /* @@@ FIXME: Remove empty hash tables. */
-  
-  return count - rel->count;
-}
-
-static void
-g_relation_select_tuple (gpointer tuple_key,
-			 gpointer tuple_value,
-			 gpointer user_data)
-{
-  gpointer    *tuple = (gpointer*) tuple_value;
-  GRealTuples *tuples = (GRealTuples*) user_data;
-  gint stride = sizeof (gpointer) * tuples->width;
-  
-  g_assert (tuple_key == tuple_value);
-  
-  memcpy (tuples->data + (tuples->len * tuples->width),
-	  tuple,
-	  stride);
-  
-  tuples->len += 1;
-}
-
-GTuples*
-g_relation_select (GRelation     *relation,
-		   gconstpointer  key,
-		   gint           field)
-{
-  GRealRelation *rel = (GRealRelation *) relation;
-  GHashTable  *table = rel->hashed_tuple_tables[field];
-  GHashTable  *key_table;
-  GRealTuples *tuples = g_new0 (GRealTuples, 1);
-  gint count;
-  
-  g_return_val_if_fail (relation != NULL, NULL);
-  g_return_val_if_fail (table != NULL, NULL);
-  
-  key_table = g_hash_table_lookup (table, key);
-  
-  if (!key_table)
-    return (GTuples*)tuples;
-  
-  count = g_relation_count (relation, key, field);
-  
-  tuples->data = g_malloc (sizeof (gpointer) * rel->fields * count);
-  tuples->width = rel->fields;
-  
-  g_hash_table_foreach (key_table, g_relation_select_tuple, tuples);
-  
-  g_assert (count == tuples->len);
-  
-  return (GTuples*)tuples;
-}
-
-gint
-g_relation_count (GRelation     *relation,
-		  gconstpointer  key,
-		  gint           field)
-{
-  GRealRelation *rel = (GRealRelation *) relation;
-  GHashTable  *table = rel->hashed_tuple_tables[field];
-  GHashTable  *key_table;
-  
-  g_return_val_if_fail (relation != NULL, 0);
-  g_return_val_if_fail (table != NULL, 0);
-  
-  key_table = g_hash_table_lookup (table, key);
-  
-  if (!key_table)
-    return 0;
-  
-  return g_hash_table_size (key_table);
-}
-
-gboolean
-g_relation_exists (GRelation   *relation, ...)
-{
-  GRealRelation *rel = (GRealRelation *) relation;
-  gpointer* tuple = g_chunk_new (gpointer, rel->tuple_chunk);
-  va_list args;
-  gint i;
-  gboolean result;
-  
-  va_start(args, relation);
-  
-  for (i = 0; i < rel->fields; i += 1)
-    tuple[i] = va_arg(args, gpointer);
-  
-  va_end(args);
-  
-  result = g_hash_table_lookup (rel->all_tuples, tuple) != NULL;
-  
-  g_mem_chunk_free (rel->tuple_chunk, tuple);
-  
-  return result;
-}
-
-void
-g_tuples_destroy (GTuples *tuples0)
-{
-  GRealTuples *tuples = (GRealTuples*) tuples0;
-  
-  if (tuples)
-    {
-      g_free (tuples->data);
-      g_free (tuples);
-    }
-}
-
-gpointer
-g_tuples_index (GTuples     *tuples0,
-		gint         index,
-		gint         field)
-{
-  GRealTuples *tuples = (GRealTuples*) tuples0;
-  
-  g_return_val_if_fail (tuples0 != NULL, NULL);
-  g_return_val_if_fail (field < tuples->width, NULL);
-  
-  return tuples->data[index * tuples->width + field];
-}
-
-/* Print
- */
-
-static void
-g_relation_print_one (gpointer tuple_key,
-		      gpointer tuple_value,
-		      gpointer user_data)
-{
-  gint i;
-  GString *gstring;
-  GRealRelation* rel = (GRealRelation*) user_data;
-  gpointer* tuples = (gpointer*) tuple_value;
-
-  gstring = g_string_new ("[");
-  
-  for (i = 0; i < rel->fields; i += 1)
-    {
-      g_string_sprintfa (gstring, "%p", tuples[i]);
-      
-      if (i < (rel->fields - 1))
-	g_string_append (gstring, ",");
-    }
-  
-  g_string_append (gstring, "]");
-  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, gstring->str);
-  g_string_free (gstring, TRUE);
-}
-
-static void
-g_relation_print_index (gpointer tuple_key,
-			gpointer tuple_value,
-			gpointer user_data)
-{
-  GRealRelation* rel = (GRealRelation*) user_data;
-  GHashTable* table = (GHashTable*) tuple_value;
-  
-  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "*** key %p", tuple_key);
-  
-  g_hash_table_foreach (table,
-			g_relation_print_one,
-			rel);
-}
-
-void
-g_relation_print (GRelation *relation)
-{
-  gint i;
-  GRealRelation* rel = (GRealRelation*) relation;
-  
-  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "*** all tuples (%d)", rel->count);
-  
-  g_hash_table_foreach (rel->all_tuples,
-			g_relation_print_one,
-			rel);
-  
-  for (i = 0; i < rel->fields; i += 1)
-    {
-      if (rel->hashed_tuple_tables[i] == NULL)
-	continue;
-      
-      g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "*** index %d", i);
-      
-      g_hash_table_foreach (rel->hashed_tuple_tables[i],
-			    g_relation_print_index,
-			    rel);
-    }
-  
-}
diff --git a/glib/gscanner.c b/glib/gscanner.c
deleted file mode 100644
index becead8..0000000
--- a/glib/gscanner.c
+++ /dev/null
@@ -1,1752 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * GScanner: Flexible lexical scanner for general purpose.
- * Copyright (C) 1997, 1998 Tim Janik
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#define		__gscanner_c__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include	<stdlib.h>
-#include	<stdarg.h>
-#include	<string.h>
-#include	<stdio.h>
-#include	"glib.h"
-#ifdef HAVE_UNISTD_H
-#include	<unistd.h>
-#endif
-#include	<errno.h>
-#include	<sys/types.h>	/* needed for sys/stat.h */
-#include	<sys/stat.h>
-#ifdef _MSC_VER
-#include	<io.h>		/* For _read() */
-#endif
-
-/* --- defines --- */
-#define	to_lower(c)				( \
-	(guchar) (							\
-	  ( (((guchar)(c))>='A' && ((guchar)(c))<='Z') * ('a'-'A') ) |	\
-	  ( (((guchar)(c))>=192 && ((guchar)(c))<=214) * (224-192) ) |	\
-	  ( (((guchar)(c))>=216 && ((guchar)(c))<=222) * (248-216) ) |	\
-	  ((guchar)(c))							\
-	)								\
-)
-#define	READ_BUFFER_SIZE	(4000)
-
-
-/* --- typedefs --- */
-typedef	struct	_GScannerKey	GScannerKey;
-
-struct	_GScannerKey
-{
-  guint		 scope_id;
-  gchar		*symbol;
-  gpointer	 value;
-};
-
-
-
-/* --- variables --- */
-static GScannerConfig g_scanner_config_template =
-{
-  (
-   " \t\r\n"
-   )			/* cset_skip_characters */,
-  (
-   G_CSET_a_2_z
-   "_"
-   G_CSET_A_2_Z
-   )			/* cset_identifier_first */,
-  (
-   G_CSET_a_2_z
-   "_0123456789"
-   G_CSET_A_2_Z
-   G_CSET_LATINS
-   G_CSET_LATINC
-   )			/* cset_identifier_nth */,
-  ( "#\n" )		/* cpair_comment_single */,
-  
-  FALSE			/* case_sensitive */,
-  
-  TRUE			/* skip_comment_multi */,
-  TRUE			/* skip_comment_single */,
-  TRUE			/* scan_comment_multi */,
-  TRUE			/* scan_identifier */,
-  FALSE			/* scan_identifier_1char */,
-  FALSE			/* scan_identifier_NULL */,
-  TRUE			/* scan_symbols */,
-  FALSE			/* scan_binary */,
-  TRUE			/* scan_octal */,
-  TRUE			/* scan_float */,
-  TRUE			/* scan_hex */,
-  FALSE			/* scan_hex_dollar */,
-  TRUE			/* scan_string_sq */,
-  TRUE			/* scan_string_dq */,
-  TRUE			/* numbers_2_int */,
-  FALSE			/* int_2_float */,
-  FALSE			/* identifier_2_string */,
-  TRUE			/* char_2_token */,
-  FALSE			/* symbol_2_token */,
-  FALSE			/* scope_0_fallback */,
-};
-
-
-/* --- prototypes --- */
-static inline
-GScannerKey*	g_scanner_lookup_internal (GScanner	*scanner,
-					   guint	 scope_id,
-					   const gchar	*symbol);
-static gint	g_scanner_key_equal	  (gconstpointer v1,
-					   gconstpointer v2);
-static guint	g_scanner_key_hash	  (gconstpointer v);
-static void	g_scanner_get_token_ll	  (GScanner	*scanner,
-					   GTokenType	*token_p,
-					   GTokenValue	*value_p,
-					   guint	*line_p,
-					   guint	*position_p);
-static void	g_scanner_get_token_i	  (GScanner	*scanner,
-					   GTokenType	*token_p,
-					   GTokenValue	*value_p,
-					   guint	*line_p,
-					   guint	*position_p);
-
-static guchar	g_scanner_peek_next_char  (GScanner	*scanner);
-static guchar	g_scanner_get_char	  (GScanner	*scanner,
-					   guint	*line_p,
-					   guint	*position_p);
-static void	g_scanner_msg_handler	  (GScanner	*scanner,
-					   gchar	*message,
-					   gint		 is_error);
-
-
-/* --- functions --- */
-static inline gint
-g_scanner_char_2_num (guchar	c,
-		      guchar	base)
-{
-  if (c >= '0' && c <= '9')
-    c -= '0';
-  else if (c >= 'A' && c <= 'Z')
-    c -= 'A' - 10;
-  else if (c >= 'a' && c <= 'z')
-    c -= 'a' - 10;
-  else
-    return -1;
-  
-  if (c < base)
-    return c;
-  
-  return -1;
-}
-
-GScanner*
-g_scanner_new (GScannerConfig	*config_templ)
-{
-  GScanner *scanner;
-  
-  if (!config_templ)
-    config_templ = &g_scanner_config_template;
-  
-  scanner = g_new0 (GScanner, 1);
-  
-  scanner->user_data = NULL;
-  scanner->max_parse_errors = 0;
-  scanner->parse_errors	= 0;
-  scanner->input_name = NULL;
-  scanner->derived_data = NULL;
-  
-  scanner->config = g_new0 (GScannerConfig, 1);
-  
-  scanner->config->case_sensitive	= config_templ->case_sensitive;
-  scanner->config->cset_skip_characters	= config_templ->cset_skip_characters;
-  if (!scanner->config->cset_skip_characters)
-    scanner->config->cset_skip_characters = "";
-  scanner->config->cset_identifier_first= config_templ->cset_identifier_first;
-  scanner->config->cset_identifier_nth	= config_templ->cset_identifier_nth;
-  scanner->config->cpair_comment_single	= config_templ->cpair_comment_single;
-  scanner->config->skip_comment_multi	= config_templ->skip_comment_multi;
-  scanner->config->skip_comment_single	= config_templ->skip_comment_single;
-  scanner->config->scan_comment_multi	= config_templ->scan_comment_multi;
-  scanner->config->scan_identifier	= config_templ->scan_identifier;
-  scanner->config->scan_identifier_1char= config_templ->scan_identifier_1char;
-  scanner->config->scan_identifier_NULL	= config_templ->scan_identifier_NULL;
-  scanner->config->scan_symbols		= config_templ->scan_symbols;
-  scanner->config->scan_binary		= config_templ->scan_binary;
-  scanner->config->scan_octal		= config_templ->scan_octal;
-  scanner->config->scan_float		= config_templ->scan_float;
-  scanner->config->scan_hex		= config_templ->scan_hex;
-  scanner->config->scan_hex_dollar	= config_templ->scan_hex_dollar;
-  scanner->config->scan_string_sq	= config_templ->scan_string_sq;
-  scanner->config->scan_string_dq	= config_templ->scan_string_dq;
-  scanner->config->numbers_2_int	= config_templ->numbers_2_int;
-  scanner->config->int_2_float		= config_templ->int_2_float;
-  scanner->config->identifier_2_string	= config_templ->identifier_2_string;
-  scanner->config->char_2_token		= config_templ->char_2_token;
-  scanner->config->symbol_2_token	= config_templ->symbol_2_token;
-  scanner->config->scope_0_fallback	= config_templ->scope_0_fallback;
-  
-  scanner->token = G_TOKEN_NONE;
-  scanner->value.v_int = 0;
-  scanner->line = 1;
-  scanner->position = 0;
-  
-  scanner->next_token = G_TOKEN_NONE;
-  scanner->next_value.v_int = 0;
-  scanner->next_line = 1;
-  scanner->next_position = 0;
-  
-  scanner->symbol_table = g_hash_table_new (g_scanner_key_hash, g_scanner_key_equal);
-  scanner->input_fd = -1;
-  scanner->text = NULL;
-  scanner->text_end = NULL;
-  scanner->buffer = NULL;
-  scanner->scope_id = 0;
-  
-  scanner->msg_handler = g_scanner_msg_handler;
-  
-  return scanner;
-}
-
-static inline void
-g_scanner_free_value (GTokenType     *token_p,
-		      GTokenValue     *value_p)
-{
-  switch (*token_p)
-    {
-    case G_TOKEN_STRING:
-    case G_TOKEN_IDENTIFIER:
-    case G_TOKEN_IDENTIFIER_NULL:
-    case G_TOKEN_COMMENT_SINGLE:
-    case G_TOKEN_COMMENT_MULTI:
-      g_free (value_p->v_string);
-      break;
-      
-    default:
-      break;
-    }
-  
-  *token_p = G_TOKEN_NONE;
-}
-
-static void
-g_scanner_destroy_symbol_table_entry (gpointer _key,
-				      gpointer _value,
-				      gpointer _data)
-{
-  GScannerKey *key = _key;
-  
-  g_free (key->symbol);
-  g_free (key);
-}
-
-void
-g_scanner_destroy (GScanner	*scanner)
-{
-  g_return_if_fail (scanner != NULL);
-  
-  g_hash_table_foreach (scanner->symbol_table, 
-			g_scanner_destroy_symbol_table_entry, NULL);
-  g_hash_table_destroy (scanner->symbol_table);
-  g_scanner_free_value (&scanner->token, &scanner->value);
-  g_scanner_free_value (&scanner->next_token, &scanner->next_value);
-  g_free (scanner->config);
-  g_free (scanner->buffer);
-  g_free (scanner);
-}
-
-static void
-g_scanner_msg_handler (GScanner		*scanner,
-		       gchar		*message,
-		       gint		 is_error)
-{
-  g_return_if_fail (scanner != NULL);
-  
-  fprintf (stdout, "%s:%d: ", scanner->input_name, scanner->line);
-  if (is_error)
-    fprintf (stdout, "error: ");
-  fprintf (stdout, "%s\n", message);
-}
-
-void
-g_scanner_error (GScanner	*scanner,
-		 const gchar	*format,
-		 ...)
-{
-  g_return_if_fail (scanner != NULL);
-  g_return_if_fail (format != NULL);
-  
-  scanner->parse_errors++;
-  
-  if (scanner->msg_handler)
-    {
-      va_list args;
-      gchar *string;
-      
-      va_start (args, format);
-      string = g_strdup_vprintf (format, args);
-      va_end (args);
-      
-      scanner->msg_handler (scanner, string, TRUE);
-      
-      g_free (string);
-    }
-}
-
-void
-g_scanner_warn (GScanner       *scanner,
-		const gchar    *format,
-		...)
-{
-  g_return_if_fail (scanner != NULL);
-  g_return_if_fail (format != NULL);
-  
-  if (scanner->msg_handler)
-    {
-      va_list args;
-      gchar *string;
-      
-      va_start (args, format);
-      string = g_strdup_vprintf (format, args);
-      va_end (args);
-      
-      scanner->msg_handler (scanner, string, FALSE);
-      
-      g_free (string);
-    }
-}
-
-static gint
-g_scanner_key_equal (gconstpointer v1,
-		     gconstpointer v2)
-{
-  const GScannerKey *key1 = v1;
-  const GScannerKey *key2 = v2;
-  
-  return (key1->scope_id == key2->scope_id) && (strcmp (key1->symbol, key2->symbol) == 0);
-}
-
-static guint
-g_scanner_key_hash (gconstpointer v)
-{
-  const GScannerKey *key = v;
-  gchar *c;
-  guint h;
-  
-  h = key->scope_id;
-  for (c = key->symbol; *c; c++)
-    {
-      guint g;
-      
-      h = (h << 4) + *c;
-      g = h & 0xf0000000;
-      if (g)
-	{
-	  h = h ^ (g >> 24);
-	  h = h ^ g;
-	}
-    }
-  
-  return h;
-}
-
-static inline GScannerKey*
-g_scanner_lookup_internal (GScanner	*scanner,
-			   guint	 scope_id,
-			   const gchar	*symbol)
-{
-  GScannerKey	*key_p;
-  GScannerKey key;
-  
-  key.scope_id = scope_id;
-  
-  if (!scanner->config->case_sensitive)
-    {
-      gchar *d;
-      const gchar *c;
-      
-      key.symbol = g_new (gchar, strlen (symbol) + 1);
-      for (d = key.symbol, c = symbol; *c; c++, d++)
-	*d = to_lower (*c);
-      *d = 0;
-      key_p = g_hash_table_lookup (scanner->symbol_table, &key);
-      g_free (key.symbol);
-    }
-  else
-    {
-      key.symbol = (gchar*) symbol;
-      key_p = g_hash_table_lookup (scanner->symbol_table, &key);
-    }
-  
-  return key_p;
-}
-
-void
-g_scanner_scope_add_symbol (GScanner	*scanner,
-			    guint	 scope_id,
-			    const gchar	*symbol,
-			    gpointer	 value)
-{
-  GScannerKey	*key;
-  
-  g_return_if_fail (scanner != NULL);
-  g_return_if_fail (symbol != NULL);
-  
-  key = g_scanner_lookup_internal (scanner, scope_id, symbol);
-  
-  if (!key)
-    {
-      key = g_new (GScannerKey, 1);
-      key->scope_id = scope_id;
-      key->symbol = g_strdup (symbol);
-      key->value = value;
-      if (!scanner->config->case_sensitive)
-	{
-	  gchar *c;
-	  
-	  c = key->symbol;
-	  while (*c != 0)
-	    {
-	      *c = to_lower (*c);
-	      c++;
-	    }
-	}
-      g_hash_table_insert (scanner->symbol_table, key, key);
-    }
-  else
-    key->value = value;
-}
-
-void
-g_scanner_scope_remove_symbol (GScanner	   *scanner,
-			       guint	    scope_id,
-			       const gchar *symbol)
-{
-  GScannerKey	*key;
-  
-  g_return_if_fail (scanner != NULL);
-  g_return_if_fail (symbol != NULL);
-  
-  key = g_scanner_lookup_internal (scanner, scope_id, symbol);
-  
-  if (key)
-    {
-      g_hash_table_remove (scanner->symbol_table, key);
-      g_free (key->symbol);
-      g_free (key);
-    }
-}
-
-gpointer
-g_scanner_lookup_symbol (GScanner	*scanner,
-			 const gchar	*symbol)
-{
-  GScannerKey	*key;
-  guint scope_id;
-  
-  g_return_val_if_fail (scanner != NULL, NULL);
-  
-  if (!symbol)
-    return NULL;
-  
-  scope_id = scanner->scope_id;
-  key = g_scanner_lookup_internal (scanner, scope_id, symbol);
-  if (!key && scope_id && scanner->config->scope_0_fallback)
-    key = g_scanner_lookup_internal (scanner, 0, symbol);
-  
-  if (key)
-    return key->value;
-  else
-    return NULL;
-}
-
-gpointer
-g_scanner_scope_lookup_symbol (GScanner	      *scanner,
-			       guint	       scope_id,
-			       const gchar    *symbol)
-{
-  GScannerKey	*key;
-  
-  g_return_val_if_fail (scanner != NULL, NULL);
-  
-  if (!symbol)
-    return NULL;
-  
-  key = g_scanner_lookup_internal (scanner, scope_id, symbol);
-  
-  if (key)
-    return key->value;
-  else
-    return NULL;
-}
-
-guint
-g_scanner_set_scope (GScanner	    *scanner,
-		     guint	     scope_id)
-{
-  guint old_scope_id;
-  
-  g_return_val_if_fail (scanner != NULL, 0);
-  
-  old_scope_id = scanner->scope_id;
-  scanner->scope_id = scope_id;
-  
-  return old_scope_id;
-}
-
-static void
-g_scanner_foreach_internal (gpointer  _key,
-			    gpointer  _value,
-			    gpointer  _user_data)
-{
-  GScannerKey *key;
-  gpointer *d;
-  GHFunc func;
-  gpointer user_data;
-  guint *scope_id;
-  
-  d = _user_data;
-  func = (GHFunc) d[0];
-  user_data = d[1];
-  scope_id = d[2];
-  key = _value;
-  
-  if (key->scope_id == *scope_id)
-    func (key->symbol, key->value, user_data);
-}
-
-void
-g_scanner_scope_foreach_symbol (GScanner       *scanner,
-				guint		scope_id,
-				GHFunc		func,
-				gpointer	user_data)
-{
-  gpointer d[3];
-  
-  g_return_if_fail (scanner != NULL);
-  
-  d[0] = (gpointer) func;
-  d[1] = user_data;
-  d[2] = &scope_id;
-  
-  g_hash_table_foreach (scanner->symbol_table, g_scanner_foreach_internal, d);
-}
-
-void
-g_scanner_freeze_symbol_table (GScanner *scanner)
-{
-  g_return_if_fail (scanner != NULL);
-  
-  g_hash_table_freeze (scanner->symbol_table);
-}
-
-void
-g_scanner_thaw_symbol_table (GScanner *scanner)
-{
-  g_return_if_fail (scanner != NULL);
-  
-  g_hash_table_thaw (scanner->symbol_table);
-}
-
-GTokenType
-g_scanner_peek_next_token (GScanner	*scanner)
-{
-  g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF);
-  
-  if (scanner->next_token == G_TOKEN_NONE)
-    {
-      scanner->next_line = scanner->line;
-      scanner->next_position = scanner->position;
-      g_scanner_get_token_i (scanner,
-			     &scanner->next_token,
-			     &scanner->next_value,
-			     &scanner->next_line,
-			     &scanner->next_position);
-    }
-  
-  return scanner->next_token;
-}
-
-GTokenType
-g_scanner_get_next_token (GScanner	*scanner)
-{
-  g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF);
-  
-  if (scanner->next_token != G_TOKEN_NONE)
-    {
-      g_scanner_free_value (&scanner->token, &scanner->value);
-      
-      scanner->token = scanner->next_token;
-      scanner->value = scanner->next_value;
-      scanner->line = scanner->next_line;
-      scanner->position = scanner->next_position;
-      scanner->next_token = G_TOKEN_NONE;
-    }
-  else
-    g_scanner_get_token_i (scanner,
-			   &scanner->token,
-			   &scanner->value,
-			   &scanner->line,
-			   &scanner->position);
-  
-  return scanner->token;
-}
-
-GTokenType
-g_scanner_cur_token (GScanner *scanner)
-{
-  g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF);
-  
-  return scanner->token;
-}
-
-GTokenValue
-g_scanner_cur_value (GScanner *scanner)
-{
-  GTokenValue v;
-  
-  v.v_int = 0;
-  
-  g_return_val_if_fail (scanner != NULL, v);
-
-  /* MSC isn't capable of handling return scanner->value; ? */
-
-  v = scanner->value;
-
-  return v;
-}
-
-guint
-g_scanner_cur_line (GScanner *scanner)
-{
-  g_return_val_if_fail (scanner != NULL, 0);
-  
-  return scanner->line;
-}
-
-guint
-g_scanner_cur_position (GScanner *scanner)
-{
-  g_return_val_if_fail (scanner != NULL, 0);
-  
-  return scanner->position;
-}
-
-gboolean
-g_scanner_eof (GScanner	*scanner)
-{
-  g_return_val_if_fail (scanner != NULL, TRUE);
-  
-  return scanner->token == G_TOKEN_EOF;
-}
-
-void
-g_scanner_input_file (GScanner *scanner,
-		      gint	input_fd)
-{
-  g_return_if_fail (scanner != NULL);
-  g_return_if_fail (input_fd >= 0);
-
-  if (scanner->input_fd >= 0)
-    g_scanner_sync_file_offset (scanner);
-
-  scanner->token = G_TOKEN_NONE;
-  scanner->value.v_int = 0;
-  scanner->line = 1;
-  scanner->position = 0;
-  scanner->next_token = G_TOKEN_NONE;
-
-  scanner->input_fd = input_fd;
-  scanner->text = NULL;
-  scanner->text_end = NULL;
-
-  if (!scanner->buffer)
-    scanner->buffer = g_new (gchar, READ_BUFFER_SIZE + 1);
-}
-
-void
-g_scanner_input_text (GScanner	  *scanner,
-		      const gchar *text,
-		      guint	   text_len)
-{
-  g_return_if_fail (scanner != NULL);
-  if (text_len)
-    g_return_if_fail (text != NULL);
-  else
-    text = NULL;
-
-  if (scanner->input_fd >= 0)
-    g_scanner_sync_file_offset (scanner);
-
-  scanner->token = G_TOKEN_NONE;
-  scanner->value.v_int = 0;
-  scanner->line = 1;
-  scanner->position = 0;
-  scanner->next_token = G_TOKEN_NONE;
-
-  scanner->input_fd = -1;
-  scanner->text = text;
-  scanner->text_end = text + text_len;
-
-  if (scanner->buffer)
-    {
-      g_free (scanner->buffer);
-      scanner->buffer = NULL;
-    }
-}
-
-static guchar
-g_scanner_peek_next_char (GScanner *scanner)
-{
-  if (scanner->text < scanner->text_end)
-    {
-      return *scanner->text;
-    }
-  else if (scanner->input_fd >= 0)
-    {
-      gint count;
-      gchar *buffer;
-
-      buffer = scanner->buffer;
-      do
-	{
-	  count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE);
-	}
-      while (count == -1 && (errno == EINTR || errno == EAGAIN));
-
-      if (count < 1)
-	{
-	  scanner->input_fd = -1;
-
-	  return 0;
-	}
-      else
-	{
-	  scanner->text = buffer;
-	  scanner->text_end = buffer + count;
-
-	  return *buffer;
-	}
-    }
-  else
-    return 0;
-}
-
-void
-g_scanner_sync_file_offset (GScanner *scanner)
-{
-  g_return_if_fail (scanner != NULL);
-
-  /* for file input, rewind the filedescriptor to the current
-   * buffer position and blow the file read ahead buffer. usefull for
-   * third party uses of our filedescriptor, which hooks onto the current
-   * scanning position.
-   */
-
-  if (scanner->input_fd >= 0 && scanner->text_end > scanner->text)
-    {
-      gint buffered;
-
-      buffered = scanner->text_end - scanner->text;
-      if (lseek (scanner->input_fd, - buffered, SEEK_CUR) >= 0)
-	{
-	  /* we succeeded, blow our buffer's contents now */
-	  scanner->text = NULL;
-	  scanner->text_end = NULL;
-	}
-      else
-	errno = 0;
-    }
-}
-
-static guchar
-g_scanner_get_char (GScanner	*scanner,
-		    guint	*line_p,
-		    guint	*position_p)
-{
-  guchar fchar;
-
-  if (scanner->text < scanner->text_end)
-    fchar = *(scanner->text++);
-  else if (scanner->input_fd >= 0)
-    {
-      gint count;
-      gchar *buffer;
-
-      buffer = scanner->buffer;
-      do
-	{
-	  count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE);
-	}
-      while (count == -1 && (errno == EINTR || errno == EAGAIN));
-
-      if (count < 1)
-	{
-	  scanner->input_fd = -1;
-	  fchar = 0;
-	}
-      else
-	{
-	  scanner->text = buffer + 1;
-	  scanner->text_end = buffer + count;
-	  fchar = *buffer;
-	  if (!fchar)
-	    {
-	      g_scanner_sync_file_offset (scanner);
-	      scanner->text_end = scanner->text;
-	      scanner->input_fd = -1;
-	    }
-	}
-    }
-  else
-    fchar = 0;
-  
-  if (fchar == '\n')
-    {
-      (*position_p) = 0;
-      (*line_p)++;
-    }
-  else if (fchar)
-    {
-      (*position_p)++;
-    }
-  
-  return fchar;
-}
-
-void
-g_scanner_unexp_token (GScanner		*scanner,
-		       GTokenType	 expected_token,
-		       const gchar	*identifier_spec,
-		       const gchar	*symbol_spec,
-		       const gchar	*symbol_name,
-		       const gchar	*message,
-		       gint		 is_error)
-{
-  gchar	*token_string;
-  guint	token_string_len;
-  gchar	*expected_string;
-  guint	expected_string_len;
-  gchar	*message_prefix;
-  gboolean print_unexp;
-  void (*msg_handler)	(GScanner*, const gchar*, ...);
-  
-  g_return_if_fail (scanner != NULL);
-  
-  if (is_error)
-    msg_handler = g_scanner_error;
-  else
-    msg_handler = g_scanner_warn;
-  
-  if (!identifier_spec)
-    identifier_spec = "identifier";
-  if (!symbol_spec)
-    symbol_spec = "symbol";
-  
-  token_string_len = 56;
-  token_string = g_new (gchar, token_string_len + 1);
-  expected_string_len = 64;
-  expected_string = g_new (gchar, expected_string_len + 1);
-  print_unexp = TRUE;
-  
-  switch (scanner->token)
-    {
-    case G_TOKEN_EOF:
-      g_snprintf (token_string, token_string_len, "end of file");
-      break;
-      
-    default:
-      if (scanner->token >= 1 && scanner->token <= 255)
-	{
-	  if ((scanner->token >= ' ' && scanner->token <= '~') ||
-	      strchr (scanner->config->cset_identifier_first, scanner->token) ||
-	      strchr (scanner->config->cset_identifier_nth, scanner->token))
-	    g_snprintf (token_string, expected_string_len, "character `%c'", scanner->token);
-	  else
-	    g_snprintf (token_string, expected_string_len, "character `\\%o'", scanner->token);
-	  break;
-	}
-      else if (!scanner->config->symbol_2_token)
-	{
-	  g_snprintf (token_string, token_string_len, "(unknown) token <%d>", scanner->token);
-	  break;
-	}
-      /* fall through */
-    case G_TOKEN_SYMBOL:
-      if (expected_token == G_TOKEN_SYMBOL ||
-	  (scanner->config->symbol_2_token &&
-	   expected_token > G_TOKEN_LAST))
-	print_unexp = FALSE;
-      if (symbol_name)
-	g_snprintf (token_string,
-		    token_string_len,
-		    "%s%s `%s'",
-		    print_unexp ? "" : "invalid ",
-		    symbol_spec,
-		    symbol_name);
-      else
-	g_snprintf (token_string,
-		    token_string_len,
-		    "%s%s",
-		    print_unexp ? "" : "invalid ",
-		    symbol_spec);
-      break;
-      
-    case G_TOKEN_ERROR:
-      print_unexp = FALSE;
-      expected_token = G_TOKEN_NONE;
-      switch (scanner->value.v_error)
-	{
-	case G_ERR_UNEXP_EOF:
-	  g_snprintf (token_string, token_string_len, "scanner: unexpected end of file");
-	  break;
-	  
-	case G_ERR_UNEXP_EOF_IN_STRING:
-	  g_snprintf (token_string, token_string_len, "scanner: unterminated string constant");
-	  break;
-	  
-	case G_ERR_UNEXP_EOF_IN_COMMENT:
-	  g_snprintf (token_string, token_string_len, "scanner: unterminated comment");
-	  break;
-	  
-	case G_ERR_NON_DIGIT_IN_CONST:
-	  g_snprintf (token_string, token_string_len, "scanner: non digit in constant");
-	  break;
-	  
-	case G_ERR_FLOAT_RADIX:
-	  g_snprintf (token_string, token_string_len, "scanner: invalid radix for floating constant");
-	  break;
-	  
-	case G_ERR_FLOAT_MALFORMED:
-	  g_snprintf (token_string, token_string_len, "scanner: malformed floating constant");
-	  break;
-	  
-	case G_ERR_DIGIT_RADIX:
-	  g_snprintf (token_string, token_string_len, "scanner: digit is beyond radix");
-	  break;
-	  
-	case G_ERR_UNKNOWN:
-	default:
-	  g_snprintf (token_string, token_string_len, "scanner: unknown error");
-	  break;
-	}
-      break;
-      
-    case G_TOKEN_CHAR:
-      g_snprintf (token_string, token_string_len, "character `%c'", scanner->value.v_char);
-      break;
-      
-    case G_TOKEN_IDENTIFIER:
-    case G_TOKEN_IDENTIFIER_NULL:
-      if (expected_token == G_TOKEN_IDENTIFIER ||
-	  expected_token == G_TOKEN_IDENTIFIER_NULL)
-	print_unexp = FALSE;
-      g_snprintf (token_string,
-		  token_string_len,
-		  "%s%s `%s'",
-		  print_unexp ? "" : "invalid ",
-		  identifier_spec,
-		  scanner->token == G_TOKEN_IDENTIFIER ? scanner->value.v_string : "null");
-      break;
-      
-    case G_TOKEN_BINARY:
-    case G_TOKEN_OCTAL:
-    case G_TOKEN_INT:
-    case G_TOKEN_HEX:
-      g_snprintf (token_string, token_string_len, "number `%ld'", scanner->value.v_int);
-      break;
-      
-    case G_TOKEN_FLOAT:
-      g_snprintf (token_string, token_string_len, "number `%.3f'", scanner->value.v_float);
-      break;
-      
-    case G_TOKEN_STRING:
-      if (expected_token == G_TOKEN_STRING)
-	print_unexp = FALSE;
-      g_snprintf (token_string,
-		  token_string_len,
-		  "%s%sstring constant \"%s\"",
-		  print_unexp ? "" : "invalid ",
-		  scanner->value.v_string[0] == 0 ? "empty " : "",
-		  scanner->value.v_string);
-      token_string[token_string_len - 2] = '"';
-      token_string[token_string_len - 1] = 0;
-      break;
-      
-    case G_TOKEN_COMMENT_SINGLE:
-    case G_TOKEN_COMMENT_MULTI:
-      g_snprintf (token_string, token_string_len, "comment");
-      break;
-      
-    case G_TOKEN_NONE:
-      /* somehow the user's parsing code is screwed, there isn't much
-       * we can do about it.
-       * Note, a common case to trigger this is
-       * g_scanner_peek_next_token(); g_scanner_unexp_token();
-       * without an intermediate g_scanner_get_next_token().
-       */
-      g_assert_not_reached ();
-      break;
-    }
-  
-  
-  switch (expected_token)
-    {
-      gboolean need_valid;
-      
-    default:
-      if (expected_token >= 1 && expected_token <= 255)
-	{
-	  if ((expected_token >= ' ' && expected_token <= '~') ||
-	      strchr (scanner->config->cset_identifier_first, expected_token) ||
-	      strchr (scanner->config->cset_identifier_nth, expected_token))
-	    g_snprintf (expected_string, expected_string_len, "character `%c'", expected_token);
-	  else
-	    g_snprintf (expected_string, expected_string_len, "character `\\%o'", expected_token);
-	  break;
-	}
-      else if (!scanner->config->symbol_2_token)
-	{
-	  g_snprintf (expected_string, expected_string_len, "(unknown) token <%d>", expected_token);
-	  break;
-	}
-      /* fall through */
-    case G_TOKEN_SYMBOL:
-      need_valid = (scanner->token == G_TOKEN_SYMBOL ||
-		    (scanner->config->symbol_2_token &&
-		     scanner->token > G_TOKEN_LAST));
-      g_snprintf (expected_string,
-		  expected_string_len,
-		  "%s%s",
-		  need_valid ? "valid " : "",
-		  symbol_spec);
-      /* FIXME: should we attempt to lookup the symbol_name for symbol_2_token? */
-      break;
-      
-    case G_TOKEN_INT:
-      g_snprintf (expected_string, expected_string_len, "number (integer)");
-      break;
-      
-    case G_TOKEN_FLOAT:
-      g_snprintf (expected_string, expected_string_len, "number (float)");
-      break;
-      
-    case G_TOKEN_STRING:
-      g_snprintf (expected_string,
-		  expected_string_len,
-		  "%sstring constant",
-		  scanner->token == G_TOKEN_STRING ? "valid " : "");
-      break;
-      
-    case G_TOKEN_IDENTIFIER:
-    case G_TOKEN_IDENTIFIER_NULL:
-      g_snprintf (expected_string,
-		  expected_string_len,
-		  "%s%s",
-		  (scanner->token == G_TOKEN_IDENTIFIER_NULL ||
-		   scanner->token == G_TOKEN_IDENTIFIER ? "valid " : ""),
-		  identifier_spec);
-      break;
-      
-    case G_TOKEN_EOF:
-      g_snprintf (expected_string, expected_string_len, "end of file");
-      break;
-
-    case G_TOKEN_NONE:
-      break;
-    }
-  
-  if (message && message[0] != 0)
-    message_prefix = " - ";
-  else
-    {
-      message_prefix = "";
-      message = "";
-    }
-  
-  if (expected_token != G_TOKEN_NONE)
-    {
-      if (print_unexp)
-	msg_handler (scanner,
-		     "unexpected %s, expected %s%s%s",
-		     token_string,
-		     expected_string,
-		     message_prefix,
-		     message);
-      else
-	msg_handler (scanner,
-		     "%s, expected %s%s%s",
-		     token_string,
-		     expected_string,
-		     message_prefix,
-		     message);
-    }
-  else
-    {
-      if (print_unexp)
-	msg_handler (scanner,
-		     "unexpected %s%s%s",
-		     token_string,
-		     message_prefix,
-		     message);
-      else
-	msg_handler (scanner,
-		     "%s%s%s",
-		     token_string,
-		     message_prefix,
-		     message);
-    }
-  
-  g_free (token_string);
-  g_free (expected_string);
-}
-
-gint
-g_scanner_stat_mode (const gchar *filename)
-{
-  struct stat  *stat_buf;
-  gint		st_mode;
-  
-  stat_buf = g_new0 (struct stat, 1);
-#ifdef HAVE_LSTAT  
-  lstat (filename, stat_buf);
-#else
-  stat (filename, stat_buf);
-#endif
-  st_mode = stat_buf->st_mode;
-  
-  g_free (stat_buf);
-  
-  return st_mode;
-}
-
-static void
-g_scanner_get_token_i (GScanner	*scanner,
-		       GTokenType	*token_p,
-		       GTokenValue	*value_p,
-		       guint		*line_p,
-		       guint		*position_p)
-{
-  do
-    {
-      g_scanner_free_value (token_p, value_p);
-      g_scanner_get_token_ll (scanner, token_p, value_p, line_p, position_p);
-    }
-  while (((*token_p > 0 && *token_p < 256) &&
-	  strchr (scanner->config->cset_skip_characters, *token_p)) ||
-	 (*token_p == G_TOKEN_CHAR &&
-	  strchr (scanner->config->cset_skip_characters, value_p->v_char)) ||
-	 (*token_p == G_TOKEN_COMMENT_MULTI &&
-	  scanner->config->skip_comment_multi) ||
-	 (*token_p == G_TOKEN_COMMENT_SINGLE &&
-	  scanner->config->skip_comment_single));
-  
-  switch (*token_p)
-    {
-    case G_TOKEN_IDENTIFIER:
-      if (scanner->config->identifier_2_string)
-	*token_p = G_TOKEN_STRING;
-      break;
-      
-    case G_TOKEN_SYMBOL:
-      if (scanner->config->symbol_2_token)
-	*token_p = (GTokenType) value_p->v_symbol;
-      break;
-      
-    case G_TOKEN_BINARY:
-    case G_TOKEN_OCTAL:
-    case G_TOKEN_HEX:
-      if (scanner->config->numbers_2_int)
-	*token_p = G_TOKEN_INT;
-      break;
-      
-    default:
-      break;
-    }
-  
-  if (*token_p == G_TOKEN_INT &&
-      scanner->config->int_2_float)
-    {
-      *token_p = G_TOKEN_FLOAT;
-      value_p->v_float = value_p->v_int;
-    }
-  
-  errno = 0;
-}
-
-static void
-g_scanner_get_token_ll	(GScanner	*scanner,
-			 GTokenType	*token_p,
-			 GTokenValue	*value_p,
-			 guint		*line_p,
-			 guint		*position_p)
-{
-  GScannerConfig *config;
-  GTokenType	   token;
-  gboolean	   in_comment_multi;
-  gboolean	   in_comment_single;
-  gboolean	   in_string_sq;
-  gboolean	   in_string_dq;
-  GString	  *gstring;
-  GTokenValue	   value;
-  guchar	   ch;
-  
-  config = scanner->config;
-  (*value_p).v_int = 0;
-  
-  if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) ||
-      scanner->token == G_TOKEN_EOF)
-    {
-      *token_p = G_TOKEN_EOF;
-      return;
-    }
-  
-  in_comment_multi = FALSE;
-  in_comment_single = FALSE;
-  in_string_sq = FALSE;
-  in_string_dq = FALSE;
-  gstring = NULL;
-  
-  do /* while (ch != 0) */
-    {
-      gboolean dotted_float = FALSE;
-      
-      ch = g_scanner_get_char (scanner, line_p, position_p);
-      
-      value.v_int = 0;
-      token = G_TOKEN_NONE;
-      
-      /* this is *evil*, but needed ;(
-       * we first check for identifier first character, because	 it
-       * might interfere with other key chars like slashes or numbers
-       */
-      if (config->scan_identifier &&
-	  ch && strchr (config->cset_identifier_first, ch))
-	goto identifier_precedence;
-      
-      switch (ch)
-	{
-	case 0:
-	  token = G_TOKEN_EOF;
-	  (*position_p)++;
-	  /* ch = 0; */
-	  break;
-	  
-	case '/':
-	  if (!config->scan_comment_multi ||
-	      g_scanner_peek_next_char (scanner) != '*')
-	    goto default_case;
-	  g_scanner_get_char (scanner, line_p, position_p);
-	  token = G_TOKEN_COMMENT_MULTI;
-	  in_comment_multi = TRUE;
-	  gstring = g_string_new ("");
-	  while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0)
-	    {
-	      if (ch == '*' && g_scanner_peek_next_char (scanner) == '/')
-		{
-		  g_scanner_get_char (scanner, line_p, position_p);
-		  in_comment_multi = FALSE;
-		  break;
-		}
-	      else
-		gstring = g_string_append_c (gstring, ch);
-	    }
-	  ch = 0;
-	  break;
-	  
-	case '\'':
-	  if (!config->scan_string_sq)
-	    goto default_case;
-	  token = G_TOKEN_STRING;
-	  in_string_sq = TRUE;
-	  gstring = g_string_new ("");
-	  while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0)
-	    {
-	      if (ch == '\'')
-		{
-		  in_string_sq = FALSE;
-		  break;
-		}
-	      else
-		gstring = g_string_append_c (gstring, ch);
-	    }
-	  ch = 0;
-	  break;
-	  
-	case '"':
-	  if (!config->scan_string_dq)
-	    goto default_case;
-	  token = G_TOKEN_STRING;
-	  in_string_dq = TRUE;
-	  gstring = g_string_new ("");
-	  while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0)
-	    {
-	      if (ch == '"')
-		{
-		  in_string_dq = FALSE;
-		  break;
-		}
-	      else
-		{
-		  if (ch == '\\')
-		    {
-		      ch = g_scanner_get_char (scanner, line_p, position_p);
-		      switch (ch)
-			{
-			  guint	i;
-			  guint	fchar;
-			  
-			case 0:
-			  break;
-			  
-			case '\\':
-			  gstring = g_string_append_c (gstring, '\\');
-			  break;
-			  
-			case 'n':
-			  gstring = g_string_append_c (gstring, '\n');
-			  break;
-			  
-			case 't':
-			  gstring = g_string_append_c (gstring, '\t');
-			  break;
-			  
-			case 'r':
-			  gstring = g_string_append_c (gstring, '\r');
-			  break;
-			  
-			case 'b':
-			  gstring = g_string_append_c (gstring, '\b');
-			  break;
-			  
-			case 'f':
-			  gstring = g_string_append_c (gstring, '\f');
-			  break;
-			  
-			case '0':
-			case '1':
-			case '2':
-			case '3':
-			case '4':
-			case '5':
-			case '6':
-			case '7':
-			  i = ch - '0';
-			  fchar = g_scanner_peek_next_char (scanner);
-			  if (fchar >= '0' && fchar <= '7')
-			    {
-			      ch = g_scanner_get_char (scanner, line_p, position_p);
-			      i = i * 8 + ch - '0';
-			      fchar = g_scanner_peek_next_char (scanner);
-			      if (fchar >= '0' && fchar <= '7')
-				{
-				  ch = g_scanner_get_char (scanner, line_p, position_p);
-				  i = i * 8 + ch - '0';
-				}
-			    }
-			  gstring = g_string_append_c (gstring, i);
-			  break;
-			  
-			default:
-			  gstring = g_string_append_c (gstring, ch);
-			  break;
-			}
-		    }
-		  else
-		    gstring = g_string_append_c (gstring, ch);
-		}
-	    }
-	  ch = 0;
-	  break;
-	  
-	case '.':
-	  if (!config->scan_float)
-	    goto default_case;
-	  token = G_TOKEN_FLOAT;
-	  dotted_float = TRUE;
-	  ch = g_scanner_get_char (scanner, line_p, position_p);
-	  goto number_parsing;
-	  
-	case '$':
-	  if (!config->scan_hex_dollar)
-	    goto default_case;
-	  token = G_TOKEN_HEX;
-	  ch = g_scanner_get_char (scanner, line_p, position_p);
-	  goto number_parsing;
-	  
-	case '0':
-	  if (config->scan_octal)
-	    token = G_TOKEN_OCTAL;
-	  else
-	    token = G_TOKEN_INT;
-	  ch = g_scanner_peek_next_char (scanner);
-	  if (config->scan_hex && (ch == 'x' || ch == 'X'))
-	    {
-	      token = G_TOKEN_HEX;
-	      g_scanner_get_char (scanner, line_p, position_p);
-	      ch = g_scanner_get_char (scanner, line_p, position_p);
-	      if (ch == 0)
-		{
-		  token = G_TOKEN_ERROR;
-		  value.v_error = G_ERR_UNEXP_EOF;
-		  (*position_p)++;
-		  break;
-		}
-	      if (g_scanner_char_2_num (ch, 16) < 0)
-		{
-		  token = G_TOKEN_ERROR;
-		  value.v_error = G_ERR_DIGIT_RADIX;
-		  ch = 0;
-		  break;
-		}
-	    }
-	  else if (config->scan_binary && (ch == 'b' || ch == 'B'))
-	    {
-	      token = G_TOKEN_BINARY;
-	      g_scanner_get_char (scanner, line_p, position_p);
-	      ch = g_scanner_get_char (scanner, line_p, position_p);
-	      if (ch == 0)
-		{
-		  token = G_TOKEN_ERROR;
-		  value.v_error = G_ERR_UNEXP_EOF;
-		  (*position_p)++;
-		  break;
-		}
-	      if (g_scanner_char_2_num (ch, 10) < 0)
-		{
-		  token = G_TOKEN_ERROR;
-		  value.v_error = G_ERR_NON_DIGIT_IN_CONST;
-		  ch = 0;
-		  break;
-		}
-	    }
-	  else
-	    ch = '0';
-	  /* fall through */
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':
-	number_parsing:
-	{
-          gboolean in_number = TRUE;
-	  gchar *endptr;
-	  
-	  if (token == G_TOKEN_NONE)
-	    token = G_TOKEN_INT;
-	  
-	  gstring = g_string_new (dotted_float ? "0." : "");
-	  gstring = g_string_append_c (gstring, ch);
-	  
-	  do /* while (in_number) */
-	    {
-	      gboolean is_E;
-	      
-	      is_E = token == G_TOKEN_FLOAT && (ch == 'e' || ch == 'E');
-	      
-	      ch = g_scanner_peek_next_char (scanner);
-	      
-	      if (g_scanner_char_2_num (ch, 36) >= 0 ||
-		  (config->scan_float && ch == '.') ||
-		  (is_E && (ch == '+' || ch == '-')))
-		{
-		  ch = g_scanner_get_char (scanner, line_p, position_p);
-		  
-		  switch (ch)
-		    {
-		    case '.':
-		      if (token != G_TOKEN_INT && token != G_TOKEN_OCTAL)
-			{
-			  value.v_error = token == G_TOKEN_FLOAT ? G_ERR_FLOAT_MALFORMED : G_ERR_FLOAT_RADIX;
-			  token = G_TOKEN_ERROR;
-			  in_number = FALSE;
-			}
-		      else
-			{
-			  token = G_TOKEN_FLOAT;
-			  gstring = g_string_append_c (gstring, ch);
-			}
-		      break;
-		      
-		    case '0':
-		    case '1':
-		    case '2':
-		    case '3':
-		    case '4':
-		    case '5':
-		    case '6':
-		    case '7':
-		    case '8':
-		    case '9':
-		      gstring = g_string_append_c (gstring, ch);
-		      break;
-		      
-		    case '-':
-		    case '+':
-		      if (token != G_TOKEN_FLOAT)
-			{
-			  token = G_TOKEN_ERROR;
-			  value.v_error = G_ERR_NON_DIGIT_IN_CONST;
-			  in_number = FALSE;
-			}
-		      else
-			gstring = g_string_append_c (gstring, ch);
-		      break;
-		      
-		    case 'e':
-		    case 'E':
-		      if ((token != G_TOKEN_HEX && !config->scan_float) ||
-			  (token != G_TOKEN_HEX &&
-			   token != G_TOKEN_OCTAL &&
-			   token != G_TOKEN_FLOAT &&
-			   token != G_TOKEN_INT))
-			{
-			  token = G_TOKEN_ERROR;
-			  value.v_error = G_ERR_NON_DIGIT_IN_CONST;
-			  in_number = FALSE;
-			}
-		      else
-			{
-			  if (token != G_TOKEN_HEX)
-			    token = G_TOKEN_FLOAT;
-			  gstring = g_string_append_c (gstring, ch);
-			}
-		      break;
-		      
-		    default:
-		      if (token != G_TOKEN_HEX)
-			{
-			  token = G_TOKEN_ERROR;
-			  value.v_error = G_ERR_NON_DIGIT_IN_CONST;
-			  in_number = FALSE;
-			}
-		      else
-			gstring = g_string_append_c (gstring, ch);
-		      break;
-		    }
-		}
-	      else
-		in_number = FALSE;
-	    }
-	  while (in_number);
-	  
-	  endptr = NULL;
-	  switch (token)
-	    {
-	    case G_TOKEN_BINARY:
-	      value.v_binary = strtol (gstring->str, &endptr, 2);
-	      break;
-	      
-	    case G_TOKEN_OCTAL:
-	      value.v_octal = strtol (gstring->str, &endptr, 8);
-	      break;
-	      
-	    case G_TOKEN_INT:
-	      value.v_int = strtol (gstring->str, &endptr, 10);
-	      break;
-	      
-	    case G_TOKEN_FLOAT:
-	      value.v_float = g_strtod (gstring->str, &endptr);
-	      break;
-	      
-	    case G_TOKEN_HEX:
-	      value.v_hex = strtol (gstring->str, &endptr, 16);
-	      break;
-	      
-	    default:
-	      break;
-	    }
-	  if (endptr && *endptr)
-	    {
-	      token = G_TOKEN_ERROR;
-	      if (*endptr == 'e' || *endptr == 'E')
-		value.v_error = G_ERR_NON_DIGIT_IN_CONST;
-	      else
-		value.v_error = G_ERR_DIGIT_RADIX;
-	    }
-	  g_string_free (gstring, TRUE);
-	  gstring = NULL;
-	  ch = 0;
-	} /* number_parsing:... */
-	break;
-	
-	default:
-	default_case:
-	{
-	  if (config->cpair_comment_single &&
-	      ch == config->cpair_comment_single[0])
-	    {
-	      token = G_TOKEN_COMMENT_SINGLE;
-	      in_comment_single = TRUE;
-	      gstring = g_string_new ("");
-              ch = g_scanner_get_char (scanner, line_p, position_p);
-	      while (ch != 0)
-		{
-		  if (ch == config->cpair_comment_single[1])
-		    {
-		      in_comment_single = FALSE;
-		      ch = 0;
-		      break;
-		    }
-		  
-		  gstring = g_string_append_c (gstring, ch);
-		  ch = g_scanner_get_char (scanner, line_p, position_p);
-		}
-	    }
-	  else if (config->scan_identifier && ch &&
-		   strchr (config->cset_identifier_first, ch))
-	    {
-	    identifier_precedence:
-	      
-	      if (config->cset_identifier_nth && ch &&
-		  strchr (config->cset_identifier_nth,
-			  g_scanner_peek_next_char (scanner)))
-		{
-		  token = G_TOKEN_IDENTIFIER;
-		  gstring = g_string_new ("");
-		  gstring = g_string_append_c (gstring, ch);
-		  do
-		    {
-		      ch = g_scanner_get_char (scanner, line_p, position_p);
-		      gstring = g_string_append_c (gstring, ch);
-		      ch = g_scanner_peek_next_char (scanner);
-		    }
-		  while (ch && strchr (config->cset_identifier_nth, ch));
-		  ch = 0;
-		}
-	      else if (config->scan_identifier_1char)
-		{
-		  token = G_TOKEN_IDENTIFIER;
-		  value.v_identifier = g_new0 (gchar, 2);
-		  value.v_identifier[0] = ch;
-		  ch = 0;
-		}
-	    }
-	  if (ch)
-	    {
-	      if (config->char_2_token)
-		token = ch;
-	      else
-		{
-		  token = G_TOKEN_CHAR;
-		  value.v_char = ch;
-		}
-	      ch = 0;
-	    }
-	} /* default_case:... */
-	break;
-	}
-      g_assert (ch == 0 && token != G_TOKEN_NONE); /* paranoid */
-    }
-  while (ch != 0);
-  
-  if (in_comment_multi || in_comment_single ||
-      in_string_sq || in_string_dq)
-    {
-      token = G_TOKEN_ERROR;
-      if (gstring)
-	{
-	  g_string_free (gstring, TRUE);
-	  gstring = NULL;
-	}
-      (*position_p)++;
-      if (in_comment_multi || in_comment_single)
-	value.v_error = G_ERR_UNEXP_EOF_IN_COMMENT;
-      else /* (in_string_sq || in_string_dq) */
-	value.v_error = G_ERR_UNEXP_EOF_IN_STRING;
-    }
-  
-  if (gstring)
-    {
-      value.v_string = gstring->str;
-      g_string_free (gstring, FALSE);
-      gstring = NULL;
-    }
-  
-  if (token == G_TOKEN_IDENTIFIER)
-    {
-      if (config->scan_symbols)
-	{
-	  GScannerKey *key;
-	  guint scope_id;
-	  
-	  scope_id = scanner->scope_id;
-	  key = g_scanner_lookup_internal (scanner, scope_id, value.v_identifier);
-	  if (!key && scope_id && scanner->config->scope_0_fallback)
-	    key = g_scanner_lookup_internal (scanner, 0, value.v_identifier);
-	  
-	  if (key)
-	    {
-	      g_free (value.v_identifier);
-	      token = G_TOKEN_SYMBOL;
-	      value.v_symbol = key->value;
-	    }
-	}
-      
-      if (token == G_TOKEN_IDENTIFIER &&
-	  config->scan_identifier_NULL &&
-	  strlen (value.v_identifier) == 4)
-	{
-	  gchar *null_upper = "NULL";
-	  gchar *null_lower = "null";
-	  
-	  if (scanner->config->case_sensitive)
-	    {
-	      if (value.v_identifier[0] == null_upper[0] &&
-		  value.v_identifier[1] == null_upper[1] &&
-		  value.v_identifier[2] == null_upper[2] &&
-		  value.v_identifier[3] == null_upper[3])
-		token = G_TOKEN_IDENTIFIER_NULL;
-	    }
-	  else
-	    {
-	      if ((value.v_identifier[0] == null_upper[0] ||
-		   value.v_identifier[0] == null_lower[0]) &&
-		  (value.v_identifier[1] == null_upper[1] ||
-		   value.v_identifier[1] == null_lower[1]) &&
-		  (value.v_identifier[2] == null_upper[2] ||
-		   value.v_identifier[2] == null_lower[2]) &&
-		  (value.v_identifier[3] == null_upper[3] ||
-		   value.v_identifier[3] == null_lower[3]))
-		token = G_TOKEN_IDENTIFIER_NULL;
-	    }
-	}
-    }
-  
-  *token_p = token;
-  *value_p = value;
-}
diff --git a/glib/gslist.c b/glib/gslist.c
deleted file mode 100644
index eed0007..0000000
--- a/glib/gslist.c
+++ /dev/null
@@ -1,595 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-
-
-struct _GAllocator /* from gmem.c */
-{
-  gchar         *name;
-  guint16        n_preallocs;
-  guint          is_unused : 1;
-  guint          type : 4;
-  GAllocator    *last;
-  GMemChunk     *mem_chunk;
-  GSList        *free_lists; /* implementation specific */
-};
-
-G_LOCK_DEFINE_STATIC (current_allocator);
-static GAllocator       *current_allocator = NULL;
-
-/* HOLDS: current_allocator_lock */
-static void
-g_slist_validate_allocator (GAllocator *allocator)
-{
-  g_return_if_fail (allocator != NULL);
-  g_return_if_fail (allocator->is_unused == TRUE);
-
-  if (allocator->type != G_ALLOCATOR_SLIST)
-    {
-      allocator->type = G_ALLOCATOR_SLIST;
-      if (allocator->mem_chunk)
-	{
-	  g_mem_chunk_destroy (allocator->mem_chunk);
-	  allocator->mem_chunk = NULL;
-	}
-    }
-
-  if (!allocator->mem_chunk)
-    {
-      allocator->mem_chunk = g_mem_chunk_new (allocator->name,
-					      sizeof (GSList),
-					      sizeof (GSList) * allocator->n_preallocs,
-					      G_ALLOC_ONLY);
-      allocator->free_lists = NULL;
-    }
-
-  allocator->is_unused = FALSE;
-}
-
-void
-g_slist_push_allocator (GAllocator *allocator)
-{
-  G_LOCK (current_allocator);
-  g_slist_validate_allocator (allocator);
-  allocator->last = current_allocator;
-  current_allocator = allocator;
-  G_UNLOCK (current_allocator);
-}
-
-void
-g_slist_pop_allocator (void)
-{
-  G_LOCK (current_allocator);
-  if (current_allocator)
-    {
-      GAllocator *allocator;
-
-      allocator = current_allocator;
-      current_allocator = allocator->last;
-      allocator->last = NULL;
-      allocator->is_unused = TRUE;
-    }
-  G_UNLOCK (current_allocator);
-}
-
-GSList*
-g_slist_alloc (void)
-{
-  GSList *list;
-
-  G_LOCK (current_allocator);
-  if (!current_allocator)
-    {
-      GAllocator *allocator = g_allocator_new ("GLib default GSList allocator",
-					       128);
-      g_slist_validate_allocator (allocator);
-      allocator->last = NULL;
-      current_allocator = allocator; 
-    }
-  if (!current_allocator->free_lists)
-    {
-      list = g_chunk_new (GSList, current_allocator->mem_chunk);
-      list->data = NULL;
-    }
-  else
-    {
-      if (current_allocator->free_lists->data)
-	{
-	  list = current_allocator->free_lists->data;
-	  current_allocator->free_lists->data = list->next;
-	  list->data = NULL;
-	}
-      else
-	{
-	  list = current_allocator->free_lists;
-	  current_allocator->free_lists = list->next;
-	}
-    }
-  G_UNLOCK (current_allocator);
-  
-  list->next = NULL;
-
-  return list;
-}
-
-void
-g_slist_free (GSList *list)
-{
-  if (list)
-    {
-      list->data = list->next;
-      G_LOCK (current_allocator);
-      list->next = current_allocator->free_lists;
-      current_allocator->free_lists = list;
-      G_UNLOCK (current_allocator);
-    }
-}
-
-void
-g_slist_free_1 (GSList *list)
-{
-  if (list)
-    {
-      list->data = NULL;
-      G_LOCK (current_allocator);
-      list->next = current_allocator->free_lists;
-      current_allocator->free_lists = list;
-      G_UNLOCK (current_allocator);
-    }
-}
-
-GSList*
-g_slist_append (GSList   *list,
-		gpointer  data)
-{
-  GSList *new_list;
-  GSList *last;
-
-  new_list = g_slist_alloc ();
-  new_list->data = data;
-
-  if (list)
-    {
-      last = g_slist_last (list);
-      /* g_assert (last != NULL); */
-      last->next = new_list;
-
-      return list;
-    }
-  else
-      return new_list;
-}
-
-GSList*
-g_slist_prepend (GSList   *list,
-		 gpointer  data)
-{
-  GSList *new_list;
-
-  new_list = g_slist_alloc ();
-  new_list->data = data;
-  new_list->next = list;
-
-  return new_list;
-}
-
-GSList*
-g_slist_insert (GSList   *list,
-		gpointer  data,
-		gint      position)
-{
-  GSList *prev_list;
-  GSList *tmp_list;
-  GSList *new_list;
-
-  if (position < 0)
-    return g_slist_append (list, data);
-  else if (position == 0)
-    return g_slist_prepend (list, data);
-
-  new_list = g_slist_alloc ();
-  new_list->data = data;
-
-  if (!list)
-    return new_list;
-
-  prev_list = NULL;
-  tmp_list = list;
-
-  while ((position-- > 0) && tmp_list)
-    {
-      prev_list = tmp_list;
-      tmp_list = tmp_list->next;
-    }
-
-  if (prev_list)
-    {
-      new_list->next = prev_list->next;
-      prev_list->next = new_list;
-    }
-  else
-    {
-      new_list->next = list;
-      list = new_list;
-    }
-
-  return list;
-}
-
-GSList *
-g_slist_concat (GSList *list1, GSList *list2)
-{
-  if (list2)
-    {
-      if (list1)
-	g_slist_last (list1)->next = list2;
-      else
-	list1 = list2;
-    }
-
-  return list1;
-}
-
-GSList*
-g_slist_remove (GSList   *list,
-		gpointer  data)
-{
-  GSList *tmp;
-  GSList *prev;
-
-  prev = NULL;
-  tmp = list;
-
-  while (tmp)
-    {
-      if (tmp->data == data)
-	{
-	  if (prev)
-	    prev->next = tmp->next;
-	  if (list == tmp)
-	    list = list->next;
-
-	  tmp->next = NULL;
-	  g_slist_free (tmp);
-
-	  break;
-	}
-
-      prev = tmp;
-      tmp = tmp->next;
-    }
-
-  return list;
-}
-
-GSList*
-g_slist_remove_link (GSList *list,
-		     GSList *link)
-{
-  GSList *tmp;
-  GSList *prev;
-
-  prev = NULL;
-  tmp = list;
-
-  while (tmp)
-    {
-      if (tmp == link)
-	{
-	  if (prev)
-	    prev->next = tmp->next;
-	  if (list == tmp)
-	    list = list->next;
-
-	  tmp->next = NULL;
-	  break;
-	}
-
-      prev = tmp;
-      tmp = tmp->next;
-    }
-
-  return list;
-}
-
-GSList*
-g_slist_copy (GSList *list)
-{
-  GSList *new_list = NULL;
-
-  if (list)
-    {
-      GSList *last;
-
-      new_list = g_slist_alloc ();
-      new_list->data = list->data;
-      last = new_list;
-      list = list->next;
-      while (list)
-	{
-	  last->next = g_slist_alloc ();
-	  last = last->next;
-	  last->data = list->data;
-	  list = list->next;
-	}
-    }
-
-  return new_list;
-}
-
-GSList*
-g_slist_reverse (GSList *list)
-{
-  GSList *prev = NULL;
-
-  while (list)
-    {
-      GSList *next = list->next;
-
-      list->next = prev;
-
-      prev = list;
-      list = next;
-    }
-
-  return prev;
-}
-
-GSList*
-g_slist_nth (GSList *list,
-	     guint   n)
-{
-  while ((n-- > 0) && list)
-    list = list->next;
-
-  return list;
-}
-
-gpointer
-g_slist_nth_data (GSList   *list,
-		  guint     n)
-{
-  while ((n-- > 0) && list)
-    list = list->next;
-
-  return list ? list->data : NULL;
-}
-
-GSList*
-g_slist_find (GSList   *list,
-	      gpointer  data)
-{
-  while (list)
-    {
-      if (list->data == data)
-	break;
-      list = list->next;
-    }
-
-  return list;
-}
-
-GSList*
-g_slist_find_custom (GSList      *list,
-		     gpointer     data,
-		     GCompareFunc func)
-{
-  g_return_val_if_fail (func != NULL, list);
-
-  while (list)
-    {
-      if (! func (list->data, data))
-	return list;
-      list = list->next;
-    }
-
-  return NULL;
-}
-
-gint
-g_slist_position (GSList *list,
-		  GSList *link)
-{
-  gint i;
-
-  i = 0;
-  while (list)
-    {
-      if (list == link)
-	return i;
-      i++;
-      list = list->next;
-    }
-
-  return -1;
-}
-
-gint
-g_slist_index (GSList   *list,
-	       gpointer data)
-{
-  gint i;
-
-  i = 0;
-  while (list)
-    {
-      if (list->data == data)
-	return i;
-      i++;
-      list = list->next;
-    }
-
-  return -1;
-}
-
-GSList*
-g_slist_last (GSList *list)
-{
-  if (list)
-    {
-      while (list->next)
-	list = list->next;
-    }
-
-  return list;
-}
-
-guint
-g_slist_length (GSList *list)
-{
-  guint length;
-
-  length = 0;
-  while (list)
-    {
-      length++;
-      list = list->next;
-    }
-
-  return length;
-}
-
-void
-g_slist_foreach (GSList   *list,
-		 GFunc     func,
-		 gpointer  user_data)
-{
-  while (list)
-    {
-      (*func) (list->data, user_data);
-      list = list->next;
-    }
-}
-
-GSList*
-g_slist_insert_sorted (GSList       *list,
-                       gpointer      data,
-                       GCompareFunc  func)
-{
-  GSList *tmp_list = list;
-  GSList *prev_list = NULL;
-  GSList *new_list;
-  gint cmp;
- 
-  g_return_val_if_fail (func != NULL, list);
-
-  if (!list)
-    {
-      new_list = g_slist_alloc();
-      new_list->data = data;
-      return new_list;
-    }
- 
-  cmp = (*func) (data, tmp_list->data);
- 
-  while ((tmp_list->next) && (cmp > 0))
-    {
-      prev_list = tmp_list;
-      tmp_list = tmp_list->next;
-      cmp = (*func) (data, tmp_list->data);
-    }
-
-  new_list = g_slist_alloc();
-  new_list->data = data;
-
-  if ((!tmp_list->next) && (cmp > 0))
-    {
-      tmp_list->next = new_list;
-      return list;
-    }
-  
-  if (prev_list)
-    {
-      prev_list->next = new_list;
-      new_list->next = tmp_list;
-      return list;
-    }
-  else
-    {
-      new_list->next = list;
-      return new_list;
-    }
-}
-
-static GSList* 
-g_slist_sort_merge  (GSList      *l1, 
-		     GSList      *l2,
-		     GCompareFunc compare_func)
-{
-  GSList list, *l;
-
-  l=&list;
-
-  while (l1 && l2)
-    {
-      if (compare_func(l1->data,l2->data) < 0)
-        {
-	  l=l->next=l1;
-	  l1=l1->next;
-        } 
-      else 
-	{
-	  l=l->next=l2;
-	  l2=l2->next;
-        }
-    }
-  l->next= l1 ? l1 : l2;
-  
-  return list.next;
-}
-
-GSList* 
-g_slist_sort (GSList       *list,
-	      GCompareFunc compare_func)
-{
-  GSList *l1, *l2;
-
-  if (!list) 
-    return NULL;
-  if (!list->next) 
-    return list;
-
-  l1 = list; 
-  l2 = list->next;
-
-  while ((l2 = l2->next) != NULL)
-    {
-      if ((l2 = l2->next) == NULL) 
-	break;
-      l1=l1->next;
-    }
-  l2 = l1->next; 
-  l1->next = NULL;
-
-  return g_slist_sort_merge (g_slist_sort (list, compare_func),
-			     g_slist_sort (l2,   compare_func),
-			     compare_func);
-}
diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c
deleted file mode 100644
index feb4572..0000000
--- a/glib/gstrfuncs.c
+++ /dev/null
@@ -1,1496 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/*
- * MT safe
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <locale.h>
-#include <errno.h>
-#include <ctype.h>		/* For tolower() */
-#if !defined (HAVE_STRSIGNAL) || !defined(NO_SYS_SIGLIST_DECL)
-#include <signal.h>
-#endif
-#include "glib.h"
-/* do not include <unistd.h> in this place since it
- * inteferes with g_strsignal() on some OSes
- */
-
-typedef union  _GDoubleIEEE754  GDoubleIEEE754;
-#define G_IEEE754_DOUBLE_BIAS   (1023)
-/* multiply with base2 exponent to get base10 exponent (nomal numbers) */
-#define G_LOG_2_BASE_10         (0.30102999566398119521)
-#if G_BYTE_ORDER == G_LITTLE_ENDIAN
-union _GDoubleIEEE754
-{
-  gdouble v_double;
-  struct {
-    guint mantissa_low : 32;
-    guint mantissa_high : 20;
-    guint biased_exponent : 11;
-    guint sign : 1;
-  } mpn;
-};
-#elif G_BYTE_ORDER == G_BIG_ENDIAN
-union _GDoubleIEEE754
-{
-  gdouble v_double;
-  struct {
-    guint sign : 1;
-    guint biased_exponent : 11;
-    guint mantissa_high : 20;
-    guint mantissa_low : 32;
-  } mpn;
-};
-#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
-#error unknown ENDIAN type
-#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
-
-gchar*
-g_strdup (const gchar *str)
-{
-  gchar *new_str;
-
-  if (str)
-    {
-      new_str = g_new (char, strlen (str) + 1);
-      strcpy (new_str, str);
-    }
-  else
-    new_str = NULL;
-
-  return new_str;
-}
-
-gpointer
-g_memdup (gconstpointer mem,
-	  guint         byte_size)
-{
-  gpointer new_mem;
-
-  if (mem)
-    {
-      new_mem = g_malloc (byte_size);
-      memcpy (new_mem, mem, byte_size);
-    }
-  else
-    new_mem = NULL;
-
-  return new_mem;
-}
-
-gchar*
-g_strndup (const gchar *str,
-	   guint        n)
-{
-  gchar *new_str;
-
-  if (str)
-    {
-      new_str = g_new (gchar, n + 1);
-      strncpy (new_str, str, n);
-      new_str[n] = '\0';
-    }
-  else
-    new_str = NULL;
-
-  return new_str;
-}
-
-gchar*
-g_strnfill (guint length,
-	    gchar fill_char)
-{
-  register gchar *str, *s, *end;
-
-  str = g_new (gchar, length + 1);
-  s = str;
-  end = str + length;
-  while (s < end)
-    *(s++) = fill_char;
-  *s = 0;
-
-  return str;
-}
-
-gchar*
-g_strdup_vprintf (const gchar *format,
-		  va_list      args1)
-{
-  gchar *buffer;
-  va_list args2;
-
-  G_VA_COPY (args2, args1);
-
-  buffer = g_new (gchar, g_printf_string_upper_bound (format, args1));
-
-  vsprintf (buffer, format, args2);
-  va_end (args2);
-
-  return buffer;
-}
-
-gchar*
-g_strdup_printf (const gchar *format,
-		 ...)
-{
-  gchar *buffer;
-  va_list args;
-
-  va_start (args, format);
-  buffer = g_strdup_vprintf (format, args);
-  va_end (args);
-
-  return buffer;
-}
-
-gchar*
-g_strconcat (const gchar *string1, ...)
-{
-  guint	  l;
-  va_list args;
-  gchar	  *s;
-  gchar	  *concat;
-
-  g_return_val_if_fail (string1 != NULL, NULL);
-
-  l = 1 + strlen (string1);
-  va_start (args, string1);
-  s = va_arg (args, gchar*);
-  while (s)
-    {
-      l += strlen (s);
-      s = va_arg (args, gchar*);
-    }
-  va_end (args);
-
-  concat = g_new (gchar, l);
-  concat[0] = 0;
-
-  strcat (concat, string1);
-  va_start (args, string1);
-  s = va_arg (args, gchar*);
-  while (s)
-    {
-      strcat (concat, s);
-      s = va_arg (args, gchar*);
-    }
-  va_end (args);
-
-  return concat;
-}
-
-gdouble
-g_strtod (const gchar *nptr,
-	  gchar **endptr)
-{
-  gchar *fail_pos_1;
-  gchar *fail_pos_2;
-  gdouble val_1;
-  gdouble val_2 = 0;
-
-  g_return_val_if_fail (nptr != NULL, 0);
-
-  fail_pos_1 = NULL;
-  fail_pos_2 = NULL;
-
-  val_1 = strtod (nptr, &fail_pos_1);
-
-  if (fail_pos_1 && fail_pos_1[0] != 0)
-    {
-      gchar *old_locale;
-
-      old_locale = g_strdup (setlocale (LC_NUMERIC, NULL));
-      setlocale (LC_NUMERIC, "C");
-      val_2 = strtod (nptr, &fail_pos_2);
-      setlocale (LC_NUMERIC, old_locale);
-      g_free (old_locale);
-    }
-
-  if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2)
-    {
-      if (endptr)
-	*endptr = fail_pos_1;
-      return val_1;
-    }
-  else
-    {
-      if (endptr)
-	*endptr = fail_pos_2;
-      return val_2;
-    }
-}
-
-gchar*
-g_strerror (gint errnum)
-{
-  static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT;
-  char *msg;
-
-#ifdef HAVE_STRERROR
-  return strerror (errnum);
-#elif NO_SYS_ERRLIST
-  switch (errnum)
-    {
-#ifdef E2BIG
-    case E2BIG: return "argument list too long";
-#endif
-#ifdef EACCES
-    case EACCES: return "permission denied";
-#endif
-#ifdef EADDRINUSE
-    case EADDRINUSE: return "address already in use";
-#endif
-#ifdef EADDRNOTAVAIL
-    case EADDRNOTAVAIL: return "can't assign requested address";
-#endif
-#ifdef EADV
-    case EADV: return "advertise error";
-#endif
-#ifdef EAFNOSUPPORT
-    case EAFNOSUPPORT: return "address family not supported by protocol family";
-#endif
-#ifdef EAGAIN
-    case EAGAIN: return "try again";
-#endif
-#ifdef EALIGN
-    case EALIGN: return "EALIGN";
-#endif
-#ifdef EALREADY
-    case EALREADY: return "operation already in progress";
-#endif
-#ifdef EBADE
-    case EBADE: return "bad exchange descriptor";
-#endif
-#ifdef EBADF
-    case EBADF: return "bad file number";
-#endif
-#ifdef EBADFD
-    case EBADFD: return "file descriptor in bad state";
-#endif
-#ifdef EBADMSG
-    case EBADMSG: return "not a data message";
-#endif
-#ifdef EBADR
-    case EBADR: return "bad request descriptor";
-#endif
-#ifdef EBADRPC
-    case EBADRPC: return "RPC structure is bad";
-#endif
-#ifdef EBADRQC
-    case EBADRQC: return "bad request code";
-#endif
-#ifdef EBADSLT
-    case EBADSLT: return "invalid slot";
-#endif
-#ifdef EBFONT
-    case EBFONT: return "bad font file format";
-#endif
-#ifdef EBUSY
-    case EBUSY: return "mount device busy";
-#endif
-#ifdef ECHILD
-    case ECHILD: return "no children";
-#endif
-#ifdef ECHRNG
-    case ECHRNG: return "channel number out of range";
-#endif
-#ifdef ECOMM
-    case ECOMM: return "communication error on send";
-#endif
-#ifdef ECONNABORTED
-    case ECONNABORTED: return "software caused connection abort";
-#endif
-#ifdef ECONNREFUSED
-    case ECONNREFUSED: return "connection refused";
-#endif
-#ifdef ECONNRESET
-    case ECONNRESET: return "connection reset by peer";
-#endif
-#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK))
-    case EDEADLK: return "resource deadlock avoided";
-#endif
-#ifdef EDEADLOCK
-    case EDEADLOCK: return "resource deadlock avoided";
-#endif
-#ifdef EDESTADDRREQ
-    case EDESTADDRREQ: return "destination address required";
-#endif
-#ifdef EDIRTY
-    case EDIRTY: return "mounting a dirty fs w/o force";
-#endif
-#ifdef EDOM
-    case EDOM: return "math argument out of range";
-#endif
-#ifdef EDOTDOT
-    case EDOTDOT: return "cross mount point";
-#endif
-#ifdef EDQUOT
-    case EDQUOT: return "disk quota exceeded";
-#endif
-#ifdef EDUPPKG
-    case EDUPPKG: return "duplicate package name";
-#endif
-#ifdef EEXIST
-    case EEXIST: return "file already exists";
-#endif
-#ifdef EFAULT
-    case EFAULT: return "bad address in system call argument";
-#endif
-#ifdef EFBIG
-    case EFBIG: return "file too large";
-#endif
-#ifdef EHOSTDOWN
-    case EHOSTDOWN: return "host is down";
-#endif
-#ifdef EHOSTUNREACH
-    case EHOSTUNREACH: return "host is unreachable";
-#endif
-#ifdef EIDRM
-    case EIDRM: return "identifier removed";
-#endif
-#ifdef EINIT
-    case EINIT: return "initialization error";
-#endif
-#ifdef EINPROGRESS
-    case EINPROGRESS: return "operation now in progress";
-#endif
-#ifdef EINTR
-    case EINTR: return "interrupted system call";
-#endif
-#ifdef EINVAL
-    case EINVAL: return "invalid argument";
-#endif
-#ifdef EIO
-    case EIO: return "I/O error";
-#endif
-#ifdef EISCONN
-    case EISCONN: return "socket is already connected";
-#endif
-#ifdef EISDIR
-    case EISDIR: return "illegal operation on a directory";
-#endif
-#ifdef EISNAME
-    case EISNAM: return "is a name file";
-#endif
-#ifdef ELBIN
-    case ELBIN: return "ELBIN";
-#endif
-#ifdef EL2HLT
-    case EL2HLT: return "level 2 halted";
-#endif
-#ifdef EL2NSYNC
-    case EL2NSYNC: return "level 2 not synchronized";
-#endif
-#ifdef EL3HLT
-    case EL3HLT: return "level 3 halted";
-#endif
-#ifdef EL3RST
-    case EL3RST: return "level 3 reset";
-#endif
-#ifdef ELIBACC
-    case ELIBACC: return "can not access a needed shared library";
-#endif
-#ifdef ELIBBAD
-    case ELIBBAD: return "accessing a corrupted shared library";
-#endif
-#ifdef ELIBEXEC
-    case ELIBEXEC: return "can not exec a shared library directly";
-#endif
-#ifdef ELIBMAX
-    case ELIBMAX: return "attempting to link in more shared libraries than system limit";
-#endif
-#ifdef ELIBSCN
-    case ELIBSCN: return ".lib section in a.out corrupted";
-#endif
-#ifdef ELNRNG
-    case ELNRNG: return "link number out of range";
-#endif
-#ifdef ELOOP
-    case ELOOP: return "too many levels of symbolic links";
-#endif
-#ifdef EMFILE
-    case EMFILE: return "too many open files";
-#endif
-#ifdef EMLINK
-    case EMLINK: return "too many links";
-#endif
-#ifdef EMSGSIZE
-    case EMSGSIZE: return "message too long";
-#endif
-#ifdef EMULTIHOP
-    case EMULTIHOP: return "multihop attempted";
-#endif
-#ifdef ENAMETOOLONG
-    case ENAMETOOLONG: return "file name too long";
-#endif
-#ifdef ENAVAIL
-    case ENAVAIL: return "not available";
-#endif
-#ifdef ENET
-    case ENET: return "ENET";
-#endif
-#ifdef ENETDOWN
-    case ENETDOWN: return "network is down";
-#endif
-#ifdef ENETRESET
-    case ENETRESET: return "network dropped connection on reset";
-#endif
-#ifdef ENETUNREACH
-    case ENETUNREACH: return "network is unreachable";
-#endif
-#ifdef ENFILE
-    case ENFILE: return "file table overflow";
-#endif
-#ifdef ENOANO
-    case ENOANO: return "anode table overflow";
-#endif
-#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
-    case ENOBUFS: return "no buffer space available";
-#endif
-#ifdef ENOCSI
-    case ENOCSI: return "no CSI structure available";
-#endif
-#ifdef ENODATA
-    case ENODATA: return "no data available";
-#endif
-#ifdef ENODEV
-    case ENODEV: return "no such device";
-#endif
-#ifdef ENOENT
-    case ENOENT: return "no such file or directory";
-#endif
-#ifdef ENOEXEC
-    case ENOEXEC: return "exec format error";
-#endif
-#ifdef ENOLCK
-    case ENOLCK: return "no locks available";
-#endif
-#ifdef ENOLINK
-    case ENOLINK: return "link has be severed";
-#endif
-#ifdef ENOMEM
-    case ENOMEM: return "not enough memory";
-#endif
-#ifdef ENOMSG
-    case ENOMSG: return "no message of desired type";
-#endif
-#ifdef ENONET
-    case ENONET: return "machine is not on the network";
-#endif
-#ifdef ENOPKG
-    case ENOPKG: return "package not installed";
-#endif
-#ifdef ENOPROTOOPT
-    case ENOPROTOOPT: return "bad proocol option";
-#endif
-#ifdef ENOSPC
-    case ENOSPC: return "no space left on device";
-#endif
-#ifdef ENOSR
-    case ENOSR: return "out of stream resources";
-#endif
-#ifdef ENOSTR
-    case ENOSTR: return "not a stream device";
-#endif
-#ifdef ENOSYM
-    case ENOSYM: return "unresolved symbol name";
-#endif
-#ifdef ENOSYS
-    case ENOSYS: return "function not implemented";
-#endif
-#ifdef ENOTBLK
-    case ENOTBLK: return "block device required";
-#endif
-#ifdef ENOTCONN
-    case ENOTCONN: return "socket is not connected";
-#endif
-#ifdef ENOTDIR
-    case ENOTDIR: return "not a directory";
-#endif
-#ifdef ENOTEMPTY
-    case ENOTEMPTY: return "directory not empty";
-#endif
-#ifdef ENOTNAM
-    case ENOTNAM: return "not a name file";
-#endif
-#ifdef ENOTSOCK
-    case ENOTSOCK: return "socket operation on non-socket";
-#endif
-#ifdef ENOTTY
-    case ENOTTY: return "inappropriate device for ioctl";
-#endif
-#ifdef ENOTUNIQ
-    case ENOTUNIQ: return "name not unique on network";
-#endif
-#ifdef ENXIO
-    case ENXIO: return "no such device or address";
-#endif
-#ifdef EOPNOTSUPP
-    case EOPNOTSUPP: return "operation not supported on socket";
-#endif
-#ifdef EPERM
-    case EPERM: return "not owner";
-#endif
-#ifdef EPFNOSUPPORT
-    case EPFNOSUPPORT: return "protocol family not supported";
-#endif
-#ifdef EPIPE
-    case EPIPE: return "broken pipe";
-#endif
-#ifdef EPROCLIM
-    case EPROCLIM: return "too many processes";
-#endif
-#ifdef EPROCUNAVAIL
-    case EPROCUNAVAIL: return "bad procedure for program";
-#endif
-#ifdef EPROGMISMATCH
-    case EPROGMISMATCH: return "program version wrong";
-#endif
-#ifdef EPROGUNAVAIL
-    case EPROGUNAVAIL: return "RPC program not available";
-#endif
-#ifdef EPROTO
-    case EPROTO: return "protocol error";
-#endif
-#ifdef EPROTONOSUPPORT
-    case EPROTONOSUPPORT: return "protocol not suppored";
-#endif
-#ifdef EPROTOTYPE
-    case EPROTOTYPE: return "protocol wrong type for socket";
-#endif
-#ifdef ERANGE
-    case ERANGE: return "math result unrepresentable";
-#endif
-#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
-    case EREFUSED: return "EREFUSED";
-#endif
-#ifdef EREMCHG
-    case EREMCHG: return "remote address changed";
-#endif
-#ifdef EREMDEV
-    case EREMDEV: return "remote device";
-#endif
-#ifdef EREMOTE
-    case EREMOTE: return "pathname hit remote file system";
-#endif
-#ifdef EREMOTEIO
-    case EREMOTEIO: return "remote i/o error";
-#endif
-#ifdef EREMOTERELEASE
-    case EREMOTERELEASE: return "EREMOTERELEASE";
-#endif
-#ifdef EROFS
-    case EROFS: return "read-only file system";
-#endif
-#ifdef ERPCMISMATCH
-    case ERPCMISMATCH: return "RPC version is wrong";
-#endif
-#ifdef ERREMOTE
-    case ERREMOTE: return "object is remote";
-#endif
-#ifdef ESHUTDOWN
-    case ESHUTDOWN: return "can't send afer socket shutdown";
-#endif
-#ifdef ESOCKTNOSUPPORT
-    case ESOCKTNOSUPPORT: return "socket type not supported";
-#endif
-#ifdef ESPIPE
-    case ESPIPE: return "invalid seek";
-#endif
-#ifdef ESRCH
-    case ESRCH: return "no such process";
-#endif
-#ifdef ESRMNT
-    case ESRMNT: return "srmount error";
-#endif
-#ifdef ESTALE
-    case ESTALE: return "stale remote file handle";
-#endif
-#ifdef ESUCCESS
-    case ESUCCESS: return "Error 0";
-#endif
-#ifdef ETIME
-    case ETIME: return "timer expired";
-#endif
-#ifdef ETIMEDOUT
-    case ETIMEDOUT: return "connection timed out";
-#endif
-#ifdef ETOOMANYREFS
-    case ETOOMANYREFS: return "too many references: can't splice";
-#endif
-#ifdef ETXTBSY
-    case ETXTBSY: return "text file or pseudo-device busy";
-#endif
-#ifdef EUCLEAN
-    case EUCLEAN: return "structure needs cleaning";
-#endif
-#ifdef EUNATCH
-    case EUNATCH: return "protocol driver not attached";
-#endif
-#ifdef EUSERS
-    case EUSERS: return "too many users";
-#endif
-#ifdef EVERSION
-    case EVERSION: return "version mismatch";
-#endif
-#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
-    case EWOULDBLOCK: return "operation would block";
-#endif
-#ifdef EXDEV
-    case EXDEV: return "cross-domain link";
-#endif
-#ifdef EXFULL
-    case EXFULL: return "message tables full";
-#endif
-    }
-#else /* NO_SYS_ERRLIST */
-  extern int sys_nerr;
-  extern char *sys_errlist[];
-
-  if ((errnum > 0) && (errnum <= sys_nerr))
-    return sys_errlist [errnum];
-#endif /* NO_SYS_ERRLIST */
-
-  msg = g_static_private_get (&msg_private);
-  if (!msg)
-    {
-      msg = g_new (gchar, 64);
-      g_static_private_set (&msg_private, msg, g_free);
-    }
-
-  sprintf (msg, "unknown error (%d)", errnum);
-
-  return msg;
-}
-
-gchar*
-g_strsignal (gint signum)
-{
-  static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT;
-  char *msg;
-
-#ifdef HAVE_STRSIGNAL
-  extern char *strsignal (int sig);
-  return strsignal (signum);
-#elif NO_SYS_SIGLIST
-  switch (signum)
-    {
-#ifdef SIGHUP
-    case SIGHUP: return "Hangup";
-#endif
-#ifdef SIGINT
-    case SIGINT: return "Interrupt";
-#endif
-#ifdef SIGQUIT
-    case SIGQUIT: return "Quit";
-#endif
-#ifdef SIGILL
-    case SIGILL: return "Illegal instruction";
-#endif
-#ifdef SIGTRAP
-    case SIGTRAP: return "Trace/breakpoint trap";
-#endif
-#ifdef SIGABRT
-    case SIGABRT: return "IOT trap/Abort";
-#endif
-#ifdef SIGBUS
-    case SIGBUS: return "Bus error";
-#endif
-#ifdef SIGFPE
-    case SIGFPE: return "Floating point exception";
-#endif
-#ifdef SIGKILL
-    case SIGKILL: return "Killed";
-#endif
-#ifdef SIGUSR1
-    case SIGUSR1: return "User defined signal 1";
-#endif
-#ifdef SIGSEGV
-    case SIGSEGV: return "Segmentation fault";
-#endif
-#ifdef SIGUSR2
-    case SIGUSR2: return "User defined signal 2";
-#endif
-#ifdef SIGPIPE
-    case SIGPIPE: return "Broken pipe";
-#endif
-#ifdef SIGALRM
-    case SIGALRM: return "Alarm clock";
-#endif
-#ifdef SIGTERM
-    case SIGTERM: return "Terminated";
-#endif
-#ifdef SIGSTKFLT
-    case SIGSTKFLT: return "Stack fault";
-#endif
-#ifdef SIGCHLD
-    case SIGCHLD: return "Child exited";
-#endif
-#ifdef SIGCONT
-    case SIGCONT: return "Continued";
-#endif
-#ifdef SIGSTOP
-    case SIGSTOP: return "Stopped (signal)";
-#endif
-#ifdef SIGTSTP
-    case SIGTSTP: return "Stopped";
-#endif
-#ifdef SIGTTIN
-    case SIGTTIN: return "Stopped (tty input)";
-#endif
-#ifdef SIGTTOU
-    case SIGTTOU: return "Stopped (tty output)";
-#endif
-#ifdef SIGURG
-    case SIGURG: return "Urgent condition";
-#endif
-#ifdef SIGXCPU
-    case SIGXCPU: return "CPU time limit exceeded";
-#endif
-#ifdef SIGXFSZ
-    case SIGXFSZ: return "File size limit exceeded";
-#endif
-#ifdef SIGVTALRM
-    case SIGVTALRM: return "Virtual time alarm";
-#endif
-#ifdef SIGPROF
-    case SIGPROF: return "Profile signal";
-#endif
-#ifdef SIGWINCH
-    case SIGWINCH: return "Window size changed";
-#endif
-#ifdef SIGIO
-    case SIGIO: return "Possible I/O";
-#endif
-#ifdef SIGPWR
-    case SIGPWR: return "Power failure";
-#endif
-#ifdef SIGUNUSED
-    case SIGUNUSED: return "Unused signal";
-#endif
-    }
-#else /* NO_SYS_SIGLIST */
-
-#ifdef NO_SYS_SIGLIST_DECL
-  extern char *sys_siglist[];	/*(see Tue Jan 19 00:44:24 1999 in changelog)*/
-#endif
-
-  return (char*) /* this function should return const --josh */ sys_siglist [signum];
-#endif /* NO_SYS_SIGLIST */
-
-  msg = g_static_private_get (&msg_private);
-  if (!msg)
-    {
-      msg = g_new (gchar, 64);
-      g_static_private_set (&msg_private, msg, g_free);
-    }
-
-  sprintf (msg, "unknown signal (%d)", signum);
-
-  return msg;
-}
-
-typedef struct
-{
-  guint min_width;
-  guint precision;
-  gboolean alternate_format, zero_padding, adjust_left, locale_grouping;
-  gboolean add_space, add_sign, possible_sign, seen_precision;
-  gboolean mod_half, mod_long, mod_extra_long;
-} PrintfArgSpec;
-
-guint
-g_printf_string_upper_bound (const gchar* format,
-			     va_list      args)
-{
-  static const gboolean honour_longs = SIZEOF_LONG > 4 || SIZEOF_VOID_P > 4;
-  guint len = 1;
-
-  if (!format)
-    return len;
-
-  while (*format)
-    {
-      register gchar c = *format++;
-
-      if (c != '%')
-        len += 1;
-      else /* (c == '%') */
-        {
-          PrintfArgSpec spec = { 0, };
-          gboolean seen_l = FALSE, conv_done = FALSE;
-          guint conv_len = 0;
-          const gchar *spec_start = format;
-
-          do
-            {
-              c = *format++;
-              switch (c)
-                {
-                  GDoubleIEEE754 u_double;
-                  guint v_uint;
-                  gint v_int;
-                  const gchar *v_string;
-
-                  /* beware of positional parameters
-                   */
-                case '$':
-                  g_warning (G_GNUC_PRETTY_FUNCTION
-                             "(): unable to handle positional parameters (%%n$)");
-                  len += 1024; /* try adding some safety padding */
-                  break;
-
-                  /* parse flags
-                   */
-                case '#':
-                  spec.alternate_format = TRUE;
-                  break;
-                case '0':
-                  spec.zero_padding = TRUE;
-                  break;
-                case '-':
-                  spec.adjust_left = TRUE;
-                  break;
-                case ' ':
-                  spec.add_space = TRUE;
-                  break;
-                case '+':
-                  spec.add_sign = TRUE;
-                  break;
-                case '\'':
-                  spec.locale_grouping = TRUE;
-                  break;
-
-                  /* parse output size specifications
-                   */
-                case '.':
-                  spec.seen_precision = TRUE;
-                  break;
-                case '1':
-                case '2':
-                case '3':
-                case '4':
-                case '5':
-                case '6':
-                case '7':
-                case '8':
-                case '9':
-                  v_uint = c - '0';
-                  c = *format;
-                  while (c >= '0' && c <= '9')
-                    {
-                      format++;
-                      v_uint = v_uint * 10 + c - '0';
-                      c = *format;
-                    }
-                  if (spec.seen_precision)
-                    spec.precision = MAX (spec.precision, v_uint);
-                  else
-                    spec.min_width = MAX (spec.min_width, v_uint);
-                  break;
-                case '*':
-                  v_int = va_arg (args, int);
-                  if (spec.seen_precision)
-                    {
-                      /* forget about negative precision */
-                      if (v_int >= 0)
-                        spec.precision = MAX (spec.precision, v_int);
-                    }
-                  else
-                    {
-                      if (v_int < 0)
-                        {
-                          v_int = - v_int;
-                          spec.adjust_left = TRUE;
-                        }
-                      spec.min_width = MAX (spec.min_width, v_int);
-                    }
-                  break;
-
-                  /* parse type modifiers
-                   */
-                case 'h':
-                  spec.mod_half = TRUE;
-                  break;
-                case 'l':
-                  if (!seen_l)
-                    {
-                      spec.mod_long = TRUE;
-                      seen_l = TRUE;
-                      break;
-                    }
-                  /* else, fall through */
-                case 'L':
-                case 'q':
-                  spec.mod_long = TRUE;
-                  spec.mod_extra_long = TRUE;
-                  break;
-                case 'z':
-                case 'Z':
-#if GLIB_SIZEOF_SIZE_T > 4
-                  spec.mod_long = TRUE;
-                  spec.mod_extra_long = TRUE;
-#endif /* GLIB_SIZEOF_SIZE_T > 4 */
-                  break;
-                case 't':
-#if GLIB_SIZEOF_PTRDIFF_T > 4
-                  spec.mod_long = TRUE;
-                  spec.mod_extra_long = TRUE;
-#endif /* GLIB_SIZEOF_PTRDIFF_T > 4 */
-                  break;
-                case 'j':
-#if GLIB_SIZEOF_INTMAX_T > 4
-                  spec.mod_long = TRUE;
-                  spec.mod_extra_long = TRUE;
-#endif /* GLIB_SIZEOF_INTMAX_T > 4 */
-                  break;
-
-                  /* parse output conversions
-                   */
-                case '%':
-                  conv_len += 1;
-                  break;
-                case 'O':
-                case 'D':
-                case 'I':
-                case 'U':
-                  /* some C libraries feature long variants for these as well? */
-                  spec.mod_long = TRUE;
-                  /* fall through */
-                case 'o':
-                  conv_len += 2;
-                  /* fall through */
-                case 'd':
-                case 'i':
-                  conv_len += 1; /* sign */
-                  /* fall through */
-                case 'u':
-                  conv_len += 4;
-                  /* fall through */
-                case 'x':
-                case 'X':
-                  spec.possible_sign = TRUE;
-                  conv_len += 10;
-                  if (spec.mod_long && honour_longs)
-                    conv_len *= 2;
-                  if (spec.mod_extra_long)
-                    conv_len *= 2;
-                  if (spec.mod_extra_long)
-                    {
-#ifdef G_HAVE_GINT64
-                      (void) va_arg (args, gint64);
-#else /* !G_HAVE_GINT64 */
-                      (void) va_arg (args, long);
-#endif /* !G_HAVE_GINT64 */
-                    }
-                  else if (spec.mod_long)
-                    (void) va_arg (args, long);
-                  else
-                    (void) va_arg (args, int);
-                  break;
-                case 'A':
-                case 'a':
-                  /*          0x */
-                  conv_len += 2;
-                  /* fall through */
-                case 'g':
-                case 'G':
-                case 'e':
-                case 'E':
-                case 'f':
-                  spec.possible_sign = TRUE;
-                  /*          n   .   dddddddddddddddddddddddd   E   +-  eeee */
-                  conv_len += 1 + 1 + MAX (24, spec.precision) + 1 + 1 + 4;
-                  if (spec.mod_extra_long)
-                    g_warning (G_GNUC_PRETTY_FUNCTION
-                               "(): unable to handle long double, collecting double only");
-#ifdef HAVE_LONG_DOUBLE
-#error need to implement special handling for long double
-#endif
-                  u_double.v_double = va_arg (args, double);
-                  /* %f can expand up to all significant digits before '.' (308) */
-                  if (c == 'f' &&
-                      u_double.mpn.biased_exponent > 0 && u_double.mpn.biased_exponent < 2047)
-                    {
-                      gint exp = u_double.mpn.biased_exponent;
-
-                      exp -= G_IEEE754_DOUBLE_BIAS;
-                      exp = exp * G_LOG_2_BASE_10 + 1;
-                      conv_len += exp;
-                    }
-                  /* some printf() implementations require extra padding for rounding */
-                  conv_len += 2;
-                  /* we can't really handle locale specific grouping here */
-                  if (spec.locale_grouping)
-                    conv_len *= 2;
-                  break;
-                case 'C':
-                  spec.mod_long = TRUE;
-                  /* fall through */
-                case 'c':
-                  conv_len += spec.mod_long ? MB_LEN_MAX : 1;
-                  (void) va_arg (args, int);
-                  break;
-                case 'S':
-                  spec.mod_long = TRUE;
-                  /* fall through */
-                case 's':
-                  v_string = va_arg (args, char*);
-                  if (!v_string)
-                    conv_len += 8; /* hold "(null)" */
-                  else if (spec.seen_precision)
-                    conv_len += spec.precision;
-                  else
-                    conv_len += strlen (v_string);
-                  conv_done = TRUE;
-                  if (spec.mod_long)
-                    {
-                      g_warning (G_GNUC_PRETTY_FUNCTION
-                                 "(): unable to handle wide char strings");
-                      len += 1024; /* try adding some safety padding */
-                    }
-                  break;
-                case 'P': /* do we actually need this? */
-                  /* fall through */
-                case 'p':
-                  spec.alternate_format = TRUE;
-                  conv_len += 10;
-                  if (honour_longs)
-                    conv_len *= 2;
-                  /* fall through */
-                case 'n':
-                  conv_done = TRUE;
-                  (void) va_arg (args, void*);
-                  break;
-                case 'm':
-                  /* there's not much we can do to be clever */
-                  v_string = g_strerror (errno);
-                  v_uint = v_string ? strlen (v_string) : 0;
-                  conv_len += MAX (256, v_uint);
-                  break;
-
-                  /* handle invalid cases
-                   */
-                case '\000':
-                  /* no conversion specification, bad bad */
-                  conv_len += format - spec_start;
-                  break;
-                default:
-                  g_warning (G_GNUC_PRETTY_FUNCTION
-                             "(): unable to handle `%c' while parsing format",
-                             c);
-                  break;
-                }
-              conv_done |= conv_len > 0;
-            }
-          while (!conv_done);
-          /* handle width specifications */
-          conv_len = MAX (conv_len, MAX (spec.precision, spec.min_width));
-          /* handle flags */
-          conv_len += spec.alternate_format ? 2 : 0;
-          conv_len += (spec.add_space || spec.add_sign || spec.possible_sign);
-          /* finally done */
-          len += conv_len;
-        } /* else (c == '%') */
-    } /* while (*format) */
-
-  return len;
-}
-
-void
-g_strdown (gchar *string)
-{
-  register guchar *s;
-
-  g_return_if_fail (string != NULL);
-
-  s = string;
-
-  while (*s)
-    {
-      *s = tolower (*s);
-      s++;
-    }
-}
-
-void
-g_strup (gchar *string)
-{
-  register guchar *s;
-
-  g_return_if_fail (string != NULL);
-
-  s = string;
-
-  while (*s)
-    {
-      *s = toupper (*s);
-      s++;
-    }
-}
-
-void
-g_strreverse (gchar *string)
-{
-  g_return_if_fail (string != NULL);
-
-  if (*string)
-    {
-      register gchar *h, *t;
-
-      h = string;
-      t = string + strlen (string) - 1;
-
-      while (h < t)
-	{
-	  register gchar c;
-
-	  c = *h;
-	  *h = *t;
-	  h++;
-	  *t = c;
-	  t--;
-	}
-    }
-}
-
-gint
-g_strcasecmp (const gchar *s1,
-	      const gchar *s2)
-{
-#ifdef HAVE_STRCASECMP
-  g_return_val_if_fail (s1 != NULL, 0);
-  g_return_val_if_fail (s2 != NULL, 0);
-
-  return strcasecmp (s1, s2);
-#else
-  gint c1, c2;
-
-  g_return_val_if_fail (s1 != NULL, 0);
-  g_return_val_if_fail (s2 != NULL, 0);
-
-  while (*s1 && *s2)
-    {
-      /* According to A. Cox, some platforms have islower's that
-       * don't work right on non-uppercase
-       */
-      c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
-      c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
-      if (c1 != c2)
-	return (c1 - c2);
-      s1++; s2++;
-    }
-
-  return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
-#endif
-}
-
-gint
-g_strncasecmp (const gchar *s1,
-	       const gchar *s2,
-	       guint n)
-{
-#ifdef HAVE_STRNCASECMP
-  return strncasecmp (s1, s2, n);
-#else
-  gint c1, c2;
-
-  g_return_val_if_fail (s1 != NULL, 0);
-  g_return_val_if_fail (s2 != NULL, 0);
-
-  while (n && *s1 && *s2)
-    {
-      n -= 1;
-      /* According to A. Cox, some platforms have islower's that
-       * don't work right on non-uppercase
-       */
-      c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
-      c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
-      if (c1 != c2)
-	return (c1 - c2);
-      s1++; s2++;
-    }
-
-  if (n)
-    return (((gint) (guchar) *s1) - ((gint) (guchar) *s2));
-  else
-    return 0;
-#endif
-}
-
-gchar*
-g_strdelimit (gchar	  *string,
-	      const gchar *delimiters,
-	      gchar	   new_delim)
-{
-  register gchar *c;
-
-  g_return_val_if_fail (string != NULL, NULL);
-
-  if (!delimiters)
-    delimiters = G_STR_DELIMITERS;
-
-  for (c = string; *c; c++)
-    {
-      if (strchr (delimiters, *c))
-	*c = new_delim;
-    }
-
-  return string;
-}
-
-gchar*
-g_strescape (gchar *string)
-{
-  gchar *q;
-  gchar *escaped;
-  guint backslashes = 0;
-  gchar *p = string;
-
-  g_return_val_if_fail (string != NULL, NULL);
-
-  while (*p != '\000')
-    backslashes += (*p++ == '\\');
-
-  if (!backslashes)
-    return g_strdup (string);
-
-  escaped = g_new (gchar, strlen (string) + backslashes + 1);
-
-  p = string;
-  q = escaped;
-
-  while (*p != '\000')
-    {
-      if (*p == '\\')
-	*q++ = '\\';
-      *q++ = *p++;
-    }
-  *q = '\000';
-
-  return escaped;
-}
-
-/* blame Elliot for these next five routines */
-gchar*
-g_strchug (gchar *string)
-{
-  guchar *start;
-
-  g_return_val_if_fail (string != NULL, NULL);
-
-  for (start = string; *start && isspace (*start); start++)
-    ;
-
-  g_memmove(string, start, strlen(start) + 1);
-
-  return string;
-}
-
-gchar*
-g_strchomp (gchar *string)
-{
-  gchar *s;
-
-  g_return_val_if_fail (string != NULL, NULL);
-
-  if (!*string)
-    return string;
-
-  for (s = string + strlen (string) - 1; s >= string && isspace ((guchar)*s); 
-       s--)
-    *s = '\0';
-
-  return string;
-}
-
-gchar**
-g_strsplit (const gchar *string,
-	    const gchar *delimiter,
-	    gint         max_tokens)
-{
-  GSList *string_list = NULL, *slist;
-  gchar **str_array, *s;
-  guint i, n = 1;
-
-  g_return_val_if_fail (string != NULL, NULL);
-  g_return_val_if_fail (delimiter != NULL, NULL);
-
-  if (max_tokens < 1)
-    max_tokens = G_MAXINT;
-
-  s = strstr (string, delimiter);
-  if (s)
-    {
-      guint delimiter_len = strlen (delimiter);
-
-      do
-	{
-	  guint len;
-	  gchar *new_string;
-
-	  len = s - string;
-	  new_string = g_new (gchar, len + 1);
-	  strncpy (new_string, string, len);
-	  new_string[len] = 0;
-	  string_list = g_slist_prepend (string_list, new_string);
-	  n++;
-	  string = s + delimiter_len;
-	  s = strstr (string, delimiter);
-	}
-      while (--max_tokens && s);
-    }
-  if (*string)
-    {
-      n++;
-      string_list = g_slist_prepend (string_list, g_strdup (string));
-    }
-
-  str_array = g_new (gchar*, n);
-
-  i = n - 1;
-
-  str_array[i--] = NULL;
-  for (slist = string_list; slist; slist = slist->next)
-    str_array[i--] = slist->data;
-
-  g_slist_free (string_list);
-
-  return str_array;
-}
-
-void
-g_strfreev (gchar **str_array)
-{
-  if (str_array)
-    {
-      int i;
-
-      for(i = 0; str_array[i] != NULL; i++)
-	g_free(str_array[i]);
-
-      g_free (str_array);
-    }
-}
-
-gchar*
-g_strjoinv (const gchar  *separator,
-	    gchar       **str_array)
-{
-  gchar *string;
-
-  g_return_val_if_fail (str_array != NULL, NULL);
-
-  if (separator == NULL)
-    separator = "";
-
-  if (*str_array)
-    {
-      guint i, len;
-      guint separator_len;
-
-      separator_len = strlen (separator);
-      len = 1 + strlen (str_array[0]);
-      for(i = 1; str_array[i] != NULL; i++)
-	len += separator_len + strlen(str_array[i]);
-
-      string = g_new (gchar, len);
-      *string = 0;
-      strcat (string, *str_array);
-      for (i = 1; str_array[i] != NULL; i++)
-	{
-	  strcat (string, separator);
-	  strcat (string, str_array[i]);
-	}
-      }
-  else
-    string = g_strdup ("");
-
-  return string;
-}
-
-gchar*
-g_strjoin (const gchar  *separator,
-	   ...)
-{
-  gchar *string, *s;
-  va_list args;
-  guint len;
-  guint separator_len;
-
-  if (separator == NULL)
-    separator = "";
-
-  separator_len = strlen (separator);
-
-  va_start (args, separator);
-
-  s = va_arg (args, gchar*);
-
-  if (s)
-    {
-      len = strlen (s);
-      
-      s = va_arg (args, gchar*);
-      while (s)
-	{
-	  len += separator_len + strlen (s);
-	  s = va_arg (args, gchar*);
-	}
-      va_end (args);
-      
-      string = g_new (gchar, len + 1);
-      *string = 0;
-      
-      va_start (args, separator);
-      
-      s = va_arg (args, gchar*);
-      strcat (string, s);
-      
-      s = va_arg (args, gchar*);
-      while (s)
-	{
-	  strcat (string, separator);
-	  strcat (string, s);
-	  s = va_arg (args, gchar*);
-	}
-    }
-  else
-    string = g_strdup ("");
-  
-  va_end (args);
-
-  return string;
-}
diff --git a/glib/gstring.c b/glib/gstring.c
deleted file mode 100644
index a7ed5c6..0000000
--- a/glib/gstring.c
+++ /dev/null
@@ -1,512 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include <stdarg.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include "glib.h"
-
-
-typedef struct _GRealStringChunk GRealStringChunk;
-typedef struct _GRealString      GRealString;
-
-struct _GRealStringChunk
-{
-  GHashTable *const_table;
-  GSList     *storage_list;
-  gint        storage_next;
-  gint        this_size;
-  gint        default_size;
-};
-
-struct _GRealString
-{
-  gchar *str;
-  gint   len;
-  gint   alloc;
-};
-
-G_LOCK_DEFINE_STATIC (string_mem_chunk);
-static GMemChunk *string_mem_chunk = NULL;
-
-/* Hash Functions.
- */
-
-gint
-g_str_equal (gconstpointer v, gconstpointer v2)
-{
-  return strcmp ((const gchar*) v, (const gchar*)v2) == 0;
-}
-
-/* 31 bit hash function */
-guint
-g_str_hash (gconstpointer key)
-{
-  const char *p = key;
-  guint h = *p;
-  
-  if (h)
-    for (p += 1; *p != '\0'; p++)
-      h = (h << 5) - h + *p;
-  
-  return h;
-}
-
-/* String Chunks.
- */
-
-GStringChunk*
-g_string_chunk_new (gint default_size)
-{
-  GRealStringChunk *new_chunk = g_new (GRealStringChunk, 1);
-  gint size = 1;
-
-  while (size < default_size)
-    size <<= 1;
-
-  new_chunk->const_table       = NULL;
-  new_chunk->storage_list      = NULL;
-  new_chunk->storage_next      = size;
-  new_chunk->default_size      = size;
-  new_chunk->this_size         = size;
-
-  return (GStringChunk*) new_chunk;
-}
-
-void
-g_string_chunk_free (GStringChunk *fchunk)
-{
-  GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
-  GSList *tmp_list;
-
-  g_return_if_fail (chunk != NULL);
-
-  if (chunk->storage_list)
-    {
-      for (tmp_list = chunk->storage_list; tmp_list; tmp_list = tmp_list->next)
-	g_free (tmp_list->data);
-
-      g_slist_free (chunk->storage_list);
-    }
-
-  if (chunk->const_table)
-    g_hash_table_destroy (chunk->const_table);
-
-  g_free (chunk);
-}
-
-gchar*
-g_string_chunk_insert (GStringChunk *fchunk,
-		       const gchar  *string)
-{
-  GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
-  gint len = strlen (string);
-  char* pos;
-
-  g_return_val_if_fail (chunk != NULL, NULL);
-
-  if ((chunk->storage_next + len + 1) > chunk->this_size)
-    {
-      gint new_size = chunk->default_size;
-
-      while (new_size < len+1)
-	new_size <<= 1;
-
-      chunk->storage_list = g_slist_prepend (chunk->storage_list,
-					     g_new (char, new_size));
-
-      chunk->this_size = new_size;
-      chunk->storage_next = 0;
-    }
-
-  pos = ((char*)chunk->storage_list->data) + chunk->storage_next;
-
-  strcpy (pos, string);
-
-  chunk->storage_next += len + 1;
-
-  return pos;
-}
-
-gchar*
-g_string_chunk_insert_const (GStringChunk *fchunk,
-			     const gchar  *string)
-{
-  GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
-  char* lookup;
-
-  g_return_val_if_fail (chunk != NULL, NULL);
-
-  if (!chunk->const_table)
-    chunk->const_table = g_hash_table_new (g_str_hash, g_str_equal);
-
-  lookup = (char*) g_hash_table_lookup (chunk->const_table, (gchar *)string);
-
-  if (!lookup)
-    {
-      lookup = g_string_chunk_insert (fchunk, string);
-      g_hash_table_insert (chunk->const_table, lookup, lookup);
-    }
-
-  return lookup;
-}
-
-/* Strings.
- */
-static gint
-nearest_pow (gint num)
-{
-  gint n = 1;
-
-  while (n < num)
-    n <<= 1;
-
-  return n;
-}
-
-static void
-g_string_maybe_expand (GRealString* string, gint len)
-{
-  if (string->len + len >= string->alloc)
-    {
-      string->alloc = nearest_pow (string->len + len + 1);
-      string->str = g_realloc (string->str, string->alloc);
-    }
-}
-
-GString*
-g_string_sized_new (guint dfl_size)
-{
-  GRealString *string;
-
-  G_LOCK (string_mem_chunk);
-  if (!string_mem_chunk)
-    string_mem_chunk = g_mem_chunk_new ("string mem chunk",
-					sizeof (GRealString),
-					1024, G_ALLOC_AND_FREE);
-
-  string = g_chunk_new (GRealString, string_mem_chunk);
-  G_UNLOCK (string_mem_chunk);
-
-  string->alloc = 0;
-  string->len   = 0;
-  string->str   = NULL;
-
-  g_string_maybe_expand (string, MAX (dfl_size, 2));
-  string->str[0] = 0;
-
-  return (GString*) string;
-}
-
-GString*
-g_string_new (const gchar *init)
-{
-  GString *string;
-
-  string = g_string_sized_new (2);
-
-  if (init)
-    g_string_append (string, init);
-
-  return string;
-}
-
-void
-g_string_free (GString *string,
-	       gint free_segment)
-{
-  g_return_if_fail (string != NULL);
-
-  if (free_segment)
-    g_free (string->str);
-
-  G_LOCK (string_mem_chunk);
-  g_mem_chunk_free (string_mem_chunk, string);
-  G_UNLOCK (string_mem_chunk);
-}
-
-GString*
-g_string_assign (GString *lval,
-		 const gchar *rval)
-{
-  g_return_val_if_fail (lval != NULL, NULL);
-  g_return_val_if_fail (rval != NULL, NULL);
-  
-  g_string_truncate (lval, 0);
-  g_string_append (lval, rval);
-
-  return lval;
-}
-
-GString*
-g_string_truncate (GString* fstring,
-		   gint len)
-{
-  GRealString *string = (GRealString*)fstring;
-
-  g_return_val_if_fail (string != NULL, NULL);
-  g_return_val_if_fail (len >= 0, NULL);
-
-  string->len = len;
-
-  string->str[len] = 0;
-
-  return fstring;
-}
-
-GString*
-g_string_append (GString *fstring,
-		 const gchar *val)
-{
-  GRealString *string = (GRealString*)fstring;
-  int len;
-
-  g_return_val_if_fail (string != NULL, NULL);
-  g_return_val_if_fail (val != NULL, fstring);
-  
-  len = strlen (val);
-  g_string_maybe_expand (string, len);
-
-  strcpy (string->str + string->len, val);
-
-  string->len += len;
-
-  return fstring;
-}
-
-GString*
-g_string_append_c (GString *fstring,
-		   gchar c)
-{
-  GRealString *string = (GRealString*)fstring;
-
-  g_return_val_if_fail (string != NULL, NULL);
-  g_string_maybe_expand (string, 1);
-
-  string->str[string->len++] = c;
-  string->str[string->len] = 0;
-
-  return fstring;
-}
-
-GString*
-g_string_prepend (GString *fstring,
-		  const gchar *val)
-{
-  GRealString *string = (GRealString*)fstring;
-  gint len;
-
-  g_return_val_if_fail (string != NULL, NULL);
-  g_return_val_if_fail (val != NULL, fstring);
-
-  len = strlen (val);
-  g_string_maybe_expand (string, len);
-
-  g_memmove (string->str + len, string->str, string->len);
-
-  strncpy (string->str, val, len);
-
-  string->len += len;
-
-  string->str[string->len] = 0;
-
-  return fstring;
-}
-
-GString*
-g_string_prepend_c (GString *fstring,
-		    gchar    c)
-{
-  GRealString *string = (GRealString*)fstring;
-
-  g_return_val_if_fail (string != NULL, NULL);
-  g_string_maybe_expand (string, 1);
-
-  g_memmove (string->str + 1, string->str, string->len);
-
-  string->str[0] = c;
-
-  string->len += 1;
-
-  string->str[string->len] = 0;
-
-  return fstring;
-}
-
-GString*
-g_string_insert (GString     *fstring,
-		 gint         pos,
-		 const gchar *val)
-{
-  GRealString *string = (GRealString*)fstring;
-  gint len;
-
-  g_return_val_if_fail (string != NULL, NULL);
-  g_return_val_if_fail (val != NULL, fstring);
-  g_return_val_if_fail (pos >= 0, fstring);
-  g_return_val_if_fail (pos <= string->len, fstring);
-
-  len = strlen (val);
-  g_string_maybe_expand (string, len);
-
-  g_memmove (string->str + pos + len, string->str + pos, string->len - pos);
-
-  strncpy (string->str + pos, val, len);
-
-  string->len += len;
-
-  string->str[string->len] = 0;
-
-  return fstring;
-}
-
-GString *
-g_string_insert_c (GString *fstring,
-		   gint     pos,
-		   gchar    c)
-{
-  GRealString *string = (GRealString*)fstring;
-
-  g_return_val_if_fail (string != NULL, NULL);
-  g_return_val_if_fail (pos <= string->len, fstring);
-
-  g_string_maybe_expand (string, 1);
-
-  g_memmove (string->str + pos + 1, string->str + pos, string->len - pos);
-
-  string->str[pos] = c;
-
-  string->len += 1;
-
-  string->str[string->len] = 0;
-
-  return fstring;
-}
-
-GString*
-g_string_erase (GString *fstring,
-		gint pos,
-		gint len)
-{
-  GRealString *string = (GRealString*)fstring;
-
-  g_return_val_if_fail (string != NULL, NULL);
-  g_return_val_if_fail (len >= 0, fstring);
-  g_return_val_if_fail (pos >= 0, fstring);
-  g_return_val_if_fail (pos <= string->len, fstring);
-  g_return_val_if_fail (pos + len <= string->len, fstring);
-
-  if (pos + len < string->len)
-    g_memmove (string->str + pos, string->str + pos + len, string->len - (pos + len));
-
-  string->len -= len;
-  
-  string->str[string->len] = 0;
-
-  return fstring;
-}
-
-GString*
-g_string_down (GString *fstring)
-{
-  GRealString *string = (GRealString*)fstring;
-  guchar *s;
-
-  g_return_val_if_fail (string != NULL, NULL);
-
-  s = string->str;
-
-  while (*s)
-    {
-      *s = tolower (*s);
-      s++;
-    }
-
-  return fstring;
-}
-
-GString*
-g_string_up (GString *fstring)
-{
-  GRealString *string = (GRealString*)fstring;
-  guchar *s;
-
-  g_return_val_if_fail (string != NULL, NULL);
-
-  s = string->str;
-
-  while (*s)
-    {
-      *s = toupper (*s);
-      s++;
-    }
-
-  return fstring;
-}
-
-static void
-g_string_sprintfa_int (GString     *string,
-		       const gchar *fmt,
-		       va_list      args)
-{
-  gchar *buffer;
-
-  buffer = g_strdup_vprintf (fmt, args);
-  g_string_append (string, buffer);
-  g_free (buffer);
-}
-
-void
-g_string_sprintf (GString *string,
-		  const gchar *fmt,
-		  ...)
-{
-  va_list args;
-
-  g_string_truncate (string, 0);
-
-  va_start (args, fmt);
-  g_string_sprintfa_int (string, fmt, args);
-  va_end (args);
-}
-
-void
-g_string_sprintfa (GString *string,
-		   const gchar *fmt,
-		   ...)
-{
-  va_list args;
-
-  va_start (args, fmt);
-  g_string_sprintfa_int (string, fmt, args);
-  va_end (args);
-}
diff --git a/glib/gtimer.c b/glib/gtimer.c
deleted file mode 100644
index f4b72ed..0000000
--- a/glib/gtimer.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "glib.h"
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif /* HAVE_UNISTD_H */
-#ifndef NATIVE_WIN32
-#include <sys/time.h>
-#endif /* NATIVE_WIN32 */
-
-#ifdef NATIVE_WIN32
-#include <windows.h>
-#endif /* NATIVE_WIN32 */
-
-typedef struct _GRealTimer GRealTimer;
-
-struct _GRealTimer
-{
-#ifdef NATIVE_WIN32
-  DWORD start;
-  DWORD end;
-#else /* !NATIVE_WIN32 */
-  struct timeval start;
-  struct timeval end;
-#endif /* !NATIVE_WIN32 */
-
-  guint active : 1;
-};
-
-GTimer*
-g_timer_new (void)
-{
-  GRealTimer *timer;
-
-  timer = g_new (GRealTimer, 1);
-  timer->active = TRUE;
-
-#ifdef NATIVE_WIN32
-  timer->start = GetTickCount ();
-#else /* !NATIVE_WIN32 */
-  gettimeofday (&timer->start, NULL);
-#endif /* !NATIVE_WIN32 */
-
-  return ((GTimer*) timer);
-}
-
-void
-g_timer_destroy (GTimer *timer)
-{
-  g_return_if_fail (timer != NULL);
-
-  g_free (timer);
-}
-
-void
-g_timer_start (GTimer *timer)
-{
-  GRealTimer *rtimer;
-
-  g_return_if_fail (timer != NULL);
-
-  rtimer = (GRealTimer*) timer;
-  rtimer->active = TRUE;
-
-#ifdef NATIVE_WIN32
-  rtimer->start = GetTickCount ();
-#else /* !NATIVE_WIN32 */
-  gettimeofday (&rtimer->start, NULL);
-#endif /* !NATIVE_WIN32 */
-}
-
-void
-g_timer_stop (GTimer *timer)
-{
-  GRealTimer *rtimer;
-
-  g_return_if_fail (timer != NULL);
-
-  rtimer = (GRealTimer*) timer;
-  rtimer->active = FALSE;
-
-#ifdef NATIVE_WIN32
-  rtimer->end = GetTickCount ();
-#else /* !NATIVE_WIN32 */
-  gettimeofday (&rtimer->end, NULL);
-#endif /* !NATIVE_WIN32 */
-}
-
-void
-g_timer_reset (GTimer *timer)
-{
-  GRealTimer *rtimer;
-
-  g_return_if_fail (timer != NULL);
-
-  rtimer = (GRealTimer*) timer;
-
-#ifdef NATIVE_WIN32
-   rtimer->start = GetTickCount ();
-#else /* !NATIVE_WIN32 */
-  gettimeofday (&rtimer->start, NULL);
-#endif /* !NATIVE_WIN32 */
-}
-
-gdouble
-g_timer_elapsed (GTimer *timer,
-		 gulong *microseconds)
-{
-  GRealTimer *rtimer;
-  gdouble total;
-#ifndef NATIVE_WIN32
-  struct timeval elapsed;
-#endif /* NATIVE_WIN32 */
-
-  g_return_val_if_fail (timer != NULL, 0);
-
-  rtimer = (GRealTimer*) timer;
-
-#ifdef NATIVE_WIN32
-  if (rtimer->active)
-    rtimer->end = GetTickCount ();
-
-  /* Check for wraparound, which happens every 49.7 days.
-   * No, Win95 machines probably are never running for that long,
-   * but NT machines are.
-   */
-  if (rtimer->end < rtimer->start)
-    total = (UINT_MAX - (rtimer->start - rtimer->end)) / 1000.0;
-  else
-    total = (rtimer->end - rtimer->start) / 1000.0;
-
-  if (microseconds)
-    {
-      if (rtimer->end < rtimer->start)
-	*microseconds =
-	  ((UINT_MAX - (rtimer->start - rtimer->end)) % 1000) * 1000;
-      else
-	*microseconds =
-	  ((rtimer->end - rtimer->start) % 1000) * 1000;
-    }
-#else /* !NATIVE_WIN32 */
-  if (rtimer->active)
-    gettimeofday (&rtimer->end, NULL);
-
-  if (rtimer->start.tv_usec > rtimer->end.tv_usec)
-    {
-      rtimer->end.tv_usec += 1000000;
-      rtimer->end.tv_sec--;
-    }
-
-  elapsed.tv_usec = rtimer->end.tv_usec - rtimer->start.tv_usec;
-  elapsed.tv_sec = rtimer->end.tv_sec - rtimer->start.tv_sec;
-
-  total = elapsed.tv_sec + ((gdouble) elapsed.tv_usec / 1e6);
-  if (total < 0)
-    {
-      total = 0;
-      
-      if (microseconds)
-	*microseconds = 0;
-    }
-  else
-    if (microseconds)
-      *microseconds = elapsed.tv_usec;
-  
-#endif /* !NATIVE_WIN32 */
-
-  return total;
-}
diff --git a/glib/gtree.c b/glib/gtree.c
deleted file mode 100644
index e6c3f19..0000000
--- a/glib/gtree.c
+++ /dev/null
@@ -1,744 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe
- */
-
-#include "glib.h"
-
-
-typedef struct _GRealTree  GRealTree;
-typedef struct _GTreeNode  GTreeNode;
-
-struct _GRealTree
-{
-  GTreeNode *root;
-  GCompareFunc key_compare;
-};
-
-struct _GTreeNode
-{
-  gint balance;      /* height (left) - height (right) */
-  GTreeNode *left;   /* left subtree */
-  GTreeNode *right;  /* right subtree */
-  gpointer key;      /* key for this node */
-  gpointer value;    /* value stored at this node */
-};
-
-
-static GTreeNode* g_tree_node_new                   (gpointer        key,
-						     gpointer        value);
-static void       g_tree_node_destroy               (GTreeNode      *node);
-static GTreeNode* g_tree_node_insert                (GTreeNode      *node,
-						     GCompareFunc    compare,
-						     gpointer        key,
-						     gpointer        value,
-						     gint           *inserted);
-static GTreeNode* g_tree_node_remove                (GTreeNode      *node,
-						     GCompareFunc    compare,
-						     gpointer        key);
-static GTreeNode* g_tree_node_balance               (GTreeNode      *node);
-static GTreeNode* g_tree_node_remove_leftmost       (GTreeNode      *node,
-						     GTreeNode     **leftmost);
-static GTreeNode* g_tree_node_restore_left_balance  (GTreeNode      *node,
-						     gint            old_balance);
-static GTreeNode* g_tree_node_restore_right_balance (GTreeNode      *node,
-						     gint            old_balance);
-static gpointer   g_tree_node_lookup                (GTreeNode      *node,
-						     GCompareFunc    compare,
-						     gpointer        key);
-static gint       g_tree_node_count                 (GTreeNode      *node);
-static gint       g_tree_node_pre_order             (GTreeNode      *node,
-						     GTraverseFunc   traverse_func,
-						     gpointer        data);
-static gint       g_tree_node_in_order              (GTreeNode      *node,
-						     GTraverseFunc   traverse_func,
-						     gpointer        data);
-static gint       g_tree_node_post_order            (GTreeNode      *node,
-						     GTraverseFunc   traverse_func,
-						     gpointer        data);
-static gpointer   g_tree_node_search                (GTreeNode      *node,
-						     GSearchFunc     search_func,
-						     gpointer        data);
-static gint       g_tree_node_height                (GTreeNode      *node);
-static GTreeNode* g_tree_node_rotate_left           (GTreeNode      *node);
-static GTreeNode* g_tree_node_rotate_right          (GTreeNode      *node);
-static void       g_tree_node_check                 (GTreeNode      *node);
-
-
-G_LOCK_DEFINE_STATIC (g_tree_global);
-static GMemChunk *node_mem_chunk = NULL;
-static GTreeNode *node_free_list = NULL;
-
-
-static GTreeNode*
-g_tree_node_new (gpointer key,
-		 gpointer value)
-{
-  GTreeNode *node;
-
-  G_LOCK (g_tree_global);
-  if (node_free_list)
-    {
-      node = node_free_list;
-      node_free_list = node->right;
-    }
-  else
-    {
-      if (!node_mem_chunk)
-	node_mem_chunk = g_mem_chunk_new ("GLib GTreeNode mem chunk",
-					  sizeof (GTreeNode),
-					  1024,
-					  G_ALLOC_ONLY);
-
-      node = g_chunk_new (GTreeNode, node_mem_chunk);
-   }
-  G_UNLOCK (g_tree_global);
-
-  node->balance = 0;
-  node->left = NULL;
-  node->right = NULL;
-  node->key = key;
-  node->value = value;
-
-  return node;
-}
-
-static void
-g_tree_node_destroy (GTreeNode *node)
-{
-  if (node)
-    {
-      g_tree_node_destroy (node->right);
-      g_tree_node_destroy (node->left);
-      G_LOCK (g_tree_global);
-      node->right = node_free_list;
-      node_free_list = node;
-      G_UNLOCK (g_tree_global);
-   }
-}
-
-
-GTree*
-g_tree_new (GCompareFunc key_compare_func)
-{
-  GRealTree *rtree;
-
-  g_return_val_if_fail (key_compare_func != NULL, NULL);
-
-  rtree = g_new (GRealTree, 1);
-  rtree->root = NULL;
-  rtree->key_compare = key_compare_func;
-
-  return (GTree*) rtree;
-}
-
-void
-g_tree_destroy (GTree *tree)
-{
-  GRealTree *rtree;
-
-  g_return_if_fail (tree != NULL);
-
-  rtree = (GRealTree*) tree;
-
-  g_tree_node_destroy (rtree->root);
-  g_free (rtree);
-}
-
-void
-g_tree_insert (GTree    *tree,
-	       gpointer  key,
-	       gpointer  value)
-{
-  GRealTree *rtree;
-  gint inserted;
-
-  g_return_if_fail (tree != NULL);
-
-  rtree = (GRealTree*) tree;
-
-  inserted = FALSE;
-  rtree->root = g_tree_node_insert (rtree->root, rtree->key_compare,
-				    key, value, &inserted);
-}
-
-void
-g_tree_remove (GTree    *tree,
-	       gpointer  key)
-{
-  GRealTree *rtree;
-
-  g_return_if_fail (tree != NULL);
-
-  rtree = (GRealTree*) tree;
-
-  rtree->root = g_tree_node_remove (rtree->root, rtree->key_compare, key);
-}
-
-gpointer
-g_tree_lookup (GTree    *tree,
-	       gpointer  key)
-{
-  GRealTree *rtree;
-
-  g_return_val_if_fail (tree != NULL, NULL);
-
-  rtree = (GRealTree*) tree;
-
-  return g_tree_node_lookup (rtree->root, rtree->key_compare, key);
-}
-
-void
-g_tree_traverse (GTree         *tree,
-		 GTraverseFunc  traverse_func,
-		 GTraverseType  traverse_type,
-		 gpointer       data)
-{
-  GRealTree *rtree;
-
-  g_return_if_fail (tree != NULL);
-
-  rtree = (GRealTree*) tree;
-
-  if (!rtree->root)
-    return;
-
-  switch (traverse_type)
-    {
-    case G_PRE_ORDER:
-      g_tree_node_pre_order (rtree->root, traverse_func, data);
-      break;
-
-    case G_IN_ORDER:
-      g_tree_node_in_order (rtree->root, traverse_func, data);
-      break;
-
-    case G_POST_ORDER:
-      g_tree_node_post_order (rtree->root, traverse_func, data);
-      break;
-    
-    case G_LEVEL_ORDER:
-      g_warning ("g_tree_traverse(): traverse type G_LEVEL_ORDER isn't implemented.");
-      break;
-    }
-}
-
-gpointer
-g_tree_search (GTree       *tree,
-	       GSearchFunc  search_func,
-	       gpointer     data)
-{
-  GRealTree *rtree;
-
-  g_return_val_if_fail (tree != NULL, NULL);
-
-  rtree = (GRealTree*) tree;
-
-  if (rtree->root)
-    return g_tree_node_search (rtree->root, search_func, data);
-  else
-    return NULL;
-}
-
-gint
-g_tree_height (GTree *tree)
-{
-  GRealTree *rtree;
-
-  g_return_val_if_fail (tree != NULL, 0);
-
-  rtree = (GRealTree*) tree;
-
-  if (rtree->root)
-    return g_tree_node_height (rtree->root);
-  else
-    return 0;
-}
-
-gint
-g_tree_nnodes (GTree *tree)
-{
-  GRealTree *rtree;
-
-  g_return_val_if_fail (tree != NULL, 0);
-
-  rtree = (GRealTree*) tree;
-
-  if (rtree->root)
-    return g_tree_node_count (rtree->root);
-  else
-    return 0;
-}
-
-static GTreeNode*
-g_tree_node_insert (GTreeNode    *node,
-		    GCompareFunc  compare,
-		    gpointer      key,
-		    gpointer      value,
-		    gint         *inserted)
-{
-  gint old_balance;
-  gint cmp;
-
-  if (!node)
-    {
-      *inserted = TRUE;
-      return g_tree_node_new (key, value);
-    }
-
-  cmp = (* compare) (key, node->key);
-  if (cmp == 0)
-    {
-      *inserted = FALSE;
-      node->value = value;
-      return node;
-    }
-
-  if (cmp < 0)
-    {
-      if (node->left)
-	{
-	  old_balance = node->left->balance;
-	  node->left = g_tree_node_insert (node->left, compare, key, value, inserted);
-
-	  if ((old_balance != node->left->balance) && node->left->balance)
-	    node->balance -= 1;
-	}
-      else
-	{
-	  *inserted = TRUE;
-	  node->left = g_tree_node_new (key, value);
-	  node->balance -= 1;
-	}
-    }
-  else if (cmp > 0)
-    {
-      if (node->right)
-	{
-	  old_balance = node->right->balance;
-	  node->right = g_tree_node_insert (node->right, compare, key, value, inserted);
-
-	  if ((old_balance != node->right->balance) && node->right->balance)
-	    node->balance += 1;
-	}
-      else
-	{
-	  *inserted = TRUE;
-	  node->right = g_tree_node_new (key, value);
-	  node->balance += 1;
-	}
-    }
-
-  if (*inserted)
-    {
-      if ((node->balance < -1) || (node->balance > 1))
-	node = g_tree_node_balance (node);
-    }
-
-  return node;
-}
-
-static GTreeNode*
-g_tree_node_remove (GTreeNode    *node,
-		    GCompareFunc  compare,
-		    gpointer      key)
-{
-  GTreeNode *new_root;
-  gint old_balance;
-  gint cmp;
-
-  if (!node)
-    return NULL;
-
-  cmp = (* compare) (key, node->key);
-  if (cmp == 0)
-    {
-      GTreeNode *garbage;
-
-      garbage = node;
-
-      if (!node->right)
-	{
-	  node = node->left;
-	}
-      else
-	{
-	  old_balance = node->right->balance;
-	  node->right = g_tree_node_remove_leftmost (node->right, &new_root);
-	  new_root->left = node->left;
-	  new_root->right = node->right;
-	  new_root->balance = node->balance;
-	  node = g_tree_node_restore_right_balance (new_root, old_balance);
-	}
-
-      G_LOCK (g_tree_global);
-      garbage->right = node_free_list;
-      node_free_list = garbage;
-      G_UNLOCK (g_tree_global);
-   }
-  else if (cmp < 0)
-    {
-      if (node->left)
-	{
-	  old_balance = node->left->balance;
-	  node->left = g_tree_node_remove (node->left, compare, key);
-	  node = g_tree_node_restore_left_balance (node, old_balance);
-	}
-    }
-  else if (cmp > 0)
-    {
-      if (node->right)
-	{
-	  old_balance = node->right->balance;
-	  node->right = g_tree_node_remove (node->right, compare, key);
-	  node = g_tree_node_restore_right_balance (node, old_balance);
-	}
-    }
-
-  return node;
-}
-
-static GTreeNode*
-g_tree_node_balance (GTreeNode *node)
-{
-  if (node->balance < -1)
-    {
-      if (node->left->balance > 0)
-	node->left = g_tree_node_rotate_left (node->left);
-      node = g_tree_node_rotate_right (node);
-    }
-  else if (node->balance > 1)
-    {
-      if (node->right->balance < 0)
-	node->right = g_tree_node_rotate_right (node->right);
-      node = g_tree_node_rotate_left (node);
-    }
-
-  return node;
-}
-
-static GTreeNode*
-g_tree_node_remove_leftmost (GTreeNode  *node,
-			     GTreeNode **leftmost)
-{
-  gint old_balance;
-
-  if (!node->left)
-    {
-      *leftmost = node;
-      return node->right;
-    }
-
-  old_balance = node->left->balance;
-  node->left = g_tree_node_remove_leftmost (node->left, leftmost);
-  return g_tree_node_restore_left_balance (node, old_balance);
-}
-
-static GTreeNode*
-g_tree_node_restore_left_balance (GTreeNode *node,
-				  gint       old_balance)
-{
-  if (!node->left)
-    node->balance += 1;
-  else if ((node->left->balance != old_balance) &&
-	   (node->left->balance == 0))
-    node->balance += 1;
-
-  if (node->balance > 1)
-    return g_tree_node_balance (node);
-  return node;
-}
-
-static GTreeNode*
-g_tree_node_restore_right_balance (GTreeNode *node,
-				   gint       old_balance)
-{
-  if (!node->right)
-    node->balance -= 1;
-  else if ((node->right->balance != old_balance) &&
-	   (node->right->balance == 0))
-    node->balance -= 1;
-
-  if (node->balance < -1)
-    return g_tree_node_balance (node);
-  return node;
-}
-
-static gpointer
-g_tree_node_lookup (GTreeNode    *node,
-		    GCompareFunc  compare,
-		    gpointer      key)
-{
-  gint cmp;
-
-  if (!node)
-    return NULL;
-
-  cmp = (* compare) (key, node->key);
-  if (cmp == 0)
-    return node->value;
-
-  if (cmp < 0)
-    {
-      if (node->left)
-	return g_tree_node_lookup (node->left, compare, key);
-    }
-  else if (cmp > 0)
-    {
-      if (node->right)
-	return g_tree_node_lookup (node->right, compare, key);
-    }
-
-  return NULL;
-}
-
-static gint
-g_tree_node_count (GTreeNode *node)
-{
-  gint count;
-
-  count = 1;
-  if (node->left)
-    count += g_tree_node_count (node->left);
-  if (node->right)
-    count += g_tree_node_count (node->right);
-
-  return count;
-}
-
-static gint
-g_tree_node_pre_order (GTreeNode     *node,
-		       GTraverseFunc  traverse_func,
-		       gpointer       data)
-{
-  if ((*traverse_func) (node->key, node->value, data))
-    return TRUE;
-  if (node->left)
-    {
-      if (g_tree_node_pre_order (node->left, traverse_func, data))
-	return TRUE;
-    }
-  if (node->right)
-    {
-      if (g_tree_node_pre_order (node->right, traverse_func, data))
-	return TRUE;
-    }
-
-  return FALSE;
-}
-
-static gint
-g_tree_node_in_order (GTreeNode     *node,
-		      GTraverseFunc  traverse_func,
-		      gpointer       data)
-{
-  if (node->left)
-    {
-      if (g_tree_node_in_order (node->left, traverse_func, data))
-	return TRUE;
-    }
-  if ((*traverse_func) (node->key, node->value, data))
-    return TRUE;
-  if (node->right)
-    {
-      if (g_tree_node_in_order (node->right, traverse_func, data))
-	return TRUE;
-    }
-
-  return FALSE;
-}
-
-static gint
-g_tree_node_post_order (GTreeNode     *node,
-			GTraverseFunc  traverse_func,
-			gpointer       data)
-{
-  if (node->left)
-    {
-      if (g_tree_node_post_order (node->left, traverse_func, data))
-	return TRUE;
-    }
-  if (node->right)
-    {
-      if (g_tree_node_post_order (node->right, traverse_func, data))
-	return TRUE;
-    }
-  if ((*traverse_func) (node->key, node->value, data))
-    return TRUE;
-
-  return FALSE;
-}
-
-static gpointer
-g_tree_node_search (GTreeNode   *node,
-		    GSearchFunc  search_func,
-		    gpointer     data)
-{
-  gint dir;
-
-  if (!node)
-    return NULL;
-
-  do {
-    dir = (* search_func) (node->key, data);
-    if (dir == 0)
-      return node->value;
-
-    if (dir < 0)
-      node = node->left;
-    else if (dir > 0)
-      node = node->right;
-  } while (node && (dir != 0));
-
-  return NULL;
-}
-
-static gint
-g_tree_node_height (GTreeNode *node)
-{
-  gint left_height;
-  gint right_height;
-
-  if (node)
-    {
-      left_height = 0;
-      right_height = 0;
-
-      if (node->left)
-	left_height = g_tree_node_height (node->left);
-
-      if (node->right)
-	right_height = g_tree_node_height (node->right);
-
-      return MAX (left_height, right_height) + 1;
-    }
-
-  return 0;
-}
-
-static GTreeNode*
-g_tree_node_rotate_left (GTreeNode *node)
-{
-  GTreeNode *left;
-  GTreeNode *right;
-  gint a_bal;
-  gint b_bal;
-
-  left = node->left;
-  right = node->right;
-
-  node->right = right->left;
-  right->left = node;
-
-  a_bal = node->balance;
-  b_bal = right->balance;
-
-  if (b_bal <= 0)
-    {
-      if (a_bal >= 1)
-	right->balance = b_bal - 1;
-      else
-	right->balance = a_bal + b_bal - 2;
-      node->balance = a_bal - 1;
-    }
-  else
-    {
-      if (a_bal <= b_bal)
-	right->balance = a_bal - 2;
-      else
-	right->balance = b_bal - 1;
-      node->balance = a_bal - b_bal - 1;
-    }
-
-  return right;
-}
-
-static GTreeNode*
-g_tree_node_rotate_right (GTreeNode *node)
-{
-  GTreeNode *left;
-  gint a_bal;
-  gint b_bal;
-
-  left = node->left;
-
-  node->left = left->right;
-  left->right = node;
-
-  a_bal = node->balance;
-  b_bal = left->balance;
-
-  if (b_bal <= 0)
-    {
-      if (b_bal > a_bal)
-	left->balance = b_bal + 1;
-      else
-	left->balance = a_bal + 2;
-      node->balance = a_bal - b_bal + 1;
-    }
-  else
-    {
-      if (a_bal <= -1)
-	left->balance = b_bal + 1;
-      else
-	left->balance = a_bal + b_bal + 2;
-      node->balance = a_bal + 1;
-    }
-
-  return left;
-}
-
-static void
-g_tree_node_check (GTreeNode *node)
-{
-  gint left_height;
-  gint right_height;
-  gint balance;
-  
-  if (node)
-    {
-      left_height = 0;
-      right_height = 0;
-      
-      if (node->left)
-	left_height = g_tree_node_height (node->left);
-      if (node->right)
-	right_height = g_tree_node_height (node->right);
-      
-      balance = right_height - left_height;
-      if (balance != node->balance)
-	g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
-	       "g_tree_node_check: failed: %d ( %d )\n",
-	       balance, node->balance);
-      
-      if (node->left)
-	g_tree_node_check (node->left);
-      if (node->right)
-	g_tree_node_check (node->right);
-    }
-}
diff --git a/glib/gutils.c b/glib/gutils.c
deleted file mode 100644
index a93ed95..0000000
--- a/glib/gutils.c
+++ /dev/null
@@ -1,927 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1998  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-/* 
- * MT safe for the unix part, FIXME: make the win32 part MT safe as well.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "glibconfig.h"
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdarg.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#ifdef HAVE_PWD_H
-#include <pwd.h>
-#endif
-#include <sys/types.h>
-#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
-#endif
-
-#ifdef NATIVE_WIN32
-#  define STRICT			/* Strict typing, please */
-#  include <windows.h>
-#  include <direct.h>
-#  include <errno.h>
-#  include <ctype.h>
-#  ifdef _MSC_VER
-#    include <io.h>
-#  endif /* _MSC_VER */
-#endif /* NATIVE_WIN32 */
-
-/* implement Glib's inline functions
- */
-#define	G_INLINE_FUNC extern
-#define	G_CAN_INLINE 1
-#include "glib.h"
-
-#ifdef	MAXPATHLEN
-#define	G_PATH_LENGTH	(MAXPATHLEN + 1)
-#elif	defined (PATH_MAX)
-#define	G_PATH_LENGTH	(PATH_MAX + 1)
-#else	/* !MAXPATHLEN */
-#define G_PATH_LENGTH   (2048 + 1)
-#endif	/* !MAXPATHLEN && !PATH_MAX */
-
-const guint glib_major_version = GLIB_MAJOR_VERSION;
-const guint glib_minor_version = GLIB_MINOR_VERSION;
-const guint glib_micro_version = GLIB_MICRO_VERSION;
-const guint glib_interface_age = GLIB_INTERFACE_AGE;
-const guint glib_binary_age = GLIB_BINARY_AGE;
-
-#if defined (NATIVE_WIN32) && defined (__LCC__)
-int __stdcall 
-LibMain (void         *hinstDll,
-	 unsigned long dwReason,
-	 void         *reserved)
-{
-  return 1;
-}
-#endif /* NATIVE_WIN32 && __LCC__ */
-
-void
-g_atexit (GVoidFunc func)
-{
-  gint result;
-  gchar *error = NULL;
-
-  /* keep this in sync with glib.h */
-
-#ifdef	G_NATIVE_ATEXIT
-  result = ATEXIT (func);
-  if (result)
-    error = g_strerror (errno);
-#elif defined (HAVE_ATEXIT)
-#  ifdef NeXT /* @#%@! NeXTStep */
-  result = !atexit ((void (*)(void)) func);
-  if (result)
-    error = g_strerror (errno);
-#  else
-  result = atexit ((void (*)(void)) func);
-  if (result)
-    error = g_strerror (errno);
-#  endif /* NeXT */
-#elif defined (HAVE_ON_EXIT)
-  result = on_exit ((void (*)(int, void *)) func, NULL);
-  if (result)
-    error = g_strerror (errno);
-#else
-  result = 0;
-  error = "no implementation";
-#endif /* G_NATIVE_ATEXIT */
-
-  if (error)
-    g_error ("Could not register atexit() function: %s", error);
-}
-
-gint
-g_snprintf (gchar	*str,
-	    gulong	 n,
-	    gchar const *fmt,
-	    ...)
-{
-#ifdef	HAVE_VSNPRINTF
-  va_list args;
-  gint retval;
-  
-  g_return_val_if_fail (str != NULL, 0);
-  g_return_val_if_fail (n > 0, 0);
-  g_return_val_if_fail (fmt != NULL, 0);
-
-  va_start (args, fmt);
-  retval = vsnprintf (str, n, fmt, args);
-  va_end (args);
-
-  if (retval < 0)
-    {
-      str[n-1] = '\0';
-      retval = strlen (str);
-    }
-
-  return retval;
-#else	/* !HAVE_VSNPRINTF */
-  gchar *printed;
-  va_list args;
-  
-  g_return_val_if_fail (str != NULL, 0);
-  g_return_val_if_fail (n > 0, 0);
-  g_return_val_if_fail (fmt != NULL, 0);
-
-  va_start (args, fmt);
-  printed = g_strdup_vprintf (fmt, args);
-  va_end (args);
-  
-  strncpy (str, printed, n);
-  str[n-1] = '\0';
-
-  g_free (printed);
-  
-  return strlen (str);
-#endif	/* !HAVE_VSNPRINTF */
-}
-
-gint
-g_vsnprintf (gchar	 *str,
-	     gulong	  n,
-	     gchar const *fmt,
-	     va_list      args)
-{
-#ifdef	HAVE_VSNPRINTF
-  gint retval;
-
-  g_return_val_if_fail (str != NULL, 0);
-  g_return_val_if_fail (n > 0, 0);
-  g_return_val_if_fail (fmt != NULL, 0);
-  
-  retval = vsnprintf (str, n, fmt, args);
-  
-  if (retval < 0)
-    {
-      str[n-1] = '\0';
-      retval = strlen (str);
-    }
-
-  return retval;
-#else	/* !HAVE_VSNPRINTF */
-  gchar *printed;
-  
-  g_return_val_if_fail (str != NULL, 0);
-  g_return_val_if_fail (n > 0, 0);
-  g_return_val_if_fail (fmt != NULL, 0);
-
-  printed = g_strdup_vprintf (fmt, args);
-  strncpy (str, printed, n);
-  str[n-1] = '\0';
-
-  g_free (printed);
-  
-  return strlen (str);
-#endif /* !HAVE_VSNPRINTF */
-}
-
-guint	     
-g_parse_debug_string  (const gchar *string, 
-		       GDebugKey   *keys, 
-		       guint	    nkeys)
-{
-  guint i;
-  guint result = 0;
-  
-  g_return_val_if_fail (string != NULL, 0);
-  
-  if (!g_strcasecmp (string, "all"))
-    {
-      for (i=0; i<nkeys; i++)
-	result |= keys[i].value;
-    }
-  else
-    {
-      gchar *str = g_strdup (string);
-      gchar *p = str;
-      gchar *q;
-      gboolean done = FALSE;
-      
-      while (*p && !done)
-	{
-	  q = strchr (p, ':');
-	  if (!q)
-	    {
-	      q = p + strlen(p);
-	      done = TRUE;
-	    }
-	  
-	  *q = 0;
-	  
-	  for (i=0; i<nkeys; i++)
-	    if (!g_strcasecmp(keys[i].key, p))
-	      result |= keys[i].value;
-	  
-	  p = q+1;
-	}
-      
-      g_free (str);
-    }
-  
-  return result;
-}
-
-gchar*
-g_basename (const gchar	   *file_name)
-{
-  register gchar *base;
-  
-  g_return_val_if_fail (file_name != NULL, NULL);
-  
-  base = strrchr (file_name, G_DIR_SEPARATOR);
-  if (base)
-    return base + 1;
-
-#ifdef NATIVE_WIN32
-  if (isalpha (file_name[0]) && file_name[1] == ':')
-    return (gchar*) file_name + 2;
-#endif /* NATIVE_WIN32 */
-  
-  return (gchar*) file_name;
-}
-
-gboolean
-g_path_is_absolute (const gchar *file_name)
-{
-  g_return_val_if_fail (file_name != NULL, FALSE);
-  
-  if (file_name[0] == G_DIR_SEPARATOR)
-    return TRUE;
-
-#ifdef NATIVE_WIN32
-  if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
-    return TRUE;
-#endif
-
-  return FALSE;
-}
-
-gchar*
-g_path_skip_root (gchar *file_name)
-{
-  g_return_val_if_fail (file_name != NULL, NULL);
-  
-  if (file_name[0] == G_DIR_SEPARATOR)
-    return file_name + 1;
-
-#ifdef NATIVE_WIN32
-  if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
-    return file_name + 3;
-#endif
-
-  return NULL;
-}
-
-gchar*
-g_dirname (const gchar	   *file_name)
-{
-  register gchar *base;
-  register guint len;
-  
-  g_return_val_if_fail (file_name != NULL, NULL);
-  
-  base = strrchr (file_name, G_DIR_SEPARATOR);
-  if (!base)
-    return g_strdup (".");
-  while (base > file_name && *base == G_DIR_SEPARATOR)
-    base--;
-  len = (guint) 1 + base - file_name;
-  
-  base = g_new (gchar, len + 1);
-  g_memmove (base, file_name, len);
-  base[len] = 0;
-  
-  return base;
-}
-
-gchar*
-g_get_current_dir (void)
-{
-  gchar *buffer;
-  gchar *dir;
-
-  buffer = g_new (gchar, G_PATH_LENGTH);
-  *buffer = 0;
-  
-  /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd")
-   * and, if that wasn't bad enough, hangs in doing so.
-   */
-#if	defined (sun) && !defined (__SVR4)
-  dir = getwd (buffer);
-#else	/* !sun */
-  dir = getcwd (buffer, G_PATH_LENGTH - 1);
-#endif	/* !sun */
-  
-  if (!dir || !*buffer)
-    {
-      /* hm, should we g_error() out here?
-       * this can happen if e.g. "./" has mode \0000
-       */
-      buffer[0] = G_DIR_SEPARATOR;
-      buffer[1] = 0;
-    }
-
-  dir = g_strdup (buffer);
-  g_free (buffer);
-  
-  return dir;
-}
-
-gchar*
-g_getenv (const gchar *variable)
-{
-#ifndef NATIVE_WIN32
-  g_return_val_if_fail (variable != NULL, NULL);
-
-  return getenv (variable);
-#else
-  gchar *v;
-  guint k;
-  static gchar *p = NULL;
-  static gint l;
-  gchar dummy[2];
-
-  g_return_val_if_fail (variable != NULL, NULL);
-  
-  v = getenv (variable);
-  if (!v)
-    return NULL;
-  
-  /* On Windows NT, it is relatively typical that environment variables
-   * contain references to other environment variables. Handle that by
-   * calling ExpandEnvironmentStrings.
-   */
-
-  /* First check how much space we need */
-  k = ExpandEnvironmentStrings (v, dummy, 2);
-  /* Then allocate that much, and actualy do the expansion */
-  if (p == NULL)
-    {
-      p = g_malloc (k);
-      l = k;
-    }
-  else if (k > l)
-    {
-      p = g_realloc (p, k);
-      l = k;
-    }
-  ExpandEnvironmentStrings (v, p, k);
-  return p;
-#endif
-}
-
-
-G_LOCK_DEFINE_STATIC (g_utils_global);
-
-static	gchar	*g_tmp_dir = NULL;
-static	gchar	*g_user_name = NULL;
-static	gchar	*g_real_name = NULL;
-static	gchar	*g_home_dir = NULL;
-
-/* HOLDS: g_utils_global_lock */
-static void
-g_get_any_init (void)
-{
-  if (!g_tmp_dir)
-    {
-      g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));
-      if (!g_tmp_dir)
-	g_tmp_dir = g_strdup (g_getenv ("TMP"));
-      if (!g_tmp_dir)
-	g_tmp_dir = g_strdup (g_getenv ("TEMP"));
-      
-#ifdef P_tmpdir
-      if (!g_tmp_dir)
-	{
-	  int k;
-	  g_tmp_dir = g_strdup (P_tmpdir);
-	  k = strlen (g_tmp_dir);
-	  if (g_tmp_dir[k-1] == G_DIR_SEPARATOR)
-	    g_tmp_dir[k-1] = '\0';
-	}
-#endif
-      
-      if (!g_tmp_dir)
-	{
-#ifndef NATIVE_WIN32
-	  g_tmp_dir = g_strdup ("/tmp");
-#else /* NATIVE_WIN32 */
-	  g_tmp_dir = g_strdup ("C:\\");
-#endif /* NATIVE_WIN32 */
-	}
-      
-      if (!g_home_dir)
-	g_home_dir = g_strdup (g_getenv ("HOME"));
-      
-#ifdef NATIVE_WIN32
-      if (!g_home_dir)
-	{
-	  /* The official way to specify a home directory on NT is
-	   * the HOMEDRIVE and HOMEPATH environment variables.
-	   *
-	   * This is inside #ifdef NATIVE_WIN32 because with the cygwin dll,
-	   * HOME should be a POSIX style pathname.
-	   */
-	  
-	  if (getenv ("HOMEDRIVE") != NULL && getenv ("HOMEPATH") != NULL)
-	    {
-	      gchar *homedrive, *homepath;
-	      
-	      homedrive = g_strdup (g_getenv ("HOMEDRIVE"));
-	      homepath = g_strdup (g_getenv ("HOMEPATH"));
-	      
-	      g_home_dir = g_strconcat (homedrive, homepath, NULL);
-	      g_free (homedrive);
-	      g_free (homepath);
-	    }
-	}
-#endif /* !NATIVE_WIN32 */
-      
-#ifdef HAVE_PWD_H
-      {
-	struct passwd *pw = NULL;
-	gpointer buffer = NULL;
-	
-#  ifdef HAVE_GETPWUID_R
-        struct passwd pwd;
-#    ifdef _SC_GETPW_R_SIZE_MAX  
-        /* This reurns the maximum length */
-        guint bufsize = sysconf (_SC_GETPW_R_SIZE_MAX);
-#    else /* _SC_GETPW_R_SIZE_MAX */
-        guint bufsize = 64;
-#    endif /* _SC_GETPW_R_SIZE_MAX */
-        gint error;
-	
-        do
-          {
-            g_free (buffer);
-            buffer = g_malloc (bufsize);
-	    errno = 0;
-	    
-#    ifdef HAVE_GETPWUID_R_POSIX
-	    error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
-            error = error < 0 ? errno : error;
-#    else /* !HAVE_GETPWUID_R_POSIX */
-#      ifdef _AIX
-	    error = getpwuid_r (getuid (), &pwd, buffer, bufsize);
-	    pw = error == 0 ? &pwd : NULL;
-#      else /* !_AIX */
-            pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
-            error = pw ? 0 : errno;
-#      endif /* !_AIX */            
-#    endif /* !HAVE_GETPWUID_R_POSIX */
-	    
-	    if (!pw)
-	      {
-		/* we bail out prematurely if the user id can't be found
-		 * (should be pretty rare case actually), or if the buffer
-		 * should be sufficiently big and lookups are still not
-		 * successfull.
-		 */
-		if (error == 0 || error == ENOENT)
-		  {
-		    g_warning ("getpwuid_r(): failed due to: No such user %d.",
-			       getuid ());
-		    break;
-		  }
-		if (bufsize > 32 * 1024)
-		  {
-		    g_warning ("getpwuid_r(): failed due to: %s.",
-			       g_strerror (error));
-		    break;
-		  }
-		
-		bufsize *= 2;
-	      }
-	  }
-	while (!pw);
-#  endif /* !HAVE_GETPWUID_R */
-	
-	if (!pw)
-	  {
-	    setpwent ();
-	    pw = getpwuid (getuid ());
-	    endpwent ();
-	  }
-	if (pw)
-	  {
-	    g_user_name = g_strdup (pw->pw_name);
-	    g_real_name = g_strdup (pw->pw_gecos);
-	    if (!g_home_dir)
-	      g_home_dir = g_strdup (pw->pw_dir);
-	  }
-	g_free (buffer);
-      }
-      
-#else /* !HAVE_PWD_H */
-      
-#  ifdef NATIVE_WIN32
-      {
-	guint len = 17;
-	gchar buffer[17];
-	
-	if (GetUserName (buffer, &len))
-	  {
-	    g_user_name = g_strdup (buffer);
-	    g_real_name = g_strdup (buffer);
-	  }
-      }
-#  endif /* NATIVE_WIN32 */
-      
-#endif /* !HAVE_PWD_H */
-      
-      if (!g_user_name)
-	g_user_name = g_strdup ("somebody");
-      if (!g_real_name)
-	g_real_name = g_strdup ("Unknown");
-      else
-	{
-	  gchar *p;
-
-	  for (p = g_real_name; *p; p++)
-	    if (*p == ',')
-	      {
-		*p = 0;
-		p = g_strdup (g_real_name);
-		g_free (g_real_name);
-		g_real_name = p;
-		break;
-	      }
-	}
-    }
-}
-
-gchar*
-g_get_user_name (void)
-{
-  G_LOCK (g_utils_global);
-  if (!g_tmp_dir)
-    g_get_any_init ();
-  G_UNLOCK (g_utils_global);
-  
-  return g_user_name;
-}
-
-gchar*
-g_get_real_name (void)
-{
-  G_LOCK (g_utils_global);
-  if (!g_tmp_dir)
-    g_get_any_init ();
-  G_UNLOCK (g_utils_global);
- 
-  return g_real_name;
-}
-
-/* Return the home directory of the user. If there is a HOME
- * environment variable, its value is returned, otherwise use some
- * system-dependent way of finding it out. If no home directory can be
- * deduced, return NULL.
- */
-
-gchar*
-g_get_home_dir (void)
-{
-  G_LOCK (g_utils_global);
-  if (!g_tmp_dir)
-    g_get_any_init ();
-  G_UNLOCK (g_utils_global);
-  
-  return g_home_dir;
-}
-
-/* Return a directory to be used to store temporary files. This is the
- * value of the TMPDIR, TMP or TEMP environment variables (they are
- * checked in that order). If none of those exist, use P_tmpdir from
- * stdio.h.  If that isn't defined, return "/tmp" on POSIXly systems,
- * and C:\ on Windows.
- */
-
-gchar*
-g_get_tmp_dir (void)
-{
-  G_LOCK (g_utils_global);
-  if (!g_tmp_dir)
-    g_get_any_init ();
-  G_UNLOCK (g_utils_global);
-  
-  return g_tmp_dir;
-}
-
-static gchar *g_prgname = NULL;
-
-gchar*
-g_get_prgname (void)
-{
-  gchar* retval;
-
-  G_LOCK (g_utils_global);
-  retval = g_prgname;
-  G_UNLOCK (g_utils_global);
-
-  return retval;
-}
-
-void
-g_set_prgname (const gchar *prgname)
-{
-  gchar *c;
-    
-  G_LOCK (g_utils_global);
-  c = g_prgname;
-  g_prgname = g_strdup (prgname);
-  g_free (c);
-  G_UNLOCK (g_utils_global);
-}
-
-guint
-g_direct_hash (gconstpointer v)
-{
-  return GPOINTER_TO_UINT (v);
-}
-
-gint
-g_direct_equal (gconstpointer v1,
-		gconstpointer v2)
-{
-  return v1 == v2;
-}
-
-gint
-g_int_equal (gconstpointer v1,
-	     gconstpointer v2)
-{
-  return *((const gint*) v1) == *((const gint*) v2);
-}
-
-guint
-g_int_hash (gconstpointer v)
-{
-  return *(const gint*) v;
-}
-
-#if 0 /* Old IO Channels */
-
-GIOChannel*
-g_iochannel_new (gint fd)
-{
-  GIOChannel *channel = g_new (GIOChannel, 1);
-
-  channel->fd = fd;
-
-#ifdef NATIVE_WIN32
-  channel->peer = 0;
-  channel->peer_fd = 0;
-  channel->offset = 0;
-  channel->need_wakeups = 0;
-#endif /* NATIVE_WIN32 */
-
-  return channel;
-}
-
-void
-g_iochannel_free (GIOChannel *channel)
-{
-  g_return_if_fail (channel != NULL);
-
-  g_free (channel);
-}
-
-void
-g_iochannel_close_and_free (GIOChannel *channel)
-{
-  g_return_if_fail (channel != NULL);
-
-  close (channel->fd);
-
-  g_iochannel_free (channel);
-}
-
-#undef g_iochannel_wakeup_peer
-
-void
-g_iochannel_wakeup_peer (GIOChannel *channel)
-{
-#ifdef NATIVE_WIN32
-  static guint message = 0;
-#endif
-
-  g_return_if_fail (channel != NULL);
-
-#ifdef NATIVE_WIN32
-  if (message == 0)
-    message = RegisterWindowMessage ("gdk-pipe-readable");
-
-#  if 0
-  g_print ("g_iochannel_wakeup_peer: calling PostThreadMessage (%#x, %d, %d, %d)\n",
-	   channel->peer, message, channel->peer_fd, channel->offset);
-#  endif
-  PostThreadMessage (channel->peer, message,
-		     channel->peer_fd, channel->offset);
-#endif /* NATIVE_WIN32 */
-}
-
-#endif /* Old IO Channels */
-
-#ifdef NATIVE_WIN32
-#ifdef _MSC_VER
-
-int
-gwin_ftruncate (gint  fd,
-		guint size)
-{
-  HANDLE hfile;
-  guint curpos;
-
-  g_return_val_if_fail (fd >= 0, -1);
-  
-  hfile = (HANDLE) _get_osfhandle (fd);
-  curpos = SetFilePointer (hfile, 0, NULL, FILE_CURRENT);
-  if (curpos == 0xFFFFFFFF
-      || SetFilePointer (hfile, size, NULL, FILE_BEGIN) == 0xFFFFFFFF
-      || !SetEndOfFile (hfile))
-    {
-      gint error = GetLastError ();
-
-      switch (error)
-	{
-	case ERROR_INVALID_HANDLE:
-	  errno = EBADF;
-	  break;
-	default:
-	  errno = EIO;
-	  break;
-	}
-
-      return -1;
-    }
-
-  return 0;
-}
-
-DIR*
-gwin_opendir (const char *dirname)
-{
-  DIR *result;
-  gchar *mask;
-  guint k;
-
-  g_return_val_if_fail (dirname != NULL, NULL);
-
-  result = g_new0 (DIR, 1);
-  result->find_file_data = g_new0 (WIN32_FIND_DATA, 1);
-  result->dir_name = g_strdup (dirname);
-  
-  k = strlen (result->dir_name);
-  if (k && result->dir_name[k - 1] == '\\')
-    {
-      result->dir_name[k - 1] = '\0';
-      k--;
-    }
-  mask = g_strdup_printf ("%s\\*", result->dir_name);
-
-  result->find_file_handle = (guint) FindFirstFile (mask,
-					     (LPWIN32_FIND_DATA) result->find_file_data);
-  g_free (mask);
-
-  if (result->find_file_handle == (guint) INVALID_HANDLE_VALUE)
-    {
-      int error = GetLastError ();
-
-      g_free (result->dir_name);
-      g_free (result->find_file_data);
-      g_free (result);
-      switch (error)
-	{
-	default:
-	  errno = EIO;
-	  return NULL;
-	}
-    }
-  result->just_opened = TRUE;
-
-  return result;
-}
-
-struct dirent*
-gwin_readdir (DIR *dir)
-{
-  static struct dirent result;
-
-  g_return_val_if_fail (dir != NULL, NULL);
-
-  if (dir->just_opened)
-    dir->just_opened = FALSE;
-  else
-    {
-      if (!FindNextFile ((HANDLE) dir->find_file_handle,
-			 (LPWIN32_FIND_DATA) dir->find_file_data))
-	{
-	  int error = GetLastError ();
-
-	  switch (error)
-	    {
-	    case ERROR_NO_MORE_FILES:
-	      return NULL;
-	    default:
-	      errno = EIO;
-	      return NULL;
-	    }
-	}
-    }
-  strcpy (result.d_name, g_basename (((LPWIN32_FIND_DATA) dir->find_file_data)->cFileName));
-      
-  return &result;
-}
-
-void
-gwin_rewinddir (DIR *dir)
-{
-  gchar *mask;
-
-  g_return_if_fail (dir != NULL);
-
-  if (!FindClose ((HANDLE) dir->find_file_handle))
-    g_warning ("gwin_rewinddir(): FindClose() failed\n");
-
-  mask = g_strdup_printf ("%s\\*", dir->dir_name);
-  dir->find_file_handle = (guint) FindFirstFile (mask,
-					  (LPWIN32_FIND_DATA) dir->find_file_data);
-  g_free (mask);
-
-  if (dir->find_file_handle == (guint) INVALID_HANDLE_VALUE)
-    {
-      int error = GetLastError ();
-
-      switch (error)
-	{
-	default:
-	  errno = EIO;
-	  return;
-	}
-    }
-  dir->just_opened = TRUE;
-}  
-
-gint
-gwin_closedir (DIR *dir)
-{
-  g_return_val_if_fail (dir != NULL, -1);
-
-  if (!FindClose ((HANDLE) dir->find_file_handle))
-    {
-      int error = GetLastError ();
-
-      switch (error)
-	{
-	default:
-	  errno = EIO; return -1;
-	}
-    }
-
-  g_free (dir->dir_name);
-  g_free (dir->find_file_data);
-  g_free (dir);
-
-  return 0;
-}
-
-#endif /* _MSC_VER */
-
-#endif /* NATIVE_WIN32 */
diff --git a/tests/testgdate.c b/tests/testgdate.c
deleted file mode 100644
index f74e00a..0000000
--- a/tests/testgdate.c
+++ /dev/null
@@ -1,486 +0,0 @@
-
-#include "glib.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <locale.h>
-#include <time.h>
-
-gboolean failed = FALSE;
-guint32 passed = 0;
-guint32 notpassed = 0;
-
-#define	TEST(m,cond)	G_STMT_START { failed = !(cond); \
-if (failed) \
-  { ++notpassed; \
-    if (!m) \
-      g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \
-    else \
-      g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \
-  } \
-else \
-  ++passed;    \
-  if ((passed+notpassed) % 10000 == 0) g_print ("."); fflush (stdout); \
-} G_STMT_END
-
-void g_date_debug_print(GDate* d)
-{
-  if (!d) g_print("NULL!\n");
-  else 
-    g_print("julian: %u (%s) DMY: %u %u %u (%s)\n",
-	    d->julian_days, 
-	    d->julian ? "valid" : "invalid",
-	    d->day,
-	    d->month,
-	    d->year,
-	    d->dmy ? "valid" : "invalid");
-  
-  fflush(stdout);
-}
-
-int main(int argc, char** argv)
-{
-  GDate* d;
-  guint32 j;
-  GDateMonth m;
-  GDateYear y, prev_y;
-  GDateDay day;
-  gchar buf[101];
-  gchar* loc;
-  /* Try to get all the leap year cases. */
-  GDateYear check_years[] = { 
-    1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
-    11, 12, 13, 14, 98, 99, 100, 101, 102, 103, 397, 
-    398, 399, 400, 401, 402, 403, 404, 405, 406,
-    1598, 1599, 1600, 1601, 1602, 1650, 1651,
-    1897, 1898, 1899, 1900, 1901, 1902, 1903, 
-    1961, 1962, 1963, 1964, 1965, 1967,
-    1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976,
-    1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 
-    1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 
-    1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 
-    2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012,
-    3000, 3001, 3002, 3998, 3999, 4000, 4001, 4002, 4003
-  };
-  guint n_check_years = sizeof(check_years)/sizeof(GDateYear);
-  guint i;
-  gboolean discontinuity;
-
-  g_print("checking GDate...");
-  
-  TEST("sizeof(GDate) is not more than 8 bytes on this platform", sizeof(GDate) < 9);
-
-  d = g_date_new();
-
-  TEST("Empty constructor produces invalid date", !g_date_valid(d));
-
-  g_date_free(d);
-
-  d = g_date_new_dmy(1,1,1);
-
-  TEST("January 1, Year 1 created and valid", g_date_valid(d));
-
-  j = g_date_julian(d);
-  
-  TEST("January 1, Year 1 is Julian date 1", j == 1);
-
-  TEST("Returned month is January", g_date_month(d) == G_DATE_JANUARY);
-  TEST("Returned day is 1", g_date_day(d) == 1);
-  TEST("Returned year is 1", g_date_year(d) == 1);
-
-  TEST("Bad month is invalid", !g_date_valid_month(G_DATE_BAD_MONTH));
-  TEST("Month 13 is invalid",  !g_date_valid_month(13));
-  TEST("Bad day is invalid",   !g_date_valid_day(G_DATE_BAD_DAY));
-  TEST("Day 32 is invalid",     !g_date_valid_day(32));
-  TEST("Bad year is invalid",  !g_date_valid_year(G_DATE_BAD_YEAR));
-  TEST("Bad julian is invalid", !g_date_valid_julian(G_DATE_BAD_JULIAN));
-  TEST("Bad weekday is invalid", !g_date_valid_weekday(G_DATE_BAD_WEEKDAY));
-  TEST("Year 2000 is a leap year", g_date_is_leap_year(2000));
-  TEST("Year 1999 is not a leap year", !g_date_is_leap_year(1999));
-  TEST("Year 1996 is a leap year", g_date_is_leap_year(1996));
-  TEST("Year 1600 is a leap year", g_date_is_leap_year(1600));
-  TEST("Year 2100 is not a leap year", !g_date_is_leap_year(2100));
-  TEST("Year 1800 is not a leap year", !g_date_is_leap_year(1800));
-
-  g_date_free(d);
-  
-  loc = setlocale(LC_ALL,"");
-  if (loc) 
-    g_print("\nLocale set to %s\n", loc);
-  else 
-    g_print("\nLocale unchanged\n");
-
-  d = g_date_new();
-  g_date_set_time(d, time(NULL));
-  TEST("Today is valid", g_date_valid(d));
-
-  g_date_strftime(buf,100,"Today is a %A, %x\n", d);
-  g_print("%s", buf);
-
-  g_date_set_time(d, 1);
-  TEST("Beginning of Unix epoch is valid", g_date_valid(d));
-
-  g_date_strftime(buf,100,"1 second into the Unix epoch it was a %A, in the month of %B, %x\n", d);
-  g_print("%s", buf);
-
-  g_date_set_julian(d, 1);
-  TEST("GDate's \"Julian\" epoch's first day is valid", g_date_valid(d));
-
-  g_date_strftime(buf,100,"Our \"Julian\" epoch begins on a %A, in the month of %B, %x\n",
-		  d);
-  g_print("%s", buf);
-
-  g_date_set_dmy(d, 10, 1, 2000);
-
-  g_date_strftime(buf,100,"%x", d);
-
-  g_date_set_parse(d, buf);
-  /* Note: this test will hopefully work, but no promises. */
-  TEST("Successfully parsed a %x-formatted string", 
-       g_date_valid(d) && 
-       g_date_month(d) == 1 && 
-       g_date_day(d) == 10 && 
-       g_date_year(d) == 2000);
-  if (failed)
-    g_date_debug_print(d);
-  
-  g_date_free(d);
-
-  j = G_DATE_BAD_JULIAN;
-
-  i = 0;
-  discontinuity = TRUE;
-  y      = check_years[0];
-  prev_y = G_DATE_BAD_YEAR;
-  while (i < n_check_years) 
-    {
-      guint32 first_day_of_year = G_DATE_BAD_JULIAN;
-      guint16 days_in_year = g_date_is_leap_year(y) ? 366 : 365;
-      guint   sunday_week_of_year = 0;
-      guint   sunday_weeks_in_year = g_date_sunday_weeks_in_year(y);
-      guint   monday_week_of_year = 0;
-      guint   monday_weeks_in_year = g_date_monday_weeks_in_year(y);
-
-      if (discontinuity)
-        g_print(" (Break in sequence of requested years to check)\n");
-
-      g_print("Checking year %u", y);
-
-      TEST("Year is valid", g_date_valid_year(y));
-
-      TEST("Number of Sunday weeks in year is 52 or 53", 
-	   sunday_weeks_in_year == 52 || sunday_weeks_in_year == 53);
-      
-      TEST("Number of Monday weeks in year is 52 or 53", 
-	   monday_weeks_in_year == 52 || monday_weeks_in_year == 53);
-	   
-      m = 1;
-      while (m < 13) 
-	{
-	  guint8 dim = g_date_days_in_month(m,y);
-	  GDate days[31];         /* This is the fast way, no allocation */
-
-	  TEST("Sensible number of days in month", (dim > 0 && dim < 32));
-
-	  TEST("Month between 1 and 12 is valid", g_date_valid_month(m));
-
-	  day = 1;
-
-	  g_date_clear(days, 31);
-
-	  while (day <= dim) 
-	    {
-	      guint i;
-              GDate tmp;
-
-	      TEST("DMY triplet is valid", g_date_valid_dmy(day,m,y));
-
-	      /* Create GDate with triplet */
-	      
-	      d = &days[day-1];
-
-	      TEST("Cleared day is invalid", !g_date_valid(d));
-
-	      g_date_set_dmy(d,day,m,y);
-
-	      TEST("Set day is valid", g_date_valid(d));
-
-	      if (m == G_DATE_JANUARY && day == 1) 
-		{
-		  first_day_of_year = g_date_julian(d);
-		}
-
-	      g_assert(first_day_of_year != G_DATE_BAD_JULIAN);
-
-	      TEST("Date with DMY triplet is valid", g_date_valid(d));
-	      TEST("Month accessor works", g_date_month(d) == m);
-	      TEST("Year accessor works", g_date_year(d) == y);
-	      TEST("Day of month accessor works", g_date_day(d) == day);
-
-	      TEST("Day of year is consistent with Julian dates",
-		   ((g_date_julian(d) + 1 - first_day_of_year) ==
-		    (g_date_day_of_year(d))));
-
-	      if (failed) 
-		{
-		  g_print("first day: %u this day: %u day of year: %u\n", 
-			  first_day_of_year, 
-			  g_date_julian(d),
-			  g_date_day_of_year(d));
-		}
-	      
-	      if (m == G_DATE_DECEMBER && day == 31) 
-		{
-		  TEST("Last day of year equals number of days in year", 
-		       g_date_day_of_year(d) == days_in_year);
-		  if (failed) 
-		    {
-		      g_print("last day: %u days in year: %u\n", 
-			      g_date_day_of_year(d), days_in_year);
-		    }
-		}
-
-	      TEST("Day of year is not more than number of days in the year",
-		   g_date_day_of_year(d) <= days_in_year);
-
-	      TEST("Monday week of year is not more than number of weeks in the year",
-		   g_date_monday_week_of_year(d) <= monday_weeks_in_year);
-	      if (failed)
-		{
-		  g_print("Weeks in year: %u\n", monday_weeks_in_year);
-		  g_date_debug_print(d);
-		}
-	      TEST("Monday week of year is >= than last week of year",
-		   g_date_monday_week_of_year(d) >= monday_week_of_year);
-
-	      if (g_date_weekday(d) == G_DATE_MONDAY) 
-		{
-		  
-		  TEST("Monday week of year on Monday 1 more than previous day's week of year",
-		       (g_date_monday_week_of_year(d) - monday_week_of_year) == 1);
-		}
-	      else 
-		{
-		  TEST("Monday week of year on non-Monday 0 more than previous day's week of year",
-		       (g_date_monday_week_of_year(d) - monday_week_of_year) == 0);
-		}
-
-
-	      monday_week_of_year = g_date_monday_week_of_year(d);
-
-
-	      TEST("Sunday week of year is not more than number of weeks in the year",
-		   g_date_sunday_week_of_year(d) <= sunday_weeks_in_year);
-	      if (failed)
-		{
-		  g_date_debug_print(d);
-		}
-	      TEST("Sunday week of year is >= than last week of year",
-		   g_date_sunday_week_of_year(d) >= sunday_week_of_year);
-
-	      if (g_date_weekday(d) == G_DATE_SUNDAY) 
-		{
-		  TEST("Sunday week of year on Sunday 1 more than previous day's week of year",
-		       (g_date_sunday_week_of_year(d) - sunday_week_of_year) == 1);
-		}
-	      else 
-		{
-		  TEST("Sunday week of year on non-Sunday 0 more than previous day's week of year",
-		       (g_date_sunday_week_of_year(d) - sunday_week_of_year) == 0);
-		}
-
-	      sunday_week_of_year = g_date_sunday_week_of_year(d);
-
-	      TEST("Date is equal to itself",
-		   g_date_compare(d,d) == 0);
-
-
-	      /*************** Increments ***********/
-
-              i = 1;
-              while (i < 402) /* Need to get 400 year increments in */ 
-                {
-	      
-                  /***** Days ******/
-                  tmp = *d;
-                  g_date_add_days(d, i);
-
-                  TEST("Adding days gives a value greater than previous",
-                       g_date_compare(d, &tmp) > 0);
-
-                  g_date_subtract_days(d, i);
-                  TEST("Forward days then backward days returns us to current day",
-                       g_date_day(d) == day);
-
-                  if (failed) 
-                    {
-                      g_print("  (increment %u, dmy %u %u %u) ", i, day, m, y);
-                      g_date_debug_print(d);
-                    }
-
-                  TEST("Forward days then backward days returns us to current month",
-                       g_date_month(d) == m);
-
-                  if (failed) 
-                    {
-                      g_print("  (increment %u, dmy %u %u %u) ", i, day, m, y);
-                      g_date_debug_print(d);
-                    }
-
-                  TEST("Forward days then backward days returns us to current year",
-                       g_date_year(d) == y);
-
-                  if (failed) 
-                    {
-                      g_print("  (increment %u, dmy %u %u %u) ", i, day, m, y);
-                      g_date_debug_print(d);
-                    }
-
-                  /******* Months ********/
-
-                  tmp = *d;
-                  g_date_add_months(d, i);
-                  TEST("Adding months gives a larger value",
-                       g_date_compare(d, &tmp) > 0);
-                  g_date_subtract_months(d, i);
-
-                  TEST("Forward months then backward months returns us to current month",
-                       g_date_month(d) == m);
-
-                  if (failed) 
-                    {
-                      g_print("  (increment %u, dmy %u %u %u) ", i, day, m, y);
-                      g_date_debug_print(d);
-                    }
-
-                  TEST("Forward months then backward months returns us to current year",
-                       g_date_year(d) == y);
-
-                  if (failed) 
-                    {
-                      g_print("  (increment %u, dmy %u %u %u) ", i, day, m, y);
-                      g_date_debug_print(d);
-                    }
-
-		  
-                  if (day < 29) 
-                    {
-                      /* Day should be unchanged */
-		      
-                      TEST("Forward months then backward months returns us to current day",
-                           g_date_day(d) == day);
-		      
-                      if (failed) 
-                        {
-                          g_print("  (increment %u, dmy %u %u %u) ", i, day, m, y);
-                          g_date_debug_print(d);
-                        }
-                    }
-                  else 
-                    {
-                      /* reset the day for later tests */
-                      g_date_set_day(d, day);
-                    }
-
-                  /******* Years ********/
-
-                  tmp = *d;
-                  g_date_add_years(d, i);
-
-                  TEST("Adding years gives a larger value",
-                       g_date_compare(d,&tmp) > 0);
-		      
-                  g_date_subtract_years(d, i);
-
-                  TEST("Forward years then backward years returns us to current month",
-                       g_date_month(d) == m);
-
-                  if (failed) 
-                    {
-                      g_print("  (increment %u, dmy %u %u %u) ", i, day, m, y);
-                      g_date_debug_print(d);
-                    }
-
-                  TEST("Forward years then backward years returns us to current year",
-                       g_date_year(d) == y);
-
-                  if (failed) 
-                    {
-                      g_print("  (increment %u, dmy %u %u %u) ", i, day, m, y);
-                      g_date_debug_print(d);
-                    }
-
-                  if (m != 2 && day != 29) 
-                    {
-                      TEST("Forward years then backward years returns us to current day",
-                           g_date_day(d) == day);
-		      
-                      if (failed) 
-                        {
-                          g_print("  (increment %u, dmy %u %u %u) ", i, day, m, y);
-                          g_date_debug_print(d);
-                        }
-                    }
-                  else 
-                    {
-                      g_date_set_day(d, day); /* reset */
-                    }
-
-                  i += 10;
-                }
-
-	      /*****  increment test relative to our local Julian count */
-
-              if (!discontinuity) {
-
-                /* We can only run sequence tests between sequential years */
-                
-                TEST("Julians are sequential with increment 1",
-                     j+1 == g_date_julian(d));
-                if (failed) 
-                  {
-                    g_print("Out of sequence, prev: %u expected: %u got: %u\n",
-                            j, j+1, g_date_julian(d));
-                  }
-
-                g_date_add_days(d,1);
-                TEST("Next day has julian 1 higher",
-                     g_date_julian(d) == j + 2);
-                g_date_subtract_days(d, 1);
-                
-                if (j != G_DATE_BAD_JULIAN) 
-                  {
-                    g_date_subtract_days(d, 1);
-                    
-                    TEST("Previous day has julian 1 lower",
-                         g_date_julian(d) == j);
-                    
-                    g_date_add_days(d, 1); /* back to original */
-                  }
-              }    
-              discontinuity = FALSE; /* goes away now */            
-
-              fflush(stdout);
-              fflush(stderr);
-
-	      j = g_date_julian(d); /* inc current julian */
-
-	      ++day;
-	    } 
-	  ++m;
-	}
-      g_print(" done\n");
-      ++i;
-      prev_y = y;
-      y = check_years[i];
-      if (prev_y == G_DATE_BAD_YEAR || 
-          (prev_y + 1) != y) discontinuity = TRUE;
-    }
-  
-  
-  g_print("\n%u tests passed, %u failed\n",passed, notpassed);
-
-  return 0;
-}
-
-
diff --git a/tests/testgdateparser.c b/tests/testgdateparser.c
deleted file mode 100644
index 1e482ff..0000000
--- a/tests/testgdateparser.c
+++ /dev/null
@@ -1,109 +0,0 @@
-
-#include "glib.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <locale.h>
-
-void g_date_debug_print(GDate* d)
-{
-  if (!d) g_print("NULL!\n");
-  else 
-    g_print("julian: %u (%s) DMY: %u %u %u (%s)\n",
-	    d->julian_days, 
-	    d->julian ? "valid" : "invalid",
-	    d->day,
-	    d->month,
-	    d->year,
-	    d->dmy ? "valid" : "invalid");
-  
-  fflush(stdout);
-}
-
-/* These only work in the POSIX locale, maybe C too - 
- * type POSIX into the program to check them
- */
-char* posix_tests [] = {
-  "19981024",
-  "981024",
-  "October 1998",
-  "October 98",
-  "oCT 98",
-  "10/24/98",
-  "10 -- 24 -- 98",
-  "10/24/1998",
-  "October 24, 1998",
-  NULL
-};
-
-int main(int argc, char** argv)
-{
-  GDate* d;
-  gchar* loc;
-  gchar input[1024];
-
-  loc = setlocale(LC_ALL,"");
-  if (loc) 
-    g_print("\nLocale set to %s\n", loc);
-  else 
-    g_print("\nLocale unchanged\n");
-
-  d = g_date_new();
-
-  while (fgets(input, 1023, stdin))
-    {
-      if (input[0] == '\n') 
-        {
-          g_print("Enter a date to parse and press enter, or type `POSIX':\n");
-          continue;
-        }
-
-      if (strcmp(input,"POSIX\n") == 0) 
-        {
-          char** s = posix_tests;
-          while (*s) {
-            g_date_set_parse(d, *s);
-            
-            g_print("POSIXy parse test `%s' ...", *s);
-
-            if (!g_date_valid(d))
-              {
-                g_print(" failed.\n");
-              }
-            else 
-              {
-                gchar buf[256];
-                
-                g_date_strftime(buf,100," parsed `%x' (%B %d %Y)\n",
-                                d);
-                g_print("%s", buf);
-              }
-
-            ++s;
-          }
-        }
-      else 
-        {
-          g_date_set_parse(d, input);
-          
-          if (!g_date_valid(d))
-            {
-              g_print("Parse failed.\n");
-            }
-          else 
-            {
-              gchar buf[256];
-              
-              g_date_strftime(buf,100,"Parsed: `%x' (%B %d %Y)\n",
-                              d);
-              g_print("%s", buf);
-            }
-        }
-    }
-
-  g_date_free(d);
-
-  return 0;
-}
-
-
diff --git a/tests/testglib.c b/tests/testglib.c
deleted file mode 100644
index 843b49e..0000000
--- a/tests/testglib.c
+++ /dev/null
@@ -1,921 +0,0 @@
-/* GLIB - Library of useful routines for C programming
- * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GLib Team and others 1997-1999.  See the AUTHORS
- * file for a list of people on the GLib Team.  See the ChangeLog
- * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
- */
-
-#undef G_LOG_DOMAIN
-
-#include <stdio.h>
-#include <string.h>
-#include "glib.h"
-
-int array[10000];
-gboolean failed = FALSE;
-
-#define	TEST(m,cond)	G_STMT_START { failed = !(cond); \
-if (failed) \
-  { if (!m) \
-      g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \
-    else \
-      g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \
-  } \
-else \
-  g_print ("."); fflush (stdout); \
-} G_STMT_END
-
-#define	C2P(c)		((gpointer) ((long) (c)))
-#define	P2C(p)		((gchar) ((long) (p)))
-
-#define GLIB_TEST_STRING "el dorado "
-#define GLIB_TEST_STRING_5 "el do"
-
-static gboolean
-node_build_string (GNode    *node,
-		   gpointer  data)
-{
-  gchar **p = data;
-  gchar *string;
-  gchar c[2] = "_";
-
-  c[0] = P2C (node->data);
-
-  string = g_strconcat (*p ? *p : "", c, NULL);
-  g_free (*p);
-  *p = string;
-
-  return FALSE;
-}
-
-static void
-g_node_test (void)
-{
-  GNode *root;
-  GNode *node;
-  GNode *node_B;
-  GNode *node_F;
-  GNode *node_G;
-  GNode *node_J;
-  guint i;
-  gchar *tstring;
-
-  g_print ("checking n-way trees: ");
-  failed = FALSE;
-
-  root = g_node_new (C2P ('A'));
-  TEST (NULL, g_node_depth (root) == 1 && g_node_max_height (root) == 1);
-
-  node_B = g_node_new (C2P ('B'));
-  g_node_append (root, node_B);
-  TEST (NULL, root->children == node_B);
-
-  g_node_append_data (node_B, C2P ('E'));
-  g_node_prepend_data (node_B, C2P ('C'));
-  g_node_insert (node_B, 1, g_node_new (C2P ('D')));
-
-  node_F = g_node_new (C2P ('F'));
-  g_node_append (root, node_F);
-  TEST (NULL, root->children->next == node_F);
-
-  node_G = g_node_new (C2P ('G'));
-  g_node_append (node_F, node_G);
-  node_J = g_node_new (C2P ('J'));
-  g_node_prepend (node_G, node_J);
-  g_node_insert (node_G, 42, g_node_new (C2P ('K')));
-  g_node_insert_data (node_G, 0, C2P ('H'));
-  g_node_insert (node_G, 1, g_node_new (C2P ('I')));
-
-  TEST (NULL, g_node_depth (root) == 1);
-  TEST (NULL, g_node_max_height (root) == 4);
-  TEST (NULL, g_node_depth (node_G->children->next) == 4);
-  TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_LEAFS) == 7);
-  TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_NON_LEAFS) == 4);
-  TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == 11);
-  TEST (NULL, g_node_max_height (node_F) == 3);
-  TEST (NULL, g_node_n_children (node_G) == 4);
-  TEST (NULL, g_node_find_child (root, G_TRAVERSE_ALL, C2P ('F')) == node_F);
-  TEST (NULL, g_node_find (root, G_LEVEL_ORDER, G_TRAVERSE_NON_LEAFS, C2P ('I')) == NULL);
-  TEST (NULL, g_node_find (root, G_IN_ORDER, G_TRAVERSE_LEAFS, C2P ('J')) == node_J);
-
-  for (i = 0; i < g_node_n_children (node_B); i++)
-    {
-      node = g_node_nth_child (node_B, i);
-      TEST (NULL, P2C (node->data) == ('C' + i));
-    }
-  
-  for (i = 0; i < g_node_n_children (node_G); i++)
-    TEST (NULL, g_node_child_position (node_G, g_node_nth_child (node_G, i)) == i);
-
-  /* we have built:                    A
-   *                                 /   \
-   *                               B       F
-   *                             / | \       \
-   *                           C   D   E       G
-   *                                         / /\ \
-   *                                       H  I  J  K
-   *
-   * for in-order traversal, 'G' is considered to be the "left"
-   * child of 'F', which will cause 'F' to be the last node visited.
-   */
-
-  tstring = NULL;
-  g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
-  TEST (tstring, strcmp (tstring, "ABCDEFGHIJK") == 0);
-  g_free (tstring); tstring = NULL;
-  g_node_traverse (root, G_POST_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
-  TEST (tstring, strcmp (tstring, "CDEBHIJKGFA") == 0);
-  g_free (tstring); tstring = NULL;
-  g_node_traverse (root, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
-  TEST (tstring, strcmp (tstring, "CBDEAHGIJKF") == 0);
-  g_free (tstring); tstring = NULL;
-  g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
-  TEST (tstring, strcmp (tstring, "ABFCDEGHIJK") == 0);
-  g_free (tstring); tstring = NULL;
-  
-  g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_LEAFS, -1, node_build_string, &tstring);
-  TEST (tstring, strcmp (tstring, "CDEHIJK") == 0);
-  g_free (tstring); tstring = NULL;
-  g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_NON_LEAFS, -1, node_build_string, &tstring);
-  TEST (tstring, strcmp (tstring, "ABFG") == 0);
-  g_free (tstring); tstring = NULL;
-
-  g_node_reverse_children (node_B);
-  g_node_reverse_children (node_G);
-
-  g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
-  TEST (tstring, strcmp (tstring, "ABFEDCGKJIH") == 0);
-  g_free (tstring); tstring = NULL;
-  
-  g_node_destroy (root);
-
-  /* allocation tests */
-
-  root = g_node_new (NULL);
-  node = root;
-
-  for (i = 0; i < 2048; i++)
-    {
-      g_node_append (node, g_node_new (NULL));
-      if ((i%5) == 4)
-	node = node->children->next;
-    }
-  TEST (NULL, g_node_max_height (root) > 100);
-  TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == 1 + 2048);
-
-  g_node_destroy (root);
-  
-  if (!failed)
-    g_print ("ok\n");
-}
-
-static gboolean
-my_hash_callback_remove (gpointer key,
-			 gpointer value,
-			 gpointer user_data)
-{
-  int *d = value;
-
-  if ((*d) % 2)
-    return TRUE;
-
-  return FALSE;
-}
-
-static void
-my_hash_callback_remove_test (gpointer key,
-			      gpointer value,
-			      gpointer user_data)
-{
-  int *d = value;
-
-  if ((*d) % 2)
-    g_print ("bad!\n");
-}
-
-static void
-my_hash_callback (gpointer key,
-		  gpointer value,
-		  gpointer user_data)
-{
-  int *d = value;
-  *d = 1;
-}
-
-static guint
-my_hash (gconstpointer key)
-{
-  return (guint) *((const gint*) key);
-}
-
-static gint
-my_hash_compare (gconstpointer a,
-		 gconstpointer b)
-{
-  return *((const gint*) a) == *((const gint*) b);
-}
-
-static gint
-my_list_compare_one (gconstpointer a, gconstpointer b)
-{
-  gint one = *((const gint*)a);
-  gint two = *((const gint*)b);
-  return one-two;
-}
-
-static gint
-my_list_compare_two (gconstpointer a, gconstpointer b)
-{
-  gint one = *((const gint*)a);
-  gint two = *((const gint*)b);
-  return two-one;
-}
-
-/* static void
-my_list_print (gpointer a, gpointer b)
-{
-  gint three = *((gint*)a);
-  g_print("%d", three);
-}; */
-
-static gint
-my_compare (gconstpointer a,
-	    gconstpointer b)
-{
-  const char *cha = a;
-  const char *chb = b;
-
-  return *cha - *chb;
-}
-
-static gint
-my_traverse (gpointer key,
-	     gpointer value,
-	     gpointer data)
-{
-  char *ch = key;
-  g_print ("%c ", *ch);
-  return FALSE;
-}
-
-int
-main (int   argc,
-      char *argv[])
-{
-  GList *list, *t;
-  GSList *slist, *st;
-  GHashTable *hash_table;
-  GMemChunk *mem_chunk;
-  GStringChunk *string_chunk;
-  GTimer *timer;
-  gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
-  gint morenums[10] = { 8, 9, 7, 0, 3, 2, 5, 1, 4, 6};
-  gchar *string;
-
-  gchar *mem[10000], *tmp_string = NULL, *tmp_string_2;
-  gint i, j;
-  GArray *garray;
-  GPtrArray *gparray;
-  GByteArray *gbarray;
-  GString *string1, *string2;
-  GTree *tree;
-  char chars[62];
-  GRelation *relation;
-  GTuples *tuples;
-  gint data [1024];
-  struct {
-    gchar *filename;
-    gchar *dirname;
-  } dirname_checks[] = {
-#ifndef NATIVE_WIN32
-    { "/", "/" },
-    { "////", "/" },
-    { ".////", "." },
-    { ".", "." },
-    { "..", "." },
-    { "../", ".." },
-    { "..////", ".." },
-    { "", "." },
-    { "a/b", "a" },
-    { "a/b/", "a/b" },
-    { "c///", "c" },
-#else
-    { "\\", "\\" },
-    { ".\\\\\\\\", "." },
-    { ".", "." },
-    { "..", "." },
-    { "..\\", ".." },
-    { "..\\\\\\\\", ".." },
-    { "", "." },
-    { "a\\b", "a" },
-    { "a\\b\\", "a\\b" },
-    { "c\\\\\\", "c" },
-#endif
-  };
-  guint n_dirname_checks = sizeof (dirname_checks) / sizeof (dirname_checks[0]);
-  guint16 gu16t1 = 0x44afU, gu16t2 = 0xaf44U;
-  guint32 gu32t1 = 0x02a7f109U, gu32t2 = 0x09f1a702U;
-#ifdef G_HAVE_GINT64
-  guint64 gu64t1 = G_GINT64_CONSTANT(0x1d636b02300a7aa7U),
-	  gu64t2 = G_GINT64_CONSTANT(0xa77a0a30026b631dU);
-#endif
-
-  g_print ("TestGLib v%u.%u.%u (i:%u b:%u)\n",
-	   glib_major_version,
-	   glib_minor_version,
-	   glib_micro_version,
-	   glib_interface_age,
-	   glib_binary_age);
-
-  string = g_get_current_dir ();
-  g_print ("cwd: %s\n", string);
-  g_free (string);
-  g_print ("user: %s\n", g_get_user_name ());
-  g_print ("real: %s\n", g_get_real_name ());
-  g_print ("home: %s\n", g_get_home_dir ());
-  g_print ("tmp-dir: %s\n", g_get_tmp_dir ());
-
-  /* type sizes */
-  g_print ("checking size of gint8: %d", (int)sizeof (gint8));
-  TEST (NULL, sizeof (gint8) == 1);
-  g_print ("\nchecking size of gint16: %d", (int)sizeof (gint16));
-  TEST (NULL, sizeof (gint16) == 2);
-  g_print ("\nchecking size of gint32: %d", (int)sizeof (gint32));
-  TEST (NULL, sizeof (gint32) == 4);
-#ifdef	G_HAVE_GINT64
-  g_print ("\nchecking size of gint64: %d", (int)sizeof (gint64));
-  TEST (NULL, sizeof (gint64) == 8);
-#endif	/* G_HAVE_GINT64 */
-  g_print ("\n");
-
-  g_print ("checking g_dirname()...");
-  for (i = 0; i < n_dirname_checks; i++)
-    {
-      gchar *dirname;
-
-      dirname = g_dirname (dirname_checks[i].filename);
-      if (strcmp (dirname, dirname_checks[i].dirname) != 0)
-	{
-	  g_print ("\nfailed for \"%s\"==\"%s\" (returned: \"%s\")\n",
-		   dirname_checks[i].filename,
-		   dirname_checks[i].dirname,
-		   dirname);
-	  n_dirname_checks = 0;
-	}
-      g_free (dirname);
-    }
-  if (n_dirname_checks)
-    g_print ("ok\n");
-
-  g_print ("checking doubly linked lists...");
-
-  list = NULL;
-  for (i = 0; i < 10; i++)
-    list = g_list_append (list, &nums[i]);
-  list = g_list_reverse (list);
-
-  for (i = 0; i < 10; i++)
-    {
-      t = g_list_nth (list, i);
-      if (*((gint*) t->data) != (9 - i))
-	g_error ("Regular insert failed");
-    }
-
-  for (i = 0; i < 10; i++)
-    if(g_list_position(list, g_list_nth (list, i)) != i)
-      g_error("g_list_position does not seem to be the inverse of g_list_nth\n");
-
-  g_list_free (list);
-  list = NULL;
-
-  for (i = 0; i < 10; i++)
-    list = g_list_insert_sorted (list, &morenums[i], my_list_compare_one);
-
-  /*
-  g_print("\n");
-  g_list_foreach (list, my_list_print, NULL);
-  */
-
-  for (i = 0; i < 10; i++)
-    {
-      t = g_list_nth (list, i);
-      if (*((gint*) t->data) != i)
-         g_error ("Sorted insert failed");
-    }
-
-  g_list_free (list);
-  list = NULL;
-
-  for (i = 0; i < 10; i++)
-    list = g_list_insert_sorted (list, &morenums[i], my_list_compare_two);
-
-  /*
-  g_print("\n");
-  g_list_foreach (list, my_list_print, NULL);
-  */
-
-  for (i = 0; i < 10; i++)
-    {
-      t = g_list_nth (list, i);
-      if (*((gint*) t->data) != (9 - i))
-         g_error ("Sorted insert failed");
-    }
-
-  g_list_free (list);
-  list = NULL;
-
-  for (i = 0; i < 10; i++)
-    list = g_list_prepend (list, &morenums[i]);
-
-  list = g_list_sort (list, my_list_compare_two);
-
-  /*
-  g_print("\n");
-  g_list_foreach (list, my_list_print, NULL);
-  */
-
-  for (i = 0; i < 10; i++)
-    {
-      t = g_list_nth (list, i);
-      if (*((gint*) t->data) != (9 - i))
-         g_error ("Merge sort failed");
-    }
-
-  g_list_free (list);
-
-  g_print ("ok\n");
-
-
-  g_print ("checking singly linked lists...");
-
-  slist = NULL;
-  for (i = 0; i < 10; i++)
-    slist = g_slist_append (slist, &nums[i]);
-  slist = g_slist_reverse (slist);
-
-  for (i = 0; i < 10; i++)
-    {
-      st = g_slist_nth (slist, i);
-      if (*((gint*) st->data) != (9 - i))
-	g_error ("failed");
-    }
-
-  g_slist_free (slist);
-  slist = NULL;
-
-  for (i = 0; i < 10; i++)
-    slist = g_slist_insert_sorted (slist, &morenums[i], my_list_compare_one);
-
-  /*
-  g_print("\n");
-  g_slist_foreach (slist, my_list_print, NULL);
-  */
-
-  for (i = 0; i < 10; i++)
-    {
-      st = g_slist_nth (slist, i);
-      if (*((gint*) st->data) != i)
-         g_error ("Sorted insert failed");
-    }
-
-  g_slist_free(slist);
-  slist = NULL;
-
-  for (i = 0; i < 10; i++)
-    slist = g_slist_insert_sorted (slist, &morenums[i], my_list_compare_two);
-
-  /*
-  g_print("\n");
-  g_slist_foreach (slist, my_list_print, NULL);
-  */
-
-  for (i = 0; i < 10; i++)
-    {
-      st = g_slist_nth (slist, i);
-      if (*((gint*) st->data) != (9 - i))
-         g_error("Sorted insert failed");
-    }
-
-  g_slist_free(slist);
-  slist = NULL;
-
-  for (i = 0; i < 10; i++)
-    slist = g_slist_prepend (slist, &morenums[i]);
-
-  slist = g_slist_sort (slist, my_list_compare_two);
-
-  /*
-  g_print("\n");
-  g_slist_foreach (slist, my_list_print, NULL);
-  */
-
-  for (i = 0; i < 10; i++)
-    {
-      st = g_slist_nth (slist, i);
-      if (*((gint*) st->data) != (9 - i))
-         g_error("Sorted insert failed");
-    }
-
-  g_slist_free(slist);
-
-  g_print ("ok\n");
-
-
-  g_print ("checking binary trees...\n");
-
-  tree = g_tree_new (my_compare);
-  i = 0;
-  for (j = 0; j < 10; j++, i++)
-    {
-      chars[i] = '0' + j;
-      g_tree_insert (tree, &chars[i], &chars[i]);
-    }
-  for (j = 0; j < 26; j++, i++)
-    {
-      chars[i] = 'A' + j;
-      g_tree_insert (tree, &chars[i], &chars[i]);
-    }
-  for (j = 0; j < 26; j++, i++)
-    {
-      chars[i] = 'a' + j;
-      g_tree_insert (tree, &chars[i], &chars[i]);
-    }
-
-  g_print ("tree height: %d\n", g_tree_height (tree));
-  g_print ("tree nnodes: %d\n", g_tree_nnodes (tree));
-
-  g_print ("tree: ");
-  g_tree_traverse (tree, my_traverse, G_IN_ORDER, NULL);
-  g_print ("\n");
-
-  for (i = 0; i < 10; i++)
-    g_tree_remove (tree, &chars[i]);
-
-  g_print ("tree height: %d\n", g_tree_height (tree));
-  g_print ("tree nnodes: %d\n", g_tree_nnodes (tree));
-
-  g_print ("tree: ");
-  g_tree_traverse (tree, my_traverse, G_IN_ORDER, NULL);
-  g_print ("\n");
-
-  g_print ("ok\n");
-
-
-  /* check n-way trees */
-  g_node_test ();
-
-  g_print ("checking mem chunks...");
-
-  mem_chunk = g_mem_chunk_new ("test mem chunk", 50, 100, G_ALLOC_AND_FREE);
-
-  for (i = 0; i < 10000; i++)
-    {
-      mem[i] = g_chunk_new (gchar, mem_chunk);
-
-      for (j = 0; j < 50; j++)
-	mem[i][j] = i * j;
-    }
-
-  for (i = 0; i < 10000; i++)
-    {
-      g_mem_chunk_free (mem_chunk, mem[i]);
-    }
-
-  g_print ("ok\n");
-
-
-  g_print ("checking hash tables...");
-
-  hash_table = g_hash_table_new (my_hash, my_hash_compare);
-  for (i = 0; i < 10000; i++)
-    {
-      array[i] = i;
-      g_hash_table_insert (hash_table, &array[i], &array[i]);
-    }
-  g_hash_table_foreach (hash_table, my_hash_callback, NULL);
-
-  for (i = 0; i < 10000; i++)
-    if (array[i] == 0)
-      g_print ("%d\n", i);
-
-  for (i = 0; i < 10000; i++)
-    g_hash_table_remove (hash_table, &array[i]);
-
-  for (i = 0; i < 10000; i++)
-    {
-      array[i] = i;
-      g_hash_table_insert (hash_table, &array[i], &array[i]);
-    }
-
-  if (g_hash_table_foreach_remove (hash_table, my_hash_callback_remove, NULL) != 5000 ||
-      g_hash_table_size (hash_table) != 5000)
-    g_print ("bad!\n");
-
-  g_hash_table_foreach (hash_table, my_hash_callback_remove_test, NULL);
-
-
-  g_hash_table_destroy (hash_table);
-
-  g_print ("ok\n");
-
-
-  g_print ("checking string chunks...");
-
-  string_chunk = g_string_chunk_new (1024);
-
-  for (i = 0; i < 100000; i ++)
-    {
-      tmp_string = g_string_chunk_insert (string_chunk, "hi pete");
-
-      if (strcmp ("hi pete", tmp_string) != 0)
-	g_error ("string chunks are broken.\n");
-    }
-
-  tmp_string_2 = g_string_chunk_insert_const (string_chunk, tmp_string);
-
-  g_assert (tmp_string_2 != tmp_string &&
-	    strcmp(tmp_string_2, tmp_string) == 0);
-
-  tmp_string = g_string_chunk_insert_const (string_chunk, tmp_string);
-
-  g_assert (tmp_string_2 == tmp_string);
-
-  g_string_chunk_free (string_chunk);
-
-  g_print ("ok\n");
-
-
-  g_print ("checking arrays...");
-
-  garray = g_array_new (FALSE, FALSE, sizeof (gint));
-  for (i = 0; i < 10000; i++)
-    g_array_append_val (garray, i);
-
-  for (i = 0; i < 10000; i++)
-    if (g_array_index (garray, gint, i) != i)
-      g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), i);
-
-  g_array_free (garray, TRUE);
-
-  garray = g_array_new (FALSE, FALSE, sizeof (gint));
-  for (i = 0; i < 100; i++)
-    g_array_prepend_val (garray, i);
-
-  for (i = 0; i < 100; i++)
-    if (g_array_index (garray, gint, i) != (100 - i - 1))
-      g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), 100 - i - 1);
-
-  g_array_free (garray, TRUE);
-
-  g_print ("ok\n");
-
-
-  g_print ("checking strings...");
-
-  string1 = g_string_new ("hi pete!");
-  string2 = g_string_new ("");
-
-  g_assert (strcmp ("hi pete!", string1->str) == 0);
-
-  for (i = 0; i < 10000; i++)
-    g_string_append_c (string1, 'a'+(i%26));
-
-#if !(defined (_MSC_VER) || defined (__LCC__))
-  /* MSVC and LCC use the same run-time C library, which doesn't like
-     the %10000.10000f format... */
-  g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%10000.10000f",
-		    "this pete guy sure is a wuss, like he's the number ",
-		    1,
-		    " wuss.  everyone agrees.\n",
-		    string1->str,
-		    10, 666, 15, 15, 666.666666666, 666.666666666);
-#else
-  g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%100.100f",
-		    "this pete guy sure is a wuss, like he's the number ",
-		    1,
-		    " wuss.  everyone agrees.\n",
-		    string1->str,
-		    10, 666, 15, 15, 666.666666666, 666.666666666);
-#endif
-
-  g_print ("string2 length = %d...\n", string2->len);
-  string2->str[70] = '\0';
-  g_print ("first 70 chars:\n%s\n", string2->str);
-  string2->str[141] = '\0';
-  g_print ("next 70 chars:\n%s\n", string2->str+71);
-  string2->str[212] = '\0';
-  g_print ("and next 70:\n%s\n", string2->str+142);
-  g_print ("last 70 chars:\n%s\n", string2->str+string2->len - 70);
-
-  g_print ("ok\n");
-
-  g_print ("checking timers...\n");
-
-  timer = g_timer_new ();
-  g_print ("  spinning for 3 seconds...\n");
-
-  g_timer_start (timer);
-  while (g_timer_elapsed (timer, NULL) < 3)
-    ;
-
-  g_timer_stop (timer);
-  g_timer_destroy (timer);
-
-  g_print ("ok\n");
-
-  g_print ("checking g_strcasecmp...");
-  g_assert (g_strcasecmp ("FroboZZ", "frobozz") == 0);
-  g_assert (g_strcasecmp ("frobozz", "frobozz") == 0);
-  g_assert (g_strcasecmp ("frobozz", "FROBOZZ") == 0);
-  g_assert (g_strcasecmp ("FROBOZZ", "froboz") != 0);
-  g_assert (g_strcasecmp ("", "") == 0);
-  g_assert (g_strcasecmp ("!#%&/()", "!#%&/()") == 0);
-  g_assert (g_strcasecmp ("a", "b") < 0);
-  g_assert (g_strcasecmp ("a", "B") < 0);
-  g_assert (g_strcasecmp ("A", "b") < 0);
-  g_assert (g_strcasecmp ("A", "B") < 0);
-  g_assert (g_strcasecmp ("b", "a") > 0);
-  g_assert (g_strcasecmp ("b", "A") > 0);
-  g_assert (g_strcasecmp ("B", "a") > 0);
-  g_assert (g_strcasecmp ("B", "A") > 0);
-
-  g_print ("ok\n");
-
-  g_print ("checking g_strdup...");
-  g_assert(g_strdup(NULL) == NULL);
-  string = g_strdup(GLIB_TEST_STRING);
-  g_assert(string != NULL);
-  g_assert(strcmp(string, GLIB_TEST_STRING) == 0);
-  g_free(string);
-
-  g_print ("ok\n");
-
-  g_print ("checking g_strconcat...");
-  string = g_strconcat(GLIB_TEST_STRING, NULL);
-  g_assert(string != NULL);
-  g_assert(strcmp(string, GLIB_TEST_STRING) == 0);
-  g_free(string);
-  string = g_strconcat(GLIB_TEST_STRING, GLIB_TEST_STRING, 
-  		       GLIB_TEST_STRING, NULL);
-  g_assert(string != NULL);
-  g_assert(strcmp(string, GLIB_TEST_STRING GLIB_TEST_STRING
-  			  GLIB_TEST_STRING) == 0);
-  g_free(string);
-  
-  g_print ("ok\n");
-
-  g_print ("checking g_strdup_printf...");
-  string = g_strdup_printf ("%05d %-5s", 21, "test");
-  g_assert (string != NULL);
-  g_assert (strcmp(string, "00021 test ") == 0);
-  g_free (string);
-
-  g_print ("ok\n");
-
-  /* g_debug (argv[0]); */
-
-  /* Relation tests */
-
-  g_print ("checking relations...");
-
-  relation = g_relation_new (2);
-
-  g_relation_index (relation, 0, g_int_hash, g_int_equal);
-  g_relation_index (relation, 1, g_int_hash, g_int_equal);
-
-  for (i = 0; i < 1024; i += 1)
-    data[i] = i;
-
-  for (i = 1; i < 1023; i += 1)
-    {
-      g_relation_insert (relation, data + i, data + i + 1);
-      g_relation_insert (relation, data + i, data + i - 1);
-    }
-
-  for (i = 2; i < 1022; i += 1)
-    {
-      g_assert (! g_relation_exists (relation, data + i, data + i));
-      g_assert (! g_relation_exists (relation, data + i, data + i + 2));
-      g_assert (! g_relation_exists (relation, data + i, data + i - 2));
-    }
-
-  for (i = 1; i < 1023; i += 1)
-    {
-      g_assert (g_relation_exists (relation, data + i, data + i + 1));
-      g_assert (g_relation_exists (relation, data + i, data + i - 1));
-    }
-
-  for (i = 2; i < 1022; i += 1)
-    {
-      g_assert (g_relation_count (relation, data + i, 0) == 2);
-      g_assert (g_relation_count (relation, data + i, 1) == 2);
-    }
-
-  g_assert (g_relation_count (relation, data, 0) == 0);
-
-  g_assert (g_relation_count (relation, data + 42, 0) == 2);
-  g_assert (g_relation_count (relation, data + 43, 1) == 2);
-  g_assert (g_relation_count (relation, data + 41, 1) == 2);
-  g_relation_delete (relation, data + 42, 0);
-  g_assert (g_relation_count (relation, data + 42, 0) == 0);
-  g_assert (g_relation_count (relation, data + 43, 1) == 1);
-  g_assert (g_relation_count (relation, data + 41, 1) == 1);
-
-  tuples = g_relation_select (relation, data + 200, 0);
-
-  g_assert (tuples->len == 2);
-
-#if 0
-  for (i = 0; i < tuples->len; i += 1)
-    {
-      printf ("%d %d\n",
-	      *(gint*) g_tuples_index (tuples, i, 0),
-	      *(gint*) g_tuples_index (tuples, i, 1));
-    }
-#endif
-
-  g_assert (g_relation_exists (relation, data + 300, data + 301));
-  g_relation_delete (relation, data + 300, 0);
-  g_assert (!g_relation_exists (relation, data + 300, data + 301));
-
-  g_tuples_destroy (tuples);
-
-  g_relation_destroy (relation);
-
-  relation = NULL;
-
-  g_print ("ok\n");
-
-  g_print ("checking pointer arrays...");
-
-  gparray = g_ptr_array_new ();
-  for (i = 0; i < 10000; i++)
-    g_ptr_array_add (gparray, GINT_TO_POINTER (i));
-
-  for (i = 0; i < 10000; i++)
-    if (g_ptr_array_index (gparray, i) != GINT_TO_POINTER (i))
-      g_print ("array fails: %p ( %p )\n", g_ptr_array_index (gparray, i), GINT_TO_POINTER (i));
-
-  g_ptr_array_free (gparray, TRUE);
-
-  g_print ("ok\n");
-
-
-  g_print ("checking byte arrays...");
-
-  gbarray = g_byte_array_new ();
-  for (i = 0; i < 10000; i++)
-    g_byte_array_append (gbarray, (guint8*) "abcd", 4);
-
-  for (i = 0; i < 10000; i++)
-    {
-      g_assert (gbarray->data[4*i] == 'a');
-      g_assert (gbarray->data[4*i+1] == 'b');
-      g_assert (gbarray->data[4*i+2] == 'c');
-      g_assert (gbarray->data[4*i+3] == 'd');
-    }
-
-  g_byte_array_free (gbarray, TRUE);
-  g_print ("ok\n");
-
-  g_printerr ("g_log tests:");
-  g_warning ("harmless warning with parameters: %d %s %#x", 42, "Boo", 12345);
-  g_message ("the next warning is a test:");
-  string = NULL;
-  g_print (string);
-
-  g_print ("checking endian macros (host is ");
-#if G_BYTE_ORDER == G_BIG_ENDIAN
-  g_print ("big endian)...");
-#else
-  g_print ("little endian)...");
-#endif
-  g_assert (GUINT16_SWAP_LE_BE (gu16t1) == gu16t2);  
-  g_assert (GUINT32_SWAP_LE_BE (gu32t1) == gu32t2);  
-#ifdef G_HAVE_GINT64
-  g_assert (GUINT64_SWAP_LE_BE (gu64t1) == gu64t2);  
-#endif
-  g_print ("ok\n");
-
-  return 0;
-}
-
