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
