Fri Sep 17 10:24:45 1999  Tim Janik  <timj@gtk.org>

        * gmem.c (g_mem_chunk_compute_size) (g_mem_chunk_new): applied patch
        from Soeren Sandmann <sandmann@daimi.au.dk>, to force mem chunk's area
        sizes to be a multitiple of atom_size, and to eliminate the MAX_MEM_AREA
        restriction of 65536 bytes. we also catch cases where users pass an area
        size < atom size with a return_if_fail statement now (which is ok,
        because previously this lead to memory corruption anyways).

Thu Sep 16 01:31:43 1999  Tim Janik  <timj@gtk.org>

	* configure.in: version increment to GLib-1.2.5, interface age 5,
	binary age 5.

Thu Aug 26 15:09:36 1999  Tim Janik  <timj@gtk.org>

        * Makefile.am:
        * gmodule/Makefile.am:
        * gthread/Makefile.am: added --export-dynamic so we can load dynmic
        modules, (required, according to the libtool 1.3.3 docu).

Mon Aug 23 14:42:58 CDT 1999 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.2.4

Mon Aug 23 18:29:45 1999  Tim Janik  <timj@gtk.org>

	* configure.in: update version to 1.2.4, interface age 4, binary age 4.

	* NEWS: updates.

	* Makefile.am: require automake 1.4, build README from README.in and
        INSTALL from INSTALL.in in dist-hook.
        
        * README.in:
	* INSTALL.in: new files to autogenerate README and INSTALL from.
	
	* COPYING: update to the GNU LESSER GENERAL PUBLIC LICENSE.

Thursday July 29, 1999 Elliot Lee <sopwith@redhat.com>

	* Makefile.am, tests/Makefile.am: Distribution the .in versions
	  of the various Windoze makefiles.

Thursday July 29, 1999 Elliot Lee <sopwith@redhat.com>

	* Makefile.am: Include various *.in files in EXTRA_DIST

Fri Jul 16 22:18:36 PDT 1999 Manish Singh <yosh@gimp.org>

	* ltconfig
	* ltmain.sh: upgrade to libtool 1.3.3

1999-06-18  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* gdate.c, gstrfuncs.c, gstring.c: Fixed the use of the
	is..... and to..... macros, which take unsigned chars, not chars!
	Thanks to Morten Welinder <terra@diku.dk> for pointing this out.

Thu Jun  3 16:30:31 PDT 1999 Manish Singh <yosh@gimp.org>

	* gerror.c (g_on_error_query): check isatty() before querying so
	we don't loop endlessly

Sat May 29 11:16:29 PDT 1999 Manish Singh <yosh@gimp.org>

	* acinclude.m4
	* config.guess
	* config.status
	* ltconfig
	* ltmain.sh: upgrade to libtool 1.3.2

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

	* gmain.c: provide a poll prototype for SunOS, as they do not do
	it self. Hint from Christian Parg <cparg@fs-design.de>.

Tue May 25 12:23:07 1999  Owen Taylor  <otaylor@redhat.com>

	* gstrfuncs.c (g_strchug): Use g_memmove() not memmove().
	(Reported by Charles Levert <charles@comm.polymtl.ca>)

Mon May 10 22:03:52 CDT 1999 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.2.3

1999-05-08  Tor Lillqvist  <tml@iki.fi>

	* Makefile.am tests/Makefile.am: Correct rules for making the
	win32-related files that are made from corresponding .in files.
	Is there a cleaner way than explicitly writing rules that invoke
	config.status?
	
Sat May  1 10:18:01 PDT 1999 Manish Singh <yosh@gimp.org>

	* acinclude.m4
	* config.guess
	* config.status
	* ltconfig
	* ltmain.sh: upgrade to libtool 1.3

1999-04-30  Tor Lillqvist  <tml@iki.fi>

	* Makefile.am: Don't distribute glibconfig.h.win32.in, but
	glibconfig.h.win32. Generate it when making a dist. Also generate
	makefile.msc and config.h.win32 from corresponding .in files when
	making dist.

	* configure.in: Also substitute @GLIB_INTERFACE_AGE@ and
	@GLIB_BINARY_AGE@ (needed in config.h.win32).
	
	* glibconfig.h.win32.in: Use static mutex structure and initial
	value corresponding to the 1999-04-07 snapshot of pthreads-win32.

	* tests/Makefile.am: Distribute makefile.msc. Generate it when
	making dist.

	* tests/makefile.msc.in: New file.

	* tests/node-test.c: Include <stdlib.h> for exit().

Thu Apr 29 02:16:36 1999  Tim Janik  <timj@gtk.org>

	* gstrfuncs.c: minor code cleanups.

Tue Apr 27 13:11:29 1999  Owen Taylor  <otaylor@redhat.com>

	* gmain.c (g_main_poll): Mask out ERR HUP and NVAL from
	the events field so we don't give IRIX fits.

Tue Apr 20 08:42:22 1999  Tim Janik  <timj@gtk.org>

	* gscanner.c (g_scanner_unexp_token): behave conservative with
	G_TOKEN_IDENTIFIER_NULL and always assume scanner->value.v_string
	to be "null" in that case.

1999-04-20  Havoc Pennington  <hp@pobox.com>

	* gutils.c (g_vsnprintf):  When using the vsnprintf()
	implementation, '\0'-terminate the resulting string
	and return its length rather than -1.

Mon Apr 19 13:42:21 1999  Owen Taylor  <otaylor@redhat.com>

	* gmain.c (g_main_iterate): Added missing
	#ifdef G_THREADS_ENABLED. (I never liked G_THREADS_ENABLED in
	the first place!)

1999-04-18  Havoc Pennington  <hp@pobox.com>

	* gutils.c (g_snprintf): When using the vsnprintf()
	implementation, '\0'-terminate the resulting string
	and return its length rather than -1.

Fri Apr 16 06:52:07 1999  Tim Janik  <timj@gtk.org>

	* gscanner.c (g_scanner_unexp_token): feature G_TOKEN_EOF as a valid
	expected token as well, so we get "- expected end of file" instead of
	"- expected (unknown) token <0>".

Tue Apr 13 16:16:14 CDT 1999 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.2.2

1999-04-12  Elliot Lee  <sopwith@mh69.mh.cuc.edu>

	* g_strchug(): s/strcpy/memmove/

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

	* configure.in: Adjusted the test for an unimplemented
	getpwuid_r. Info from Michael Pruett <mikep@ugcs.caltech.edu>.

Sun Apr 11 15:07:34 1999  Tim Janik  <timj@gtk.org>

	* configure.in: bumped versin number to GLib 1.2.2, interface 2,
	binary 2.
	
	* NEWS: updates.

Sun Apr 11 14:37:06 1999  Tim Janik  <timj@gtk.org>

	* gstrfuncs.c (g_strcasecmp): always check for s1, s2 != NULL.

Sat Apr 10 19:30:50 1999  Tim Janik  <timj@gtk.org>

	* glib.h: removed braces around inline strings for the G_GNUC_FUNCTION
	and G_GNUC_PRETTY_FUNCTION macros, so the macros can be used for compile
	time string concatenation.

Thu Apr  8 19:53:19 1999  Owen Taylor  <otaylor@redhat.com>

	* gmain.c (g_main_iterate): Check for two threads
	calling g_main_iterate at once.

	* gmain.c: If the set of poll file descriptors changes
	during a call to poll(), abort that call, and start
	a new poll. My test program still segfaults
	obscurely on glibc 2.0 (in read()!!!), but now it works on
	glibc 2.1, so I'll blame something else for the other segfault.

1999-03-31  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* configure.in: Fixed slight bug, that made configure hang on some
	systems. Please do not merge this into 1.3 branch. It's taken care
	of differently there. Info from J. Rhett Aultman
	<cuplan@alley.gator.net>
	
Wed Mar 24 21:23:47 CST 1999 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.2.1

	* README:
	  INSTALL: 
	  NEWS: 
	  sanity_check: updated

	* glibconfig.h.win32.in:
	  Makefile.am:
 	  docs/glib-config.1.in:
	  docs/Makefile.am: Added files used to generate new files.

	* glibconfig.h.win32:
	  docs/glib-config.1: Removed, now generated.

	* configure.in: Added to output now-generated files.
	
Tue Mar 23 13:43:39 PST 1999 Manish Singh <yosh@gimp.org>

	* giounix.c: add user_data param to check and prepare functions

Mon Mar 22 03:54:43 1999  Tim Janik  <timj@gtk.org>

	* glib.h:
	* gmain.c: add user_data to the GSource ->check and ->prepare functions,
	so it can be used to e.g. pass a GPollFd.
	(g_main_poll): only add poll records with an events mask != 0 to the
	fd_array. don't even bother calling poll_func() if fds=timeout=0.
	added debugging printouts around poll_func() invokation that can be
	enabled with #define G_MAIN_POLL_DEBUG.

Fri Mar 19 16:29:50 PST 1999 Manish Singh <yosh@gimp.org>

	* acinclude.m4
	* config.guess
	* config.sub
	* ltconfig
	* ltmain.sh: upgrade to libtool 1.2f

	* autogen.sh: libtool is not required to autogen glib

	* acconfig.h: remove WITH_SYMBOL_UNDERSCORE (not explictly
	needed)

1999-03-18  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

	* gmem.c: Fixed another stupid fault of mine: Did
	s/g_static_/g_private_/g

Wed Mar 17 03:17:42 1999  Tim Janik  <timj@gtk.org>
	
	* configure.in bumped versin number to GLib 1.2.1, interface 1,
	binary 1.
	
	* NEWS: updates.

	* glib.h: added GLIB_CHECK_VERSION() macro similar to
	GTK_CHECK_VERSION().

Sun Mar 14 17:50:35 1999  Tim Janik  <timj@gtk.org>

	* gmem.c (g_mem_chunk_*): changed a bunch of g_assert() statements
	to g_return_if_fail().
	(g_mem_profile): 
	(g_mem_chunk_print): 
	(g_mem_chunk_info): removed some extraneous "\n"s at the end of the log
	messages.

	* gtimer.c (g_timer_*):	changed a bunch of g_assert() statements
	to g_return_if_fail().
	* grel.c (g_*): changed a bunch of g_assert() statements to
	g_return_if_fail() and added some extra ones to check relation != NULL.

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

	* configure.in: Also accept _Pctime_r instead of ctime_r, while
	seraching for the right `_REENTRANT' flag. This is for Digital
	UNIX 4.0d. Thanks to Sascha Brawer <sb@adasys.ch>.

Tue Mar  9 23:25:50 1999  Tim Janik  <timj@gtk.org>

	* configure.in: check for working realloc (NULL,).
	* gmem.c (g_realloc): use malloc() for initial allocation on systems
	where realloc(NULL,) will not work (this is the case on SunOS, reported
	by Tom Geiger).

Mon Mar  8 07:42:08 1999  Tim Janik  <timj@gtk.org>

	* ghook.c (g_hook_unref): when !hook_list->is_setup, wrap the
	flag around the call to g_hook_free() to avoid spurious
	warnings (happens during destruction phase).

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

	* glibconfig.h.win32, config.h.win32: Moved G_THREADS_IMPL_POSIX
	from config.h.win32 to glibconfig.h.win32

	* acconfig.h, configure.in, config.h.win32: Added test for DCE
	versions of mutex_trylock and cond_timedwait. The win32 versions
	are posix, aren't they?

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

	* gmem.c: Fixed a stupid cut'n'paste error of mine. Thanks to
	Friedrich Dominicus <Friedrich.Dominicus@inka.de>

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

        * gutils.c (g_get_any_init): Fixed yet another bloody
        implementation of getpwuid_r on AIX. Thanks to Olaf Dietsche
        <olaf.dietsche+list.gtk@netcologne.de>. I would like a configure
        test better than that, but have no idea, how to do that easily.

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 invokation. set hook_free to g_source_destroy_func, this way
	we always invoke the destroy notifiers for user_data and source_data
	after execution of dispatch(). thus, g_source_destroy_func() will always
	be called within the main_loop lock (this wasn't really assured
	before), and can release and reaquire the look around destroy notifier
	invokation.

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

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

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

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

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

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

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

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

	* Merge in current Win32 version:

	* README.win32: More text.

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

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

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

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

	* giowin32.c: New file.

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

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

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

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

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

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

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

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

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

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

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

	* testglib.c: removed unused cruft

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

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

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

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

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

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

	* gstrfuncs.c:
	Do not use vasprintf.

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

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

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

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

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

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

	* testglib.c:
	Make all aux functions static.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* gthread/testgthread.c: cleanups

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

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

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

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

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

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

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

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

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

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

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

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

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

        * Released GLib 1.1.12

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

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

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

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

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

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

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

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

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

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

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

	* testglib.c: Added g_strdup_printf check.

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

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

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

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

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

	* Makefile.am: minor cleanups, mostly cosmetic

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

	* glib.h: added g_strndup_a macro

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

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

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

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

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

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

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

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

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

        * Released GLib 1.1.11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* Released GLib 1.1.9

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

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

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

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

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

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

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

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

	* Released GLib 1.1.8  (CVS tag is GLIB_1_1_8a)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* Made the thread related code follow GNU coding standard.

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

	* Changed try_lock to trylock throughout.

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

	* glib.c: Corrected g_trylock macro for G_DEBUG_LOCKS.

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

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

	* gthraed/*.c: Added copyright headers.

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

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

	* gthread/testgthread.c: updated test program.

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

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

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

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

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

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

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

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

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

	* Released GLib 1.1.7

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

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

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

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

	* Released GLib 1.1.6

	* NEWS: updated

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

	* gmain.c: fixes to #undef HAVE_POLL case

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

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

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

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

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

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

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

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

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

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

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

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

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

	* INSTALL:
          NEWS:
	  README:
	  glib.spec:
	  docs/glib-config.1: Incremented versions to 1.1.6.

Wed Dec  2 02:10:59 1998  Tim Janik  <timj@gtk.org>

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

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

	* incremented GLib version to 1.1.6.

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

	* gdate.c: New file, implements calendrical calculations.

	* glib.h: Added declarations for GDate module.

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

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

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

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

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

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

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

	* ghash.c: implemented incremental freezing facility.

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

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

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

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

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

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

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

        * gutils.c: Initialise need_wakeups.

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

        * gmodule/gmodule.def: Added g_module_build_path.

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

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

        * makefile.msc: A few more comments.

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

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

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

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

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

	* gdataset.c: cleanups wrt automatic initialization.

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

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

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

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

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

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

	* Released GLib 1.1.5

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

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

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

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

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

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

	* testglib.c: Test the new sort functions.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* gmessages.c
	* gscanner.c: #include <config.h> in here too, for HAVE_UNISTD_H

1998-11-01 Tor Lillqvist <tml@iki.fi>

	* glib.def: Added the new functions.

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

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

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

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

Sat Oct 31 05:08:26 1998  Tim Janik  <timj@gtk.org>

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

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

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

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

	* glib.h:
	* gscanner.c:
	(g_scanner_sync_file_offset): new function for file input.
	rewind the filedescriptor to the current buffer position and blow
 	the file read ahead buffer. usefull for third party uses of our
 	filedescriptor, which hooks onto the current scanning position.
	(this became neccessary with the implementation of buffered
	reads).
	(g_scanner_input_file):
	(g_scanner_input_text): automatically blow the read ahead buffer.
	(g_scanner_get_char): blow the read ahead buffer when the end of
	input is reached, i.e. a '\000' char is read.

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

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

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

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

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

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

	* testglib.c: new tests for the endian stuff

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

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

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

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

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

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

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

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

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

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

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

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

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

	* glib.h:
	Changes for Windows:

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

	Added pragmas for Microsoft C to make it more pedantic.

	Marked GLib's global variables for export from DLL.

	Added the function g_strescape that escapes backslashes.

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

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

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

	Removed duplicate declarations of the version variables.

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

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

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

	* gscanner.c:
	Conditionalized inclusion of unistd.h. Added changes for
	Microsoft C. Added CR to the skipped character set. Added small
	workaround for MSC compiler bug in g_scanner_cur_value.

	* gstrfuncs.c:
	Added the function g_strescape, which escapes the backslash
	character. Needed especially when printing Windows filenames.

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

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

	* makefile.lcc makefile.msc:
	New files. Compiler-specific makefiles for LCC-Win32 and
	Microsoft C. Only Microsoft C is actually supported currently.

	* testglib.c:
	Added pathname check cases for Windows. Added workaround for
	bug in the Microsoft runtime library. Improved some tests a bit.

Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>

	* Released GLib 1.1.4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* Makefile.am: added ghook.c.

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

	* glib.h: define G_GNUC_UNUSED.

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

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

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

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

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

	* Released GLib 1.1.3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* config.h.in: removed from repository

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

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

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

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

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

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

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

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

	* configure.in: added -posix check for NeXTStep

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

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

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

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

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

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

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

	* glib.h: inlining hassle. for compilers that don't allow the `inline'
 	keyword, mostly because of strict ANSI C compliance or dumbness, we try
 	to fall back to either `__inline__' or `__inline'.
	we define G_CAN_INLINE, if the compiler seems to be actually *capable*
 	to do function inlining, in which case inline function bodys do make
 	sense. we also define G_INLINE_FUNC to properly export the function
 	prototypes if no inlinig can be performed. we special case most of the
 	stuff, so inline functions can have a normal implementation by defining
 	G_INLINE_FUNC to extern and G_CAN_INLINE to 1.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* glib.h: provide a definition for G_VA_COPY.

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

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

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

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

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

	* glib.h
	* gstrfuncs.c: added g_strndup

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

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

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

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


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

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

	* grel.c: made private functions static.

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

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

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

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

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

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

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

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

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

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

Sun Aug 16 Elliot Lee

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* Released GLib 1.1.2

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

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

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

	* Released GLib 1.1.1

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

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

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

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

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

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

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

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

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

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

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

	* Makefile.am: compile gnode.c.

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

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

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

	* Released GLib 1.1.0

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

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

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

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

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

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

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

	* glib.h: typo fixed for alphas for gint64

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

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

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

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

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

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

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

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

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

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

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

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

	* glib.h: added g_array_length

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* ghash.c: new function, g_hash_table_size

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

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

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

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

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

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

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

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

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

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

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

	* Makefile.am glib.m4 configure.in:

	Moved out from GTK+; added AM_PATH_GLIB macro.

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

	* glib.h: renamed g_const_pointer => gconstpointer

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* gscanner.c: replaced some snprintf with g_snprintf

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* configure.in: preserve automake CFLAGS.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* garray.c: g_rarray_truncate length done correctly

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

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

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

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

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

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

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

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

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

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

	* glist.c: adapted g_list_length and g_list_length.

	* gslist.c: adapted g_slist_length and g_slist_length.

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

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

	* testglib.c: Remove trailing ; after functions

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* added and autoconfigured in a new utility function
	g_strcasecmp

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	* gscanner.c: removed inlines from clist and gscanner

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

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

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

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

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

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

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

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

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

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

	* Started ChangeLog
