Tue Feb 16 14:08:59 CST 1999 Shawn T. Amundson <amundson@gtk.org>

	* NEWS
	  README
	  INSTALL
	  config.h.win32
	  configure.in
	  glib.spec
	  glibconfig.h.win32
	  docs/glib-config.1: version=1.1.16 

	* Released GLib 1.1.16

1999-02-15  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* glib.h, glibconfig.h.win32, configure.in: Changed signature of
	all g_static_mutex_* functions to take a pointer rather than the
	struct itself. This is not an issue at the moment, because those
	funcs are really macros, but is it un'G'ish and might fall on our
	feet in the future.

Mon Feb 15 07:45:54 1999  Tim Janik  <timj@gtk.org>

	* configure.in (--enable-debug): default to yes for development trees.

Mon Feb 15 06:18:58 1999  Tim Janik  <timj@gtk.org>

	* glib.h: return guints instead of gints for g_hash_table_size
	and g_hash_table_foreach_remove.

Wed Feb 10 12:01:42 1999  Tim Janik  <timj@gtk.org>

	* configure.in: don't reset G_MODULE_IMPL, so it can be overridden
	from the command line.

1999-02-10  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* glib.h: s/G_LOCK_DECLARE/G_LOCK_DEFINE/ throuhout glib. Added
	G_LOCK_EXTERN macro to declare a lock externally.

Wed Feb 10 06:20:30 1999  Tim Janik  <timj@gtk.org>

	* gmutex.c (g_static_private_set): invoke destroy notifier when
	overwriting values, initialize new array fields with NULL.
	(g_static_private_free_data): do not skip destroy notification for
	data == NULL.

	* gutils.c (g_direct_equal): compare pointer values directly instead
	of just their guint values which is a loosing conversion for
	sizeof(gpointer)==8 systems.
	(g_get_any_init): restructured code so we don't use endless loops like
	while (1), which boil down to an ugly alias for goto.
	strip ,.* from the real name.

February 9, 1999 sopwith@redhat.com

	. glist.c, gnode.c, gslist.c: allocate pools of 128 items instead
	of 1024 items.

1999-02-08  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in, acconfig.h: Changed the test for getpwuid_r to
	exclude those systems (i.e. IRIX), that set ENOSYS after the call.
	Test, if pthread_getspecific is posix like or something different,
	as on PCThreads.	

Sun Feb  7 21:56:00 1999  Owen Taylor  <otaylor@redhat.com>

	* gmem.c (g_mem_profile): Copy all elements
	of the allocations[] array, including the last.
	(Pointed out by "Matthew W. Samsonoff" <mws7323@osfmail.isc.rit.edu>)
	
1999-02-05  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in: Make the error message in case of a broken thread
	system a bit more informative.

	* gutils.c (g_get_any_init): Changed the error logic again, now
	only leaving the memory doubling loop, when success is reached or
	when the user isn't found or when the buffer is 32k big,
	additionally now getpwuid will be run, if getpwuid_r didn't work
	out properly. A warning is issued however.

Thu Feb 04 20:42:24 1999  Tor Lillqvist  <tml@iki.fi>

	* glibconfig.h.win32 config.h.win32: Update GLIB_MICRO_VERSION.

1999-02-04  Christopher Blizzard  <blizzard@redhat.com>

	* glib.spec (Packager): Change my email address

Thu Feb  4 01:45:01 PST 1999 Shawn T. Amundson <amundson@gtk.org>

	* ChangeLog
	  NEWS
	  README
	  configure.in
	  glib.spec
	  docs/glib-config.1: version=1.1.15

	* Released GLib 1.1.15

Tue Feb 02 00:08:54 1999  Tor Lillqvist  <tml@iki.fi>

	* gmessages.c (g_log_default_handler): (Win32:) Don't call
 	ensure_stdout_valid (which would open an unneeded console window)
 	if we're calling a logging function.  Define ensure_stdout_valid
 	as an empty macro on Unix.

	* gutils.c (g_get_any_init): (Win32:) Trust HOME first if defined,
	then try HOMEDRIVE and HOMEPATH.

Mon Feb  1 19:04:28 1999  Owen Taylor  <otaylor@redhat.com>

	* gmain.c (g_main_iterate): Release the main_loop
	 lock around calls to prepare() and check() so
	 that we are not holding the main loop lock
	 over user code.

1999-01-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in: Moved the check for MT safe function variants
	after the determination of the MT cflags and use them there.

1999-01-29  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in: Fixed typo. Now HPUX 11 thread system detection
	should work.

	* gutils.c (g_get_any_init): Changed initial bufsize to 64. Should
	solve some problems out there.

Wed Jan 27 23:21:50 CST 1999 Shawn T. Amundson <amundson@gtk.org>

	* INSTALL
	  NEWS
	  README
	  configure.in
	  glib.spec
	  docs/glib-config.1: version=1.1.14

	* Released GLib 1.1.14

1999-01-28  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in: Simplified configure.in test for posix threads,
	systems, that provide /usr/include/pthread.h should also have the
	posix thread library. This is to avoid writing down all the tests
	twice. New test for thread system on HPUX 11. Info from Matt
	Nottingham <matt@sar.dera.gov.uk>.

Wed Jan 27 20:39:49 PST 1999 Manish Singh <yosh@gimp.org>

	* acinclude.m4: Xsed isn't valid here, don't use it

	* ltmain.sh
	* ltconfig: better file magic regexp for Linux libs

	* gmodule/Makefile.am: arg, noinst_LTLIBRARIES doesn't make shared
	libs, revert my previous change to this file

	* docs/texinfo.tex: add it so automake doesn't whine

Wed Jan 27 01:57:19 1999  Tim Janik  <timj@gtk.org>

	* configure.in (G_MODULE_HAVE_DLERROR): applied patch from Andrej
	Borsenkow <borsenkow.msk@sni.de> to also check for dlsym() in system
	libraries and -ldl, to catch systems that provide dlopen() in libc
	and dlsym() in libdl. this is at least the case for Reliant UNIX
	5.44 (labeling itself as SINIX).

Tue Jan 26 13:39:22 PST 1999 Manish Singh <yosh@gimp.org>

	* configure.in: don't use backquotes in warning text

1999-01-26  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* gdate.c (g_date_set_time): Removed the #warning about MT
	unsafety without localtime_r.

	* configure.in: Moved it here.

Mon Jan 25 10:07:53 1999  Raph Levien  <raph@gimp.org>

	* configure.in: (#define G_THREADS_IMPL...) Changed the #define,
	adding the G_THREADS_IMPL_ prefix to $g_threads_impl_def because
	it looked wrong to me and was breaking gimp compile.

Mon Jan 25 15:34:43 1999  Timur Bakeyev <mc@bat.ru>

	* configure.in, gstrfuncs.c: Inverted logic of NO_SYS_SYGLIST_DECL -
	now it's normal (see 1999-01-19 Josh MacDonald). Also, remove from
	#include <signal.h> wrapper NO_SYS_SYGLIST - *sys_syglist[] declara-
	tion hides there.

1999-01-25  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in: Do not use the thread libs, when searching for
	some functions, as this might require glib to always be linked
	with the thread libs on some platforms.

	* gutils.c (g_get_any_init): Don't set errno to zero and use it
	only as the error code, if the function returned a value less
	0. It might happen, that the call succeeds, even though the errno
	is set during the call (i.e. it first looks for a passwd file,
	which is not found). Submitted by Michael Natterer
	<mitschel@cs.tu-berlin.de>. BTW: Sorry for all the mess with that
	`getpwuid_r' change, but it had to be done once.

Sun Jan 24 10:33:30 1999  Tim Janik  <timj@gtk.org>

	* gutils.c (g_get_any_init): reverted raja's changes, since they leaked
	a struct passwd contents buffer and for the rest mostly substituted a
	while loop with a bunch of gotos.
	restored the getpwuid() code to what we had after my recent clean ups
	("Sat Jan 23 02:14:28 1999 Tim Janik"), module yosh's recent changes.
	to feature solaris behaviour of directly returning errno, we don't
	modify error anymore if it's > 0 and simply reset errno.
	don't reset g_home_dir for !NATIVE_WIN32 && !NATIVE_WIN32.

1999-01-24  Raja R Harinath  <harinath@cs.umn.edu>

	* gutils.c 
	(g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: 
	Hopefully got the error handling for `getpwuid_r' right.
	(g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]:
	Fix typo (change `pw == NULL' to `pw != NULL').
	
Sun Jan 24 00:36:22 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* ghash.c:
	- Revert previous "fix" (which really just did things a
	  different way).
	- (g_hash_table_remove): Don't need to support multiple values
	  for a single key.

	* tests/hash-test.c:
	Add test where hash function always returns a single value.
	Add beginnings of tests for g_hash_table_foreach[_remove] and
	g_hash_table_remove.

Sat Jan 23 20:40:06 PST 1999 Manish Singh <yosh@gimp.org>

	* gutils.c: removed the #warning about MT without getpwuid_r

	* configure.in: and moved it here

Sat Jan 23 22:45:59 1999  Jeff Garzik  <jgarzik@pobox.com>

	* ghash.c (g_hash_table_lookup_node, g_hash_table_lookup,
		   g_hash_table_insert, g_hash_table_remove,
		   g_hash_table_lookup_extended):
	  - Fixed bug that overwrote nodes in hash buckets instead of
	    adding them to the hash bucket node list.
	    Hash tables now work as advertised.

	(g_hash_table_resize):
	  - Use g_new0 instead of manual init.
	  - Space out code a bit for readability.

	(g_hash_nodes_destroy):
	  - Replaced "if (!hash_node) return;" with
	    "if (hash_node) {do stuff}".
	    Testing takes up less code space than explicit call to
	    'return' before end of function.  (look at gcc -S)

	Updated module header copyright to 1999.
	New module macro G_HASH_BUCKET for (table,key)->bucket lookups.

	* tests/hash-test.c:
	- Add two new tests, one with strings as the keys and values, and
	  one with ints as the keys and values.  Tests indirect (strings)
	  and direct (ints) hashing.
	- Cleanup unused junk left over from testglib.c.
	- Converted a g_print call to g_assert_not_reached.
	- Updated copyright to 1999.

	* testglib.c, tests/string-test.c:
	- Init 'tmp_string' var to NULL, silencing uninit-var warning.

1999-01-23  Raja R Harinath  <harinath@cs.umn.edu>

	* gutils.c (g_get_any_init) [HAVE_GETPWUID_R]:
	Rewrite not to look at `errno' if library call succeeds, since
	`errno' is not reset to 0.
	
Sat Jan 23 16:17:04 1999  Tor Lillqvist  <tml@iki.fi>

	* glibconfig.h.win32: Update the magic values for
	pthread_mutex_t size and initializer bytes to match the
	latest version of pthreads for Win32.

Sat Jan 23 02:14:28 1999  Tim Janik  <timj@gtk.org>

	* gutils.c (g_get_any_init): cleaned up the errno mess for
	GETPWUID. we especially don't want to g_error() out here!
	the warning for G_THREADS_ENABLED and !HAVE_GETPWUID_R isn't
	gcc related.
	if !HAVE_PWD_H and !NATIVE_WIN32, g_free the home dir before
	resetting it to NULL, why are we doing this anyways?
	reordered code a bit so we always provide defaults (except
	for g_home_dir).

Thu Jan 21 12:40:11 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* tests/{Makefile.am, string-test.c, strfunc-test.c}:
	Separate string and strfunc tests, working towards goal of
	having separate test for each of the GLib modules.
	Add a couple GString length tests.

Thu Jan 21 09:36:05 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* configure.in:
	Use AC_PREREQ not AC_REQUIRE for autoconf version test.

1999-01-21  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* gutils.c (g_get_any_init): Changed error handling again, as the
	error is not always set in errno, it is the return value on some
	systems. What an evil world.

Thu Jan 21 05:35:20 1999  Tor Lillqvist  <tml@iki.fi>

	* gstrfuncs.c: Include signal.h only when the signal names will be
	needed.

Wed Jan 20 22:09:59 EST 1999 Mandrake <mandrake@mandrake.net>

	* configure.in / Makefile.am : made some adjustments for automake 1.4
	and autoconf 2.13 (per suggestions made by  Raja R Harinath
	<harinath@cs.umn.edu>)

Wed Jan 20 20:33:14 EST 1999 Mandrake <mandrake@mandrake.net>

	* autogen.sh: automake 1.4 and libtool 1.2d notices.
	(maybe I'll write an actual test for automake 1.4 later)

Wed Jan 20 15:05:25 PST 1999 Manish Singh <yosh@gimp.org>

	* HACKING: new file

	* Makefile.am: since we require automake 1.4 now, ditch the build
	top-level first and just use SUBDIRS

	* gmodule/Makefile.am: use noinst_LTLIBRARIES instead of overriding
	the install rule

Wed Jan 20 16:16:01 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* gutils.c (g_get_any_init):
	Revert previous patch, move error value set line down to proper
	place.  Caught by Elliot Lee <sopwith@redhat.com>.

Wed Jan 20 20:48:58 GMT 1999  Adam D. Moss  <adam@gimp.org>

	* gutils.c (g_get_any_init): All gtk apps were broken
	here on my setup.  I changed the error to a warning to at
	least get things limping.

1999-01-20  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* gutils.c (g_get_any_init): Use getpwuid_r with the right
	signature, if available.

	* configure.in, acconfig.h: Test for existance of getpwuid_r and
	its signature.

Tue Jan 19 20:52:43 1999  Tor Lillqvist  <tml@iki.fi>
	
	* Makefile.am (EXTRA_DIST): Add new Win32 files.

	* README.win32: Describe the conditional compilation macros.

	* makefile.lcc: Removed.

1999-01-19  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in: Moved test for localtime_r and rand_r to a place
	after the determination of the G_THREAD_LIBS and use them for
	finding those functions, necessary on systems with a different C
	library libc_r for threaded progs, like FreeBSD 2.2.x. Info from
	Timur Bakeyev <mc@bat.ru>.

Tue Jan 19 00:44:24 1999  Josh MacDonald  <jmacd@axis.hip.berkeley.edu>

	* gstrfuncs.c (g_strsignal): The "extern char* sys_siglist"
	declaration breaks systems with different declarations, like
	mine (FreeBSD).  So, I added a configuration variable to decide
	whether the declaration is neccesary.  Change also appears on
	line 275 of configure.in.

Sun Jan 17 17:13:54 CST 1999 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.13

	* README:
	  INSTALL:
	  docs/glib-config: ver=1.1.13

Mon Jan 18 00:02:46 1999  Tim Janik  <timj@gtk.org>

	* NEWS: updates for 1.1.13.

Sun Jan 17 17:15:59 1999  Tim Janik  <timj@gtk.org>

	* gtree.c (g_tree_traverse): removed assertion about rtree->root being
	NULL, so this function can be applied to unpopulated trees as well, fix
	provided by Simon Kagedal <sika8225@csd.uu.se>.

Sun Jan 17 11:17:19 1999 Christopher Blizzard  <blizzard@appliedtheory.com>

	* glib.spec: add packager address

Sun Jan 17 11:10:05 1999 Christopher Blizzard  <blizzard@appliedtheory.com>

	* glib.spec: increment version number to 1.1.13

Sun Jan 17 16:14:03 1999  Tim Janik  <timj@gtk.org>

	* glib.h (g_error): if !defined (G_LOG_DOMAIN) define G_LOG_DOMAIN as
	((gchar*) 0) instead of ((void*) 0) to silence egcs C++ mode, reported
	by Seth Alves <alves@hungry.com>.

Sun Jan 17 14:13:52 1999  Tim Janik  <timj@gtk.org>

	* glib.h: added a define G_HOOK_DEFERRED_DESTROY, to substitute a noop
	GHookList.hook_destroy function.

	* ghook.c (g_hook_destroy_link): don't really call hook_destroy if it
	is G_HOOK_DEFERRED_DESTROY. for the case where we invoke hook->destroy()
	we now clean up the hook completely afterwards, i.e. data, func and
	destroy are immediately set to NULL and hook_free can't play with that
	values anymore.

	* gmain.c (g_source_add): set hook_destroy to G_HOOK_DEFERRED_DESTROY,
	instead of using an ugly _noop() hack, this is to avoid an uneccessary
	function invokation. set hook_free to g_source_destroy_func, this way
	we always invoke the destroy notifiers for user_data and source_data
	after execution of dispatch(). thus, g_source_destroy_func() will always
	be called within the main_loop lock (this wasn't really assured
	before), and can release and reaquire the look around destroy notifier
	invokation.

Sun Jan 17 11:01:40 1999  Tor Lillqvist  <tml@iki.fi>

	* config.h.win32 glibconfig.h.win32: Increment version number here
 	also.

Sun Jan 17 05:12:17 1999  Tim Janik  <timj@gtk.org>

	* configure.in: incremented version number to 1.1.13, bin age 0,
	interface age 0.

	* glib.h: added hook_destroy member to struct _GHookList.

	* ghook.c (g_hook_destroy_link): if the hook_list defines a hook_destroy
	function, use that to marshal hook destruction notifiers.

	* gmain.c: removed g_source_free_func and added g_source_destroy_func,
	which marshalls the user_data and source_data destructors of sources
	outside of the main_loop lock.
	removed GIdleData struct since its sole member callback can be passed
	as source_data directly.
	added a gboolean return value to all g_source_remove* functions,
	indicating whether the source could be removed, because these functions
	don't issue warnings upon unseccessful removals themselves. this way at
	least the caller gets a chance to warn upon failing removals.
	(g_main_iterate): set in_check_or_prepare around calls to check() or
	prepare().
	(g_main_pending): simply return FALSE if called from within check() or
	prepare().
	(g_main_iteration): issue a warning if called from within check() or
	prepare() and bail out with FALSE.
	(g_main_run): likewise.
	(g_source_remove_by_funcs_user_data): new function to remove sources by
	user data and function table.
	(g_idle_remove_by_data): new function to really remove idles only, since
	g_source_remove_by_user_data would remove timeouts or other sources as
	well.

1999-01-16  Tor Lillqvist  <tml@iki.fi>

	* Merge in current Win32 version:

	* README.win32: More text.

	* config.h.win32 glibconfig.h.win32: Update to match the
	corresponding generated files on Unix.

	* makefile.msc: Update with new source files, and gthread
 	library. Use the compiler flag -MD instead of using -D_DLL and
	/nodefaultlib:libc msvcrt.lib in the link phase.

	* glib.def: Update to include new functions, drop removed ones.

	* glib.h: Add comments about main loop and polling on Win32. (In
	general, it's only for the GIMP's use.) Add Win32 IO Channel
	functions. Remove the obsoleted old IO Channel stuff (which was
	in #if 0 already).

	* giowin32.c: New file.

	* gmain.c: Include config.h, conditionalize <sys/time.h>
 	inclusion.  Add g_poll implementation for Win32 (only for the
 	GIMP's needs for now, it's hard or even impossible to be as clean
 	and generic as on Unix). Implement g_get_current_time on Win32. If
 	threads aren't supported, don't try to wake up main thread's
 	loop. On Win32, use a semaphore and not a pipe to wake up the main
 	loop.

	* gmessages.c: On Win32, allocate a console window if the standard
	output handle is invalid before writing to stdout, and reopen stdout
	to that console window.

	* giochannel.c: Conditionalize unistd.h inclusion. Some indentation
	cleanup.

	* gstrfuncs.c: Include <signal.h>.

	* gutils.c: On Win32, also check the HOMEDRIVE and HOMEPATH
	environment variables.

Sun Jan 17 01:06:38 1999 Timur Bakeyev <mc@bat.ru>

	* configure.in: Add support for FreeBSD 2.2.x macro _THREAD_SAFE.

Wed Jan 13 11:27:24 PST 1999 Manish Singh <yosh@gimp.org>

	* glib.h: don't use inline for !__GNUC__ case with g_warning,
	g_error, and g_message wrappers since some compilers throw
	away arguments in this case

Tue Jan 12 21:59:14 PST 1999 Manish Singh <yosh@gimp.org>

	* acinclude.m4
	* ltconfig
	* ltmain.sh: upgrade to libtool 1.2d (with fixes for irix6 and osf)

	* testglib.c: removed unused cruft

Tue Jan 12 09:57:06 PST 1999 Manish Singh <yosh@gimp.org>

	* gdate.c: #warning isn't portable, check for gcc

1999-01-12  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

        * gdate.c: Include config.h to get HAVE_LOCALTIME_R macro.

        * configure.in: Moved function check back to the place, they've
        been before.

1999-01-11  Jeff Garzik  <jgarzik@pobox.com>

	* gstrfuncs.c:
	Do not use vasprintf.

	* configure.in, glib.h, testglib.c, tests/.cvsignore,
	  tests/Makefile.am, tests/alloca-test.c:
	Do not use alloca.

1999-01-11  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in: Test for localtime_r only after including the
	right MT enabling CFLAGS (i.e. -D_REENTRANT on most systems).

	* configure.in: Find right thread system on DG/UX. Thanks to Marc
	J. Fraioli <fraioli@dg-rtp.dg.com> for hint. Finally removed the
	stuff for -fstack-check, that didnt work anyway.

	* gdate.c (g_date_set_time): Emit warning, if no localtime_r
	function is available on thread enabled systems. Define ptm only,
	if really needed, and assert on it.

Sat Jan  9 15:08:44 1999  Jeff Garzik  <jgarzik@pobox.com>

	* testglib.c:
	Make all aux functions static.

	* tests/Makefile.am, tests/dirname-test.c, tests/type-test.c:
	New tests dirname-test and type-test, from testglib.

Sat Jan  9 13:53:00 1999  Jeff Garzik  <jgarzik@pobox.com>

	* configure.in:
	Add checks for vasprintf, localtime_r.

	* gdate.c (g_date_set_time):
	Use localtime if localtime_r is not available.

	* gstrfuncs.c (g_strdup_vprintf):
	Use glibc vasprintf if possible; it's a bit faster than using
	GLib routines, and makes output code a bit smaller.

	* acconfig.h:
	Remove HAVE_VSNPRINTF and HAVE_VPRINTF.  autoheader picks these
	up automatically and puts them in config.h.in.

Thu Jan  7 15:14:08 1999  Owen Taylor  <otaylor@redhat.com>

	* gmain.c (g_source_free_func): Call the source-specific
	free function when the hook is freed not when it
	is destroyed; this fixes a bug where a timeout destroyed
	from itself would access already freed data.

1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* gutils.c (g_get_any_init): Here we must replace getpwuid by
	getpwuid_r, but as I do not know how for now, I just made a FIXME
	note ;-)

	* gdate.c (g_date_set_time): localtime --> localtime_r to make it
	thread safe.

	* configure.in: We do not need to check for broken solaris mutex
	intitializer any longer. Provide a macro to show the used thread
	implementation. Not nice, but this is needed until thread support
	is completed here inside glib.

Tue Jan  5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>

	* configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
	the # needs to be in column 1

	* gthread/testgthread.c: cleanups

	* tests/node-test.c: #include unistd.h for exit()

1999-01-04  Andrew T. Veliath  <andrewtv@usa.net>

	* glib.h (g_array_insert_val): fix macro to be shorthand of
	g_array_insert_vals.

Mon Jan  4 15:35:29 PST 1999 Manish Singh <yosh@gimp.org>

	* acglib.m4: some echos interpret \n's and some don't. Deal with
	accordingly.

Mon Jan  4 20:58:50 1999  Tim Janik  <timj@gtk.org>

	* gscanner.c: eliminated extraneous "register" qualifiers in variable
	declarations.

	* gmain.c: #undef events and revents which may have been defined in
 	sys/poll.h for SVR3,4 compatibility on some AIX systems. fix been
	provided by Philippe Defert <Philippe.Defert@cern.ch>.

Mon Jan  4 14:38:11 1999  Tim Janik  <timj@gtk.org>

	* glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros
	so their arguments get only evaluated once. changed g_strconcat3_a to
	have the same semantics as g_strconcat, i.e. if a certain argument is
 	NULL, the rest of the parameter list is skipped.

	* tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be
 	able to compile on all systems. added test for g_strconcat() semantics.

	* we need a alloca() replacement for !G_HAVE_ALLOCA rsn!

Mon Jan  4 02:58:13 CST 1999 Shawn T. Amundson <amundson@gtk.org>

        * Released GLib 1.1.12

        * INSTALL:
          NEWS:
          README:
          configure.in:
	  glib.spec:
          docs/glib-config.1: version=1.1.12

	* tests/Makefile.am: fixed so it works properly with
	  builddir and srcdir.

Sun Jan  3 01:38:14 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* tests/Makefile.am:
	add array-test.c, tree-test.c

	* tests/array-test.c, tests/tree-test.c:
	New module, tests array family

	* tests/hash-test.c, tests/list-test.c, tests/slist-test.c,
	  tests/string-test.c, tests/node-test.c:
	Clean out cruft left over from testglib.

Sat Jan  2 22:42:25 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* Makefile.am, configure.in, tests/*:
	Added 'make check' tests, based on testglib code.

Sat Jan  2 19:52:45 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* glib.h, testglib.c:
	Added g_alloca, g_new_a, g_new0_a macros.

Sat Jan  2 16:45:44 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* testglib.c: Added g_strdup_printf check.

Fri Jan  1 21:58:40 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* glib.h:
	(g_strdup_a, g_strndup_a): Handle NULL strings like g_strdup.
	s/g_strconcat_a/g_strconcat3_a/ to reflect fixed number of args

	* testglib.c:
	Added g_strdup, g_strconcat checks.
	Added str==NULL checks for alloca string macros.
	s/g_strconcat_a/g_strconcat3_a/

Fri Jan  1 18:30:41 PST 1999 Manish Singh <yosh@gimp.org>

	* testglib.c: made the alloca tests follow the testglib style

	* Makefile.am: minor cleanups, mostly cosmetic

Fri Jan  1 20:43:19 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* glib.h: added g_strndup_a macro

	* testglib.c:
	Added tests for new alloca-based string routines.
	Reformatted a couple strings.

Sat Jan  2 02:20:59 1999  Tim Janik  <timj@gtk.org>

	* ghook.c:
	(g_hook_list_invoke):
	(g_hook_list_invoke_check):
	(g_hook_list_marshal_check):
	(g_hook_list_marshal): avoid unneccessary extra hook referencing (the
	explicit hook referencing became unneccessarry with my changes from
	Mon Dec 21 21:48:29 1998).

	* gmain.c (g_main_iterate): fixed reference counting leaks with
 	premature loop aborts.

Fri Jan  1 22:47:44 1999  Tim Janik  <timj@gtk.org>

	* gscanner.c (g_scanner_unexp_token): handle G_TOKEN_IDENTIFIER_NULL
	as G_TOKEN_IDENTIFIER.

Fri Jan  1 17:09:19 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

	* configure.in, glib.h:
	Added two new alloca-based function macros, g_strdup_a and
	g_strconcat_a.	These are stack-based and much faster than
	their g_malloc-based counterparts.  Kudos to Ulrich Drepper
	for help on this one.

Wed Dec 30 18:24:57 CST 1998 Shawn T. Amundson <amundson@gtk.org>

        * Released GLib 1.1.11

        * INSTALL:
          NEWS:
          README:
          configure.in:
          docs/glib-config.1: version=1.1.11

1998-12-30  Raja R Harinath  <harinath@cs.umn.edu>

	* glib.h (G[U]INT64_FROM_{LE,BE}):
	Define to G[U]INT64_TO_{LE,BE}, not G[U]INT32_TO_{LE,BE}.

Fri Dec 25 19:56:33 PST 1998 Manish Singh <yosh@gimp.org>

	* acglib.m4
	* configure.in: provide defaults for POLL sysdefs, simple enums
	don't work with bitwise logic. Reported by Daniel Skarda
	<0rfelyus@atrey.karlin.mff.cuni.cz>

Wed Dec 23 00:43:25 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* INSTALL:
	  NEWS:
	  README:
	  configure.in:
	  docs/glib-config.1: version=1.1.10

Wed Dec 23 04:18:11 1998  George Lebl  <jirka@5z.com>

	* gmain.c: (g_get_current_time) don't cast to timeval since
	  timeval is for some reason not always a struct of longs, weird

Tue Dec 22 10:32:11 1998  Tim Janik  <timj@gtk.org>

	* ghook.c (g_hook_first_valid): fixed buglet that could cause bogus
	warnings.

Mon Dec 21 21:48:29 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gmain.c: there was a reference count race for hooks during invocation
	loops. since all (known) hook loop implementations, do currently start
	out with g_hook_first_valid() and iterate with g_hook_next_valid(),
	g_hook_first_valid() will now return a referenced hook, and
	g_hook_next_valid() will "eat" that, and eventually transfer it to
	the next hook. <sigh> unfortunately this requires g_hook_next_valid()
 	to take the hook_list as additional argument.

	* gmain.c (g_main_iterate): adjusted callers of g_hook_next_valid().

Mon Dec 21 03:48:04 1998  Tim Janik  <timj@gtk.org>

	* gmain.c (g_main_iterate): default initialize source_timeout with -1
	so we have a sane timeout value if (*prpare) doesn't set it.

Sat Dec 19 16:56:02 1998  Owen Taylor  <otaylor@redhat.com>

	* glib.h gmain.c (G_PRIORITY_LOW): Add #defines defining
	scale of priorities.

Sat Dec 19 16:56:02 1998  Owen Taylor  <otaylor@redhat.com>

	* gmain.c (g_main_poll): Allocate space for pollfd's
	_after_ adding poll wake-up-pipe record.

	* gmain.c (g_main_add_poll): Changed name
	of internal function g_main_add_poll_unlocked()
	back from the non-sensical g_main_add_unlocking_poll().

Sat Dec 19 06:25:55 1998  Tim Janik  <timj@gtk.org>

	* glib.m4: fixed a minor bug that would let configures bail out
	if the MODULES argument contained newlines.

	* acglib.m4: new file to be included by configure.in. it holds
	special GLIB_ autoconfiguration macros, eventually some of the
	easier ones should be moved into glib.m4, e.g. GLIB_IF_VAR_EQ,
	GLIB_STR_CONTAINS or GLIB_ADD_TO_VAR.

Sat Dec 19 04:27:17 1998  Tim Janik  <timj@gtk.org>

	* fixed up sys/poll.h and sys/types.h inclusions.

Sat Dec 19 03:10:50 1998  Tim Janik  <timj@gtk.org>

	* fixed up gthread includes, cleaned up glibconfig.h a little bit.

Fri Dec 18 12:51:39 1998  Owen Taylor  <otaylor@redhat.com>

	* gmain.c: Fix errors in computation of timeout
	expiration times > 1sec.

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

	* configure.in (have_threads): Changed the last pthread_cond_init
	to pthread_attr_init.

Fri Dec 18 00:03:17 1998  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gmain.c:
	(g_main_is_running): new function to check whether a main loop has been
	quitted.
	(g_main_new): added a gboolean argument to determine whether the loop
	should be considered initially running or not. however, g_main_run ()
 	will still reset the main loops running state to TRUE upon initial
 	entrance.

	* gmain.c:
 	(g_main_iterate): documented this function's purpose in 5 steps.
 	for step 2), flag sources as G_SOURCE_READY even if !dispatch and
	check G_SOURCE_READY prior to (*prepare), so we don't call (*prepare)
 	on them multiple times.

Thu Dec 17 23:43:47 1998  Tim Janik  <timj@gtk.org>

	* gmain.c (g_main_add_poll): reordered arguments, so GPollFD* comes
	first, <sigh> (sorry Snorfle, i should have let you know in the first
 	place).
	(g_main_dispatch): stack G_HOOK_FLAG_IN_CALL flags. call source's
	destructor when destroying a source.

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

	* garray.c (g_ptr_array_remove_index): Fixed size in g_memmove,
	reported by Alexander Larsson <alla@lysator.liu.se>.

	* gmem.c: Fixed bug, that made compile fail for -DENABLE_MEM_PROFILE.

Wed Dec 16 23:04:26 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.9

	* INSTALL:
	  NEWS:
	  README:
	  configure.in:
	  glib.spec:
	  docs/glib-config.1: version=1.1.9

Wed Dec 16 22:32:13 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* glib.h:
	  giounix.c: s/g_main_poll_add/g_main_remove_add/g
                     s/g_main_poll_remove/g_main_remove_poll/g
                     s/g_main_poll_add_unlocking/g_main_add_unlocking_poll/g
          (from Tim Janik)

Wed Dec 16 20:04:10 PST 1998 Manish Singh <yosh@gimp.org>

	* configure.in: check for pthread_attr_init in all cases, du4
	needs this since most of the other functions are just #defines

Thu Dec 17 04:10:49 1998  Tim Janik  <timj@gtk.org>

	* glib.h (G_LOCK_DECLARE_*): if !G_THREADS_ENABLED, eat the
	trailing semicolon with a bogus function declaration, instead
	of with a bogus variable declarations, so we avoid unused
	variable warnings.

Wed Dec 16 07:49:16 PST 1998 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.8  (CVS tag is GLIB_1_1_8a)

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

	* giounix.c (g_io_channel_unix_get_fd): Fixed small bug.

1998-12-16  Joel Becker  <jlbec@ocala.cs.miami.edu>

	* glib.h, gscanner.c: changed func_data to user_data in
        g_scanner_scope_symbol_foreach and associated friends, because
	AIX headers #define func_data.

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

	* configure.in: Fixed stupid bug, that made
	g_static_mutex_lock(*mutex) not work as expected.

	* docs/glib-config.1: Updated to reflect the existence of gthread.

	* gmain.c (g_main_poll_add_unlocking): Changed
	g_main_poll_add_unlocked to g_main_poll_add_unlocking to match
	semantic, (indeed, main_loop must be locked, when calling this
	function). Removed the unlocking from the end of that function, as
	that is not right. Made a 'HOLDS' comment above the function.

Wed Dec 16 03:16:58 1998  Tim Janik  <timj@gtk.org>

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

	* glib.h: changed g_lock() to G_LOCK(), g_unlock() to G_UNLOCK() and
	g_trylock() to G_TRYLOCK(), since these are macros that expand to
	nothing with --disable-threads.
	changed G_LOCK_DEFINE() to G_LOCK_DECLARE() and introduced
 	G_LOCK_DECLARE_STATIC() to achive the results of static G_LOCK_DECLARE().
	changed semantics of g_thread_supported to g_thread_supported() so it
	can be used as a function like g_module_supported(). the actuall
	definition is still a macro that expands into a variable for
 	performance reasons though.
	various indentation and coding style cleanups.

	* configure.in: added --enable-threads that defaults to yes.

	* gmutex.c: changed tests g_thread_supported to g_thread_supported (),
	changed variable settings of g_thread_supported
 	to g_threads_got_initialized.

	garray.c:
	gcache.c:
	gdataset.c:
	gdate.c:
	ghash.c:
	glist.c:
	gmain.c:
	gnode.c:
	gslist.c:
	gstring.c:
	gtree.c:
	gutils.c:
	changed s/g_lock/G_LOCK/, s/g_unlock/G_UNLOCK/,
 	s/static G_LOCK_DEFINE/G_LOCK_DECLARE_STATIC/.

Tue Dec 15 23:16:05 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* INSTALL:
	  NEWS:
	  README
	  configure.in:
	  glib.spec:
	  docs/glib-config.1: Incremented version

Wed Dec 16 22:29:48 1998  Joel Becker  <jlbec@ocala.cs.miami.edu>

	* configure.in: fixed the AIX thread checking.
	Just an error on the wildcard.  BTW, -D_THREAD_SAFE
	is correct for AIX.

Wed Dec 16 02:02:48 1998  Tim Janik  <timj@gtk.org>

	* glib-config.in (lib_glib): fixed library and flag ordering for
	--libs

Tue Dec 15 17:17:46 1998  Owen Taylor  <otaylor@redhat.com>

	* glib.h giounix.c giochannel.c: Use an "inheritance"
	scheme for IO channel memory allocation.h

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

	* gdate.c (g_date_prepare_to_parse): Solaris has a broken strftime
	that produced garbage output for the test date I was using to
	set up the parser. So use a different date that Solaris seems
	to like.

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

	* configure.in: Dont complain, if --without-threads or
	--with-threads=none is supplied; Test for pthread_attr_init
	instead of pthread_cond_init, if threads seems to be supported by
	standard glib. (CFLAGS): Use G_THREAD_CFLAGS for compiling of glib
	as well.

	* glib.h, gmutex.c: Changed private to private_key to avoid
	problems when compiling with under C++.

1998-12-15  Jeff Garzik  <jgarzik@Pobox.com>

	* configure.in:
	bugfixes, correctly support --without-threads and friends

	* gthread/testgthread.c: corrected 64-bitness problem

Tue Dec 15 10:40:09 1998  Owen Taylor  <otaylor@redhat.com>

	* gnode.c glist.c gslist.c: Make sure all
	calls to g_node_validate_allocator are within
	current_allocator lock, so we have consistency
	on that point. (Should not really matter,
	but this way we match the comments)

	* glist.c (g_list_free_1): Removed some lines
	that should never have been committed. (For
	debugging)

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

	* gthread/gthread-nspr.c, configure.in: Added new default thread
	implementation on top of the mozilla nspr library.

	* gmem.c, gmessaged.c, gthread/gthread.c, gthread/gthread-*.c:
	Changed GStaticMutex and GStaticPrivate in gmem.c and gmessages.c
	into GMutex and GPrivate resp. to make error reporting and use of
	gmem possible in most (not all, though) gthread functions. Also
	initialized the modules via new init functions.

	* configure.in: Fixed syntax bug in definition of type
	GStaticMutex.

	* gthread/testgthread.c: Updated to work with nspr, but see note
	there for remaining problems.

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

	* gmutex.c, glib.h: Now abort, if a mutex/cond/private is
	allocated before the thread system is set up.

	* gthread/gthread.c (g_thread_init): Removed g_thread_try_init(),
	as it is not necessary. Changed the error message. Corrected logic
	for g_thread_use_default_impl.

	* gmutex.c (g_mutex_init): Keep the thread private data array
	after calling g_thread_init().

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

	* gthread/testgthread.c (new_thread): Now also working for posix
	threads; (wait_thread): Now a better implementation, that does not
	use 100% CPU.

	* Made the thread related code follow GNU coding standard.

	* Made a comment (HOLDS:) above each function, that expects the
	given locks to be held.

	* Changed try_lock to trylock throughout.

	* glib.c: Eventually removed the #if 0'ed code for old GStaticMutex.

	* glib.c: Corrected g_trylock macro for G_DEBUG_LOCKS.

	* gmain.c (g_main_poll_add_unlocked): first take a new poll record
	form the poll_free_list.

	* gmem.c, gstrfuncs.c, gutils.c: Made it MT safe.

	* gthraed/*.c: Added copyright headers.

	* gthread/gthread-solaris.c: do not use g_log for errors, as g_log
	uses these module and endless recursions might happen, just use a
	plain fprintf(stderr,...).

	* gthread/gthread.c (g_thread_try_init): Call g_mutex_init().

	* gthread/testgthread.c: updated test program.

Tue Dec  8 18:49:56 1998  Owen Taylor  <otaylor@redhat.com>

	* Start at adding thread-safety. (mostly work
	of Sebastian Wilhelmi <wilhelmi@ira.uka.de>)

	- configure.in now looks for a system thread implementation.
	Currently support is included for POSIX threads
	and Solaris threads. The default support is built
	into a separate library -lgthread.

	- The thread implementation can be modified by passing
	a vector of functions g_thread_init().

	- The default or supplied functions are used to
	implement a small set of thread functions for
	mutexes, condition variables, and thread-private
	data.

	- GLib now uses these functions to provide thread
	safety. (In the sense that all global static
	data is locked... individual structures must still
	be locked by the caller.)

Sat Dec 12 19:08:59 1998  Tim Janik  <timj@gtk.org>

	* configure.in: always define G_HAVE_INLINE if __cplusplus is
 	defined, reported by Wan-Teh Chang <wtc@netscape.com>.

Thu Dec 10 21:49:39 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.7

	* INSTALL:
	  NEWS:
	  README:
	  configure.in:
	  glib.spec:
	  docs/glib-config.1: Increased version to 1.1.7

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
