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
