Wed Dec  9 22:44:44 EST 1998 Joel Becker <jlbec@ocala.cs.miami.edu>

	* Removed #define of G_COMPILED_WITH_DEBUGGING from glibconfig.h
	It shouldn't be there, and it was causing a double #define.
        (config.h defines it also)

Tue Dec  8 12:18:38 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.6

	* NEWS: updated

Mon Dec  7 23:10:41 PST 1998 Manish Singh <yosh@gimp.org>

	* gmain.c: fixes to #undef HAVE_POLL case

1998-12-02  Havoc Pennington  <hp@pobox.com>

	* gdate.c (g_date_set_month): If Julian is valid, we have to 
	update the dmy representation before setting the components
	of it.
	(g_date_set_day): Same.
	(g_date_set_year): Same.

1998-12-02  Havoc Pennington  <hp@pobox.com>

	* testgdate.c, testgdateparser.c: Two new files. This is kind of 
	ugly code, but I want to go ahead and make the tests available. 
	It isn't contaminating any other code. :-) Since one of these 
	is interactive and the other takes a while to run, I've kept 
	them separate from testglib for now.
	* Makefile.am: Build gdate test programs.
	
1998-12-02  Havoc Pennington  <hp@pobox.com>

	* gdate.c (g_date_valid): Rely on GDate::dmy and GDate::Julian
	flags, rather than re-checking the validity of the actual
	values. This should be the correct behavior, the old way was
	leftover cruft.

	* glib.h, gdate.c: Changed MDY to DMY throughout.

Sat Nov 28 12:53:47 1998  Owen Taylor  <otaylor@redhat.com>

	* Makefile.am configure.in acconfig.h giochannel.c
	  glib.h glist.c gmain.c gutils.c:

        - Revised GIOChannel to provide a generic virtual-function
  	  based interface.
	- Added unix fd-based GIOChannel's
	- Added generic main-loop abstraction
	- Added timeouts and idle functions using main-loop abstraction.

1998-12-02  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* glib.h: 
	* gdate.c: changed `gpointer struct_tm_p' parameter of
	g_date_to_struct_tm back to `struct tm *tm' and forward declared
	`struct tm' in glib.h; yes, this is nice, we still need not
	include time.h.

Tue Dec  1 23:01:44 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* INSTALL:
          NEWS:
	  README:
	  glib.spec:
	  docs/glib-config.1: Incremented versions to 1.1.6.
	
Wed Dec  2 02:10:59 1998  Tim Janik  <timj@gtk.org>

	* gdate.c: s/time_t/GTime/ and s/g_print/g_message/
	include time.h.

	* glib.h: removed #include <time.h>, changed time_t paramter of
 	g_date_set_time() to time_t, changed struct tm parameter of
	g_date_to_struct_tm to `gpointer struct_tm_p'. yes, this is not
	nice, but including time.h actually breaks a bunch of code.
	
	* incremented GLib version to 1.1.6.

1998-11-30  Havoc Pennington  <hp@pobox.com>

	* gdate.c: New file, implements calendrical calculations.
	
	* glib.h: Added declarations for GDate module.

Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* ghook.c: added g_hook_list_marshal_check() to eventually destroy
	hooks after they got marshalled.

Sun Nov 29 17:31:43 EST 1998  Jeff Garzik  <jgarzik@pobox.com>

	* configure.in, Makefile.am, gmodule/Makefile.am:
	Put -DFOO stuff into Makefile.am INCLUDES.

Sun Nov 29 14:17:09 PST 1998 Manish Singh <yosh@gimp.org>

	* configure.in: put debug -DFOO stuff into CPPFLAGS, not CFLAGS,
	so CFLAGS can be overridden at make time properly

Sat Nov 28 01:23:25 1998  Tim Janik  <timj@gtk.org>

	* ghash.c: implemented incremental freezing facility.

Thu Nov 26 01:36:20 1998  Tim Janik  <timj@gtk.org>

	* glib.h: 
	* ghash.c: reverted the g_hash_table_set_key_freefunc() addition,
	since it's to specialized and needs to be resolved in a generic
	fashion.

Tue Nov 24 18:57:59 PST 1998 Manish Singh <yosh@gimp.org>

	* applied glib-tml-981120-0, change log appended below.

	* glibconfig.h.win32: passthrough 64-bit constants unchanged, VC++
	infers them

Fri Nov 20 22:26:43 1998  Tor Lillqvist  <tml@iki.fi>

        * glib.h: Moved MSC pragmas from glib.h to glibconfig.h.win32.
        peer_offset field in WIN32 part of GIOChannel removed, need_wakeups
        added. Added "extern" to __declspec(dllimport).

        * gutils.c: Initialise need_wakeups.

        * glibconfig.h.win32: Pragmas moved here. Define G_GINT64_CONSTANT.

        * gmodule/gmodule.def: Added g_module_build_path.

        * gscanner.c: (g_scanner_cur_value) Move initailisation of v
        to before its use.

        * glib.def: Added g_(s)list_sort.

        * makefile.msc: A few more comments.

Tue Nov 24 14:05:47 EST 1998	Michael K. Johnson <johnsonm@redhat.com>

	* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
	prototype.
	* ghash.c: added g_hash_table_set_key_freefunc() implementation.
	Modified the prototypes of the functions g_hash_node_destroy() and 
	g_hash_nodes_destroy(), and changed the functions that call them
	to match the new definitions.
	This changes no external interfaces, and should create no binary
	or source incompatibilities.  It does add a member to the
	GHashTable structure.

Tue Nov 24 09:40:00 1998  Tim Janik  <timj@gtk.org>

	* glib.h: removed the GListAllocator type and its g_*_allocator_*()
 	function variants (which weren't working anyways) in favour of a
 	generic GAllocator type. new functions:
	g_allocator_new, g_allocator_free, g_slist_push_allocator,
	g_slist_pop_allocator, g_list_push_allocator, g_list_pop_allocator,
	g_node_push_allocator and g_node_pop_allocator.

	* gstring.c: removed bogus slist allocator code.
	* gtree.c: maintain own list of free tree nodes and don't waste
	GSLists for that, removed bogus slist allocator code.
	* glist.c: use GAllocators for node allocation.
	* gslist.c: use GAllocators for node allocation.
	* gnode.c: use GAllocators for node allocation.

	* gdataset.c: cleanups wrt automatic initialization.

Mon Nov 23 10:03:58 1998  Owen Taylor  <otaylor@gtk.org>

	* glib.h garray.[ch]: added g_array_insert_vals() to
	insert elements at an arbitrary index, and
	g_array_insert_val() macro.

Sun Nov 22 17:07:03 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gslist.c: new function g_slist_copy() to duplicate a list with all its
	data pointers.
	* glist.c: new function g_list_copy.

Sat Nov 21 14:57:39 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* INSTALL:
	  NEWS:
	  README:
	  configure.in:
	  glib.spec: Updated to version 1.1.5

	* Released GLib 1.1.5

Wed Nov 18 1998 Elliot Lee <sopwith@redhat.com>

	* gdataset.c: There was a code path into g_data_set_internal
	  through a function (g_datalist_id_set_full). Neither function
	  checked for g_dataset_init having been run, but
	  g_data_set_internal used the memchunk. I added
	  a check into g_data_set_internal so it will do the
	  initialization if needed. (There's probably a better way.)

Mon Nov 16 07:48:06 1998  Tim Janik  <timj@gtk.org>

	* glib.h (g_bit_nth_msf): fixed off-by-one error, so we don't waste
	a loop iteration if (-1) was passed, reported by Andreas Bombe
 	<andreas.bombe@munich.netsurf.de>.

Fri Nov 13 15:17:34 1998  Owen Taylor  <otaylor@redhat.com>

	* glist.c gslist.c glib.h: Added g_list_sort() and
	g_slist_sort() to merge sort GLists and GSLists.
	Submitted by Sven Over <sven.over@ob.kamp.net>
	over a year ago!

	* testglib.c: Test the new sort functions.

Wed Nov 11 23:23:22 EST 1998 Jeff Garzik <jgarzik@pobox.com>

	* Makefile.am : INCLUDES is the right way to add to CFLAGS, not
	DEFS.  Also there are bugs with '+=' in makefiles.
	Got rid of DEFS line by moving G_LOG_DOMAIN setting into INCLUDES.
	Removed redundant -I from INCLUDES.

Wed Nov 11 18:11:24 EST 1998 Gregory McLean <gregm@comstar.net>

	* docs/*.sgml : Batch of new documentation that should be easier
	to maintain and extend. Plus generate whatever sort of doc file
	you would like. I didn't change the Makefile stuff as I'm not sure
	what default doc type people want. Oh and this is all DocBook format.
	Enjoy!

Tue Nov 10 17:12:45 PST 1998 Manish Singh <yosh@gimp.org>

	* configure.in: use __extension__ for long long on gcc >= 2.8 and
	egcs, and provide a G_GINT64_CONSTANT wrapper so -ansi -pedantic
	compiles clean.

	* glib.h: make the endian x86 asm __const__ so the compiler can do
	better optimizations. Also remove the cc clobber, these shouldn't
	be changing condition codes. Ditch some redundant casts. Add an
	optimization for 64-bit endian conversions in x86. Use constant
	wrapper for the generic method.

	* testglib.c: use constant wrappers for 64-bit constants

1998-11-04  Phil Schwan  <pschwan@cmu.edu>

	* configure.in: Added 'strncasecmp' to the list of functions to be
	searched for.
	* glib.h: Added a prototype for 'g_strncasecmp'
	* gstrfuncs.c: (g_strncasecmp) new function modeled closely after
	'g_strcasecmp'

Wed Nov  4 15:06:44 PST 1998 Manish Singh <yosh@gimp.org>

	* config.h.win32 (new file)
	* glibconfig.h.win32
	* glib.def
	* makefile.msc: applied glib-tml-981104, win32 sync

1998-11-03  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* glib.h: 
	* garray.c:
	(g_array_remove_index): new function for removing an entry from an
	array while preserving the order
	(g_array_remove_index_fast): new function for removing an entry
	from an array. the order might be distorted
	(g_ptr_array_remove_index_fast, g_ptr_array_remove_fast): new
	functions; working similiar to the above. (they have the semantic
	of the old g_ptr_array_remove[_index] functions)
	(g_ptr_array_remove_index, g_ptr_array_remove): new semantic. now
	the order of the elements in the array is not changed
	(g_byte_array_remove_index, g_byte_array_remove_index_fast): new
	functions; byte_array wrapper for g_array_remove_index[_fast]

Sun Nov  1 23:00:18 PST 1998 Manish Singh <yosh@gimp.org>

	* glib.h
	* configure.in: endian macros defined using the glibconfig.h
	mechanism now

	* ghook.c: casts for GHookFunc and GHookCheckFunc to avoid warnings

Sat Oct 31 20:14:22 PST 1998 Manish Singh <yosh@gimp.org>

	* applied glib-tml-981101-1 patch from Tor Lillqvist (ChangeLog
	entry appended below)

	* testglib.c
	* gstrfuncs.c
	* glib.h: use G_HAVE_GINT64, since HAVE_GINT64 is gone

	* gmessages.c
	* gscanner.c: #include <config.h> in here too, for HAVE_UNISTD_H
 
1998-11-01 Tor Lillqvist <tml@iki.fi>

	* glib.def: Added the new functions.

	* gutils.c:
	(g_getenv): Better implementation on Win32. No loop necessary.
	(g_get_any_init): Use P_tmpdir if defined as tmp directory. Don't
	set home dir always to NULL on Win32.  Don't use tmp directory as
	last resort home directory, but return NULL if no home
	directory is known (application must check).

	* makefile.msc: Better touch command, just COPYing a single file
	sets the timestamp from that file, which isn't what touching should
	do.

1998-10-31  Raja R Harinath  <harinath@cs.umn.edu>

	Land glib-rrh-19981025-0.patch.
	* Makefile.am (glibconfig.h): New rule.  
	(stamp-gc-h): New rule.  Generate `glibconfig.h'.
	* configure.in (AM_CONFIG_HEADER): It is now `config.h'.
	(HAVE_BROKEN_WCTYPE): On Solaris, look for iswalnum in -lw before
	concluding "broken wctype".
	(glibconfig.h): Use AC_OUTPUT_COMMANDS to put generation code into
	config.status.
	* glib.h: Remove a lot of tests and defines.  All these have been
	moved to `configure.in (glibconfig.h)'.
	* gerror.c: Include <config.h>.
	* gmem.c: Likewise.
	* gstrfuncs.c: Likewise.
	* gutils.c: Likewise.
	
Sat Oct 31 05:08:26 1998  Tim Janik  <timj@gtk.org>

	* glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros.
	added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and
 	G_STRUCT_MEMBER() for handling structure fields through their offsets.
	(struct _GHookList): added a hook_free function member, that can be used
	to free additional fields in derived hook structures.
	g_hook_free(): if hook_list->hook_free != NULL, call this function prior
	to freeing the hook. (this functionality should have been there in the
	first place, it just got forgotten as an implementation detail).

Wed Oct 28 00:49:32 PST 1998 Manish Singh <yosh@gimp.org>

	* glib.h: G_BREAKPOINT for alpha from Robert Wilhelm
	<robert@physiol.med.tu-muenchen.de>

Tue Oct 27 07:25:53 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gscanner.c:
	(g_scanner_sync_file_offset): new function 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.
	(this became neccessary with the implementation of buffered
	reads).
	(g_scanner_input_file): 
	(g_scanner_input_text): automatically blow the read ahead buffer.
	(g_scanner_get_char): blow the read ahead buffer when the end of
	input is reached, i.e. a '\000' char is read.

Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>

	* glib.h: get rid of duplicate #g_htonl and friends in the
	NATIVE_WIN32 part

Mon Oct 26 22:42:01 PST 1998 Manish Singh <yosh@gimp.org>

	* glibconfig.h.win32
	* gutils.c
	* makefile.msc: win32 patch from Tor Lillqvist (glib-tml-981027-0),
	fixes some minor win32 buglets

Mon Oct 26 22:12:03 PST 1998 Manish Singh <yosh@gimp.org>

	* glib.h: reimplemented the endian stuff, using inline asm
	for x86. #define g_htonl and friends.

	* testglib.c: new tests for the endian stuff

	* configure.in: care for AIX in gmodule linker flags test (from
	Joel Becker <jlbec@raleigh.ibm.com>). Check $host_os for linux
	instead of existance of /usr/include/linux

	* gutils.c: buh-bye evil warning. Thou hast been #ifdef'd out
	of thine existance!

Tue Oct 27 03:00:50 1998  Tim Janik  <timj@gtk.org>

	* glib.h: removed dummy structure definitions for struct _GCache,
 	_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.

	* gutils.c: implement glib's inline functions _after_ all include
 	statements have been processed.
	removed Tor's MAXPATHLEN check since there already was one supplied
	further down in this file.
	(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
 	since lcc maybe used on other platforms as well. why in hell is this
	stuff required?
	(g_get_any_init): for windows, if the user name is supplied, use it as
	realname also.
	in general, if there is no homedir specified, use the tmpdir that
	we already figured.

	* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
 	g_return_if_fail().

	* applied glib-tml-981020-0.patch for WIN32 portability, added some
	comments and g_return_if_fail() statements, minor indentation fixes.
	ChangeLog entry from Tor Lillqvist is appended.

	* glib.h (struct dirent): use lower case structure members.

	* glib.h: 
	* makefile.lcc:
	* makefile.msc:
	s/COMPILING_GLIB/GLIB_COMPILATION/

1998-10-20: Tor Lillqvist <tml@iki.fi>

	* README.win32 glib.def gmodule.def
	* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
	New files for the Windows port. The .def files list exported
	symbols for the Microsoft linker and compatibles.

	* configure.in:
	Added checks for some platform-dependent headers: pwd.h sys/param.h
	sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.

	* gerror.c:
	Conditionalized inclusion of system-dependent headers. Changes
	for Windows: no gdb to do a stack trace. Just call abort().

	* glib.h:
	Changes for Windows:

	Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
	platform-dependent file name syntax elements. Added macros
	G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
	platform-dependent search path syntax conventions.

	Added pragmas for Microsoft C to make it more pedantic.

	Marked GLib's global variables for export from DLL.

	Added the function g_strescape that escapes backslashes.

	Added functions g_path_is_absolute and g_path_skip_root to
	handle platform-dependent file name syntax.

	Added the function g_getenv that expands environment variables
	that contain references to other environment variables, as is
	typical on Windows NT.

	Added the GIOChannel structure which is used to encapsulate the
	IPC mechanism used by the GIMP's plug-ins, and possibly other
	things later. On Unix a GIOChannel encapsulates just a file
	descriptor. On Windows it contains a file handle from _pipe() and a
	few other things related to the implementation of gdk_input_add
	and GIMP plug-in communication. Subject to change.

	Removed duplicate declarations of the version variables.

	For the Microsoft compiler, declare own implementation of
	ftruncate and the <dirent.h> functions.

	* gmem.c:
	Define a symbolic name  for the profiling table size.

	* gmessages.c:
	Conditionalized inclusion of unistd.h. On Windows, output using
	stdio to stdout.

	* gscanner.c:
	Conditionalized inclusion of unistd.h. Added changes for
	Microsoft C. Added CR to the skipped character set. Added small
	workaround for MSC compiler bug in g_scanner_cur_value.
	
	* gstrfuncs.c:
	Added the function g_strescape, which escapes the backslash
	character. Needed especially when printing Windows filenames.

	* gtimer.c:
	Conditionalized inclusion of unistd.h and sys/time.h. Added
	implementations for Windows.

	* gutils.c:
	Conditionalized inclusion of platform-dependent headers. Use
	the platform-independent file name syntax macros.
	Conditionalize code on platform-dependent features. Added the
	functions g_path_is_absolute g_path_skip_root and g_getenv.
	Added the GIOChannel-related functions. Added
	compiler-dependent Unix compatibility functions for Windows.

	* makefile.lcc makefile.msc:
	New files. Compiler-specific makefiles for LCC-Win32 and
	Microsoft C. Only Microsoft C is actually supported currently.
	
	* testglib.c:
	Added pathname check cases for Windows. Added workaround for
	bug in the Microsoft runtime library. Improved some tests a bit.
	
Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.4

	* docs/Makefile.am:
	* docs/.cvsignore
	* docs/glib-config.1: 
	* docs/glib.texi: Moved docs from gtk and created glib-config.1 
	from gtk-config.1 in gtk

	* configure.in:
	* Makefile.am:
	* sanity_check: added in docs directory, change rule 'release'
	to 'snapshot' and created a new 'release' rule for doing the
	distribution.  Added in a 'sanity' rule.

	* NEWS:
	* README: 
	* INSTALL: Updated for the release

Sun Oct 25 07:30:10 1998  Tim Janik  <timj@gtk.org>

	* gscanner.c:
	(g_scanner_peek_next_char): 
 	(g_scanner_get_char): no more characters are available if read() returns
 	anything less than 1, not only on 0 return.

	* glib.h: 
	* gstrfuncs.c: final API cleanup of string arrays to suit sopwith's
	argument order requirements.
 	(g_strsplit): renamed from g_str_array_split().
	(g_strjoinv): renamed from g_str_array_joinv(), string array is
	now passed as last parameter. removed `const' qualifier from string
	array pointer (again).
	(g_strjoin): new function from sopwith to concatenate strings with
	an additional seperator.
	(g_strfreev): renamed from g_str_array_free.

Sat Oct 24 22:23:04 PDT 1998 Manish Singh <yosh@gimp.org>

	* gnode.c: small fix to g_node_children_foreach to make it work right.
	From Paco Moya <paco@cadnotebk17.eecs.berkeley.edu>

Wed Oct 21 19:22:58 1998  Tim Janik  <timj@gtk.org>

	* configure.in (G_MODULE_HAVE_DLERROR): reverted part of the changes
 	from Sebastian Wilhelmi (1998-10-20). don't specify a specific loading
	behaviour (i.e. RTLD_NOW) when we are not sure whether it is supplied.
	changed the return value from (!f2 && f1) to (!f2 || f1) so we default
	to not needing an underscore. reverted the extra plugin.c building,
	because .lo files are not ELF libraries, this can't work. This needs
	further investigation on Solaris...

Wed Oct 21 17:03:05 1998  Tim Janik  <timj@gtk.org>

	* glib.h: 
	* gstrfuncs.c: API cleanups of the new g_str* functions for consistency
 	with the existing naming scheme for g_str* functions. grouped the g_str*
	functions that will return a newly allocated string seperatedly. all of
	the in_place arguments were skipped, the caller is supposed to pass a
	g_strdup()ed string if he wants to retrive a new copy. indentation and
	coding style fixups. added some g_return_if_fail() statements.
	string array functions are prefixed with g_str_array_.
	(g_strdelimit): return the modified string like all other g_str*
 	functions, that operate in place.
	(g_strchug): renamed from g_str_chug(), removed in_place argument.
	(g_strchomp): renamed from g_str_chomp(), removed in_place argument.
	(g_strstrip): renamed from g_str_strip(), removed in_place argument.
	(g_str_array_join): renamed from g_strconcatv(), since it actually
 	operates on a string array and has totaly different semantics from
	g_strconcat(). check for separator != NULL, don't segfault if the first
 	string is NULL. removed the `const' from the string array that's passed,
	so users can operate on gchar** string arrays.
	(g_str_array_split): renamed from g_str_split() because we actually
 	produce a string array. reimplemented this function for efficiency.
	removed macro aliases g_str_joinv and g_str_join.

1998-10-20  Elliot Lee  <sopwith@redhat.com>

	* glib.h, gstrfuncs.c: Move string join/split/free routines from
 	libgnome/gnome-string, rename, and add g_str_chug.

1998-10-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in: made the check for needed _ in module's func-names
	work on solaris. (G_MODULE_NEED_USCORE must be set outside
	AC_CACHE_VAL, dlopen(0,0) refused to work on solaris).

Tue Oct 20 03:32:58 PDT 1998 Manish Singh <yosh@gimp.org>

	* configure.in
	* acconfig.h: added test for endianness

	* glib.h: #define endian macros for system and some conversions
	between byte order

Thu Oct  8 06:47:27 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gdataset.c: removed functions g_dataset_id_set_destroy and
	g_datalist_id_set_destroy and macros g_dataset_set_destroy and
	g_datalist_set_destroy.
	added new functions g_dataset_id_remove_no_notify and
	g_datalist_id_remove_no_notify plus associated macros
	g_dataset_remove_no_notify and g_datalist_remove_no_notify, which
 	will remove a certain data portion without invokation of its destroy
 	notifier, this should only be used in very controled circumstances.

Wed Oct  7 05:31:24 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	removed the #pragma } statement after extern "C" {. use
 	(c-set-offset 'inextern-lang 0) to fixup emacs cc-mode indentation.

	* glib.h:
	* ghook.c: API and code cleanups. changed the G_HOOK_ACTIVE and
 	G_HOOK_IN_CALL enum vals to G_HOOK_FLAG_ACTIVE and G_HOOK_FLAG_IN_CALL.
	changed the G_HOOK_IS_ACTIVE() and G_HOOK_IS_IN_CALL() macros to
	G_HOOK_ACTIVE() and G_HOOK_IN_CALL().
	fixed the g_hook_find* functions, so they iterate over non-active
	hooks as well.
	(g_hook_first_valid):
	(g_hook_next_valid): added an extra argument gboolean may_be_in_call,
	which indicates whether G_HOOK_IN_CALL() hooks are considered valid
	or not. these two functions are meant as iterators for the hook list
	invocation, so they need to a) provide functionality to implement
	may_recurse bahaviour and b) only walk active hooks.

Tue Oct  6 14:29:47 1998  Tim Janik  <timj@gtk.org>

	* gmem.c (g_malloc0): fixed memory offsett when ENABLE_MEM_CHECK is
	defined and ENABLE_MEM_PROFILE is not (patch from Martin Pool
 	<mbp@wistful.humbug.org.au>).

Sat Oct  3 01:18:10 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* ghook.c:
	(g_hook_list_invoke):
	(g_hook_list_invoke):
	(g_hook_list_marshal): properly handle the first valid hook to call,
	it maybe IN_CALL already.
	(g_hook_list_marshal): minor name change.

Fri Oct  2 23:21:21 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* ghook.c: renamed GHook.id to GHook.hook_id so we don't get troubles
	with ObjC which reserves "id" as a keyword (Raja R Harinath
 	<harinath@cs.umn.edu>).

Wed Sep 30 10:53:03 1998  Tim Janik  <timj@gtk.org>

	* Makefile.am: added ghook.c.

	* glib.h:
 	* ghook.c: generic callback maintenance functions.

	* glib.h: define G_GNUC_UNUSED.

Fri Sep 25 00:04:37 1998  Tim Janik  <timj@gtk.org>

	* configure.in: version bump to 1.1.4, binary age 0, interface age 0.

	* glib.h (struct _GScanner): dumped peeked_char and text_len in favour
 	of *text_end and *buffer for buffered read()s.

	* gscanner.c: changed peeking and retrival of next character so we
	have buffered reads. fixed minor bug with number parsing error
	reporting. made some static!!! variables local ones (why did we use
 	static temporary variables in the lowlevel tokenization code anyways?).

Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.3

Mon Sep 21 07:43:13 1998  Tim Janik  <timj@gtk.org>

	* glib.h: added g_renew() which works as g_new() for g_realloc().

Mon Sep 21 02:22:12 1998  Tim Janik  <timj@gtk.org>

	* NEWS file update for upcoming release of GLib + GModule
	version 1.1.3, binary age 0, interface age 0. (GModule uses
	the same version numbers as GLib.)

	* glib.h: swap the inclusion of of float.h and limits.h to work
	around a egcs 1.1 oddity on Solaris 2.5.1 (fix provided by
	Per Abrahamsen  <abraham@dina.kvl.dk>).

	* glib.h:
	* gscanner.c: renamed the GValue union to GTokenValue, this should
	not affect source compatibility in most cases.

	* ghash.c: added some g_return_if_fail() statements. make
 	g_hash_table_lookup_node() an inline function so we save an extra
	function invokation on lookups.

Sun Sep 20 18:21:46 1998  Owen Taylor  <otaylor@redhat.com>

	* ltmain.sh: Patch to libtool-1.2b to make --disable-static
	work.

Sun Sep 20 02:09:44 1998  Josh MacDonald  <jmacd@axis.hip.berkeley.edu>

	* glib.h: New function g_hash_table_foreach_remove is similar to
 	g_hash_table_foreach, but the callback's return value indicates
 	whether to remove the element (if TRUE) or not (if FALSE).  
	Returns the number of elements deleted.

Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>

	* glib.h
	* gstrfuncs.c: added g_memdup implementation

Fri Sep 18 18:46:14 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gdataset.c: make the datalists a safe type (not using a generic
	gpointer) by expecting a GData* argument in the g_datalist functions.
	provide g_dataset_foreach() and g_datalist_foreach() functions that
 	allow a GDataForeachFunc function to walk the data lists.
	(g_dataset_destroy_internal): made this function truely reentrant (i.e.
	can be called from within destroy notifiers as well).
	the *_foreach functions are _not_ reentrant (unless all the other
	dataset and datalist functions).

Fri Sep 18 03:41:20 1998  Tim Janik  <timj@gtk.org>

	* gtree.c (g_tree_new): check for key_compare_func != NULL (reported
	by Michal Kara).

Thu Sep 17 18:55:46 PDT 1998 Manish Singh <yosh@gimp.org>

	* config.h.in: removed from repository

	* install-sh
	* missing
	* mkinstalldirs: updated to latest automake version

Thu Sep 17 06:36:25 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gdataset.c: implemented g_datalist_* along the lines of g_dataset,
	but operates on an opaque gpointer *datalist; pointer, e.g. for the
	implementation of GtkObject named data.
	we cache a certain portion of the already freed data entries now, to
 	gain a slight performance improve with data reallocation.

Tue Sep 15 14:57:30 1998  Owen Taylor  <otaylor@redhat.com>

	* Makefile.am glib-config.in l*: Update to libtool-1.2b,
	change library versioning scheme to drop LT_RELEASE
	from the -l line, while keeping it in the soname.

Fri Sep 11 02:11:46 1998  Tim Janik  <timj@gtk.org>

	* glib.h: explicitely include the prototypes for inline functions
	to cure gcc warnings for -Wmissing-prototypes.

Wed Sep  9 02:52:04 PDT 1998 Manish Singh <yosh@gimp.org>

	* configure.in: added -posix check for NeXTStep

Tue Sep  8 05:04:06 1998  Tim Janik  <timj@gtk.org>

	* glib.h: abandon the use of ATEXIT(), we keep the fallback
	macros for backwards compatibility. people ought to use g_atexit().

	* gutils.c (g_atexit): new function to take over the implementation
	of ATEXIT. this function is guarranteed to succeed, similar to
	g_malloc().

Mon Sep  7 20:07:38 PDT 1998 Manish Singh <yosh@gimp.org>

	* configure.in: comment the -std1 check and save LIBS properly

Mon Sep  7 07:53:21 1998  Tim Janik  <timj@gtk.org>

	* configure.in: check for all three inline keywords individually.

	* glib.h: 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 inlinig 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.

	* ltconfig: (compiler PIC flag test): special case linux for non
	aout systems to honour lcc's position independant code (cases
	"linux*aout)" and "linux*)" got added). (this needs to go into
	libtool which does an advanced test, checking for __LCC__).

	* autogen.sh: take $CC=lcc into account by invoking automake with
	--include-deps so lcc isn't scared by gcc's auto-dependancy
	generation code. care about $ACLOCAL_FLAGS. optionally feature
	autoheader.

	* minor fixups in other places to cure some of lcc's warnings.

Sun Sep  6 19:08:53 PDT 1998 Manish Singh <yosh@gimp.org>

	* configure.in: added -std1 check for ANSI compliance (from gtk)

Sun Sep  6 12:31:50 PDT 1998 Manish Singh <yosh@gimp.org>

	* glib.h: provide proper ATEXIT behavior on NeXTStep by !atexit

Sat Sep  5 18:03:36 1998  Tom Tromey  <tromey@cygnus.com>

	* gutils.c (GLIB_INLINE): Define.
	* glib.h (GLIB_INLINE): New define.
	(g_bit_nth_msf): Use it.  Also, add prototype.
	(g_bit_storage): Likewise.
	(g_bit_storage): Likewise.

Sat Sep  5 04:40:02 1998  Tim Janik  <timj@gtk.org>

	* glib.h: 
	(g_chunk_new0): use g_mem_chunk_alloc0() to allocate the memchunk,
	so the correct size of the memchunk is allocated with 0's and not
	a memory portion of the size of the desired type.

	* gmem.c: new function g_mem_chunk_alloc0() which will initialize
	a memory area allocated with g_mem_chunk_alloc() with 0's.

Wed Sep  2 19:13:28 1998  Owen Taylor  <otaylor@redhat.com>

	* garray.c glib.h (g_array_[ap/pre]pend_vals): make
	data argument const.

Wed Aug 26 06:32:40 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gstrfuncs.c: new function g_strnfill() to return a new string
	of specified length, filled with a specific character.

Tue Sep  1 23:46:31 1998  Josh MacDonald  <jmacd@axis.hip.berkeley.edu>

	* testglib.c (main): Update the array tests.  Reduce the number of
	iterations for the prepend test from 10000 to 100 since it is
	O(n^2) and was taking longer than I would like to wait.

	* garray.c: I've worked on the GArray interface, mostly.  It was
 	seriously broken before and I hate to do it, but this is going to
 	break some code.  It is important to do this now, because more and
 	more people are starting to use glib and the interface was both
 	broken and inconsistent.  First, rename the _truncate functions of
 	both the GArray and GPtrArray classes to _set_size, since this
 	function can also be used to extend the arrays.  GArray now
 	accepts two more initialization arguments: clear and element_size.
  	Instead of providing the type to each access function, the array
 	now stores the element size.  Clear, if set, causes the library to
 	zero element's memory as the array expands.  The major broken-ness
 	here was that array->len was in bytes, not elements.  Now, since
 	the array knows its element size, array->len is correct and I have
 	removed the g_array_length macro.  The only macro which now
 	accepts the type as an argument is g_array_index, which casts the
 	element to the right type--this interface does not change.  The
 	append and prepend functions simply need the types removed.
  	g_ptr_array_remove_index now returns the removed element.

	* gprimes.c (g_spaced_primes_closest): Move this function out of
 	ghash.c and rename it from g_hash_closest_prime.  Fix the primes
 	so that they are actually prime (they weren't all -- isn't that
 	nice?).

Mon Aug 24 02:08:56 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
 	* gstring.c:
	* gstrfuncs.c:
 	(g_vsprintf): removed this function which was not publically
	exported in glib.h. to export it, it should have been named
 	differently in the first place, since its semantics differ from
 	vsprintf(). apart from that, it was a possible cause for
	problems since it worked on a previously allocated memory area and
	was used in a lot places of glib. exporting it would have been a
	guararant for problems with threaded programs.
	(g_printf_string_upper_bound): exported this function to return
	a string size, guarranteed to be big enough to hold the fully
 	expanded format+args string. added 'q', 'L' and 'll' flag handling.
 	in fact, the newly allocated area is in most cases much bigger than
 	required.
	(g_strdup_vprintf()): new function returning a newly allocated string
 	containing the contents of *format and associated args (size is
	calculated with g_printf_string_upper_bound()).
	(g_strdup_printf): new function which wraps g_strdup_vprintf().

	* configure.in: check for va_copy() or __va_copy() alternatively.
	check whether va_lists can be copyied by value.

	* glib.h: provide a definition for G_VA_COPY.

	* glib.h:
	* gmessages.c:
 	(g_logv):
	(g_vsnprintf):
	pass va_lists by value, not by reference, since this causes problems
	on platforms that implement va_list as as arrays. internaly, use
	G_VA_COPY (new_arg, org_arg); va_end (new_arg); to produce a second
	va_list variable, if multiple passes are required. changed all
	callers.

	* glib.h:
	* gerror.h:
	renamed g_debug() to g_on_error_query(), cleaned up a bit.
	renamed g_stack_trace() to g_on_error_stack_trace() since both
	functions cluttered different namespaces.
	there is an appropriate comment in glib.h now that explains the
	unix and gdb specific dependencies of both functions.
	removed g_attach_process().
	g_on_error_stack_trace() should probably be handled with caution,
	i've seem several different linux versions (2.0.x) become unstable
	after invokation of this function.

1998-08-18: Elliot Lee <sopwith@redhat.com>

	* In gmem.c, add the ability to exclude memory chunks from the
 	  memory profiling information.

Tue Aug 18 18:23:09 PDT 1998 Manish Singh <yosh@gimp.org>

	* glib.h
	* gstrfuncs.c: added g_strndup

Tue Aug 18 04:40:17 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gmessages.c: new function g_log_set_always_fatal() to set an
	additional fatal_mask for log levels that are considered to be fatal
	globally (required by gtk). since this mask is not domain-associated,
	it is restricted to the log levels, introduced by glib itself.

	* gmem.c:
	* grel.c:
	* gtree.c (g_tree_node_check):
	don't use g_print() calls for informational/debugging output,
	but log all this stuff through g_log() with G_LOG_LEVEL_INFO.
	libraries shouldn't use printf(), g_print() or g_printerr() at all.

Tue Aug 18 02:46:44 1998  Tim Janik  <timj@gtk.org>


	* glib.h (__STRICT_ANSI__): if __STRICT_ANSI__ is defined, make
	`inline' a noop, since strict ANSI rules don't permit `inline'.

Mon Aug 17 15:21:42 1998  Tim Janik  <timj@gtk.org>

	* grel.c: made private functions static.

Sun Aug 16 23:23:46 CDT 1998 Shawn T. Amundson <amundson@gtk.org>

	* gmodule/Makefile.am: added gmodule-dl.c and gmodule-dld.c to
	  EXTRA_DIST
	* glib.spec: version = 1.1.3

Mon Aug 17 01:46:14 1998  Tim Janik  <timj@gtk.org>

	* glib.m4: feature an extra MODULES parameter, so glib-config can
	be invoked with the "gmodule" argument.

	* glib.h: changed the log level to G_LOG_LEVEL_CRITICAL for all
 	g_return*_if_fail statements, and made them issue a message
	like "assertion `%s' failed".

	* gmessages.c (g_logv): ugh, don't pass log_domain as NULL to
 	g_log_find_domain.

Sun Aug 16 20:28:27 1998  Tim Janik  <timj@gtk.org>

        * version bump to 1.1.3, binary age 0, interface age 0.

	* glib.h: be nice to platforms that don't have gint64 and don't
	issue #warning on every compilation. since glib doesn't require
	gint64 itself, packages that need gint64 should test for this
 	themselves.

	* glib.h:
	* gutils.c: added a new function g_vsnprintf().

Sun Aug 16 Elliot Lee

	glib.h: #error out if we don't recognize the SIZEOF_VOID_P
	        #warning if no gint64

Fri Aug 14 16:41:53 1998  Tim Janik  <timj@gtk.org>

	* glib.h: added static inline functions for bit mask tests:
	g_bit_nth_lsf, g_bit_nth_msf and g_bit_storage.

Fri Aug 13 14:23:37 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gmessages.c:
	revised the message handling system, which is now based on a new
 	mechanism g_log*. most of the assertment macros got adapted to
	feature the new g_log() call with an additional specification of
	the log level in a preprocessor macro G_LOG_DOMAIN. if G_LOG_DOMAIN
	is undefined upon the includion of glib.h, it'll be defined with a
	value of (NULL) and thus preserves the original bahaviour for
	warning and error messages. the message handler setting functions
	for g_warning, g_error and g_message are only provided for backwards
	compatibility and might get removed somewhen.

	* Makefile.am: feature the G_LOG_DOMAIN macro to set the log domain
	to "GLib" upon compilation. we currently have to add this definition
	to the DEFS variable.
	* testglib.c: we need an ugly #undef G_LOG_DOMAIN at the start
	of this file currently, since automake doesn't support per target
	_CFLAGS yet.

	* glib.h: changed some gints to gbooleans, made a few const corrections,
	removed some superfluous G_STMT_START{}G_STMT_END wrappers, added some
	in other required places.

	* gnode.c:
 	(g_node_prepend):
	(g_node_insert_before):
	(g_node_insert):
	(g_node_append_data):
	(g_node_prepend_data):
	(g_node_insert_data_before):
	(g_node_insert_data):
	(g_node_append):
	return (node), so these macros/functions can be usefully chained with
	g_node_new().

Mon Aug 10 17:56:11 PDT 1998 Manish Singh <yosh@gimp.org>

	* glib.h: it's GTime now, and it's back!

Mon Aug 10 02:17:19 1998  Tim Janik  <timj@gtk.org>

	* Makefile.am: minor hack to cause SUBDIRS (gmodule) to be build
	last. we do this by making all-recursive-am depend on all-am.

Sun Aug  9 15:56:11 1998  Tim Janik  <timj@gtk.org>

	* configure.in: added GModule checks. generate files in gmodule/.
	* glib-config.in: support library specifications `glib' and `gmodule'.
	* Makefile.am: feature the gmodule/ subdir.

Wed Aug  5 10:04:29 PDT 1998 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.2

Wed Aug 05 01:15:36 1998  George Lebl  <jirka@5z.com>

	* testglib.c: fix 64-bitness in g_prints, sizeof doesn't
	  seem to return int so I cast it for printing, probably
	  just cosmetic

Tue Aug  4 19:54:06 PDT 1998 Shawn T. Amundson <amundson@gkt.org>

	* Released GLib 1.1.1

Tue Aug  4 15:17:54 1998  Tim Janik  <timj@gtk.org>

	* configure.in: version bump to 1.1.1, binary age 1, interface age 0.
	* NEWS: updates.
	* README: updates.
	* INSTALL: updates and fixes.
	* COPYING: include the GNU LGPL, rather than shipping an empty file.
	* AUTHORS: listed original authors here, and added people who made
	significant improvements to glib.

	* glib.h:
	* gutils.c: implement g_get_current_dir() which returns a newly
	allocated string, instead of a g_getcwd() variant that operates
	on a static buffer.
	export glib_interface_age and glib_binary_age.
	as a convenience, macro definitions have been added for
 	g_node_insert_data, g_node_insert_data_before, g_node_append_data and
	g_node_prepend_data.

	* testglib.c: minor cleanups, print current dir.

Mon Aug  3 16:02:26 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gnode.c: change order of gpointer data; field in struct _GNode to
	be partly binary compatible with GList and GSList.

1998-08-03  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* garray.c (g_ptr_array_remove_index): bugfix: index check for
	array has been wrong.

Fri Jul 31 22:17:05 1998  Tim Janik  <timj@gtk.org>

	* testglib.c (g_node_test): added a GNode test.

Fri Jul 31 09:08:16 1998  Tim Janik  <timj@gtk.org>

	* Makefile.am: compile gnode.c.

	* glib.h:
	* gnode.c: added implementation of n-way trees.

	* gtree.c (g_tree_traverse): added a warning to the switch() statement
	which says that G_LEVEL_ORDER is not implemented.

Mon Jul 27 00:17:30 CDT 1998 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.0

Mon Jul 27 01:02:27 1998  Tim Janik  <timj@gtk.org>

	* glib.h: #if 0'ed out the GTime definition, until it is definitively
 	needed. #if 0'ed out the g_getcwd() version, because it is the wrong
 	implementation.

Sat Jul 25 16:09:00 1998  Mark Crichton <crichton@expert.cc.purdue.edu>

	* glib.h: gtime changed to g_time.  gtime is used in
	/usr/include/time.h in NetBSD, causing multiple headaches.
	If this isn't the right way of fixing it.... ;)

Thu Jul 23 00:29:14 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gscanner.c: new functions to make a scanner scope sensitive wrt
 	symbol lookups.
	g_scanner_scope_foreach_symbol, g_scanner_scope_lookup_symbol,
	g_scanner_scope_remove_symbol, g_scanner_scope_add_symbol and
	g_scanner_set_scope.
	g_scanner_add_symbol, g_scanner_remove_symbol and
 	g_scanner_foreach_symbol are now aliases for scope 0.

Mon Jul 20 23:05:34 1998  George Lebl  <jirka@5z.com>

	* glib.h: typo fixed for alphas for gint64

Tue Jul 14 09:05:18 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gutils.c: new fuction g_dirname() which returns a newlly
	allocated string.

Fri Jul 10 06:33:43 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gutils.h: added a bunch of utility/wrapper functions:
	g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(),
	g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname().

	* gutils.c: removed all g_str* functions.
	* gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this
	place. this file shall never include <unistd.h> to avoid clashes for
	some of the g_str* functions on some OSes.

Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko <nether@gimp.org>

	* glib.h:
	* ghash.c: Renamed g_hash_table_lookup_full to
	g_hash_table_lookup_extended to conform with naming conventions.

Tue Jul  7 03:18:58 EEST 1998 Lauri Alanko <nether@gimp.org>

	* glib.h:
	* ghash.c: Generic cleanup, added a function:
	(g_hash_table_lookup_full): Return whether the lookup succeeded,
	and also retrieve the key and value. This allows one to
	distinguish between failed lookup and finding a NULL, and also
	allows one to free a key in the hash.

Mon Jul  6 10:12:05 PDT 1998 Manish Singh <yosh@gimp.org>

	* ltconfig: fix for properly detecting shared lib support on
	SunPro cc (taken from libtool 1.2.a)

Sat Jul  4 13:38:52 PDT 1998 Manish Singh <yosh@gimp.org>

	* glib.h: added g_array_length

Tue Jun 30 11:58:25 1998  Tim Janik  <timj@gtk.org>

	* gscanner.c (g_scanner_unexp_token): take symbol_2_token into
	account. react on valid/invalid string pairs.

Sat Jun 27 21:55:46 PDT 1998 Manish Singh <yosh@gimp.org>

	* glib.m4: ftp.glib.org -> ftp.gtk.org, since glib.org isn't
	ours. ;)

Fri Jun 19 03:11:02 1998  Tim Janik  <timj@gtk.org>

	* gdataset.c: removed g_dataset_try_key, g_dataset_force_id and
 	g_dataset_retrive_key in favour of GQuarks.
	a GQuark is an numeric id wich is associated with a certain string.
	(g_quark_try_string): try to get the quark associated with this string,
 	if the lookup failed return 0.
	(g_quark_from_string): get the associated quark for a string, if there
 	isn't currently a GQuark associated with this string, then allocate a
 	new quark and return that.
	(g_quark_from_static_string): like the above function, but the string
 	isn't strdup()ed to save memory.
	(g_quark_to_string): get the string that is associated with a certain
	GQuark.

	* gdataset.c (g_dataset_id_set_data_full): invoke the destroy function
	_after_ the new data has been setup.

Thu Jun 18 02:35:21 1998  Owen Taylor  <otaylor@gtk.org>

	* glib.h: Changed messages for g_return_[val]_if_fail to
	be somewhat more clear: assertion "blah" failed.

1998-06-18  Federico Mena Quintero  <federico@nuclecu.unam.mx>

	* testglib.c (main): Use GINT_TO_POINTER casts to remove compiler
	warnings.

	* grel.c: #include <string.h>

Fri Jun 12 15:39:06 1998  Tim Janik  <timj@gtk.org>

	* glib.h (GScanner): cleanups of the structure fields (binary
	incompatible).

Fri Jun 12 00:39:28 1998  Josh MacDonald  <jmacd@icw.EECS.Berkeley.EDU>

	* glib.h: add new hash and equal functions g_int_*.  complement
	g_direct_hash with g_direct_equal.

	* grel.c: new file, GRelations implement tuples of N-N mappings.
	A comment in glib.h briefly describes the interface.

	* ghash.c: new function, g_hash_table_size

	* glib.h: new typedefs, gsize, gssize, gtime.

	* garray.c: new functions implementing a simplified GArray.  This
	GPtrArray is an array of gpointers and has functions to add and
	remove elements, much like java.lang.Vector.

	* garray.c: new functions for the single-byte special case of
	GArray.  The functions g_byte_array* operate on arrays of bytes.
	Internally, a GArray is used.

	* testglib.c: tests for g_ptr_array, g_byte_array, and g_relation...

1998-06-11  Federico Mena Quintero  <federico@nuclecu.unam.mx>

	* gdataset.c: #include <string.h>

Thu Jun 11 04:15:31 1998  Tim Janik  <timj@gtk.org>

        * glib.h:
        * gdataset.c: new function g_dataset_retrive_key. adjusted prealloc
        sizes, to take up less space on initial allocation.

1998-06-10  Raja R Harinath  <harinath@cs.umn.edu>

	* acinclude.m4: New file.  Contains `libtool.m4' from libtool-1.2,
	the version from which glib's libtool forked.  Needed for people
	who use post-1.2 alphas of libtool.
	* configure.in (enable_mem_check, enable_mem_profile): Replace
	`echo -n' with AC_MSG_CHECKING.
	(fd_set): Explain test for `fd_set' better.

Wed Jun 10 19:29:51 1998  Owen Taylor  <otaylor@gtk.org>

	* Makefile.am glib.m4 configure.in:

	Moved out from GTK+; added AM_PATH_GLIB macro.

Wed Jun 10 12:56:07 1998  Owen Taylor  <otaylor@gtk.org>

	* glib.h: renamed g_const_pointer => gconstpointer

Tue Jun  9 17:47:33 1998  Owen Taylor  <otaylor@gtk.org>

	* glib.h: Remove #error - HP/UX.

Sat May 23 19:00:01 1998  Owen Taylor  <otaylor@gtk.org>
  [ Combination of:
     gtk-rrh-980412-0.patch (Raja R Harinath <harinath@cs.umn.edu>)
     gtk-jbuhler-980516-0 (Jeremy Buhler <jbuhler@cs.washington.edu>) ]

	* glib.h ghash.c gstring.c gdataset.c gutils.c:
	- Added new typedef g_const_pointer; expunged all incorrect
	  uses of 'const gpointer'.
	- Fixed up warnings that that created,
	- Changed GHashFunc and GCompareFunc to take g_const_pointer
	  arguments. (Necessary, but will cause warnings in existing
	  code until fixed)
	- Added other new const in harmless positions.

Mon Jun  8 01:06:47 1998  Tim Janik  <timj@gtk.org>

	* glib.h: added enum-helper macros for code generation.
	added G_BREAKPOINT().

Sat Jun  6 14:09:22 PDT 1998 Manish Singh <yosh@gimp.org>

	* gmem.c: commented out MEM_PROFILE and MEM_CHECK, causing weird
	problems

Wed Jun  3 06:19:42 1998  Tim Janik  <timj@gtk.org>

	* glib.h (g_chunk_new0): convenience macro, for allocating small chunks
	like g_chunk_new() with additional 0 initialization.

Mon Jun  1 04:43:27 1998  Tim Janik  <timj@gtk.org>

	* ghash.c (g_hash_table_insert): wrote a comment describing why
	a hash node's key should not also get replaced when overriding
 	previous entries.

Tue May 26 18:30:06 1998  Tim Janik  <timj@gtk.org>

	* glib.h (g_string_sized_new): new function to controll the preallocated
	size of a GString.

	* glib.h (g_strreversed): new function to reverse a string.

Mon May 18 22:14:39 1998  Owen Taylor  <otaylor@gtk.org>
(Yasuhiro SHIRASAKI <joke@awa.tohoku.ac.jp> : gtk-joke-980517-0.patch)

	* gutils.c: Restored a missing prototype for g_vsprintf.

Wed May 20 05:02:26 1998  Tim Janik  <timj@gtk.org>

        * glib.h: conditionally define NULL, FALSE and TRUE.
        (g_mem_chunk_create): new convenience macro as a short hand for
        g_mem_chunk_new().
        (g_chunk_free): new convenience macro to be consistent with g_chunk_new.

Tue, 19 May 1998 09:00:02 +0200  Paolo Molaro <lupus@debian.org>

	* gcompletion.c: generic functions for com<TAB>pletion...

Sun May 17 10:48:27 1998  Tim Janik  <timj@gtk.org>

	* gscanner.c (g_scanner_unexp_token): provide usefull default
 	specifications for identifier_spec and symbol_spec.

	* glib.h: new functions g_slist_nth_data and g_list_nth_data to return
 	the data of the nth element in the list.

Fri May 15 22:31:49 1998  Tim Janik  <timj@gtk.org>

	* gscanner.c (g_scanner_unexp_token): removed spurious va_end(args)
 	that for some reason didn't produce a compiler warning on my machine
 	(is va_end defined to nothing for i386?).

Fri May 15 12:32:08 1998  rodo  <doulik@karlin.mff.cuni.cz>

	* gscanner.c: replaced some snprintf with g_snprintf

Fri May 15 00:56:59 1998  Tim Janik  <timj@gtk.org>

	* glib.h: further support for gcc function attributes: G_GNUC_FORMAT,
	G_GNUC_NORETURN and G_GNUC_CONST.

	* gscanner.c (g_scanner_stat_mode): changed stat() to lstat().
	(g_scanner_msg_handler): "\n" at end of line!
	(g_scanner_foreach_symbol): new function to iterate over the symbol
 	table (GScanner does value-wrapping).

Thu May 14 04:14:12 1998  Tim Janik  <timj@gtk.org>

	* glib.h: typedef gint gboolean;
	this is needed to provide portability with big-endian platforms (e.g.
	try sizeof(bool) for c++ on big-endians - it's 4).
	this is also needed to maintain some_union.d_gint==some_union.d_gboolean.
 	plus, gint to gboolean casts and vice versa need to be possible without
 	loss.

Tue May 12 19:22:58 1998  Owen Taylor  <otaylor@gtk.org>

 	* glib/glib.h: Added macros G[U]INT_TO_POINTER() and
	GPOINTER_TO_[U]INT for storing small integers integers
	inside pointers.

	* glib/testglib.c: Print sizeof() results
	as g_print("%ld", (glong)sizeof(foo)), to deal with
	size_t being long on Alpha's.

Tue May 12 16:54:15 1998  Owen Taylor  <otaylor@gtk.org>
	(James A <jamesa@demon.net> : gtk-jamesa-980511-4.patch)

	* glib.h gstring.c gmessages.c: Added some missing
	const to arguments.

	* gutils.c (g_strsignal.c): Added missing return statements.

Mon May 11 21:11:54 1998  Owen Taylor  <otaylor@gtk.org>

	* gutils.c gmessages.c: Moved g_error, g_warning, g_message and
	g_print from gutils.c to new file gmessages.c, to avoid having to
	include <unistd.h> in gutils.c which was causing problems for the
	g_strsignal implementation on FreeBSD boxes.

Mon May 11 09:53:43 1998  Tim Janik  <timj@gtk.org>

	* configure.in: preserve automake CFLAGS.

	* Makefile.am: fully rename the created library to libglib-1.1.la.
	this means we need to change certain portions of the Makefile.am on
	major/minor version bumps.

	* ltmain.sh: the -release option is not required anymore.

        * glib.h: provide G_GNUC_FUNCTION and G_GNUC_PRETTY_FUNCTION to
	avoid conditionals. unconditionally define NULL, TRUE, FALSE, MAX,
	MIN, ABS and CLAMP, these macros might be screwed from other headers.

Mon May 11 01:44:10 1998  Tim Janik  <timj@gtk.org>

	* gdataset.c: new file, gdatasets implement the object data
	mechanism from GtkObject. a generic data pointer is associated with
	a certain location and a key id.

Sat May  9 20:08:12 1998  Owen Taylor  <otaylor@gtk.org>

        * glib/gmem.c: Experimentally restore GMemChunk
        to its primeval state - where mem areas are
        freed incrementally instead of searching the tree
        every time a mem area is completely empty. Also,
        always keep one mem chunk around. (Reduced calls
        to malloc() a lot, but doesn't really improve
        performance significiantly)

Thu May  7 08:17:28 1998  Tim Janik  <timj@gtk.org>

	* glib.h (G_GNUC_PRINTF):
	(G_GNUC_SCANF): macros to facilitate the printf/scanf format argument
	checking of gcc.

	* gstring.c: const corrections, string!=NULL checks at function entry.
	(g_string_down): new function for tolower(3) conversion.
	(g_string_up): new function for toupper(3) conversion.

	* gutils.c: const corrections.
	(g_strdown): g_string_down() counterpart.
	(g_strup): g_string_up() counterpart.

	* gscanner.c (g_scanner_unexp_token):
 	(g_scanner_error):
	(g_scanner_warn): new functions to let a scanner put out warnings
 	or errors, especially to react on unexpected tokens.

	* gslist.c:
 	(g_slist_index): find out about about the position of a
	certain data pointer.
 	(g_slist_position): find out about about the position of a
	certain node.

	* glist.c:
 	(g_list_index): find out about about the position of a
	certain data pointer.

Thu May  7 05:14:19 1998  Tim Janik  <timj@gtk.org>

	* ltmain.sh: added a new commandline flag -postfix similar to -release,
	but will immediately change the library name.

	* Makefile.am: specify -postfix and -version-info

	* configure.in: version bump to 1.1.0. added GLIB_INTERFACE_AGE and
	GLIB_BINARY_AGE. calculate LT_* variables for libtool.

Fri May  1 16:36:08 1998  Owen Taylor  <otaylor@gtk.org>

	* gutils.c: (g_strcasecmp). Check for isupper before
	taking tolower, and account for macroized tolower.

	* gutils.c (g_error): Check for recursion.

1998-04-27  Elliot Lee  <sopwith@cuc.ml.org>

	* glist.c (g_list_position): New function to find the position of
	a link in a list - should be the inverse of g_list_nth(), but
	haven't tested it so poof.

Thu Apr 30 21:41:30 1998  Owen Taylor  <otaylor@gtk.org>

	* gstring.c : Check arguments more carefully,
	(gtk-draco-980423-1.patch; ramsey@rhrk.uni-kl.de)

Tue Apr  7 19:36:48 1998  Owen Taylor  <owt1@cornell.edu>

	* gutils.c (g_direct_compare): Removed, because that's what
	a NULL comparison function means. And it wasn't 64 bit safe.

Mon Apr  6 18:43:25 1998  Tim Janik  <timj@gtk.org>

	* gscanner.c (g_scanner_get_token_ll): fixed a bug that caused floats
	of the format ".xxx" to be parsed as "xxx".

Fri Apr  3 20:36:35 1998  Owen Taylor  <owt1@cornell.edu>

	* gutils.c (g_parse_debug_string): Make debug string
	parsine case-insensitive

Fri Apr  3 17:03:18 PST 1998 Manish Singh <yosh@gimp.org>

	* gstring.c: corrected possible overrun when inserting into
	GStrings (thanks Elrond)

Fri Apr  3 18:05:45 1998  Owen Taylor  <owt1@cornell.edu>

	* testglib.c: Removed literal german from strings
	to appease SGI compiler.

Thu Mar 26 20:47:21 1998  Owen Taylor  <owt1@cornell.edu>

	* configure.in glib glibconfig.h.in: Add test for atexit/on_exit -
	use on_exit if atexit not found in definition of ATEXIT.

Wed Mar 25 15:23:37 1998  Owen Taylor  <owt1@cornell.edu>

	* Makefile.am: Switched glibconfig.h rule from HEADERS
	to DATA, so that it is not added to DISTFILES

Wed Mar 18 22:27:08 PST 1998 Manish Singh <yosh@gimp.org>

	* garray.c: g_rarray_truncate length done correctly

Sun Mar 15 07:13:34 1998  Tim Janik  <timj@gimp.org>

	* gutils.c: changed *_handler variables to be named glib_*_handler,
	so you can easily access them from gdb.

Sat Mar 14 17:47:43 1998  Owen Taylor  <owt1@cornell.edu>

	* Makefile.am: Don't refer to current directory as $(top_builddir)
	to avoid confusing non-gmakes

Sat Mar 14 01:37:35 1998  Owen Taylor  <owt1@cornell.edu>

	* Makefile.am (configincludedir): Moved glibconfig.h to
          $(pkglibdir)/include

Tue Mar 10 02:03:12 1998  Tim Janik  <timj@gimp.org>

	* gscanner.c (g_scanner_destroy_symbol_table_entry): new function to
	free symbol table entries upon destruction
 	(gtk-gronlund-980309-0.patch.gz).

Mon Mar  9 15:02:21 1998  Tim Janik  <timj@gimp.org>

	* glib.h: changed *_length functions to return guint.
	changed *_nth functions to take guint as argument.

	* glist.c: adapted g_list_length and g_list_length.

	* gslist.c: adapted g_slist_length and g_slist_length.

Mon Mar  2 17:51:18 1998  Owen Taylor  <owt1@cornell.edu>

	* glib.h gutils.c : changed g_strcasecmp
	  to take gchar* not guchar*

	* testglib.c: Remove trailing ; after functions

Sun Mar  1 19:04:40 1998  Owen Taylor  <owt1@cornell.edu>

	* glib.h gstring.c: Added g_string_insert[_c]()
	  and g_string_erase().

	  From: Stefan Wille  <1wille@vsys1.informatik.uni-hamburg.de>

Mon Feb 16 23:05:06 1998  Owen Taylor  <owt1@cornell.edu>

	* glist.c (g_list_insert_sorted): Changed function
	  so elements are always inserted, even if they compare
	  equal with another.

Thu Feb 12 22:48:11 1998  Owen Taylor  <owt1@cornell.edu>

	* gstring.c glib.h: removed deprecated g_string_equal
	  and g_string_hash.

Tue Feb 10 13:04:36 1998  Owen Taylor  <owt1@cornell.edu>

	* configure.in: Add check to see if the C library's
	  iswalnum can actually be used. (Not true for
	  Linux libc-5.4.38)

Sat Feb  7 11:48:09 1998  Owen Taylor  <owt1@cornell.edu>

	* gstring.c gutils.c: added some additional consts in
	  appropriate places to remove a warning

Sat Feb  7 11:15:54 1998  Owen Taylor  <owt1@cornell.edu>

	* gutils.c: include <ctype.h> for tolower()

Fri Jan 30 23:57:17 PST 1998 Manish Singh <yosh@gimp.org>

	* added and autoconfigured in a new utility function
	g_strcasecmp

Wed Jan 28 23:53:27 PST 1998 Manish Singh <yosh@gimp.org>

	* glist.c
	* gslist.c
	* testglib.c: the sort functions compared backwards. Fixed
	* glib.h: list iterator macros now check for NULL pointers

Tue Jan 27 09:46:57 PST 1998 Manish Singh <yosh@gimp.org>

	* gstring.c: g_string_prepend and g_string_prepend_c had
	interchanged src and dest parameters for g_memmove. Fixed.

Tue Jan 27 01:38:52 PST 1998 Manish Singh <yosh@gimp.org>

	* gslist.c: fixed a really, really lame error. g_slist_insert
	didn't hook the data in! Reworked the routine to reflect the
	functionality of g_list

Wed Jan 21 01:13:25 1998  Tim Janik  <timj@psynet.net>

	* Applied patch from (Raja R Harinath <harinath@cs.umn.edu>)
	  to add function g_snprintf.
        * configure.in (AC_CHECK_FUNCS): Check for vsnprintf.
        * glib.h: Add prototype for g_snprintf.
        * glibconfig.h.in: Add HAVE_VSNPRINTF.
        * gutils.c (g_snprintf): new function.

Sat Jan 17 23:52:40 1998  Owen Taylor  <owt1@cornell.edu>

	* gstring.{c,h} gscanner.c:
	   renamed g_string_equal => g_str_equal
	   renamed g_string_hash => g_str_hash
	  And const corrected. Old functions left in for now.

Fri Jan  9 20:03:46 1998  Tim Janik  <timj@psynet.net>

	* gutils.c (g_strerror): changed message for EAGAIN from
	"no more processes" to "try again" since EAGAIN is used with
	functions else than fork().

	* gscanner.c (g_scanner_get_token_ll): use strtol() instead of
	strtoul() to avoid conflicts with solaris.

	* merged the glib portions from Jan 2 to Jan 7 out of gtk+/ChangeLog
 	into this file.

Wed Jan  7 02:14:30 PST 1998 Manish Singh <yosh@gimp.org>

	* glib.h:
	* glist.c:
	* gslist.c:
	* testglib.c: Added g_[s]list_insert_sorted function
	and appropriate tests in testglib

Sat Jan  3 20:23:25 1998  Owen Taylor  <owt1@cornell.edu>

	* glib.h: Changed guint32 -> guint for bitfields.
	(Bitfields must be int or unsigned int?)

Fri Jan  2 23:52 PST 1998 Jay Painter <jpaint@serv.net>

	* glib_pre1.h:
	* glib_pre2.h:
	* glib.h: reverted glibconfig.h and glib.h files back to the
	way they were before my ugly hack.

	* gscanner.c: removed inlines from clist and gscanner

Tue Dec 23 02:49:51 1997  Tim Janik  <timj@psynet.net>

	* gscanner.c: new file for GScanner: Flexible lexical scanner for
 	general purpose.
	* glib_pre2.h: added GScanner includes. added g_strconcat and g_strtod.
	gutils.c (g_strconcat): new function for string concatenation of NULL
 	terminated parameter list.
	(g_strtod): new function to perform best string to double conversion
	with or without consideration of the current locale.

Mon Dec 15 19:33:58 1997  Tim Janik  <timj@psynet.net>

	* glist.c: minor optimizations:
 	(g_list_append): `if' optimized for common code path, commented out
 	unneccessary `assert', saved one variable assignment.
	(g_list_prepend): saved two (conditioned) variable assignment.
	(g_list_insert): saved one  (conditioned) variable assignment,
	saved one variable assignment.
	(g_list_remove): `if' optimized for common code path, saved two
	variable assignments by using `g_list_free_1' (which is even
 	faster) instead of `g_list_free'.
	(g_list_reverse): saved allocation of one variable, saved one
	variable assignment.

Wed Dec 10 23:27:20 1997  Tim Janik  <timj@psynet.net>

	* glib_pre1.h:
	* glib_pre2.h:
	* glib.h: this file now gets concatenated by makeglib_h from
	glib_pre1.h and glib_pre2.h to merge in glibconfig.h wich got
	created by configure (done by Jay Painter).

	* glib_pre2.h: the g_assert*() and g_return_*_fail() macros
	are wrapped by G_STMT_START and G_STMT_END now, to avoid conflicts
	when used within if (...) g_macro(); else ... conditionals.

Tue Dec 17 13:14:07 1996  Peter Mattis  <pmattis@charnley.HIP.Berkeley.EDU>

	* glib.h: Changed 'g_return_if_fail' and 'g_return_val_if_fail' to
	not call 'g_string' but to simply stringify the
	expression. Calling 'g_string' causes the expression to be
	expanded which is undesired.

Sun Dec  1 01:30:48 1996  Peter Mattis  <pmattis@charnley.HIP.Berkeley.EDU>

	* Started ChangeLog
