Sun Feb 21 22:11:51 CST 1999  Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.2.0

	* AUTHORS: updated

Wed Feb 24 00:08:42 CST 1999 Shawn T. Amundson <amundson@gtk.org>

	* *.[ch]: inserted additional note to look for ChangeLog and
	  AUTHORS file for a log of modifications.

Sun Feb 21 14:01:00 1999  Dr Mike <drmike@redhat.com>

	* Made specfile generated, tweaked slightly
	
Thu Feb 18 08:24:12 1999  Tim Janik  <timj@gtk.org>

	* gmem.c (g_realloc): plugged a memory leak, reported by Koen D'Hondt
	<ripley@xs4all.nl> on 15 Oct 1998. allocate inital block from realloc.

1999-02-17  Elliot Lee  <sopwith@redhat.com>

	* glib.spec: Do --enable-debug=no for the .rpm's.

Wed Feb 17 17:04:06 1999  Tor Lillqvist  <tml@iki.fi>

	* config.h.win32: Must define HAVE_PTHREAD_GETSPECIFIC_POSIX.

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 invocation. 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
	invocation.

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 invocation 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 invocation 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 invocation 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
