mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-09 19:06:15 +01:00
Initial revision
This commit is contained in:
commit
2e0320d57e
17
.cvsignore
Normal file
17
.cvsignore
Normal file
@ -0,0 +1,17 @@
|
||||
*.lo
|
||||
Makefile
|
||||
Makefile.in
|
||||
configure
|
||||
aclocal.m4
|
||||
.deps
|
||||
_libs
|
||||
libglib-1.1.la
|
||||
config.log
|
||||
glibconfig.h
|
||||
glib.h
|
||||
libtool
|
||||
config.status
|
||||
stamp-h
|
||||
.libs
|
||||
testglib
|
||||
config.cache
|
443
ChangeLog
Normal file
443
ChangeLog
Normal file
@ -0,0 +1,443 @@
|
||||
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 wrning on my machine
|
||||
(is va_end undefined 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
|
443
ChangeLog.pre-2-0
Normal file
443
ChangeLog.pre-2-0
Normal file
@ -0,0 +1,443 @@
|
||||
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 wrning on my machine
|
||||
(is va_end undefined 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
|
443
ChangeLog.pre-2-10
Normal file
443
ChangeLog.pre-2-10
Normal file
@ -0,0 +1,443 @@
|
||||
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 wrning on my machine
|
||||
(is va_end undefined 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
|
443
ChangeLog.pre-2-12
Normal file
443
ChangeLog.pre-2-12
Normal file
@ -0,0 +1,443 @@
|
||||
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 wrning on my machine
|
||||
(is va_end undefined 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
|
443
ChangeLog.pre-2-2
Normal file
443
ChangeLog.pre-2-2
Normal file
@ -0,0 +1,443 @@
|
||||
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 wrning on my machine
|
||||
(is va_end undefined 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
|
443
ChangeLog.pre-2-4
Normal file
443
ChangeLog.pre-2-4
Normal file
@ -0,0 +1,443 @@
|
||||
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 wrning on my machine
|
||||
(is va_end undefined 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
|
443
ChangeLog.pre-2-6
Normal file
443
ChangeLog.pre-2-6
Normal file
@ -0,0 +1,443 @@
|
||||
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 wrning on my machine
|
||||
(is va_end undefined 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
|
443
ChangeLog.pre-2-8
Normal file
443
ChangeLog.pre-2-8
Normal file
@ -0,0 +1,443 @@
|
||||
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 wrning on my machine
|
||||
(is va_end undefined 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
|
54
Makefile.am
Normal file
54
Makefile.am
Normal file
@ -0,0 +1,54 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
configincludedir = $(pkglibdir)/include
|
||||
|
||||
bin_SCRIPTS=glib-config
|
||||
|
||||
EXTRA_DIST = \
|
||||
glib.m4
|
||||
|
||||
lib_LTLIBRARIES = libglib-1.1.la
|
||||
|
||||
libglib_1_1_la_SOURCES = \
|
||||
garray.c \
|
||||
gcache.c \
|
||||
gcompletion.c \
|
||||
gdataset.c \
|
||||
gerror.c \
|
||||
ghash.c \
|
||||
glist.c \
|
||||
gmem.c \
|
||||
gmessages.c \
|
||||
gprimes.c \
|
||||
gslist.c \
|
||||
gtimer.c \
|
||||
gtree.c \
|
||||
gstring.c \
|
||||
gscanner.c \
|
||||
gutils.c
|
||||
|
||||
include_HEADERS = \
|
||||
glib.h
|
||||
|
||||
configinclude_DATA = \
|
||||
glibconfig.h
|
||||
|
||||
libglib_1_1_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
|
||||
INCLUDES = -I$(top_srcdir)
|
||||
|
||||
noinst_PROGRAMS = testglib
|
||||
testglib_LDADD = libglib-@LT_RELEASE@.la
|
||||
|
||||
m4datadir = $(datadir)/aclocal
|
||||
m4data_DATA = glib.m4
|
||||
|
||||
.PHONY: files release
|
||||
|
||||
files:
|
||||
@files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \
|
||||
echo $$p; \
|
||||
done
|
||||
|
||||
release:
|
||||
$(MAKE) dist distdir=$(PACKAGE)`date +"%y%m%d"`
|
76
acconfig.h
Normal file
76
acconfig.h
Normal file
@ -0,0 +1,76 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
/* acconfig.h
|
||||
This file is in the public domain.
|
||||
|
||||
Descriptive text for the C preprocessor macros that
|
||||
the distributed Autoconf macros can define.
|
||||
No software package will use all of them; autoheader copies the ones
|
||||
your configure.in uses into your configuration header file templates.
|
||||
|
||||
The entries are in sort -df order: alphabetical, case insensitive,
|
||||
ignoring punctuation (such as underscores). Although this order
|
||||
can split up related entries, it makes it easier to check whether
|
||||
a given entry is in the file.
|
||||
|
||||
Leave the following blank line there!! Autoheader needs it. */
|
||||
|
||||
|
||||
/* Other stuff */
|
||||
|
||||
#undef ENABLE_MEM_CHECK
|
||||
#undef ENABLE_MEM_PROFILE
|
||||
|
||||
#undef G_COMPILED_WITH_DEBUGGING
|
||||
#undef HAVE_BROKEN_WCTYPE
|
||||
#undef HAVE_DOPRNT
|
||||
#undef HAVE_FLOAT_H
|
||||
#undef HAVE_LIMITS_H
|
||||
#undef HAVE_LONG_DOUBLE
|
||||
#undef HAVE_SYS_SELECT_H
|
||||
#undef HAVE_STRERROR
|
||||
#undef HAVE_STRSIGNAL
|
||||
#undef HAVE_VSNPRINTF
|
||||
#undef HAVE_VALUES_H
|
||||
#undef HAVE_VPRINTF
|
||||
#undef HAVE_WCHAR_H
|
||||
#undef HAVE_WCTYPE_H
|
||||
|
||||
#undef NO_FD_SET
|
||||
#undef NO_SYS_ERRLIST
|
||||
#undef NO_SYS_SIGLIST
|
||||
|
||||
#undef SIZEOF_CHAR
|
||||
#undef SIZEOF_SHORT
|
||||
#undef SIZEOF_LONG
|
||||
#undef SIZEOF_INT
|
||||
#undef SIZEOF_VOID_P
|
||||
|
||||
#undef GLIB_MAJOR_VERSION
|
||||
#undef GLIB_MINOR_VERSION
|
||||
#undef GLIB_MICRO_VERSION
|
||||
|
||||
/* #undef PACKAGE */
|
||||
/* #undef VERSION */
|
||||
|
||||
|
||||
/* Leave that blank line there!! Autoheader needs it.
|
||||
If you're adding to this file, keep in mind:
|
||||
The entries are in sort -df order: alphabetical, case insensitive,
|
||||
ignoring punctuation (such as underscores). */
|
50
autogen.sh
Executable file
50
autogen.sh
Executable file
@ -0,0 +1,50 @@
|
||||
#!/bin/sh
|
||||
# Run this to generate all the initial makefiles, etc.
|
||||
|
||||
DIE=0
|
||||
|
||||
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "You must have autoconf installed to compile GLIB."
|
||||
echo "Download the appropriate package for your distribution,"
|
||||
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
|
||||
DIE=1
|
||||
}
|
||||
|
||||
(libtool --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "You must have libtool installed to compile GLIB."
|
||||
echo "Get ftp://alpha.gnu.org/gnu/libtool-1.0h.tar.gz"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
}
|
||||
|
||||
(automake --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "You must have automake installed to compile GLIB."
|
||||
echo "Get ftp://ftp.cygnus.com/pub/home/tromey/automake-1.2d.tar.gz"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
}
|
||||
|
||||
if test "$DIE" -eq 1; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
test -f glib.h || {
|
||||
echo "You must run this script in the top-level GLIB directory"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if test -z "$*"; then
|
||||
echo "I am going to run ./configure with no arguments - if you wish "
|
||||
echo "to pass any to it, please specify them on the $0 command line."
|
||||
fi
|
||||
|
||||
aclocal
|
||||
automake
|
||||
autoconf
|
||||
./configure "$@"
|
||||
|
||||
echo
|
||||
echo "Now type 'make' to compile GLIB."
|
883
config.guess
vendored
Executable file
883
config.guess
vendored
Executable file
@ -0,0 +1,883 @@
|
||||
#! /bin/sh
|
||||
# Attempt to guess a canonical system name.
|
||||
# Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# Written by Per Bothner <bothner@cygnus.com>.
|
||||
# The master version of this file is at the FSF in /home/gd/gnu/lib.
|
||||
#
|
||||
# This script attempts to guess a canonical system name similar to
|
||||
# config.sub. If it succeeds, it prints the system name on stdout, and
|
||||
# exits with 0. Otherwise, it exits with 1.
|
||||
#
|
||||
# The plan is that this can be called by configure scripts if you
|
||||
# don't specify an explicit system type (host/target name).
|
||||
#
|
||||
# Only a few systems have been added to this list; please add others
|
||||
# (but try to keep the structure clean).
|
||||
#
|
||||
|
||||
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
|
||||
# (ghazi@noc.rutgers.edu 8/24/94.)
|
||||
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
|
||||
PATH=$PATH:/.attbin ; export PATH
|
||||
fi
|
||||
|
||||
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
|
||||
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
|
||||
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
|
||||
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
|
||||
|
||||
trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
|
||||
|
||||
# Note: order is significant - the case branches are not exclusive.
|
||||
|
||||
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
alpha:OSF1:*:*)
|
||||
if test $UNAME_RELEASE = "V4.0"; then
|
||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
|
||||
fi
|
||||
# A Vn.n version is a released version.
|
||||
# A Tn.n version is a released field test version.
|
||||
# A Xn.n version is an unreleased experimental baselevel.
|
||||
# 1.2 uses "1.2" for uname -r.
|
||||
cat <<EOF >dummy.s
|
||||
.globl main
|
||||
.ent main
|
||||
main:
|
||||
.frame \$30,0,\$26,0
|
||||
.prologue 0
|
||||
.long 0x47e03d80 # implver $0
|
||||
lda \$2,259
|
||||
.long 0x47e20c21 # amask $2,$1
|
||||
srl \$1,8,\$2
|
||||
sll \$2,2,\$2
|
||||
sll \$0,3,\$0
|
||||
addl \$1,\$0,\$0
|
||||
addl \$2,\$0,\$0
|
||||
ret \$31,(\$26),1
|
||||
.end main
|
||||
EOF
|
||||
${CC-cc} dummy.s -o dummy 2>/dev/null
|
||||
if test "$?" = 0 ; then
|
||||
./dummy
|
||||
case "$?" in
|
||||
7)
|
||||
UNAME_MACHINE="alpha"
|
||||
;;
|
||||
15)
|
||||
UNAME_MACHINE="alphaev5"
|
||||
;;
|
||||
14)
|
||||
UNAME_MACHINE="alphaev56"
|
||||
;;
|
||||
10)
|
||||
UNAME_MACHINE="alphapca56"
|
||||
;;
|
||||
16)
|
||||
UNAME_MACHINE="alphaev6"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
rm -f dummy.s dummy
|
||||
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
|
||||
exit 0 ;;
|
||||
21064:Windows_NT:50:3)
|
||||
echo alpha-dec-winnt3.5
|
||||
exit 0 ;;
|
||||
Amiga*:UNIX_System_V:4.0:*)
|
||||
echo m68k-cbm-sysv4
|
||||
exit 0;;
|
||||
amiga:NetBSD:*:*)
|
||||
echo m68k-cbm-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
amiga:OpenBSD:*:*)
|
||||
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
arc64:OpenBSD:*:*)
|
||||
echo mips64el-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
arc:OpenBSD:*:*)
|
||||
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
hkmips:OpenBSD:*:*)
|
||||
echo mips-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
pmax:OpenBSD:*:*)
|
||||
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
sgi:OpenBSD:*:*)
|
||||
echo mips-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
wgrisc:OpenBSD:*:*)
|
||||
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
|
||||
echo arm-acorn-riscix${UNAME_RELEASE}
|
||||
exit 0;;
|
||||
arm32:NetBSD:*:*)
|
||||
echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||
exit 0 ;;
|
||||
SR2?01:HI-UX/MPP:*:*)
|
||||
echo hppa1.1-hitachi-hiuxmpp
|
||||
exit 0;;
|
||||
Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
|
||||
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
|
||||
if test "`(/bin/universe) 2>/dev/null`" = att ; then
|
||||
echo pyramid-pyramid-sysv3
|
||||
else
|
||||
echo pyramid-pyramid-bsd
|
||||
fi
|
||||
exit 0 ;;
|
||||
NILE:*:*:dcosx)
|
||||
echo pyramid-pyramid-svr4
|
||||
exit 0 ;;
|
||||
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
|
||||
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit 0 ;;
|
||||
i86pc:SunOS:5.*:*)
|
||||
echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit 0 ;;
|
||||
sun4*:SunOS:6*:*)
|
||||
# According to config.sub, this is the proper way to canonicalize
|
||||
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
|
||||
# it's likely to be more like Solaris than SunOS4.
|
||||
echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit 0 ;;
|
||||
sun4*:SunOS:*:*)
|
||||
case "`/usr/bin/arch -k`" in
|
||||
Series*|S4*)
|
||||
UNAME_RELEASE=`uname -v`
|
||||
;;
|
||||
esac
|
||||
# Japanese Language versions have a version number like `4.1.3-JL'.
|
||||
echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
|
||||
exit 0 ;;
|
||||
sun3*:SunOS:*:*)
|
||||
echo m68k-sun-sunos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
sun*:*:4.2BSD:*)
|
||||
UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
|
||||
test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
|
||||
case "`/bin/arch`" in
|
||||
sun3)
|
||||
echo m68k-sun-sunos${UNAME_RELEASE}
|
||||
;;
|
||||
sun4)
|
||||
echo sparc-sun-sunos${UNAME_RELEASE}
|
||||
;;
|
||||
esac
|
||||
exit 0 ;;
|
||||
aushp:SunOS:*:*)
|
||||
echo sparc-auspex-sunos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
atari*:NetBSD:*:*)
|
||||
echo m68k-atari-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
atari*:OpenBSD:*:*)
|
||||
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
sun3*:NetBSD:*:*)
|
||||
echo m68k-sun-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
sun3*:OpenBSD:*:*)
|
||||
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
mac68k:NetBSD:*:*)
|
||||
echo m68k-apple-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
mac68k:OpenBSD:*:*)
|
||||
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
mvme68k:OpenBSD:*:*)
|
||||
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
mvme88k:OpenBSD:*:*)
|
||||
echo m88k-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
powerpc:machten:*:*)
|
||||
echo powerpc-apple-machten${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
RISC*:Mach:*:*)
|
||||
echo mips-dec-mach_bsd4.3
|
||||
exit 0 ;;
|
||||
RISC*:ULTRIX:*:*)
|
||||
echo mips-dec-ultrix${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
VAX*:ULTRIX*:*:*)
|
||||
echo vax-dec-ultrix${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
2020:CLIX:*:*)
|
||||
echo clipper-intergraph-clix${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
mips:*:*:UMIPS | mips:*:*:RISCos)
|
||||
sed 's/^ //' << EOF >dummy.c
|
||||
int main (argc, argv) int argc; char **argv; {
|
||||
#if defined (host_mips) && defined (MIPSEB)
|
||||
#if defined (SYSTYPE_SYSV)
|
||||
printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
|
||||
#endif
|
||||
#if defined (SYSTYPE_SVR4)
|
||||
printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
|
||||
#endif
|
||||
#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
|
||||
printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
|
||||
#endif
|
||||
#endif
|
||||
exit (-1);
|
||||
}
|
||||
EOF
|
||||
${CC-cc} dummy.c -o dummy \
|
||||
&& ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
|
||||
&& rm dummy.c dummy && exit 0
|
||||
rm -f dummy.c dummy
|
||||
echo mips-mips-riscos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
Night_Hawk:Power_UNIX:*:*)
|
||||
echo powerpc-harris-powerunix
|
||||
exit 0 ;;
|
||||
m88k:CX/UX:7*:*)
|
||||
echo m88k-harris-cxux7
|
||||
exit 0 ;;
|
||||
m88k:*:4*:R4*)
|
||||
echo m88k-motorola-sysv4
|
||||
exit 0 ;;
|
||||
m88k:*:3*:R3*)
|
||||
echo m88k-motorola-sysv3
|
||||
exit 0 ;;
|
||||
AViiON:dgux:*:*)
|
||||
# DG/UX returns AViiON for all architectures
|
||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||
if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
|
||||
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
|
||||
-o ${TARGET_BINARY_INTERFACE}x = x ] ; then
|
||||
echo m88k-dg-dgux${UNAME_RELEASE}
|
||||
else
|
||||
echo m88k-dg-dguxbcs${UNAME_RELEASE}
|
||||
fi
|
||||
else echo i586-dg-dgux${UNAME_RELEASE}
|
||||
fi
|
||||
exit 0 ;;
|
||||
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
|
||||
echo m88k-dolphin-sysv3
|
||||
exit 0 ;;
|
||||
M88*:*:R3*:*)
|
||||
# Delta 88k system running SVR3
|
||||
echo m88k-motorola-sysv3
|
||||
exit 0 ;;
|
||||
XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
|
||||
echo m88k-tektronix-sysv3
|
||||
exit 0 ;;
|
||||
Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
|
||||
echo m68k-tektronix-bsd
|
||||
exit 0 ;;
|
||||
*:IRIX*:*:*)
|
||||
echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
|
||||
exit 0 ;;
|
||||
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
|
||||
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
|
||||
exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
|
||||
i?86:AIX:*:*)
|
||||
echo i386-ibm-aix
|
||||
exit 0 ;;
|
||||
*:AIX:2:3)
|
||||
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
|
||||
sed 's/^ //' << EOF >dummy.c
|
||||
#include <sys/systemcfg.h>
|
||||
|
||||
main()
|
||||
{
|
||||
if (!__power_pc())
|
||||
exit(1);
|
||||
puts("powerpc-ibm-aix3.2.5");
|
||||
exit(0);
|
||||
}
|
||||
EOF
|
||||
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
|
||||
rm -f dummy.c dummy
|
||||
echo rs6000-ibm-aix3.2.5
|
||||
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
|
||||
echo rs6000-ibm-aix3.2.4
|
||||
else
|
||||
echo rs6000-ibm-aix3.2
|
||||
fi
|
||||
exit 0 ;;
|
||||
*:AIX:*:4)
|
||||
if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
|
||||
IBM_ARCH=rs6000
|
||||
else
|
||||
IBM_ARCH=powerpc
|
||||
fi
|
||||
if [ -x /usr/bin/oslevel ] ; then
|
||||
IBM_REV=`/usr/bin/oslevel`
|
||||
else
|
||||
IBM_REV=4.${UNAME_RELEASE}
|
||||
fi
|
||||
echo ${IBM_ARCH}-ibm-aix${IBM_REV}
|
||||
exit 0 ;;
|
||||
*:AIX:*:*)
|
||||
echo rs6000-ibm-aix
|
||||
exit 0 ;;
|
||||
ibmrt:4.4BSD:*|romp-ibm:BSD:*)
|
||||
echo romp-ibm-bsd4.4
|
||||
exit 0 ;;
|
||||
ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
|
||||
echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
|
||||
exit 0 ;; # report: romp-ibm BSD 4.3
|
||||
*:BOSX:*:*)
|
||||
echo rs6000-bull-bosx
|
||||
exit 0 ;;
|
||||
DPX/2?00:B.O.S.:*:*)
|
||||
echo m68k-bull-sysv3
|
||||
exit 0 ;;
|
||||
9000/[34]??:4.3bsd:1.*:*)
|
||||
echo m68k-hp-bsd
|
||||
exit 0 ;;
|
||||
hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
|
||||
echo m68k-hp-bsd4.4
|
||||
exit 0 ;;
|
||||
9000/[3478]??:HP-UX:*:*)
|
||||
case "${UNAME_MACHINE}" in
|
||||
9000/31? ) HP_ARCH=m68000 ;;
|
||||
9000/[34]?? ) HP_ARCH=m68k ;;
|
||||
9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
|
||||
9000/8?? ) HP_ARCH=hppa1.0 ;;
|
||||
esac
|
||||
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
|
||||
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
|
||||
exit 0 ;;
|
||||
3050*:HI-UX:*:*)
|
||||
sed 's/^ //' << EOF >dummy.c
|
||||
#include <unistd.h>
|
||||
int
|
||||
main ()
|
||||
{
|
||||
long cpu = sysconf (_SC_CPU_VERSION);
|
||||
/* The order matters, because CPU_IS_HP_MC68K erroneously returns
|
||||
true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
|
||||
results, however. */
|
||||
if (CPU_IS_PA_RISC (cpu))
|
||||
{
|
||||
switch (cpu)
|
||||
{
|
||||
case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
|
||||
case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
|
||||
case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
|
||||
default: puts ("hppa-hitachi-hiuxwe2"); break;
|
||||
}
|
||||
}
|
||||
else if (CPU_IS_HP_MC68K (cpu))
|
||||
puts ("m68k-hitachi-hiuxwe2");
|
||||
else puts ("unknown-hitachi-hiuxwe2");
|
||||
exit (0);
|
||||
}
|
||||
EOF
|
||||
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
|
||||
rm -f dummy.c dummy
|
||||
echo unknown-hitachi-hiuxwe2
|
||||
exit 0 ;;
|
||||
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
|
||||
echo hppa1.1-hp-bsd
|
||||
exit 0 ;;
|
||||
9000/8??:4.3bsd:*:*)
|
||||
echo hppa1.0-hp-bsd
|
||||
exit 0 ;;
|
||||
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
|
||||
echo hppa1.1-hp-osf
|
||||
exit 0 ;;
|
||||
hp8??:OSF1:*:*)
|
||||
echo hppa1.0-hp-osf
|
||||
exit 0 ;;
|
||||
i?86:OSF1:*:*)
|
||||
if [ -x /usr/sbin/sysversion ] ; then
|
||||
echo ${UNAME_MACHINE}-unknown-osf1mk
|
||||
else
|
||||
echo ${UNAME_MACHINE}-unknown-osf1
|
||||
fi
|
||||
exit 0 ;;
|
||||
parisc*:Lites*:*:*)
|
||||
echo hppa1.1-hp-lites
|
||||
exit 0 ;;
|
||||
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
|
||||
echo c1-convex-bsd
|
||||
exit 0 ;;
|
||||
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
|
||||
if getsysinfo -f scalar_acc
|
||||
then echo c32-convex-bsd
|
||||
else echo c2-convex-bsd
|
||||
fi
|
||||
exit 0 ;;
|
||||
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
|
||||
echo c34-convex-bsd
|
||||
exit 0 ;;
|
||||
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
|
||||
echo c38-convex-bsd
|
||||
exit 0 ;;
|
||||
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
|
||||
echo c4-convex-bsd
|
||||
exit 0 ;;
|
||||
CRAY*X-MP:*:*:*)
|
||||
echo xmp-cray-unicos
|
||||
exit 0 ;;
|
||||
CRAY*Y-MP:*:*:*)
|
||||
echo ymp-cray-unicos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
CRAY*[A-Z]90:*:*:*)
|
||||
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
|
||||
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
|
||||
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
|
||||
exit 0 ;;
|
||||
CRAY*TS:*:*:*)
|
||||
echo t90-cray-unicos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
CRAY-2:*:*:*)
|
||||
echo cray2-cray-unicos
|
||||
exit 0 ;;
|
||||
F300:UNIX_System_V:*:*)
|
||||
FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
|
||||
echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
exit 0 ;;
|
||||
F301:UNIX_System_V:*:*)
|
||||
echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
|
||||
exit 0 ;;
|
||||
hp3[0-9][05]:NetBSD:*:*)
|
||||
echo m68k-hp-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
hp300:OpenBSD:*:*)
|
||||
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
i?86:BSD/386:*:* | *:BSD/OS:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
*:FreeBSD:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
|
||||
exit 0 ;;
|
||||
*:NetBSD:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||
exit 0 ;;
|
||||
*:OpenBSD:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||
exit 0 ;;
|
||||
i*:CYGWIN*:*)
|
||||
echo i386-pc-cygwin32
|
||||
exit 0 ;;
|
||||
i*:MINGW*:*)
|
||||
echo i386-pc-mingw32
|
||||
exit 0 ;;
|
||||
p*:CYGWIN*:*)
|
||||
echo powerpcle-unknown-cygwin32
|
||||
exit 0 ;;
|
||||
prep*:SunOS:5.*:*)
|
||||
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit 0 ;;
|
||||
*:GNU:*:*)
|
||||
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
|
||||
exit 0 ;;
|
||||
*:Linux:*:*)
|
||||
# The BFD linker knows what the default object file format is, so
|
||||
# first see if it will tell us.
|
||||
ld_help_string=`ld --help 2>&1`
|
||||
ld_supported_emulations=`echo $ld_help_string \
|
||||
| sed -ne '/supported emulations:/!d
|
||||
s/[ ][ ]*/ /g
|
||||
s/.*supported emulations: *//
|
||||
s/ .*//
|
||||
p'`
|
||||
case "$ld_supported_emulations" in
|
||||
i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
|
||||
i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
|
||||
sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
|
||||
m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
|
||||
elf32ppc) echo "powerpc-unknown-linux-gnu" ; exit 0 ;;
|
||||
esac
|
||||
|
||||
if test "${UNAME_MACHINE}" = "alpha" ; then
|
||||
sed 's/^ //' <<EOF >dummy.s
|
||||
.globl main
|
||||
.ent main
|
||||
main:
|
||||
.frame \$30,0,\$26,0
|
||||
.prologue 0
|
||||
.long 0x47e03d80 # implver $0
|
||||
lda \$2,259
|
||||
.long 0x47e20c21 # amask $2,$1
|
||||
srl \$1,8,\$2
|
||||
sll \$2,2,\$2
|
||||
sll \$0,3,\$0
|
||||
addl \$1,\$0,\$0
|
||||
addl \$2,\$0,\$0
|
||||
ret \$31,(\$26),1
|
||||
.end main
|
||||
EOF
|
||||
LIBC=""
|
||||
${CC-cc} dummy.s -o dummy 2>/dev/null
|
||||
if test "$?" = 0 ; then
|
||||
./dummy
|
||||
case "$?" in
|
||||
7)
|
||||
UNAME_MACHINE="alpha"
|
||||
;;
|
||||
15)
|
||||
UNAME_MACHINE="alphaev5"
|
||||
;;
|
||||
14)
|
||||
UNAME_MACHINE="alphaev56"
|
||||
;;
|
||||
10)
|
||||
UNAME_MACHINE="alphapca56"
|
||||
;;
|
||||
16)
|
||||
UNAME_MACHINE="alphaev6"
|
||||
;;
|
||||
esac
|
||||
|
||||
objdump --private-headers dummy | \
|
||||
grep ld.so.1 > /dev/null
|
||||
if test "$?" = 0 ; then
|
||||
LIBC="libc1"
|
||||
fi
|
||||
fi
|
||||
rm -f dummy.s dummy
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
|
||||
elif test "${UNAME_MACHINE}" = "mips" ; then
|
||||
cat >dummy.c <<EOF
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
#ifdef __MIPSEB__
|
||||
printf ("%s-unknown-linux-gnu\n", argv[1]);
|
||||
#endif
|
||||
#ifdef __MIPSEL__
|
||||
printf ("%sel-unknown-linux-gnu\n", argv[1]);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
|
||||
rm -f dummy.c dummy
|
||||
else
|
||||
# Either a pre-BFD a.out linker (linux-gnuoldld)
|
||||
# or one that does not give us useful --help.
|
||||
# GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
|
||||
# If ld does not provide *any* "supported emulations:"
|
||||
# that means it is gnuoldld.
|
||||
echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
|
||||
test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
|
||||
|
||||
case "${UNAME_MACHINE}" in
|
||||
i?86)
|
||||
VENDOR=pc;
|
||||
;;
|
||||
*)
|
||||
VENDOR=unknown;
|
||||
;;
|
||||
esac
|
||||
# Determine whether the default compiler is a.out or elf
|
||||
cat >dummy.c <<EOF
|
||||
#include <features.h>
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
#ifdef __ELF__
|
||||
# ifdef __GLIBC__
|
||||
# if __GLIBC__ >= 2
|
||||
printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
|
||||
# else
|
||||
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||
# endif
|
||||
# else
|
||||
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||
# endif
|
||||
#else
|
||||
printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
|
||||
rm -f dummy.c dummy
|
||||
fi ;;
|
||||
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
|
||||
# are messed up and put the nodename in both sysname and nodename.
|
||||
i?86:DYNIX/ptx:4*:*)
|
||||
echo i386-sequent-sysv4
|
||||
exit 0 ;;
|
||||
i?86:UNIX_SV:4.2MP:2.*)
|
||||
# Unixware is an offshoot of SVR4, but it has its own version
|
||||
# number series starting with 2...
|
||||
# I am not positive that other SVR4 systems won't match this,
|
||||
# I just have to hope. -- rms.
|
||||
# Use sysv4.2uw... so that sysv4* matches it.
|
||||
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
|
||||
exit 0 ;;
|
||||
i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
|
||||
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
|
||||
echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
|
||||
else
|
||||
echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
|
||||
fi
|
||||
exit 0 ;;
|
||||
i?86:*:3.2:*)
|
||||
if test -f /usr/options/cb.name; then
|
||||
UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
|
||||
echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
|
||||
elif /bin/uname -X 2>/dev/null >/dev/null ; then
|
||||
UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
|
||||
(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
|
||||
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
|
||||
&& UNAME_MACHINE=i586
|
||||
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
|
||||
else
|
||||
echo ${UNAME_MACHINE}-pc-sysv32
|
||||
fi
|
||||
exit 0 ;;
|
||||
pc:*:*:*)
|
||||
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
||||
# the processor, so we play safe by assuming i386.
|
||||
echo i386-pc-msdosdjgpp
|
||||
exit 0 ;;
|
||||
Intel:Mach:3*:*)
|
||||
echo i386-pc-mach3
|
||||
exit 0 ;;
|
||||
paragon:*:*:*)
|
||||
echo i860-intel-osf1
|
||||
exit 0 ;;
|
||||
i860:*:4.*:*) # i860-SVR4
|
||||
if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
|
||||
echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
|
||||
else # Add other i860-SVR4 vendors below as they are discovered.
|
||||
echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
|
||||
fi
|
||||
exit 0 ;;
|
||||
mini*:CTIX:SYS*5:*)
|
||||
# "miniframe"
|
||||
echo m68010-convergent-sysv
|
||||
exit 0 ;;
|
||||
M68*:*:R3V[567]*:*)
|
||||
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
|
||||
3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
|
||||
OS_REL=''
|
||||
test -r /etc/.relid \
|
||||
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& echo i486-ncr-sysv4.3${OS_REL} && exit 0
|
||||
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||
&& echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
|
||||
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& echo i486-ncr-sysv4 && exit 0 ;;
|
||||
m68*:LynxOS:2.*:*)
|
||||
echo m68k-unknown-lynxos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
mc68030:UNIX_System_V:4.*:*)
|
||||
echo m68k-atari-sysv4
|
||||
exit 0 ;;
|
||||
i?86:LynxOS:2.*:*)
|
||||
echo i386-unknown-lynxos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
TSUNAMI:LynxOS:2.*:*)
|
||||
echo sparc-unknown-lynxos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
|
||||
echo rs6000-unknown-lynxos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
SM[BE]S:UNIX_SV:*:*)
|
||||
echo mips-dde-sysv${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
RM*:SINIX-*:*:*)
|
||||
echo mips-sni-sysv4
|
||||
exit 0 ;;
|
||||
*:SINIX-*:*:*)
|
||||
if uname -p 2>/dev/null >/dev/null ; then
|
||||
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||
echo ${UNAME_MACHINE}-sni-sysv4
|
||||
else
|
||||
echo ns32k-sni-sysv
|
||||
fi
|
||||
exit 0 ;;
|
||||
PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||
echo i586-unisys-sysv4
|
||||
exit 0 ;;
|
||||
*:UNIX_System_V:4*:FTX*)
|
||||
# From Gerald Hewes <hewes@openmarket.com>.
|
||||
# How about differentiating between stratus architectures? -djm
|
||||
echo hppa1.1-stratus-sysv4
|
||||
exit 0 ;;
|
||||
*:*:*:FTX*)
|
||||
# From seanf@swdc.stratus.com.
|
||||
echo i860-stratus-sysv4
|
||||
exit 0 ;;
|
||||
mc68*:A/UX:*:*)
|
||||
echo m68k-apple-aux${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
news*:NEWS-OS:*:6*)
|
||||
echo mips-sony-newsos6
|
||||
exit 0 ;;
|
||||
R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*)
|
||||
if [ -d /usr/nec ]; then
|
||||
echo mips-nec-sysv${UNAME_RELEASE}
|
||||
else
|
||||
echo mips-unknown-sysv${UNAME_RELEASE}
|
||||
fi
|
||||
exit 0 ;;
|
||||
esac
|
||||
|
||||
#echo '(No uname command or uname output not recognized.)' 1>&2
|
||||
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
|
||||
|
||||
cat >dummy.c <<EOF
|
||||
#ifdef _SEQUENT_
|
||||
# include <sys/types.h>
|
||||
# include <sys/utsname.h>
|
||||
#endif
|
||||
main ()
|
||||
{
|
||||
#if defined (sony)
|
||||
#if defined (MIPSEB)
|
||||
/* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
|
||||
I don't know.... */
|
||||
printf ("mips-sony-bsd\n"); exit (0);
|
||||
#else
|
||||
#include <sys/param.h>
|
||||
printf ("m68k-sony-newsos%s\n",
|
||||
#ifdef NEWSOS4
|
||||
"4"
|
||||
#else
|
||||
""
|
||||
#endif
|
||||
); exit (0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined (__arm) && defined (__acorn) && defined (__unix)
|
||||
printf ("arm-acorn-riscix"); exit (0);
|
||||
#endif
|
||||
|
||||
#if defined (hp300) && !defined (hpux)
|
||||
printf ("m68k-hp-bsd\n"); exit (0);
|
||||
#endif
|
||||
|
||||
#if defined (NeXT)
|
||||
#if !defined (__ARCHITECTURE__)
|
||||
#define __ARCHITECTURE__ "m68k"
|
||||
#endif
|
||||
int version;
|
||||
version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
|
||||
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
|
||||
exit (0);
|
||||
#endif
|
||||
|
||||
#if defined (MULTIMAX) || defined (n16)
|
||||
#if defined (UMAXV)
|
||||
printf ("ns32k-encore-sysv\n"); exit (0);
|
||||
#else
|
||||
#if defined (CMU)
|
||||
printf ("ns32k-encore-mach\n"); exit (0);
|
||||
#else
|
||||
printf ("ns32k-encore-bsd\n"); exit (0);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined (__386BSD__)
|
||||
printf ("i386-pc-bsd\n"); exit (0);
|
||||
#endif
|
||||
|
||||
#if defined (sequent)
|
||||
#if defined (i386)
|
||||
printf ("i386-sequent-dynix\n"); exit (0);
|
||||
#endif
|
||||
#if defined (ns32000)
|
||||
printf ("ns32k-sequent-dynix\n"); exit (0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined (_SEQUENT_)
|
||||
struct utsname un;
|
||||
|
||||
uname(&un);
|
||||
|
||||
if (strncmp(un.version, "V2", 2) == 0) {
|
||||
printf ("i386-sequent-ptx2\n"); exit (0);
|
||||
}
|
||||
if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
|
||||
printf ("i386-sequent-ptx1\n"); exit (0);
|
||||
}
|
||||
printf ("i386-sequent-ptx\n"); exit (0);
|
||||
|
||||
#endif
|
||||
|
||||
#if defined (vax)
|
||||
#if !defined (ultrix)
|
||||
printf ("vax-dec-bsd\n"); exit (0);
|
||||
#else
|
||||
printf ("vax-dec-ultrix\n"); exit (0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined (alliant) && defined (i860)
|
||||
printf ("i860-alliant-bsd\n"); exit (0);
|
||||
#endif
|
||||
|
||||
exit (1);
|
||||
}
|
||||
EOF
|
||||
|
||||
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
|
||||
rm -f dummy.c dummy
|
||||
|
||||
# Apollos put the system type in the environment.
|
||||
|
||||
test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
|
||||
|
||||
# Convex versions that predate uname can use getsysinfo(1)
|
||||
|
||||
if [ -x /usr/convex/getsysinfo ]
|
||||
then
|
||||
case `getsysinfo -f cpu_type` in
|
||||
c1*)
|
||||
echo c1-convex-bsd
|
||||
exit 0 ;;
|
||||
c2*)
|
||||
if getsysinfo -f scalar_acc
|
||||
then echo c32-convex-bsd
|
||||
else echo c2-convex-bsd
|
||||
fi
|
||||
exit 0 ;;
|
||||
c34*)
|
||||
echo c34-convex-bsd
|
||||
exit 0 ;;
|
||||
c38*)
|
||||
echo c38-convex-bsd
|
||||
exit 0 ;;
|
||||
c4*)
|
||||
echo c4-convex-bsd
|
||||
exit 0 ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
#echo '(Unable to guess system type)' 1>&2
|
||||
|
||||
exit 1
|
81
config.h.in
Normal file
81
config.h.in
Normal file
@ -0,0 +1,81 @@
|
||||
/* config.h.in. Generated automatically from configure.in by autoheader. */
|
||||
|
||||
/* Define to empty if the keyword does not work. */
|
||||
#undef const
|
||||
|
||||
/* Define if you don't have vprintf but do have _doprnt. */
|
||||
#undef HAVE_DOPRNT
|
||||
|
||||
/* Define if you have the vprintf function. */
|
||||
#undef HAVE_VPRINTF
|
||||
|
||||
/* Define as __inline if that's what the C compiler calls it. */
|
||||
#undef inline
|
||||
|
||||
/* Define if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Other stuff */
|
||||
#undef G_COMPILED_WITH_DEBUGGING
|
||||
#undef HAVE_BROKEN_WCTYPE
|
||||
#undef HAVE_DOPRNT
|
||||
#undef HAVE_FLOAT_H
|
||||
#undef HAVE_LIMITS_H
|
||||
#undef HAVE_LONG_DOUBLE
|
||||
#undef HAVE_SYS_SELECT_H
|
||||
#undef HAVE_STRERROR
|
||||
#undef HAVE_STRSIGNAL
|
||||
#undef HAVE_VSNPRINTF
|
||||
#undef HAVE_VALUES_H
|
||||
#undef HAVE_VPRINTF
|
||||
#undef HAVE_WCHAR_H
|
||||
#undef HAVE_WCTYPE_H
|
||||
|
||||
#undef NO_FD_SET
|
||||
#undef NO_SYS_ERRLIST
|
||||
#undef NO_SYS_SIGLIST
|
||||
|
||||
/* The number of bytes in a char. */
|
||||
#undef SIZEOF_CHAR
|
||||
|
||||
/* The number of bytes in a int. */
|
||||
#undef SIZEOF_INT
|
||||
|
||||
/* The number of bytes in a long. */
|
||||
#undef SIZEOF_LONG
|
||||
|
||||
/* The number of bytes in a short. */
|
||||
#undef SIZEOF_SHORT
|
||||
|
||||
/* The number of bytes in a void *. */
|
||||
#undef SIZEOF_VOID_P
|
||||
|
||||
/* Define if you have the atexit function. */
|
||||
#undef HAVE_ATEXIT
|
||||
|
||||
/* Define if you have the memmove function. */
|
||||
#undef HAVE_MEMMOVE
|
||||
|
||||
/* Define if you have the on_exit function. */
|
||||
#undef HAVE_ON_EXIT
|
||||
|
||||
/* Define if you have the strcasecmp function. */
|
||||
#undef HAVE_STRCASECMP
|
||||
|
||||
/* Define if you have the strerror function. */
|
||||
#undef HAVE_STRERROR
|
||||
|
||||
/* Define if you have the strsignal function. */
|
||||
#undef HAVE_STRSIGNAL
|
||||
|
||||
/* Define if you have the vsnprintf function. */
|
||||
#undef HAVE_VSNPRINTF
|
||||
|
||||
/* Define if you have the <float.h> header file. */
|
||||
#undef HAVE_FLOAT_H
|
||||
|
||||
/* Define if you have the <limits.h> header file. */
|
||||
#undef HAVE_LIMITS_H
|
||||
|
||||
/* Define if you have the <values.h> header file. */
|
||||
#undef HAVE_VALUES_H
|
954
config.sub
vendored
Executable file
954
config.sub
vendored
Executable file
@ -0,0 +1,954 @@
|
||||
#! /bin/sh
|
||||
# Configuration validation subroutine script, version 1.1.
|
||||
# Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
# can handle that machine. It does not imply ALL GNU software can.
|
||||
#
|
||||
# This file is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||
# Supply the specified configuration type as an argument.
|
||||
# If it is invalid, we print an error message on stderr and exit with code 1.
|
||||
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||
|
||||
# This file is supposed to be the same for all GNU packages
|
||||
# and recognize all the CPU types, system types and aliases
|
||||
# that are meaningful with *any* GNU software.
|
||||
# Each package is responsible for reporting which valid configurations
|
||||
# it does not support. The user should be able to distinguish
|
||||
# a failure to support a valid configuration from a meaningless
|
||||
# configuration.
|
||||
|
||||
# The goal of this file is to map all the various variations of a given
|
||||
# machine specification into a single specification in the form:
|
||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
|
||||
# or in some cases, the newer four-part form:
|
||||
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
||||
# It is wrong to echo any other type of specification.
|
||||
|
||||
if [ x$1 = x ]
|
||||
then
|
||||
echo Configuration name missing. 1>&2
|
||||
echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
|
||||
echo "or $0 ALIAS" 1>&2
|
||||
echo where ALIAS is a recognized configuration type. 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# First pass through any local machine types.
|
||||
case $1 in
|
||||
*local*)
|
||||
echo $1
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
|
||||
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
case $maybe_os in
|
||||
linux-gnu*)
|
||||
os=-$maybe_os
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
;;
|
||||
*)
|
||||
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||
if [ $basic_machine != $1 ]
|
||||
then os=`echo $1 | sed 's/.*-/-/'`
|
||||
else os=; fi
|
||||
;;
|
||||
esac
|
||||
|
||||
### Let's recognize common machines as not being operating systems so
|
||||
### that things like config.sub decstation-3100 work. We also
|
||||
### recognize some manufacturers as not being operating systems, so we
|
||||
### can provide default operating systems below.
|
||||
case $os in
|
||||
-sun*os*)
|
||||
# Prevent following clause from handling this invalid input.
|
||||
;;
|
||||
-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
|
||||
-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
|
||||
-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
|
||||
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||
-apple)
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
-hiux*)
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
-sco5)
|
||||
os=sco3.2v5
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco4)
|
||||
os=-sco3.2v4
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco3.2.[4-9]*)
|
||||
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco3.2v[4-9]*)
|
||||
# Don't forget version if it is 3.2v4 or newer.
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco*)
|
||||
os=-sco3.2v2
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-isc)
|
||||
os=-isc2.2
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-clix*)
|
||||
basic_machine=clipper-intergraph
|
||||
;;
|
||||
-isc*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-lynx*)
|
||||
os=-lynxos
|
||||
;;
|
||||
-ptx*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
|
||||
;;
|
||||
-windowsnt*)
|
||||
os=`echo $os | sed -e 's/windowsnt/winnt/'`
|
||||
;;
|
||||
-psos*)
|
||||
os=-psos
|
||||
;;
|
||||
esac
|
||||
|
||||
# Decode aliases for certain CPU-COMPANY combinations.
|
||||
case $basic_machine in
|
||||
# Recognize the basic CPU types without company name.
|
||||
# Some are omitted here because they have special meanings below.
|
||||
tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
|
||||
| arme[lb] | pyramid | mn10200 | mn10300 \
|
||||
| tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
|
||||
| alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
|
||||
| i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
|
||||
| mips64 | mipsel | mips64el | mips64orion | mips64orionel \
|
||||
| mipstx39 | mipstx39el \
|
||||
| sparc | sparclet | sparclite | sparc64 | v850)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
# We use `pc' rather than `unknown'
|
||||
# because (1) that's what they normally are, and
|
||||
# (2) the word "unknown" tends to confuse beginning users.
|
||||
i[3456]86)
|
||||
basic_machine=$basic_machine-pc
|
||||
;;
|
||||
# Object if more than one company name word.
|
||||
*-*-*)
|
||||
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
|
||||
exit 1
|
||||
;;
|
||||
# Recognize the basic CPU types with company name.
|
||||
vax-* | tahoe-* | i[3456]86-* | i860-* | m32r-* | m68k-* | m68000-* \
|
||||
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
|
||||
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
|
||||
| power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
|
||||
| xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* \
|
||||
| alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
|
||||
| ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
|
||||
| sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
|
||||
| sparc64-* | mips64-* | mipsel-* \
|
||||
| mips64el-* | mips64orion-* | mips64orionel-* \
|
||||
| mipstx39-* | mipstx39el-* \
|
||||
| f301-*)
|
||||
;;
|
||||
# Recognize the various machine names and aliases which stand
|
||||
# for a CPU type and a company and sometimes even an OS.
|
||||
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
|
||||
basic_machine=m68000-att
|
||||
;;
|
||||
3b*)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
alliant | fx80)
|
||||
basic_machine=fx80-alliant
|
||||
;;
|
||||
altos | altos3068)
|
||||
basic_machine=m68k-altos
|
||||
;;
|
||||
am29k)
|
||||
basic_machine=a29k-none
|
||||
os=-bsd
|
||||
;;
|
||||
amdahl)
|
||||
basic_machine=580-amdahl
|
||||
os=-sysv
|
||||
;;
|
||||
amiga | amiga-*)
|
||||
basic_machine=m68k-cbm
|
||||
;;
|
||||
amigaos | amigados)
|
||||
basic_machine=m68k-cbm
|
||||
os=-amigaos
|
||||
;;
|
||||
amigaunix | amix)
|
||||
basic_machine=m68k-cbm
|
||||
os=-sysv4
|
||||
;;
|
||||
apollo68)
|
||||
basic_machine=m68k-apollo
|
||||
os=-sysv
|
||||
;;
|
||||
aux)
|
||||
basic_machine=m68k-apple
|
||||
os=-aux
|
||||
;;
|
||||
balance)
|
||||
basic_machine=ns32k-sequent
|
||||
os=-dynix
|
||||
;;
|
||||
convex-c1)
|
||||
basic_machine=c1-convex
|
||||
os=-bsd
|
||||
;;
|
||||
convex-c2)
|
||||
basic_machine=c2-convex
|
||||
os=-bsd
|
||||
;;
|
||||
convex-c32)
|
||||
basic_machine=c32-convex
|
||||
os=-bsd
|
||||
;;
|
||||
convex-c34)
|
||||
basic_machine=c34-convex
|
||||
os=-bsd
|
||||
;;
|
||||
convex-c38)
|
||||
basic_machine=c38-convex
|
||||
os=-bsd
|
||||
;;
|
||||
cray | ymp)
|
||||
basic_machine=ymp-cray
|
||||
os=-unicos
|
||||
;;
|
||||
cray2)
|
||||
basic_machine=cray2-cray
|
||||
os=-unicos
|
||||
;;
|
||||
[ctj]90-cray)
|
||||
basic_machine=c90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
crds | unos)
|
||||
basic_machine=m68k-crds
|
||||
;;
|
||||
da30 | da30-*)
|
||||
basic_machine=m68k-da30
|
||||
;;
|
||||
decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
|
||||
basic_machine=mips-dec
|
||||
;;
|
||||
delta | 3300 | motorola-3300 | motorola-delta \
|
||||
| 3300-motorola | delta-motorola)
|
||||
basic_machine=m68k-motorola
|
||||
;;
|
||||
delta88)
|
||||
basic_machine=m88k-motorola
|
||||
os=-sysv3
|
||||
;;
|
||||
dpx20 | dpx20-*)
|
||||
basic_machine=rs6000-bull
|
||||
os=-bosx
|
||||
;;
|
||||
dpx2* | dpx2*-bull)
|
||||
basic_machine=m68k-bull
|
||||
os=-sysv3
|
||||
;;
|
||||
ebmon29k)
|
||||
basic_machine=a29k-amd
|
||||
os=-ebmon
|
||||
;;
|
||||
elxsi)
|
||||
basic_machine=elxsi-elxsi
|
||||
os=-bsd
|
||||
;;
|
||||
encore | umax | mmax)
|
||||
basic_machine=ns32k-encore
|
||||
;;
|
||||
fx2800)
|
||||
basic_machine=i860-alliant
|
||||
;;
|
||||
genix)
|
||||
basic_machine=ns32k-ns
|
||||
;;
|
||||
gmicro)
|
||||
basic_machine=tron-gmicro
|
||||
os=-sysv
|
||||
;;
|
||||
h3050r* | hiux*)
|
||||
basic_machine=hppa1.1-hitachi
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
h8300hms)
|
||||
basic_machine=h8300-hitachi
|
||||
os=-hms
|
||||
;;
|
||||
harris)
|
||||
basic_machine=m88k-harris
|
||||
os=-sysv3
|
||||
;;
|
||||
hp300-*)
|
||||
basic_machine=m68k-hp
|
||||
;;
|
||||
hp300bsd)
|
||||
basic_machine=m68k-hp
|
||||
os=-bsd
|
||||
;;
|
||||
hp300hpux)
|
||||
basic_machine=m68k-hp
|
||||
os=-hpux
|
||||
;;
|
||||
hp9k2[0-9][0-9] | hp9k31[0-9])
|
||||
basic_machine=m68000-hp
|
||||
;;
|
||||
hp9k3[2-9][0-9])
|
||||
basic_machine=m68k-hp
|
||||
;;
|
||||
hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
|
||||
basic_machine=hppa1.1-hp
|
||||
;;
|
||||
hp9k8[0-9][0-9] | hp8[0-9][0-9])
|
||||
basic_machine=hppa1.0-hp
|
||||
;;
|
||||
hppa-next)
|
||||
os=-nextstep3
|
||||
;;
|
||||
i370-ibm* | ibm*)
|
||||
basic_machine=i370-ibm
|
||||
os=-mvs
|
||||
;;
|
||||
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
||||
i[3456]86v32)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv32
|
||||
;;
|
||||
i[3456]86v4*)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv4
|
||||
;;
|
||||
i[3456]86v)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv
|
||||
;;
|
||||
i[3456]86sol2)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
os=-solaris2
|
||||
;;
|
||||
iris | iris4d)
|
||||
basic_machine=mips-sgi
|
||||
case $os in
|
||||
-irix*)
|
||||
;;
|
||||
*)
|
||||
os=-irix4
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
isi68 | isi)
|
||||
basic_machine=m68k-isi
|
||||
os=-sysv
|
||||
;;
|
||||
m88k-omron*)
|
||||
basic_machine=m88k-omron
|
||||
;;
|
||||
magnum | m3230)
|
||||
basic_machine=mips-mips
|
||||
os=-sysv
|
||||
;;
|
||||
merlin)
|
||||
basic_machine=ns32k-utek
|
||||
os=-sysv
|
||||
;;
|
||||
miniframe)
|
||||
basic_machine=m68000-convergent
|
||||
;;
|
||||
mipsel*-linux*)
|
||||
basic_machine=mipsel-unknown
|
||||
os=-linux-gnu
|
||||
;;
|
||||
mips*-linux*)
|
||||
basic_machine=mips-unknown
|
||||
os=-linux-gnu
|
||||
;;
|
||||
mips3*-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
|
||||
;;
|
||||
mips3*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
|
||||
;;
|
||||
ncr3000)
|
||||
basic_machine=i486-ncr
|
||||
os=-sysv4
|
||||
;;
|
||||
news | news700 | news800 | news900)
|
||||
basic_machine=m68k-sony
|
||||
os=-newsos
|
||||
;;
|
||||
news1000)
|
||||
basic_machine=m68030-sony
|
||||
os=-newsos
|
||||
;;
|
||||
news-3600 | risc-news)
|
||||
basic_machine=mips-sony
|
||||
os=-newsos
|
||||
;;
|
||||
next | m*-next )
|
||||
basic_machine=m68k-next
|
||||
case $os in
|
||||
-nextstep* )
|
||||
;;
|
||||
-ns2*)
|
||||
os=-nextstep2
|
||||
;;
|
||||
*)
|
||||
os=-nextstep3
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
nh3000)
|
||||
basic_machine=m68k-harris
|
||||
os=-cxux
|
||||
;;
|
||||
nh[45]000)
|
||||
basic_machine=m88k-harris
|
||||
os=-cxux
|
||||
;;
|
||||
nindy960)
|
||||
basic_machine=i960-intel
|
||||
os=-nindy
|
||||
;;
|
||||
np1)
|
||||
basic_machine=np1-gould
|
||||
;;
|
||||
pa-hitachi)
|
||||
basic_machine=hppa1.1-hitachi
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
paragon)
|
||||
basic_machine=i860-intel
|
||||
os=-osf
|
||||
;;
|
||||
pbd)
|
||||
basic_machine=sparc-tti
|
||||
;;
|
||||
pbb)
|
||||
basic_machine=m68k-tti
|
||||
;;
|
||||
pc532 | pc532-*)
|
||||
basic_machine=ns32k-pc532
|
||||
;;
|
||||
pentium | p5)
|
||||
basic_machine=i586-intel
|
||||
;;
|
||||
pentiumpro | p6)
|
||||
basic_machine=i686-intel
|
||||
;;
|
||||
pentium-* | p5-*)
|
||||
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
pentiumpro-* | p6-*)
|
||||
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
k5)
|
||||
# We don't have specific support for AMD's K5 yet, so just call it a Pentium
|
||||
basic_machine=i586-amd
|
||||
;;
|
||||
nexen)
|
||||
# We don't have specific support for Nexgen yet, so just call it a Pentium
|
||||
basic_machine=i586-nexgen
|
||||
;;
|
||||
pn)
|
||||
basic_machine=pn-gould
|
||||
;;
|
||||
power) basic_machine=rs6000-ibm
|
||||
;;
|
||||
ppc) basic_machine=powerpc-unknown
|
||||
;;
|
||||
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||
basic_machine=powerpcle-unknown
|
||||
;;
|
||||
ppcle-* | powerpclittle-*)
|
||||
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ps2)
|
||||
basic_machine=i386-ibm
|
||||
;;
|
||||
rm[46]00)
|
||||
basic_machine=mips-siemens
|
||||
;;
|
||||
rtpc | rtpc-*)
|
||||
basic_machine=romp-ibm
|
||||
;;
|
||||
sequent)
|
||||
basic_machine=i386-sequent
|
||||
;;
|
||||
sh)
|
||||
basic_machine=sh-hitachi
|
||||
os=-hms
|
||||
;;
|
||||
sps7)
|
||||
basic_machine=m68k-bull
|
||||
os=-sysv2
|
||||
;;
|
||||
spur)
|
||||
basic_machine=spur-unknown
|
||||
;;
|
||||
sun2)
|
||||
basic_machine=m68000-sun
|
||||
;;
|
||||
sun2os3)
|
||||
basic_machine=m68000-sun
|
||||
os=-sunos3
|
||||
;;
|
||||
sun2os4)
|
||||
basic_machine=m68000-sun
|
||||
os=-sunos4
|
||||
;;
|
||||
sun3os3)
|
||||
basic_machine=m68k-sun
|
||||
os=-sunos3
|
||||
;;
|
||||
sun3os4)
|
||||
basic_machine=m68k-sun
|
||||
os=-sunos4
|
||||
;;
|
||||
sun4os3)
|
||||
basic_machine=sparc-sun
|
||||
os=-sunos3
|
||||
;;
|
||||
sun4os4)
|
||||
basic_machine=sparc-sun
|
||||
os=-sunos4
|
||||
;;
|
||||
sun4sol2)
|
||||
basic_machine=sparc-sun
|
||||
os=-solaris2
|
||||
;;
|
||||
sun3 | sun3-*)
|
||||
basic_machine=m68k-sun
|
||||
;;
|
||||
sun4)
|
||||
basic_machine=sparc-sun
|
||||
;;
|
||||
sun386 | sun386i | roadrunner)
|
||||
basic_machine=i386-sun
|
||||
;;
|
||||
symmetry)
|
||||
basic_machine=i386-sequent
|
||||
os=-dynix
|
||||
;;
|
||||
tx39)
|
||||
basic_machine=mipstx39-unknown
|
||||
;;
|
||||
tx39el)
|
||||
basic_machine=mipstx39el-unknown
|
||||
;;
|
||||
tower | tower-32)
|
||||
basic_machine=m68k-ncr
|
||||
;;
|
||||
udi29k)
|
||||
basic_machine=a29k-amd
|
||||
os=-udi
|
||||
;;
|
||||
ultra3)
|
||||
basic_machine=a29k-nyu
|
||||
os=-sym1
|
||||
;;
|
||||
vaxv)
|
||||
basic_machine=vax-dec
|
||||
os=-sysv
|
||||
;;
|
||||
vms)
|
||||
basic_machine=vax-dec
|
||||
os=-vms
|
||||
;;
|
||||
vpp*|vx|vx-*)
|
||||
basic_machine=f301-fujitsu
|
||||
;;
|
||||
vxworks960)
|
||||
basic_machine=i960-wrs
|
||||
os=-vxworks
|
||||
;;
|
||||
vxworks68)
|
||||
basic_machine=m68k-wrs
|
||||
os=-vxworks
|
||||
;;
|
||||
vxworks29k)
|
||||
basic_machine=a29k-wrs
|
||||
os=-vxworks
|
||||
;;
|
||||
xmp)
|
||||
basic_machine=xmp-cray
|
||||
os=-unicos
|
||||
;;
|
||||
xps | xps100)
|
||||
basic_machine=xps100-honeywell
|
||||
;;
|
||||
none)
|
||||
basic_machine=none-none
|
||||
os=-none
|
||||
;;
|
||||
|
||||
# Here we handle the default manufacturer of certain CPU types. It is in
|
||||
# some cases the only manufacturer, in others, it is the most popular.
|
||||
mips)
|
||||
if [ x$os = x-linux-gnu ]; then
|
||||
basic_machine=mips-unknown
|
||||
else
|
||||
basic_machine=mips-mips
|
||||
fi
|
||||
;;
|
||||
romp)
|
||||
basic_machine=romp-ibm
|
||||
;;
|
||||
rs6000)
|
||||
basic_machine=rs6000-ibm
|
||||
;;
|
||||
vax)
|
||||
basic_machine=vax-dec
|
||||
;;
|
||||
pdp11)
|
||||
basic_machine=pdp11-dec
|
||||
;;
|
||||
we32k)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
sparc)
|
||||
basic_machine=sparc-sun
|
||||
;;
|
||||
cydra)
|
||||
basic_machine=cydra-cydrome
|
||||
;;
|
||||
orion)
|
||||
basic_machine=orion-highlevel
|
||||
;;
|
||||
orion105)
|
||||
basic_machine=clipper-highlevel
|
||||
;;
|
||||
*)
|
||||
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Here we canonicalize certain aliases for manufacturers.
|
||||
case $basic_machine in
|
||||
*-digital*)
|
||||
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
|
||||
;;
|
||||
*-commodore*)
|
||||
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# Decode manufacturer-specific aliases for certain operating systems.
|
||||
|
||||
if [ x"$os" != x"" ]
|
||||
then
|
||||
case $os in
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# -solaris* is a basic system type, with this one exception.
|
||||
-solaris1 | -solaris1.*)
|
||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||
;;
|
||||
-solaris)
|
||||
os=-solaris2
|
||||
;;
|
||||
-svr4*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-unixware*)
|
||||
os=-sysv4.2uw
|
||||
;;
|
||||
-gnu/linux*)
|
||||
os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
|
||||
;;
|
||||
# First accept the basic system types.
|
||||
# The portable systems comes first.
|
||||
# Each alternative MUST END IN A *, to match a version number.
|
||||
# -sysv* is not here because it comes later, after sysvr4.
|
||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||
| -aos* \
|
||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||
| -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
|
||||
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -uxpv*)
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-linux*)
|
||||
os=`echo $os | sed -e 's|linux|linux-gnu|'`
|
||||
;;
|
||||
-sunos5*)
|
||||
os=`echo $os | sed -e 's|sunos5|solaris2|'`
|
||||
;;
|
||||
-sunos6*)
|
||||
os=`echo $os | sed -e 's|sunos6|solaris3|'`
|
||||
;;
|
||||
-osfrose*)
|
||||
os=-osfrose
|
||||
;;
|
||||
-osf*)
|
||||
os=-osf
|
||||
;;
|
||||
-utek*)
|
||||
os=-bsd
|
||||
;;
|
||||
-dynix*)
|
||||
os=-bsd
|
||||
;;
|
||||
-acis*)
|
||||
os=-aos
|
||||
;;
|
||||
-ctix* | -uts*)
|
||||
os=-sysv
|
||||
;;
|
||||
-ns2 )
|
||||
os=-nextstep2
|
||||
;;
|
||||
# Preserve the version number of sinix5.
|
||||
-sinix5.*)
|
||||
os=`echo $os | sed -e 's|sinix|sysv|'`
|
||||
;;
|
||||
-sinix*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-triton*)
|
||||
os=-sysv3
|
||||
;;
|
||||
-oss*)
|
||||
os=-sysv3
|
||||
;;
|
||||
-svr4)
|
||||
os=-sysv4
|
||||
;;
|
||||
-svr3)
|
||||
os=-sysv3
|
||||
;;
|
||||
-sysvr4)
|
||||
os=-sysv4
|
||||
;;
|
||||
# This must come after -sysvr4.
|
||||
-sysv*)
|
||||
;;
|
||||
-xenix)
|
||||
os=-xenix
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
# Get rid of the `-' at the beginning of $os.
|
||||
os=`echo $os | sed 's/[^-]*-//'`
|
||||
echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
else
|
||||
|
||||
# Here we handle the default operating systems that come with various machines.
|
||||
# The value should be what the vendor currently ships out the door with their
|
||||
# machine or put another way, the most popular os provided with the machine.
|
||||
|
||||
# Note that if you're going to try to match "-MANUFACTURER" here (say,
|
||||
# "-sun"), then you have to tell the case statement up towards the top
|
||||
# that MANUFACTURER isn't an operating system. Otherwise, code above
|
||||
# will signal an error saying that MANUFACTURER isn't an operating
|
||||
# system, and we'll never get to this point.
|
||||
|
||||
case $basic_machine in
|
||||
*-acorn)
|
||||
os=-riscix1.2
|
||||
;;
|
||||
arm*-semi)
|
||||
os=-aout
|
||||
;;
|
||||
pdp11-*)
|
||||
os=-none
|
||||
;;
|
||||
*-dec | vax-*)
|
||||
os=-ultrix4.2
|
||||
;;
|
||||
m68*-apollo)
|
||||
os=-domain
|
||||
;;
|
||||
i386-sun)
|
||||
os=-sunos4.0.2
|
||||
;;
|
||||
m68000-sun)
|
||||
os=-sunos3
|
||||
# This also exists in the configure program, but was not the
|
||||
# default.
|
||||
# os=-sunos4
|
||||
;;
|
||||
*-tti) # must be before sparc entry or we get the wrong os.
|
||||
os=-sysv3
|
||||
;;
|
||||
sparc-* | *-sun)
|
||||
os=-sunos4.1.1
|
||||
;;
|
||||
*-ibm)
|
||||
os=-aix
|
||||
;;
|
||||
*-hp)
|
||||
os=-hpux
|
||||
;;
|
||||
*-hitachi)
|
||||
os=-hiux
|
||||
;;
|
||||
i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
|
||||
os=-sysv
|
||||
;;
|
||||
*-cbm)
|
||||
os=-amigaos
|
||||
;;
|
||||
*-dg)
|
||||
os=-dgux
|
||||
;;
|
||||
*-dolphin)
|
||||
os=-sysv3
|
||||
;;
|
||||
m68k-ccur)
|
||||
os=-rtu
|
||||
;;
|
||||
m88k-omron*)
|
||||
os=-luna
|
||||
;;
|
||||
*-next )
|
||||
os=-nextstep
|
||||
;;
|
||||
*-sequent)
|
||||
os=-ptx
|
||||
;;
|
||||
*-crds)
|
||||
os=-unos
|
||||
;;
|
||||
*-ns)
|
||||
os=-genix
|
||||
;;
|
||||
i370-*)
|
||||
os=-mvs
|
||||
;;
|
||||
*-next)
|
||||
os=-nextstep3
|
||||
;;
|
||||
*-gould)
|
||||
os=-sysv
|
||||
;;
|
||||
*-highlevel)
|
||||
os=-bsd
|
||||
;;
|
||||
*-encore)
|
||||
os=-bsd
|
||||
;;
|
||||
*-sgi)
|
||||
os=-irix
|
||||
;;
|
||||
*-siemens)
|
||||
os=-sysv4
|
||||
;;
|
||||
*-masscomp)
|
||||
os=-rtu
|
||||
;;
|
||||
f301-fujitsu)
|
||||
os=-uxpv
|
||||
;;
|
||||
*)
|
||||
os=-none
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Here we handle the case where we know the os, and the CPU type, but not the
|
||||
# manufacturer. We pick the logical manufacturer.
|
||||
vendor=unknown
|
||||
case $basic_machine in
|
||||
*-unknown)
|
||||
case $os in
|
||||
-riscix*)
|
||||
vendor=acorn
|
||||
;;
|
||||
-sunos*)
|
||||
vendor=sun
|
||||
;;
|
||||
-aix*)
|
||||
vendor=ibm
|
||||
;;
|
||||
-hpux*)
|
||||
vendor=hp
|
||||
;;
|
||||
-hiux*)
|
||||
vendor=hitachi
|
||||
;;
|
||||
-unos*)
|
||||
vendor=crds
|
||||
;;
|
||||
-dgux*)
|
||||
vendor=dg
|
||||
;;
|
||||
-luna*)
|
||||
vendor=omron
|
||||
;;
|
||||
-genix*)
|
||||
vendor=ns
|
||||
;;
|
||||
-mvs*)
|
||||
vendor=ibm
|
||||
;;
|
||||
-ptx*)
|
||||
vendor=sequent
|
||||
;;
|
||||
-vxsim* | -vxworks*)
|
||||
vendor=wrs
|
||||
;;
|
||||
-aux*)
|
||||
vendor=apple
|
||||
;;
|
||||
esac
|
||||
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
|
||||
;;
|
||||
esac
|
||||
|
||||
echo $basic_machine$os
|
221
configure.in
Normal file
221
configure.in
Normal file
@ -0,0 +1,221 @@
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
AC_INIT(glist.c)
|
||||
|
||||
# Save this value here, since automake will set cflags later
|
||||
cflags_set=${CFLAGS+set}
|
||||
|
||||
# Making releases:
|
||||
# GLIB_MICRO_VERSION += 1;
|
||||
# GLIB_INTERFACE_AGE += 1;
|
||||
# GLIB_BINARY_AGE += 1;
|
||||
# if any functions have been added, set GLIB_INTERFACE_AGE to 0.
|
||||
# if backwards compatibility has been broken,
|
||||
# set GLIB_BINARY_AGE and GLIB_INTERFACE_AGE to 0.
|
||||
#
|
||||
GLIB_MAJOR_VERSION=1
|
||||
GLIB_MINOR_VERSION=1
|
||||
GLIB_MICRO_VERSION=0
|
||||
GLIB_INTERFACE_AGE=0
|
||||
GLIB_BINARY_AGE=0
|
||||
GLIB_VERSION=$GLIB_MAJOR_VERSION.$GLIB_MINOR_VERSION.$GLIB_MICRO_VERSION
|
||||
AC_SUBST(GLIB_VERSION)
|
||||
|
||||
# libtool versioning
|
||||
LT_RELEASE=$GLIB_MAJOR_VERSION.$GLIB_MINOR_VERSION
|
||||
LT_CURRENT=`expr $GLIB_MICRO_VERSION - $GLIB_INTERFACE_AGE`
|
||||
LT_REVISION=$GLIB_INTERFACE_AGE
|
||||
LT_AGE=`expr $GLIB_BINARY_AGE - $GLIB_INTERFACE_AGE`
|
||||
AC_SUBST(LT_RELEASE)
|
||||
AC_SUBST(LT_CURRENT)
|
||||
AC_SUBST(LT_REVISION)
|
||||
AC_SUBST(LT_AGE)
|
||||
|
||||
VERSION=$GLIB_VERSION
|
||||
PACKAGE=glib
|
||||
|
||||
AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define)
|
||||
|
||||
# Specify a configuration file
|
||||
AM_CONFIG_HEADER(glibconfig.h)
|
||||
|
||||
AC_DEFINE_UNQUOTED(GLIB_MAJOR_VERSION, $GLIB_MAJOR_VERSION)
|
||||
AC_DEFINE_UNQUOTED(GLIB_MINOR_VERSION, $GLIB_MINOR_VERSION)
|
||||
AC_DEFINE_UNQUOTED(GLIB_MICRO_VERSION, $GLIB_MICRO_VERSION)
|
||||
|
||||
dnl Initialize libtool
|
||||
AM_PROG_LIBTOOL
|
||||
|
||||
dnl Initialize maintainer mode
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
AC_ARG_ENABLE(debug, [ --enable-debug=[no/minimum/yes] turn on debugging [default=minimum]],,enable_debug=minimum)
|
||||
AC_ARG_ENABLE(mem_check, [ --enable-mem-check=[no/yes] turn on malloc/free sanity checking [default=no]],,enable_mem_check=no)
|
||||
AC_ARG_ENABLE(mem_profile, [ --enable-mem-profile=[no/yes] turn on malloc profiling atexit [default=no]],,enable_mem_profile=no)
|
||||
|
||||
AC_ARG_ENABLE(ansi, [ --enable-ansi turn on strict ansi [default=no]],
|
||||
, enable_ansi=no)
|
||||
|
||||
echo -n "Enabling memory checking... "
|
||||
if test "x$enable_mem_check" = "xyes"; then
|
||||
AC_DEFINE(ENABLE_MEM_CHECK, 1)
|
||||
AC_SUBST(ENABLE_MEM_CHECK)
|
||||
echo "yes"
|
||||
else
|
||||
echo "no"
|
||||
fi
|
||||
|
||||
echo -n "Enabling memory profiling... "
|
||||
if test "x$enable_mem_profile" = "xyes"; then
|
||||
AC_DEFINE(ENABLE_MEM_PROFILE, 1)
|
||||
AC_SUBST(ENABLE_MEM_PROFILE)
|
||||
echo "yes"
|
||||
else
|
||||
echo "no"
|
||||
fi
|
||||
|
||||
if test "x$enable_debug" = "xyes"; then
|
||||
test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
|
||||
CFLAGS="$CFLAGS -DG_ENABLE_DEBUG"
|
||||
else
|
||||
if test "x$enable_debug" = "xno"; then
|
||||
CFLAGS="$CFLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS"
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(G_COMPILED_WITH_DEBUGGING, "${enable_debug}")
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
AM_PROG_CC_STDC
|
||||
AC_PROG_INSTALL
|
||||
|
||||
if eval "test x$GCC = xyes"; then
|
||||
if eval test -z \"`echo "$CFLAGS" | grep "\-Wall" 2> /dev/null`\" ; then
|
||||
CFLAGS="$CFLAGS -Wall"
|
||||
fi
|
||||
|
||||
if eval "test x$enable_ansi = xyes"; then
|
||||
if eval test -z \"`echo "$CFLAGS" | grep "\-ansi" 2> /dev/null`\" ; then
|
||||
CFLAGS="$CFLAGS -ansi"
|
||||
fi
|
||||
|
||||
if eval test -z \"`echo "$CFLAGS" | grep "\-pedantic" 2> /dev/null`\" ; then
|
||||
CFLAGS="$CFLAGS -pedantic"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_VPRINTF
|
||||
|
||||
AC_CHECK_FUNCS(atexit on_exit)
|
||||
|
||||
AC_CHECK_SIZEOF(char)
|
||||
AC_CHECK_SIZEOF(short)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
AC_CHECK_SIZEOF(int)
|
||||
AC_CHECK_SIZEOF(void *)
|
||||
|
||||
# long doubles were not used, and a portability problem
|
||||
# AC_C_LONG_DOUBLE
|
||||
AC_C_CONST
|
||||
AC_C_INLINE
|
||||
|
||||
AC_CHECK_HEADERS(float.h, AC_DEFINE(HAVE_FLOAT_H))
|
||||
AC_CHECK_HEADERS(limits.h, AC_DEFINE(HAVE_LIMITS_H))
|
||||
AC_CHECK_HEADERS(values.h, AC_DEFINE(HAVE_VALUES_H))
|
||||
|
||||
# Check for strerror, strsignal, memmove, vsnprintf, and strcasecmp functions
|
||||
AC_CHECK_FUNCS(strerror strsignal memmove vsnprintf strcasecmp)
|
||||
|
||||
# Check for sys_errlist
|
||||
AC_MSG_CHECKING(sys_errlist)
|
||||
AC_TRY_LINK(, [
|
||||
extern char *sys_errlist[];
|
||||
extern int sys_nerr;
|
||||
sys_errlist[sys_nerr-1][0] = 0;
|
||||
], glib_ok=yes, glib_ok=no)
|
||||
AC_MSG_RESULT($glib_ok)
|
||||
if test $glib_ok = no; then
|
||||
AC_DEFINE(NO_SYS_ERRLIST)
|
||||
fi
|
||||
|
||||
# Check for sys_siglist
|
||||
AC_MSG_CHECKING(sys_siglist)
|
||||
AC_TRY_LINK(, [
|
||||
extern char *sys_siglist[];
|
||||
sys_siglist[1][0] = 0;
|
||||
], glib_ok=yes, glib_ok=no)
|
||||
AC_MSG_RESULT($glib_ok)
|
||||
if test $glib_ok = no; then
|
||||
AC_DEFINE(NO_SYS_SIGLIST)
|
||||
fi
|
||||
|
||||
# Check for sys/select.h
|
||||
|
||||
AC_MSG_CHECKING([fd_set and sys/select])
|
||||
AC_TRY_COMPILE([#include <sys/types.h>],
|
||||
[fd_set readMask, writeMask;], gtk_ok=yes, gtk_ok=no)
|
||||
if test $gtk_ok = no; then
|
||||
AC_HEADER_EGREP(fd_mask, sys/select.h, gtk_ok=yes)
|
||||
if test $gtk_ok = yes; then
|
||||
AC_DEFINE(HAVE_SYS_SELECT_H)
|
||||
fi
|
||||
fi
|
||||
AC_MSG_RESULT($gtk_ok)
|
||||
if test $gtk_ok = no; then
|
||||
AC_DEFINE(NO_FD_SET)
|
||||
fi
|
||||
|
||||
# This stuff is here, only so that we can define these
|
||||
# things in glibconfig.h. If ../config.h was installed
|
||||
# (under some other name?) then the definitions would
|
||||
# belong there. (They are only used in GDK)
|
||||
|
||||
# Check for wchar.h
|
||||
|
||||
AC_MSG_CHECKING(for wchar.h)
|
||||
AC_TRY_CPP([#include <wchar.h>], gtk_ok=yes, gtk_ok=no)
|
||||
if test $gtk_ok = yes; then
|
||||
AC_DEFINE(HAVE_WCHAR_H)
|
||||
fi
|
||||
AC_MSG_RESULT($gtk_ok)
|
||||
|
||||
# Check for wctype.h (for iswalnum)
|
||||
|
||||
AC_MSG_CHECKING(for wctype.h)
|
||||
AC_TRY_CPP([#include <wctype.h>], gtk_ok=yes, gtk_ok=no)
|
||||
if test $gtk_ok = yes; then
|
||||
AC_DEFINE(HAVE_WCTYPE_H)
|
||||
fi
|
||||
AC_MSG_RESULT($gtk_ok)
|
||||
|
||||
# The following is necessary for Linux libc-5.4.38
|
||||
|
||||
AC_MSG_CHECKING(if iswalnum() and friends are properly defined)
|
||||
AC_TRY_LINK([#include <stdlib.h>],[
|
||||
#if (defined(HAVE_WCTYPE_H) || defined(HAVE_WCHAR_H))
|
||||
# ifdef HAVE_WCTYPE_H
|
||||
# include <wctype.h>
|
||||
# else
|
||||
# ifdef HAVE_WCHAR_H
|
||||
# include <wchar.h>
|
||||
# endif
|
||||
# endif
|
||||
#else
|
||||
# define iswalnum(c) ((wchar_t)(c) <= 0xFF && isalnum(c))
|
||||
#endif
|
||||
iswalnum((wchar_t) 0);
|
||||
], gtk_ok=yes, gtk_ok=no)
|
||||
|
||||
if test $gtk_ok = no; then
|
||||
AC_DEFINE(HAVE_BROKEN_WCTYPE)
|
||||
fi
|
||||
AC_MSG_RESULT($gtk_ok)
|
||||
|
||||
AC_OUTPUT([Makefile glib-config],[chmod +x glib-config])
|
143
garray.c
Normal file
143
garray.c
Normal file
@ -0,0 +1,143 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
#define MIN_ARRAY_SIZE 16
|
||||
|
||||
|
||||
typedef struct _GRealArray GRealArray;
|
||||
|
||||
struct _GRealArray
|
||||
{
|
||||
guint8 *data;
|
||||
guint len;
|
||||
guint alloc;
|
||||
guint zero_terminated;
|
||||
};
|
||||
|
||||
|
||||
static gint g_nearest_pow (gint num);
|
||||
static void g_array_maybe_expand (GRealArray *array,
|
||||
gint len);
|
||||
|
||||
|
||||
static GMemChunk *array_mem_chunk = NULL;
|
||||
|
||||
|
||||
GArray*
|
||||
g_array_new (gint zero_terminated)
|
||||
{
|
||||
GRealArray *array;
|
||||
|
||||
if (!array_mem_chunk)
|
||||
array_mem_chunk = g_mem_chunk_new ("array mem chunk",
|
||||
sizeof (GRealArray),
|
||||
1024, G_ALLOC_AND_FREE);
|
||||
|
||||
array = g_chunk_new (GRealArray, array_mem_chunk);
|
||||
|
||||
array->data = NULL;
|
||||
array->len = 0;
|
||||
array->alloc = 0;
|
||||
array->zero_terminated = (zero_terminated ? 1 : 0);
|
||||
|
||||
return (GArray*) array;
|
||||
}
|
||||
|
||||
void
|
||||
g_array_free (GArray *array,
|
||||
gint free_segment)
|
||||
{
|
||||
if (free_segment)
|
||||
g_free (array->data);
|
||||
|
||||
g_mem_chunk_free (array_mem_chunk, array);
|
||||
}
|
||||
|
||||
GArray*
|
||||
g_rarray_append (GArray *array,
|
||||
gpointer data,
|
||||
gint size)
|
||||
{
|
||||
g_array_maybe_expand ((GRealArray*) array, size);
|
||||
|
||||
memcpy (array->data + array->len, data, size);
|
||||
|
||||
array->len += size;
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
GArray*
|
||||
g_rarray_prepend (GArray *array,
|
||||
gpointer data,
|
||||
gint size)
|
||||
{
|
||||
g_array_maybe_expand ((GRealArray*) array, size);
|
||||
|
||||
g_memmove (array->data + size, array->data, array->len);
|
||||
memcpy (array->data, data, size);
|
||||
|
||||
array->len += size;
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
GArray*
|
||||
g_rarray_truncate (GArray *array,
|
||||
gint length,
|
||||
gint size)
|
||||
{
|
||||
if (array->data)
|
||||
memset (array->data + length * size, 0, size);
|
||||
array->len = length * size;
|
||||
return array;
|
||||
}
|
||||
|
||||
|
||||
static gint
|
||||
g_nearest_pow (gint num)
|
||||
{
|
||||
gint n = 1;
|
||||
|
||||
while (n < num)
|
||||
n <<= 1;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static void
|
||||
g_array_maybe_expand (GRealArray *array,
|
||||
gint len)
|
||||
{
|
||||
guint old_alloc;
|
||||
|
||||
if ((array->len + len) > array->alloc)
|
||||
{
|
||||
old_alloc = array->alloc;
|
||||
|
||||
array->alloc = g_nearest_pow (array->len + array->zero_terminated + len);
|
||||
array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
|
||||
array->data = g_realloc (array->data, array->alloc);
|
||||
|
||||
memset (array->data + old_alloc, 0, array->alloc - old_alloc);
|
||||
}
|
||||
}
|
260
gbacktrace.c
Normal file
260
gbacktrace.c
Normal file
@ -0,0 +1,260 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/times.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include "glib.h"
|
||||
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif /* HAVE_SYS_SELECT_H */
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <string.h> /* for bzero on BSD systems */
|
||||
#endif
|
||||
|
||||
#define INTERACTIVE 0
|
||||
#define STACK_TRACE 1
|
||||
|
||||
|
||||
#ifndef NO_FD_SET
|
||||
# define SELECT_MASK fd_set
|
||||
#else
|
||||
# ifndef _AIX
|
||||
typedef long fd_mask;
|
||||
# endif
|
||||
# if defined(_IBMR2)
|
||||
# define SELECT_MASK void
|
||||
# else
|
||||
# define SELECT_MASK int
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
static int do_query (char *prompt);
|
||||
static void debug (const gchar *progname, int method);
|
||||
static void stack_trace (char **);
|
||||
static void stack_trace_sigchld (int);
|
||||
|
||||
|
||||
static int stack_trace_done;
|
||||
|
||||
void
|
||||
g_debug (const gchar *progname)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
fprintf (stdout, "[n]othing, [e]xit, [s]tack trace, [a]ttach to process: ");
|
||||
fflush (stdout);
|
||||
|
||||
fgets (buf, 32, stdin);
|
||||
if (strcmp (buf, "n\n") == 0)
|
||||
return;
|
||||
else if (strcmp (buf, "s\n") == 0)
|
||||
debug (progname, STACK_TRACE);
|
||||
else if (strcmp (buf, "a\n") == 0)
|
||||
debug (progname, INTERACTIVE);
|
||||
else
|
||||
exit (0);
|
||||
}
|
||||
|
||||
void
|
||||
g_attach_process (const gchar *progname,
|
||||
int query)
|
||||
{
|
||||
if (!query || do_query ("attach to process"))
|
||||
debug (progname, INTERACTIVE);
|
||||
}
|
||||
|
||||
void
|
||||
g_stack_trace (const gchar *progname,
|
||||
int query)
|
||||
{
|
||||
if (!query || do_query ("print stack trace"))
|
||||
debug (progname, STACK_TRACE);
|
||||
}
|
||||
|
||||
static int
|
||||
do_query (char *prompt)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
fprintf (stdout, "%s (y/n) ", prompt);
|
||||
fflush (stdout);
|
||||
|
||||
fgets (buf, 32, stdin);
|
||||
if ((strcmp (buf, "yes\n") == 0) ||
|
||||
(strcmp (buf, "y\n") == 0) ||
|
||||
(strcmp (buf, "YES\n") == 0) ||
|
||||
(strcmp (buf, "Y\n") == 0))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
debug (const char *progname,
|
||||
int method)
|
||||
{
|
||||
pid_t pid;
|
||||
char buf[16];
|
||||
char *args[4] = { "gdb", NULL, NULL, NULL };
|
||||
volatile int x;
|
||||
|
||||
sprintf (buf, "%d", (int) getpid ());
|
||||
|
||||
args[1] = (gchar*) progname;
|
||||
args[2] = buf;
|
||||
|
||||
switch (method)
|
||||
{
|
||||
case INTERACTIVE:
|
||||
fprintf (stdout, "pid: %s\n", buf);
|
||||
break;
|
||||
case STACK_TRACE:
|
||||
pid = fork ();
|
||||
if (pid == 0)
|
||||
{
|
||||
stack_trace (args);
|
||||
_exit (0);
|
||||
}
|
||||
else if (pid == (pid_t) -1)
|
||||
{
|
||||
perror ("could not fork");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
x = 1;
|
||||
while (x)
|
||||
;
|
||||
}
|
||||
|
||||
static void
|
||||
stack_trace (char **args)
|
||||
{
|
||||
pid_t pid;
|
||||
int in_fd[2];
|
||||
int out_fd[2];
|
||||
SELECT_MASK fdset;
|
||||
SELECT_MASK readset;
|
||||
struct timeval tv;
|
||||
int sel, index, state;
|
||||
char buffer[256];
|
||||
char c;
|
||||
|
||||
stack_trace_done = 0;
|
||||
signal (SIGCHLD, stack_trace_sigchld);
|
||||
|
||||
if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1))
|
||||
{
|
||||
perror ("could open pipe");
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
pid = fork ();
|
||||
if (pid == 0)
|
||||
{
|
||||
close (0); dup (in_fd[0]); /* set the stdin to the in pipe */
|
||||
close (1); dup (out_fd[1]); /* set the stdout to the out pipe */
|
||||
close (2); dup (out_fd[1]); /* set the stderr to the out pipe */
|
||||
|
||||
execvp (args[0], args); /* exec gdb */
|
||||
perror ("exec failed");
|
||||
_exit (0);
|
||||
}
|
||||
else if (pid == (pid_t) -1)
|
||||
{
|
||||
perror ("could not fork");
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
FD_ZERO (&fdset);
|
||||
FD_SET (out_fd[0], &fdset);
|
||||
|
||||
write (in_fd[1], "backtrace\n", 10);
|
||||
write (in_fd[1], "p x = 0\n", 8);
|
||||
write (in_fd[1], "quit\n", 5);
|
||||
|
||||
index = 0;
|
||||
state = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
readset = fdset;
|
||||
tv.tv_sec = 1;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv);
|
||||
if (sel == -1)
|
||||
break;
|
||||
|
||||
if ((sel > 0) && (FD_ISSET (out_fd[0], &readset)))
|
||||
{
|
||||
if (read (out_fd[0], &c, 1))
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
if (c == '#')
|
||||
{
|
||||
state = 1;
|
||||
index = 0;
|
||||
buffer[index++] = c;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
buffer[index++] = c;
|
||||
if ((c == '\n') || (c == '\r'))
|
||||
{
|
||||
buffer[index] = 0;
|
||||
fprintf (stdout, "%s", buffer);
|
||||
state = 0;
|
||||
index = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (stack_trace_done)
|
||||
break;
|
||||
}
|
||||
|
||||
close (in_fd[0]);
|
||||
close (in_fd[1]);
|
||||
close (out_fd[0]);
|
||||
close (out_fd[1]);
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
static void
|
||||
stack_trace_sigchld (int signum)
|
||||
{
|
||||
stack_trace_done = 1;
|
||||
}
|
212
gcache.c
Normal file
212
gcache.c
Normal file
@ -0,0 +1,212 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GCacheNode GCacheNode;
|
||||
typedef struct _GRealCache GRealCache;
|
||||
|
||||
struct _GCacheNode
|
||||
{
|
||||
/* A reference counted node */
|
||||
gpointer value;
|
||||
gint ref_count;
|
||||
};
|
||||
|
||||
struct _GRealCache
|
||||
{
|
||||
/* Called to create a value from a key */
|
||||
GCacheNewFunc value_new_func;
|
||||
|
||||
/* Called to destroy a value */
|
||||
GCacheDestroyFunc value_destroy_func;
|
||||
|
||||
/* Called to duplicate a key */
|
||||
GCacheDupFunc key_dup_func;
|
||||
|
||||
/* Called to destroy a key */
|
||||
GCacheDestroyFunc key_destroy_func;
|
||||
|
||||
/* Associates keys with nodes */
|
||||
GHashTable *key_table;
|
||||
|
||||
/* Associates nodes with keys */
|
||||
GHashTable *value_table;
|
||||
};
|
||||
|
||||
|
||||
static GCacheNode* g_cache_node_new (gpointer value);
|
||||
static void g_cache_node_destroy (GCacheNode *node);
|
||||
|
||||
|
||||
static GMemChunk *node_mem_chunk = NULL;
|
||||
|
||||
|
||||
GCache*
|
||||
g_cache_new (GCacheNewFunc value_new_func,
|
||||
GCacheDestroyFunc value_destroy_func,
|
||||
GCacheDupFunc key_dup_func,
|
||||
GCacheDestroyFunc key_destroy_func,
|
||||
GHashFunc hash_key_func,
|
||||
GHashFunc hash_value_func,
|
||||
GCompareFunc key_compare_func)
|
||||
{
|
||||
GRealCache *cache;
|
||||
|
||||
g_return_val_if_fail (value_new_func != NULL, NULL);
|
||||
g_return_val_if_fail (value_destroy_func != NULL, NULL);
|
||||
g_return_val_if_fail (key_dup_func != NULL, NULL);
|
||||
g_return_val_if_fail (key_destroy_func != NULL, NULL);
|
||||
g_return_val_if_fail (hash_key_func != NULL, NULL);
|
||||
g_return_val_if_fail (hash_value_func != NULL, NULL);
|
||||
g_return_val_if_fail (key_compare_func != NULL, NULL);
|
||||
|
||||
cache = g_new (GRealCache, 1);
|
||||
cache->value_new_func = value_new_func;
|
||||
cache->value_destroy_func = value_destroy_func;
|
||||
cache->key_dup_func = key_dup_func;
|
||||
cache->key_destroy_func = key_destroy_func;
|
||||
cache->key_table = g_hash_table_new (hash_key_func, key_compare_func);
|
||||
cache->value_table = g_hash_table_new (hash_value_func, NULL);
|
||||
|
||||
return (GCache*) cache;
|
||||
}
|
||||
|
||||
void
|
||||
g_cache_destroy (GCache *cache)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
|
||||
g_return_if_fail (cache != NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
g_hash_table_destroy (rcache->key_table);
|
||||
g_hash_table_destroy (rcache->value_table);
|
||||
g_free (rcache);
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_cache_insert (GCache *cache,
|
||||
gpointer key)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
GCacheNode *node;
|
||||
gpointer value;
|
||||
|
||||
g_return_val_if_fail (cache != NULL, NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
|
||||
node = g_hash_table_lookup (rcache->key_table, key);
|
||||
if (node)
|
||||
{
|
||||
node->ref_count += 1;
|
||||
return node->value;
|
||||
}
|
||||
|
||||
key = (* rcache->key_dup_func) (key);
|
||||
value = (* rcache->value_new_func) (key);
|
||||
node = g_cache_node_new (value);
|
||||
|
||||
g_hash_table_insert (rcache->key_table, key, node);
|
||||
g_hash_table_insert (rcache->value_table, value, key);
|
||||
|
||||
return node->value;
|
||||
}
|
||||
|
||||
void
|
||||
g_cache_remove (GCache *cache,
|
||||
gpointer value)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
GCacheNode *node;
|
||||
gpointer key;
|
||||
|
||||
g_return_if_fail (cache != NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
|
||||
key = g_hash_table_lookup (rcache->value_table, value);
|
||||
node = g_hash_table_lookup (rcache->key_table, key);
|
||||
|
||||
node->ref_count -= 1;
|
||||
if (node->ref_count == 0)
|
||||
{
|
||||
g_hash_table_remove (rcache->value_table, value);
|
||||
g_hash_table_remove (rcache->key_table, key);
|
||||
|
||||
(* rcache->key_destroy_func) (key);
|
||||
(* rcache->value_destroy_func) (node->value);
|
||||
g_cache_node_destroy (node);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_cache_key_foreach (GCache *cache,
|
||||
GHFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
|
||||
g_return_if_fail (cache != NULL);
|
||||
g_return_if_fail (func != NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
|
||||
g_hash_table_foreach (rcache->value_table, func, user_data);
|
||||
}
|
||||
|
||||
void
|
||||
g_cache_value_foreach (GCache *cache,
|
||||
GHFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
|
||||
g_return_if_fail (cache != NULL);
|
||||
g_return_if_fail (func != NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
|
||||
g_hash_table_foreach (rcache->key_table, func, user_data);
|
||||
}
|
||||
|
||||
|
||||
static GCacheNode*
|
||||
g_cache_node_new (gpointer value)
|
||||
{
|
||||
GCacheNode *node;
|
||||
|
||||
if (!node_mem_chunk)
|
||||
node_mem_chunk = g_mem_chunk_new ("cache node mem chunk", sizeof (GCacheNode),
|
||||
1024, G_ALLOC_AND_FREE);
|
||||
|
||||
node = g_chunk_new (GCacheNode, node_mem_chunk);
|
||||
|
||||
node->value = value;
|
||||
node->ref_count = 1;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static void
|
||||
g_cache_node_destroy (GCacheNode *node)
|
||||
{
|
||||
g_mem_chunk_free (node_mem_chunk, node);
|
||||
}
|
238
gcompletion.c
Normal file
238
gcompletion.c
Normal file
@ -0,0 +1,238 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "glib.h"
|
||||
#include <string.h>
|
||||
|
||||
static void completion_check_cache (GCompletion* cmp, gchar** new_prefix);
|
||||
|
||||
GCompletion*
|
||||
g_completion_new (GCompletionFunc func) {
|
||||
GCompletion* gcomp;
|
||||
|
||||
gcomp = g_new(GCompletion, 1);
|
||||
gcomp->items = NULL;
|
||||
gcomp->cache = NULL;
|
||||
gcomp->prefix = NULL;
|
||||
if ( func )
|
||||
gcomp->func = func;
|
||||
else
|
||||
gcomp->func = NULL;
|
||||
return gcomp;
|
||||
}
|
||||
|
||||
void
|
||||
g_completion_add_items (GCompletion* cmp, GList* items) {
|
||||
GList* it;
|
||||
|
||||
g_return_if_fail( cmp != NULL);
|
||||
g_return_if_fail( items != NULL);
|
||||
|
||||
/* optimize adding to cache? */
|
||||
if ( cmp->cache ) {
|
||||
g_list_free(cmp->cache);
|
||||
cmp->cache = NULL;
|
||||
}
|
||||
if ( cmp->prefix ) {
|
||||
g_free(cmp->prefix);
|
||||
cmp->prefix = NULL;
|
||||
}
|
||||
|
||||
it = items;
|
||||
while ( it ) {
|
||||
cmp->items = g_list_prepend(cmp->items, it->data);
|
||||
it = it->next;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_completion_remove_items (GCompletion* cmp, GList* items) {
|
||||
GList* it;
|
||||
|
||||
g_return_if_fail( cmp != NULL);
|
||||
g_return_if_fail( items != NULL);
|
||||
|
||||
it = items;
|
||||
while ( cmp->items && it ) {
|
||||
cmp->items = g_list_remove(cmp->items, it->data);
|
||||
it = it->next;
|
||||
}
|
||||
it = items;
|
||||
while ( cmp->cache && it ) {
|
||||
cmp->cache = g_list_remove(cmp->cache, it->data);
|
||||
it = it->next;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_completion_clear_items (GCompletion* cmp) {
|
||||
g_return_if_fail(cmp != NULL);
|
||||
|
||||
g_list_free(cmp->items);
|
||||
cmp->items = NULL;
|
||||
g_list_free(cmp->cache);
|
||||
cmp->cache = NULL;
|
||||
g_free(cmp->prefix);
|
||||
cmp->prefix = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
completion_check_cache (GCompletion* cmp, gchar** new_prefix) {
|
||||
register GList* list;
|
||||
register gint len;
|
||||
register gint i;
|
||||
register gint plen;
|
||||
gchar* postfix=NULL;
|
||||
gchar* s;
|
||||
|
||||
if ( !new_prefix )
|
||||
return;
|
||||
if ( !cmp->cache ) {
|
||||
*new_prefix = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
len = strlen(cmp->prefix);
|
||||
list = cmp->cache;
|
||||
s = cmp->func?(*cmp->func)(list->data):(gchar*)list->data;
|
||||
postfix = s + len;
|
||||
plen = strlen(postfix);
|
||||
list = list->next;
|
||||
|
||||
while (list && plen) {
|
||||
s = cmp->func?(*cmp->func)(list->data):(gchar*)list->data;
|
||||
s += len;
|
||||
for (i=0; i < plen; ++i) {
|
||||
if ( postfix[i] != s[i] )
|
||||
break;
|
||||
}
|
||||
plen = i;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
*new_prefix = g_new0(gchar, len+plen+1);
|
||||
strncpy(*new_prefix, cmp->prefix, len);
|
||||
strncpy(*new_prefix+len, postfix, plen);
|
||||
}
|
||||
|
||||
GList*
|
||||
g_completion_complete (GCompletion* cmp, gchar* prefix, gchar** new_prefix) {
|
||||
gint plen, len;
|
||||
gint done=0;
|
||||
GList* list;
|
||||
|
||||
g_return_val_if_fail(cmp != NULL, NULL);
|
||||
g_return_val_if_fail(prefix != NULL, NULL);
|
||||
|
||||
len = strlen(prefix);
|
||||
if ( cmp->prefix && cmp->cache ) {
|
||||
plen = strlen(cmp->prefix);
|
||||
if ( plen <= len && !strncmp(prefix, cmp->prefix, plen) ) {
|
||||
/* use the cache */
|
||||
list = cmp->cache;
|
||||
while ( list ) {
|
||||
if ( strncmp(prefix, cmp->func?(*cmp->func)(list->data):(gchar*)list->data, len) ) {
|
||||
list = g_list_remove_link(cmp->cache, list);
|
||||
if ( list != cmp->cache )
|
||||
cmp->cache = list;
|
||||
} else
|
||||
list = list->next;
|
||||
}
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!done) { /* normal code */
|
||||
g_list_free(cmp->cache);
|
||||
cmp->cache = NULL;
|
||||
list = cmp->items;
|
||||
while (*prefix && list) {
|
||||
if ( !strncmp(prefix, cmp->func?(*cmp->func)(list->data):(gchar*)list->data, len) )
|
||||
cmp->cache = g_list_prepend(cmp->cache, list->data);
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
if ( cmp->prefix ) {
|
||||
g_free(cmp->prefix);
|
||||
cmp->prefix = NULL;
|
||||
}
|
||||
if ( cmp->cache )
|
||||
cmp->prefix = g_strdup(prefix);
|
||||
completion_check_cache(cmp, new_prefix);
|
||||
return *prefix?cmp->cache:cmp->items;
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
g_completion_free (GCompletion* cmp) {
|
||||
g_return_if_fail(cmp != NULL);
|
||||
|
||||
g_completion_clear_items(cmp);
|
||||
g_free(cmp);
|
||||
}
|
||||
|
||||
#ifdef TEST_COMPLETION
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int main (int argc, char* argv[]) {
|
||||
|
||||
FILE * file;
|
||||
gchar buf[1024];
|
||||
GList *list;
|
||||
GList *result;
|
||||
GList *tmp;
|
||||
GCompletion * cmp;
|
||||
gint i;
|
||||
gchar* longp=NULL;
|
||||
|
||||
if ( argc < 3 ) {
|
||||
g_warning("Usage: %s filename prefix1 [prefix2 ...]\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( !(file=fopen(argv[1], "r")) ) {
|
||||
g_warning("Cannot open %s\n", argv[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
cmp = g_completion_new(NULL);
|
||||
list = g_list_alloc();
|
||||
while (fgets(buf, 1024, file)) {
|
||||
list->data = g_strdup(buf);
|
||||
g_completion_add_items(cmp, list);
|
||||
}
|
||||
fclose(file);
|
||||
|
||||
for ( i= 2; i < argc; ++i) {
|
||||
printf("COMPLETING: %s\n", argv[i]);
|
||||
result = g_completion_complete(cmp, argv[i], &longp);
|
||||
g_list_foreach(result, (GFunc)printf, NULL);
|
||||
printf("LONG MATCH: %s\n", longp);
|
||||
g_free(longp);
|
||||
longp = NULL;
|
||||
}
|
||||
|
||||
g_list_foreach(cmp->items, (GFunc)g_free, NULL);
|
||||
g_completion_free(cmp);
|
||||
g_list_free(list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
342
gdataset.c
Normal file
342
gdataset.c
Normal file
@ -0,0 +1,342 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* gdataset.c: Generic dataset mechanism, similar to GtkObject data.
|
||||
* Copyright (C) 1998 Tim Janik
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
|
||||
/* --- defines --- */
|
||||
#define G_DATASET_ID_BLOCK_SIZE (1024)
|
||||
#define G_DATASET_MEM_CHUNK_PREALLOC (512)
|
||||
#define G_DATASET_DATA_MEM_CHUNK_PREALLOC (1024)
|
||||
|
||||
|
||||
/* --- structures --- */
|
||||
typedef struct _GDatasetData GDatasetData;
|
||||
typedef struct _GDataset GDataset;
|
||||
struct _GDatasetData
|
||||
{
|
||||
GDatasetData *next;
|
||||
guint id;
|
||||
gpointer data;
|
||||
GDestroyNotify destroy_func;
|
||||
};
|
||||
|
||||
struct _GDataset
|
||||
{
|
||||
gconstpointer location;
|
||||
GDatasetData *data_list;
|
||||
};
|
||||
|
||||
|
||||
/* --- prototypes --- */
|
||||
static inline GDataset* g_dataset_lookup (gconstpointer dataset_location);
|
||||
static inline void g_dataset_destroy_i (GDataset *dataset);
|
||||
static void g_dataset_initialize (void);
|
||||
static guint* g_dataset_id_new (void);
|
||||
|
||||
|
||||
/* --- variables --- */
|
||||
static GHashTable *g_dataset_location_ht = NULL;
|
||||
static GHashTable *g_dataset_key_ht = NULL;
|
||||
static GDataset *g_dataset_cached = NULL;
|
||||
static GMemChunk *g_dataset_mem_chunk = NULL;
|
||||
static GMemChunk *g_dataset_data_mem_chunk = NULL;
|
||||
static guint *g_dataset_id_block = NULL;
|
||||
static guint g_dataset_id_index = G_DATASET_ID_BLOCK_SIZE + 1;
|
||||
|
||||
|
||||
/* --- functions --- */
|
||||
static inline GDataset*
|
||||
g_dataset_lookup (gconstpointer dataset_location)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
|
||||
if (g_dataset_cached && g_dataset_cached->location == dataset_location)
|
||||
return g_dataset_cached;
|
||||
|
||||
if (!g_dataset_location_ht)
|
||||
g_dataset_initialize ();
|
||||
|
||||
dataset = g_hash_table_lookup (g_dataset_location_ht, dataset_location);
|
||||
if (dataset)
|
||||
g_dataset_cached = dataset;
|
||||
|
||||
return dataset;
|
||||
}
|
||||
|
||||
static inline void
|
||||
g_dataset_destroy_i (GDataset *dataset)
|
||||
{
|
||||
register GDatasetData *list;
|
||||
|
||||
if (dataset == g_dataset_cached)
|
||||
g_dataset_cached = NULL;
|
||||
g_hash_table_remove (g_dataset_location_ht, dataset->location);
|
||||
|
||||
list = dataset->data_list;
|
||||
g_mem_chunk_free (g_dataset_mem_chunk, dataset);
|
||||
|
||||
while (list)
|
||||
{
|
||||
register GDatasetData *prev;
|
||||
|
||||
prev = list;
|
||||
list = prev->next;
|
||||
|
||||
if (prev->destroy_func)
|
||||
prev->destroy_func (prev->data);
|
||||
|
||||
g_mem_chunk_free (g_dataset_data_mem_chunk, prev);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_dataset_destroy (gconstpointer dataset_location)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
|
||||
g_return_if_fail (dataset_location != NULL);
|
||||
|
||||
dataset = g_dataset_lookup (dataset_location);
|
||||
if (dataset)
|
||||
g_dataset_destroy_i (dataset);
|
||||
}
|
||||
|
||||
void
|
||||
g_dataset_id_set_destroy (gconstpointer dataset_location,
|
||||
guint key_id,
|
||||
GDestroyNotify destroy_func)
|
||||
{
|
||||
g_return_if_fail (dataset_location != NULL);
|
||||
|
||||
if (key_id)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
|
||||
dataset = g_dataset_lookup (dataset_location);
|
||||
if (dataset)
|
||||
{
|
||||
register GDatasetData *list;
|
||||
|
||||
list = dataset->data_list;
|
||||
while (list)
|
||||
{
|
||||
if (list->id == key_id)
|
||||
{
|
||||
list->destroy_func = destroy_func;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_dataset_id_get_data (gconstpointer dataset_location,
|
||||
guint key_id)
|
||||
{
|
||||
g_return_val_if_fail (dataset_location != NULL, NULL);
|
||||
|
||||
if (key_id)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
|
||||
dataset = g_dataset_lookup (dataset_location);
|
||||
if (dataset)
|
||||
{
|
||||
register GDatasetData *list;
|
||||
|
||||
for (list = dataset->data_list; list; list = list->next)
|
||||
if (list->id == key_id)
|
||||
return list->data;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
g_dataset_id_set_data_full (gconstpointer dataset_location,
|
||||
guint key_id,
|
||||
gpointer data,
|
||||
GDestroyNotify destroy_func)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
register GDatasetData *list;
|
||||
|
||||
g_return_if_fail (dataset_location != NULL);
|
||||
g_return_if_fail (key_id > 0);
|
||||
|
||||
dataset = g_dataset_lookup (dataset_location);
|
||||
if (!dataset)
|
||||
{
|
||||
dataset = g_chunk_new (GDataset, g_dataset_mem_chunk);
|
||||
dataset->location = dataset_location;
|
||||
dataset->data_list = NULL;
|
||||
g_hash_table_insert (g_dataset_location_ht,
|
||||
(gpointer) dataset->location, /* Yuck */
|
||||
dataset);
|
||||
}
|
||||
|
||||
list = dataset->data_list;
|
||||
if (!data)
|
||||
{
|
||||
register GDatasetData *prev;
|
||||
|
||||
prev = NULL;
|
||||
while (list)
|
||||
{
|
||||
if (list->id == key_id)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = list->next;
|
||||
else
|
||||
{
|
||||
dataset->data_list = list->next;
|
||||
|
||||
if (!dataset->data_list)
|
||||
g_dataset_destroy_i (dataset);
|
||||
}
|
||||
|
||||
/* we need to have unlinked before invoking the destroy function
|
||||
*/
|
||||
if (list->destroy_func)
|
||||
list->destroy_func (list->data);
|
||||
|
||||
g_mem_chunk_free (g_dataset_data_mem_chunk, list);
|
||||
break;
|
||||
}
|
||||
|
||||
prev = list;
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
register GDatasetData *prev;
|
||||
|
||||
prev = NULL;
|
||||
while (list)
|
||||
{
|
||||
if (list->id == key_id)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = list->next;
|
||||
else
|
||||
dataset->data_list = list->next;
|
||||
|
||||
/* we need to have unlinked before invoking the destroy function
|
||||
*/
|
||||
if (list->destroy_func)
|
||||
list->destroy_func (list->data);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
prev = list;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
if (!list)
|
||||
list = g_chunk_new (GDatasetData, g_dataset_data_mem_chunk);
|
||||
list->next = dataset->data_list;
|
||||
list->id = key_id;
|
||||
list->data = data;
|
||||
list->destroy_func = destroy_func;
|
||||
dataset->data_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
guint
|
||||
g_dataset_try_key (const gchar *key)
|
||||
{
|
||||
register guint *id;
|
||||
g_return_val_if_fail (key != NULL, 0);
|
||||
|
||||
if (g_dataset_key_ht)
|
||||
{
|
||||
id = g_hash_table_lookup (g_dataset_key_ht, (gpointer) key);
|
||||
|
||||
if (id)
|
||||
return *id;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
guint
|
||||
g_dataset_force_id (const gchar *key)
|
||||
{
|
||||
register guint *id;
|
||||
|
||||
g_return_val_if_fail (key != NULL, 0);
|
||||
|
||||
if (!g_dataset_key_ht)
|
||||
g_dataset_initialize ();
|
||||
|
||||
id = g_hash_table_lookup (g_dataset_key_ht, (gpointer) key);
|
||||
if (!id)
|
||||
{
|
||||
id = g_dataset_id_new ();
|
||||
g_hash_table_insert (g_dataset_key_ht, g_strdup (key), id);
|
||||
}
|
||||
|
||||
return *id;
|
||||
}
|
||||
|
||||
static void
|
||||
g_dataset_initialize (void)
|
||||
{
|
||||
if (!g_dataset_location_ht)
|
||||
{
|
||||
g_dataset_location_ht = g_hash_table_new (g_direct_hash, NULL);
|
||||
g_dataset_key_ht = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
g_dataset_cached = NULL;
|
||||
g_dataset_mem_chunk =
|
||||
g_mem_chunk_new ("GDataset MemChunk",
|
||||
sizeof (GDataset),
|
||||
sizeof (GDataset) * G_DATASET_MEM_CHUNK_PREALLOC,
|
||||
G_ALLOC_AND_FREE);
|
||||
g_dataset_data_mem_chunk =
|
||||
g_mem_chunk_new ("GDatasetData MemChunk",
|
||||
sizeof (GDatasetData),
|
||||
sizeof (GDatasetData) * G_DATASET_DATA_MEM_CHUNK_PREALLOC,
|
||||
G_ALLOC_AND_FREE);
|
||||
}
|
||||
}
|
||||
|
||||
static guint*
|
||||
g_dataset_id_new (void)
|
||||
{
|
||||
static guint seq_id = 1;
|
||||
register guint *id;
|
||||
|
||||
if (g_dataset_id_index >= G_DATASET_ID_BLOCK_SIZE)
|
||||
{
|
||||
g_dataset_id_block = g_new (guint, G_DATASET_ID_BLOCK_SIZE);
|
||||
g_dataset_id_index = 0;
|
||||
}
|
||||
|
||||
id = &g_dataset_id_block[g_dataset_id_index++];
|
||||
*id = seq_id++;
|
||||
|
||||
return id;
|
||||
}
|
260
gerror.c
Normal file
260
gerror.c
Normal file
@ -0,0 +1,260 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/times.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include "glib.h"
|
||||
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif /* HAVE_SYS_SELECT_H */
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <string.h> /* for bzero on BSD systems */
|
||||
#endif
|
||||
|
||||
#define INTERACTIVE 0
|
||||
#define STACK_TRACE 1
|
||||
|
||||
|
||||
#ifndef NO_FD_SET
|
||||
# define SELECT_MASK fd_set
|
||||
#else
|
||||
# ifndef _AIX
|
||||
typedef long fd_mask;
|
||||
# endif
|
||||
# if defined(_IBMR2)
|
||||
# define SELECT_MASK void
|
||||
# else
|
||||
# define SELECT_MASK int
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
static int do_query (char *prompt);
|
||||
static void debug (const gchar *progname, int method);
|
||||
static void stack_trace (char **);
|
||||
static void stack_trace_sigchld (int);
|
||||
|
||||
|
||||
static int stack_trace_done;
|
||||
|
||||
void
|
||||
g_debug (const gchar *progname)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
fprintf (stdout, "[n]othing, [e]xit, [s]tack trace, [a]ttach to process: ");
|
||||
fflush (stdout);
|
||||
|
||||
fgets (buf, 32, stdin);
|
||||
if (strcmp (buf, "n\n") == 0)
|
||||
return;
|
||||
else if (strcmp (buf, "s\n") == 0)
|
||||
debug (progname, STACK_TRACE);
|
||||
else if (strcmp (buf, "a\n") == 0)
|
||||
debug (progname, INTERACTIVE);
|
||||
else
|
||||
exit (0);
|
||||
}
|
||||
|
||||
void
|
||||
g_attach_process (const gchar *progname,
|
||||
int query)
|
||||
{
|
||||
if (!query || do_query ("attach to process"))
|
||||
debug (progname, INTERACTIVE);
|
||||
}
|
||||
|
||||
void
|
||||
g_stack_trace (const gchar *progname,
|
||||
int query)
|
||||
{
|
||||
if (!query || do_query ("print stack trace"))
|
||||
debug (progname, STACK_TRACE);
|
||||
}
|
||||
|
||||
static int
|
||||
do_query (char *prompt)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
fprintf (stdout, "%s (y/n) ", prompt);
|
||||
fflush (stdout);
|
||||
|
||||
fgets (buf, 32, stdin);
|
||||
if ((strcmp (buf, "yes\n") == 0) ||
|
||||
(strcmp (buf, "y\n") == 0) ||
|
||||
(strcmp (buf, "YES\n") == 0) ||
|
||||
(strcmp (buf, "Y\n") == 0))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
debug (const char *progname,
|
||||
int method)
|
||||
{
|
||||
pid_t pid;
|
||||
char buf[16];
|
||||
char *args[4] = { "gdb", NULL, NULL, NULL };
|
||||
volatile int x;
|
||||
|
||||
sprintf (buf, "%d", (int) getpid ());
|
||||
|
||||
args[1] = (gchar*) progname;
|
||||
args[2] = buf;
|
||||
|
||||
switch (method)
|
||||
{
|
||||
case INTERACTIVE:
|
||||
fprintf (stdout, "pid: %s\n", buf);
|
||||
break;
|
||||
case STACK_TRACE:
|
||||
pid = fork ();
|
||||
if (pid == 0)
|
||||
{
|
||||
stack_trace (args);
|
||||
_exit (0);
|
||||
}
|
||||
else if (pid == (pid_t) -1)
|
||||
{
|
||||
perror ("could not fork");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
x = 1;
|
||||
while (x)
|
||||
;
|
||||
}
|
||||
|
||||
static void
|
||||
stack_trace (char **args)
|
||||
{
|
||||
pid_t pid;
|
||||
int in_fd[2];
|
||||
int out_fd[2];
|
||||
SELECT_MASK fdset;
|
||||
SELECT_MASK readset;
|
||||
struct timeval tv;
|
||||
int sel, index, state;
|
||||
char buffer[256];
|
||||
char c;
|
||||
|
||||
stack_trace_done = 0;
|
||||
signal (SIGCHLD, stack_trace_sigchld);
|
||||
|
||||
if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1))
|
||||
{
|
||||
perror ("could open pipe");
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
pid = fork ();
|
||||
if (pid == 0)
|
||||
{
|
||||
close (0); dup (in_fd[0]); /* set the stdin to the in pipe */
|
||||
close (1); dup (out_fd[1]); /* set the stdout to the out pipe */
|
||||
close (2); dup (out_fd[1]); /* set the stderr to the out pipe */
|
||||
|
||||
execvp (args[0], args); /* exec gdb */
|
||||
perror ("exec failed");
|
||||
_exit (0);
|
||||
}
|
||||
else if (pid == (pid_t) -1)
|
||||
{
|
||||
perror ("could not fork");
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
FD_ZERO (&fdset);
|
||||
FD_SET (out_fd[0], &fdset);
|
||||
|
||||
write (in_fd[1], "backtrace\n", 10);
|
||||
write (in_fd[1], "p x = 0\n", 8);
|
||||
write (in_fd[1], "quit\n", 5);
|
||||
|
||||
index = 0;
|
||||
state = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
readset = fdset;
|
||||
tv.tv_sec = 1;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv);
|
||||
if (sel == -1)
|
||||
break;
|
||||
|
||||
if ((sel > 0) && (FD_ISSET (out_fd[0], &readset)))
|
||||
{
|
||||
if (read (out_fd[0], &c, 1))
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
if (c == '#')
|
||||
{
|
||||
state = 1;
|
||||
index = 0;
|
||||
buffer[index++] = c;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
buffer[index++] = c;
|
||||
if ((c == '\n') || (c == '\r'))
|
||||
{
|
||||
buffer[index] = 0;
|
||||
fprintf (stdout, "%s", buffer);
|
||||
state = 0;
|
||||
index = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (stack_trace_done)
|
||||
break;
|
||||
}
|
||||
|
||||
close (in_fd[0]);
|
||||
close (in_fd[1]);
|
||||
close (out_fd[0]);
|
||||
close (out_fd[1]);
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
static void
|
||||
stack_trace_sigchld (int signum)
|
||||
{
|
||||
stack_trace_done = 1;
|
||||
}
|
426
ghash.c
Normal file
426
ghash.c
Normal file
@ -0,0 +1,426 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
#define HASH_TABLE_MIN_SIZE 11
|
||||
#define HASH_TABLE_MAX_SIZE 13845163
|
||||
|
||||
|
||||
typedef struct _GHashNode GHashNode;
|
||||
typedef struct _GRealHashTable GRealHashTable;
|
||||
|
||||
struct _GHashNode
|
||||
{
|
||||
gpointer key;
|
||||
gpointer value;
|
||||
GHashNode *next;
|
||||
};
|
||||
|
||||
struct _GRealHashTable
|
||||
{
|
||||
gint size;
|
||||
gint nnodes;
|
||||
gint frozen;
|
||||
GHashNode **nodes;
|
||||
GHashFunc hash_func;
|
||||
GCompareFunc key_compare_func;
|
||||
};
|
||||
|
||||
|
||||
static void g_hash_table_resize (GHashTable *hash_table);
|
||||
static gint g_hash_closest_prime (gint num);
|
||||
static GHashNode* g_hash_node_new (gpointer key,
|
||||
gpointer value);
|
||||
static void g_hash_node_destroy (GHashNode *hash_node);
|
||||
static void g_hash_nodes_destroy (GHashNode *hash_node);
|
||||
|
||||
|
||||
extern gint g_primes[];
|
||||
extern gint g_nprimes;
|
||||
|
||||
static GMemChunk *node_mem_chunk = NULL;
|
||||
static GHashNode *node_free_list = NULL;
|
||||
|
||||
|
||||
GHashTable*
|
||||
g_hash_table_new (GHashFunc hash_func,
|
||||
GCompareFunc key_compare_func)
|
||||
{
|
||||
GRealHashTable *hash_table;
|
||||
|
||||
g_return_val_if_fail (hash_func != NULL, NULL);
|
||||
|
||||
hash_table = g_new (GRealHashTable, 1);
|
||||
hash_table->size = 0;
|
||||
hash_table->nnodes = 0;
|
||||
hash_table->frozen = FALSE;
|
||||
hash_table->nodes = NULL;
|
||||
hash_table->hash_func = hash_func;
|
||||
hash_table->key_compare_func = key_compare_func;
|
||||
|
||||
return ((GHashTable*) hash_table);
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_destroy (GHashTable *hash_table)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
gint i;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
|
||||
for (i = 0; i < rhash_table->size; i++)
|
||||
g_hash_nodes_destroy (rhash_table->nodes[i]);
|
||||
|
||||
if (rhash_table->nodes)
|
||||
g_free (rhash_table->nodes);
|
||||
g_free (rhash_table);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_insert (GHashTable *hash_table,
|
||||
gpointer key,
|
||||
gpointer value)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode *node;
|
||||
guint hash_val;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
|
||||
if (rhash_table->size == 0)
|
||||
g_hash_table_resize (hash_table);
|
||||
|
||||
hash_val = (* rhash_table->hash_func) (key) % rhash_table->size;
|
||||
|
||||
node = rhash_table->nodes[hash_val];
|
||||
while (node)
|
||||
{
|
||||
if ((rhash_table->key_compare_func &&
|
||||
(* rhash_table->key_compare_func) (node->key, key)) ||
|
||||
(node->key == key))
|
||||
{
|
||||
/* do not reset node->key in this place, keeping
|
||||
* the old key might be intended.
|
||||
* a g_hash_table_remove/g_hash_table_insert pair
|
||||
* can be used otherwise.
|
||||
*
|
||||
* node->key = key;
|
||||
*/
|
||||
node->value = value;
|
||||
return;
|
||||
}
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
node = g_hash_node_new (key, value);
|
||||
node->next = rhash_table->nodes[hash_val];
|
||||
rhash_table->nodes[hash_val] = node;
|
||||
|
||||
rhash_table->nnodes += 1;
|
||||
g_hash_table_resize (hash_table);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_remove (GHashTable *hash_table,
|
||||
gconstpointer key)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode *node;
|
||||
GHashNode *prev;
|
||||
guint hash_val;
|
||||
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
if (hash_table && rhash_table->size)
|
||||
{
|
||||
hash_val = (* rhash_table->hash_func) (key) % rhash_table->size;
|
||||
|
||||
prev = NULL;
|
||||
node = rhash_table->nodes[hash_val];
|
||||
|
||||
while (node)
|
||||
{
|
||||
if ((rhash_table->key_compare_func &&
|
||||
(* rhash_table->key_compare_func) (node->key, key)) ||
|
||||
(node->key == key))
|
||||
{
|
||||
if (prev)
|
||||
prev->next = node->next;
|
||||
if (node == rhash_table->nodes[hash_val])
|
||||
rhash_table->nodes[hash_val] = node->next;
|
||||
|
||||
g_hash_node_destroy (node);
|
||||
|
||||
rhash_table->nnodes -= 1;
|
||||
g_hash_table_resize (hash_table);
|
||||
break;
|
||||
}
|
||||
|
||||
prev = node;
|
||||
node = node->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_hash_table_lookup (GHashTable *hash_table,
|
||||
gconstpointer key)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode *node;
|
||||
guint hash_val;
|
||||
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
if (hash_table && rhash_table->size)
|
||||
{
|
||||
hash_val = (* rhash_table->hash_func) (key) % rhash_table->size;
|
||||
|
||||
node = rhash_table->nodes[hash_val];
|
||||
|
||||
/* Hash table lookup needs to be fast.
|
||||
* We therefore remove the extra conditional of testing
|
||||
* whether to call the key_compare_func or not from
|
||||
* the inner loop.
|
||||
*/
|
||||
if (rhash_table->key_compare_func)
|
||||
{
|
||||
while (node)
|
||||
{
|
||||
if ((* rhash_table->key_compare_func) (node->key, key))
|
||||
return node->value;
|
||||
node = node->next;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (node)
|
||||
{
|
||||
if (node->key == key)
|
||||
return node->value;
|
||||
node = node->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_freeze (GHashTable *hash_table)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
rhash_table->frozen = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_thaw (GHashTable *hash_table)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
rhash_table->frozen = FALSE;
|
||||
|
||||
g_hash_table_resize (hash_table);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_foreach (GHashTable *hash_table,
|
||||
GHFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode *node;
|
||||
gint i;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
|
||||
for (i = 0; i < rhash_table->size; i++)
|
||||
{
|
||||
node = rhash_table->nodes[i];
|
||||
|
||||
while (node)
|
||||
{
|
||||
(* func) (node->key, node->value, user_data);
|
||||
node = node->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
g_hash_table_resize (GHashTable *hash_table)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode **new_nodes;
|
||||
GHashNode *node;
|
||||
GHashNode *next;
|
||||
gfloat nodes_per_list;
|
||||
guint hash_val;
|
||||
gint new_size;
|
||||
gint need_resize;
|
||||
gint i;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
|
||||
if (rhash_table->size == 0)
|
||||
{
|
||||
rhash_table->size = HASH_TABLE_MIN_SIZE;
|
||||
rhash_table->nodes = g_new (GHashNode*, rhash_table->size);
|
||||
|
||||
for (i = 0; i < rhash_table->size; i++)
|
||||
rhash_table->nodes[i] = NULL;
|
||||
}
|
||||
else if (!rhash_table->frozen)
|
||||
{
|
||||
need_resize = FALSE;
|
||||
nodes_per_list = (gfloat) rhash_table->nnodes / (gfloat) rhash_table->size;
|
||||
|
||||
if (nodes_per_list < 0.3)
|
||||
{
|
||||
if (rhash_table->size > HASH_TABLE_MIN_SIZE)
|
||||
need_resize = TRUE;
|
||||
}
|
||||
else if (nodes_per_list > 3.0)
|
||||
{
|
||||
if (rhash_table->size < HASH_TABLE_MAX_SIZE)
|
||||
need_resize = TRUE;
|
||||
}
|
||||
|
||||
if (need_resize)
|
||||
{
|
||||
new_size = g_hash_closest_prime (rhash_table->nnodes);
|
||||
if (new_size < HASH_TABLE_MIN_SIZE)
|
||||
new_size = HASH_TABLE_MIN_SIZE;
|
||||
else if (new_size > HASH_TABLE_MAX_SIZE)
|
||||
new_size = HASH_TABLE_MAX_SIZE;
|
||||
|
||||
new_nodes = g_new (GHashNode*, new_size);
|
||||
|
||||
for (i = 0; i < new_size; i++)
|
||||
new_nodes[i] = NULL;
|
||||
|
||||
for (i = 0; i < rhash_table->size; i++)
|
||||
{
|
||||
node = rhash_table->nodes[i];
|
||||
|
||||
while (node)
|
||||
{
|
||||
next = node->next;
|
||||
|
||||
hash_val = (* rhash_table->hash_func) (node->key) % new_size;
|
||||
node->next = new_nodes[hash_val];
|
||||
new_nodes[hash_val] = node;
|
||||
|
||||
node = next;
|
||||
}
|
||||
}
|
||||
|
||||
g_free (rhash_table->nodes);
|
||||
|
||||
rhash_table->nodes = new_nodes;
|
||||
rhash_table->size = new_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static gint
|
||||
g_hash_closest_prime (gint num)
|
||||
{
|
||||
gint i;
|
||||
|
||||
for (i = 0; i < g_nprimes; i++)
|
||||
if ((g_primes[i] - num) > 0)
|
||||
return g_primes[i];
|
||||
|
||||
return g_primes[g_nprimes - 1];
|
||||
}
|
||||
|
||||
static GHashNode*
|
||||
g_hash_node_new (gpointer key,
|
||||
gpointer value)
|
||||
{
|
||||
GHashNode *hash_node;
|
||||
|
||||
if (node_free_list)
|
||||
{
|
||||
hash_node = node_free_list;
|
||||
node_free_list = node_free_list->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!node_mem_chunk)
|
||||
node_mem_chunk = g_mem_chunk_new ("hash node mem chunk",
|
||||
sizeof (GHashNode),
|
||||
1024, G_ALLOC_ONLY);
|
||||
|
||||
hash_node = g_chunk_new (GHashNode, node_mem_chunk);
|
||||
}
|
||||
|
||||
hash_node->key = key;
|
||||
hash_node->value = value;
|
||||
hash_node->next = NULL;
|
||||
|
||||
return hash_node;
|
||||
}
|
||||
|
||||
static void
|
||||
g_hash_node_destroy (GHashNode *hash_node)
|
||||
{
|
||||
if (hash_node)
|
||||
{
|
||||
hash_node->next = node_free_list;
|
||||
node_free_list = hash_node;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
g_hash_nodes_destroy (GHashNode *hash_node)
|
||||
{
|
||||
GHashNode *node;
|
||||
|
||||
if (hash_node)
|
||||
{
|
||||
node = hash_node;
|
||||
while (node->next)
|
||||
node = node->next;
|
||||
node->next = node_free_list;
|
||||
node_free_list = hash_node;
|
||||
}
|
||||
}
|
57
glib-config
Executable file
57
glib-config
Executable file
@ -0,0 +1,57 @@
|
||||
#!/bin/sh
|
||||
|
||||
prefix=/usr/local
|
||||
exec_prefix=${prefix}
|
||||
exec_prefix_set=no
|
||||
|
||||
usage="\
|
||||
Usage: glib-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--libs] [--cflags]"
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) optarg= ;;
|
||||
esac
|
||||
|
||||
case $1 in
|
||||
--prefix=*)
|
||||
prefix=$optarg
|
||||
if test $exec_prefix_set = no ; then
|
||||
exec_prefix=$optarg
|
||||
fi
|
||||
;;
|
||||
--prefix)
|
||||
echo $prefix
|
||||
;;
|
||||
--exec-prefix=*)
|
||||
exec_prefix=$optarg
|
||||
exec_prefix_set=yes
|
||||
;;
|
||||
--exec-prefix)
|
||||
echo $exec_prefix
|
||||
;;
|
||||
--version)
|
||||
echo 1.1.0
|
||||
;;
|
||||
--cflags)
|
||||
if test ${prefix}/include != /usr/include ; then
|
||||
includes=-I${prefix}/include
|
||||
fi
|
||||
echo -I${exec_prefix}/lib/glib/include $includes
|
||||
;;
|
||||
--libs)
|
||||
echo -L${exec_prefix}/lib -lglib-1.1
|
||||
;;
|
||||
*)
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
57
glib-config.in
Normal file
57
glib-config.in
Normal file
@ -0,0 +1,57 @@
|
||||
#!/bin/sh
|
||||
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
exec_prefix_set=no
|
||||
|
||||
usage="\
|
||||
Usage: glib-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--libs] [--cflags]"
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) optarg= ;;
|
||||
esac
|
||||
|
||||
case $1 in
|
||||
--prefix=*)
|
||||
prefix=$optarg
|
||||
if test $exec_prefix_set = no ; then
|
||||
exec_prefix=$optarg
|
||||
fi
|
||||
;;
|
||||
--prefix)
|
||||
echo $prefix
|
||||
;;
|
||||
--exec-prefix=*)
|
||||
exec_prefix=$optarg
|
||||
exec_prefix_set=yes
|
||||
;;
|
||||
--exec-prefix)
|
||||
echo $exec_prefix
|
||||
;;
|
||||
--version)
|
||||
echo @GLIB_VERSION@
|
||||
;;
|
||||
--cflags)
|
||||
if test @includedir@ != /usr/include ; then
|
||||
includes=-I@includedir@
|
||||
fi
|
||||
echo -I@libdir@/glib/include $includes
|
||||
;;
|
||||
--libs)
|
||||
echo -L@libdir@ -lglib-@LT_RELEASE@
|
||||
;;
|
||||
*)
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
183
glib.m4
Normal file
183
glib.m4
Normal file
@ -0,0 +1,183 @@
|
||||
# Configure paths for GLIB
|
||||
# Owen Taylor 97-11-3
|
||||
|
||||
dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
|
||||
dnl Test for GTK, and define GLIB_CFLAGS and GLIB_LIBS
|
||||
dnl
|
||||
AC_DEFUN(AM_PATH_GLIB,
|
||||
[dnl
|
||||
dnl Get the cflags and libraries from the glib-config script
|
||||
dnl
|
||||
AC_ARG_WITH(glib-prefix,[ --with-glib-prefix=PFX Prefix where GLIB is installed (optional)],
|
||||
glib_config_prefix="$withval", glib_config_prefix="")
|
||||
AC_ARG_WITH(glib-exec-prefix,[ --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)],
|
||||
glib_config_exec_prefix="$withval", glib_config_exec_prefix="")
|
||||
AC_ARG_ENABLE(glibtest, [ --disable-glibtest Do not try to compile and run a test GLIB program],
|
||||
, enable_glibtest=yes)
|
||||
|
||||
if test x$glib_config_exec_prefix != x ; then
|
||||
glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix"
|
||||
if test x${GLIB_CONFIG+set} != xset ; then
|
||||
GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config
|
||||
fi
|
||||
fi
|
||||
if test x$glib_config_prefix != x ; then
|
||||
glib_config_args="$glib_config_args --prefix=$glib_config_prefix"
|
||||
if test x${GLIB_CONFIG+set} != xset ; then
|
||||
GLIB_CONFIG=$glib_config_prefix/bin/glib-config
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_PATH_PROG(GLIB_CONFIG, glib-config, no)
|
||||
min_glib_version=ifelse([$1], ,0.99.7,$1)
|
||||
AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
|
||||
no_glib=""
|
||||
if test "$GLIB_CONFIG" = "no" ; then
|
||||
no_glib=yes
|
||||
else
|
||||
GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags`
|
||||
GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs`
|
||||
glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \
|
||||
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
|
||||
glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \
|
||||
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
|
||||
glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \
|
||||
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
|
||||
if test "x$enable_glibtest" = "xyes" ; then
|
||||
ac_save_CFLAGS="$CFLAGS"
|
||||
ac_save_LIBS="$LIBS"
|
||||
CFLAGS="$CFLAGS $GLIB_CFLAGS"
|
||||
LIBS="$LIBS $GLIB_LIBS"
|
||||
dnl
|
||||
dnl Now check if the installed GLIB is sufficiently new. (Also sanity
|
||||
dnl checks the results of glib-config to some extent
|
||||
dnl
|
||||
rm -f conf.glibtest
|
||||
AC_TRY_RUN([
|
||||
#include <glib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
int major, minor, micro;
|
||||
char *tmp_version;
|
||||
|
||||
system ("touch conf.glibtest");
|
||||
|
||||
/* HP/UX 9 (%@#!) writes to sscanf strings */
|
||||
tmp_version = g_strdup("$min_glib_version");
|
||||
if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) {
|
||||
printf("%s, bad version string\n", "$min_glib_version");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if ((glib_major_version != $glib_config_major_version) ||
|
||||
(glib_minor_version != $glib_config_minor_version) ||
|
||||
(glib_micro_version != $glib_config_micro_version))
|
||||
{
|
||||
printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
|
||||
$glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
|
||||
glib_major_version, glib_minor_version, glib_micro_version);
|
||||
printf ("*** was found! If glib-config was correct, then it is best\n");
|
||||
printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n");
|
||||
printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
|
||||
printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
|
||||
printf("*** required on your system.\n");
|
||||
printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n");
|
||||
printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n");
|
||||
printf("*** before re-running configure\n");
|
||||
}
|
||||
else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
|
||||
(glib_minor_version != GLIB_MINOR_VERSION) ||
|
||||
(glib_micro_version != GLIB_MICRO_VERSION))
|
||||
{
|
||||
printf("*** GLIB header files (version %d.%d.%d) do not match\n",
|
||||
GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
|
||||
printf("*** library (version %d.%d.%d)\n",
|
||||
glib_major_version, glib_minor_version, glib_micro_version);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((glib_major_version > major) ||
|
||||
((glib_major_version == major) && (glib_minor_version > minor)) ||
|
||||
((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n",
|
||||
glib_major_version, glib_minor_version, glib_micro_version);
|
||||
printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n",
|
||||
major, minor, micro);
|
||||
printf("*** GLIB is always available from ftp://ftp.glib.org.\n");
|
||||
printf("***\n");
|
||||
printf("*** If you have already installed a sufficiently new version, this error\n");
|
||||
printf("*** probably means that the wrong copy of the glib-config shell script is\n");
|
||||
printf("*** being found. The easiest way to fix this is to remove the old version\n");
|
||||
printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n");
|
||||
printf("*** correct copy of glib-config. (In this case, you will have to\n");
|
||||
printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
|
||||
printf("*** so that the correct libraries are found at run-time))\n");
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
LIBS="$ac_save_LIBS"
|
||||
fi
|
||||
fi
|
||||
if test "x$no_glib" = x ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
ifelse([$2], , :, [$2])
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
if test "$GLIB_CONFIG" = "no" ; then
|
||||
echo "*** The glib-config script installed by GLIB could not be found"
|
||||
echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in"
|
||||
echo "*** your path, or set the GLIB_CONFIG environment variable to the"
|
||||
echo "*** full path to glib-config."
|
||||
else
|
||||
if test -f conf.glibtest ; then
|
||||
:
|
||||
else
|
||||
echo "*** Could not run GLIB test program, checking why..."
|
||||
CFLAGS="$CFLAGS $GLIB_CFLAGS"
|
||||
LIBS="$LIBS $GLIB_LIBS"
|
||||
AC_TRY_LINK([
|
||||
#include <glib/glib.h>
|
||||
#include <stdio.h>
|
||||
], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ],
|
||||
[ echo "*** The test program compiled, but did not run. This usually means"
|
||||
echo "*** that the run-time linker is not finding GLIB or finding the wrong"
|
||||
echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
|
||||
echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
|
||||
echo "*** to the installed location Also, make sure you have run ldconfig if that"
|
||||
echo "*** is required on your system"
|
||||
echo "***"
|
||||
echo "*** If you have an old version installed, it is best to remove it, although"
|
||||
echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
|
||||
echo "***"
|
||||
echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
|
||||
echo "*** came with the system with the command"
|
||||
echo "***"
|
||||
echo "*** rpm --erase --nodeps gtk gtk-devel" ],
|
||||
[ echo "*** The test program failed to compile or link. See the file config.log for the"
|
||||
echo "*** exact error that occured. This usually means GLIB was incorrectly installed"
|
||||
echo "*** or that you have moved GLIB since it was installed. In the latter case, you"
|
||||
echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ])
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
LIBS="$ac_save_LIBS"
|
||||
fi
|
||||
fi
|
||||
GLIB_CFLAGS=""
|
||||
GLIB_LIBS=""
|
||||
ifelse([$3], , :, [$3])
|
||||
fi
|
||||
AC_SUBST(GLIB_CFLAGS)
|
||||
AC_SUBST(GLIB_LIBS)
|
||||
rm -f conf.glibtest
|
||||
])
|
54
glib/Makefile.am
Normal file
54
glib/Makefile.am
Normal file
@ -0,0 +1,54 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
configincludedir = $(pkglibdir)/include
|
||||
|
||||
bin_SCRIPTS=glib-config
|
||||
|
||||
EXTRA_DIST = \
|
||||
glib.m4
|
||||
|
||||
lib_LTLIBRARIES = libglib-1.1.la
|
||||
|
||||
libglib_1_1_la_SOURCES = \
|
||||
garray.c \
|
||||
gcache.c \
|
||||
gcompletion.c \
|
||||
gdataset.c \
|
||||
gerror.c \
|
||||
ghash.c \
|
||||
glist.c \
|
||||
gmem.c \
|
||||
gmessages.c \
|
||||
gprimes.c \
|
||||
gslist.c \
|
||||
gtimer.c \
|
||||
gtree.c \
|
||||
gstring.c \
|
||||
gscanner.c \
|
||||
gutils.c
|
||||
|
||||
include_HEADERS = \
|
||||
glib.h
|
||||
|
||||
configinclude_DATA = \
|
||||
glibconfig.h
|
||||
|
||||
libglib_1_1_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
|
||||
INCLUDES = -I$(top_srcdir)
|
||||
|
||||
noinst_PROGRAMS = testglib
|
||||
testglib_LDADD = libglib-@LT_RELEASE@.la
|
||||
|
||||
m4datadir = $(datadir)/aclocal
|
||||
m4data_DATA = glib.m4
|
||||
|
||||
.PHONY: files release
|
||||
|
||||
files:
|
||||
@files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \
|
||||
echo $$p; \
|
||||
done
|
||||
|
||||
release:
|
||||
$(MAKE) dist distdir=$(PACKAGE)`date +"%y%m%d"`
|
143
glib/garray.c
Normal file
143
glib/garray.c
Normal file
@ -0,0 +1,143 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
#define MIN_ARRAY_SIZE 16
|
||||
|
||||
|
||||
typedef struct _GRealArray GRealArray;
|
||||
|
||||
struct _GRealArray
|
||||
{
|
||||
guint8 *data;
|
||||
guint len;
|
||||
guint alloc;
|
||||
guint zero_terminated;
|
||||
};
|
||||
|
||||
|
||||
static gint g_nearest_pow (gint num);
|
||||
static void g_array_maybe_expand (GRealArray *array,
|
||||
gint len);
|
||||
|
||||
|
||||
static GMemChunk *array_mem_chunk = NULL;
|
||||
|
||||
|
||||
GArray*
|
||||
g_array_new (gint zero_terminated)
|
||||
{
|
||||
GRealArray *array;
|
||||
|
||||
if (!array_mem_chunk)
|
||||
array_mem_chunk = g_mem_chunk_new ("array mem chunk",
|
||||
sizeof (GRealArray),
|
||||
1024, G_ALLOC_AND_FREE);
|
||||
|
||||
array = g_chunk_new (GRealArray, array_mem_chunk);
|
||||
|
||||
array->data = NULL;
|
||||
array->len = 0;
|
||||
array->alloc = 0;
|
||||
array->zero_terminated = (zero_terminated ? 1 : 0);
|
||||
|
||||
return (GArray*) array;
|
||||
}
|
||||
|
||||
void
|
||||
g_array_free (GArray *array,
|
||||
gint free_segment)
|
||||
{
|
||||
if (free_segment)
|
||||
g_free (array->data);
|
||||
|
||||
g_mem_chunk_free (array_mem_chunk, array);
|
||||
}
|
||||
|
||||
GArray*
|
||||
g_rarray_append (GArray *array,
|
||||
gpointer data,
|
||||
gint size)
|
||||
{
|
||||
g_array_maybe_expand ((GRealArray*) array, size);
|
||||
|
||||
memcpy (array->data + array->len, data, size);
|
||||
|
||||
array->len += size;
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
GArray*
|
||||
g_rarray_prepend (GArray *array,
|
||||
gpointer data,
|
||||
gint size)
|
||||
{
|
||||
g_array_maybe_expand ((GRealArray*) array, size);
|
||||
|
||||
g_memmove (array->data + size, array->data, array->len);
|
||||
memcpy (array->data, data, size);
|
||||
|
||||
array->len += size;
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
GArray*
|
||||
g_rarray_truncate (GArray *array,
|
||||
gint length,
|
||||
gint size)
|
||||
{
|
||||
if (array->data)
|
||||
memset (array->data + length * size, 0, size);
|
||||
array->len = length * size;
|
||||
return array;
|
||||
}
|
||||
|
||||
|
||||
static gint
|
||||
g_nearest_pow (gint num)
|
||||
{
|
||||
gint n = 1;
|
||||
|
||||
while (n < num)
|
||||
n <<= 1;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static void
|
||||
g_array_maybe_expand (GRealArray *array,
|
||||
gint len)
|
||||
{
|
||||
guint old_alloc;
|
||||
|
||||
if ((array->len + len) > array->alloc)
|
||||
{
|
||||
old_alloc = array->alloc;
|
||||
|
||||
array->alloc = g_nearest_pow (array->len + array->zero_terminated + len);
|
||||
array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
|
||||
array->data = g_realloc (array->data, array->alloc);
|
||||
|
||||
memset (array->data + old_alloc, 0, array->alloc - old_alloc);
|
||||
}
|
||||
}
|
260
glib/gbacktrace.c
Normal file
260
glib/gbacktrace.c
Normal file
@ -0,0 +1,260 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/times.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include "glib.h"
|
||||
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif /* HAVE_SYS_SELECT_H */
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <string.h> /* for bzero on BSD systems */
|
||||
#endif
|
||||
|
||||
#define INTERACTIVE 0
|
||||
#define STACK_TRACE 1
|
||||
|
||||
|
||||
#ifndef NO_FD_SET
|
||||
# define SELECT_MASK fd_set
|
||||
#else
|
||||
# ifndef _AIX
|
||||
typedef long fd_mask;
|
||||
# endif
|
||||
# if defined(_IBMR2)
|
||||
# define SELECT_MASK void
|
||||
# else
|
||||
# define SELECT_MASK int
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
static int do_query (char *prompt);
|
||||
static void debug (const gchar *progname, int method);
|
||||
static void stack_trace (char **);
|
||||
static void stack_trace_sigchld (int);
|
||||
|
||||
|
||||
static int stack_trace_done;
|
||||
|
||||
void
|
||||
g_debug (const gchar *progname)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
fprintf (stdout, "[n]othing, [e]xit, [s]tack trace, [a]ttach to process: ");
|
||||
fflush (stdout);
|
||||
|
||||
fgets (buf, 32, stdin);
|
||||
if (strcmp (buf, "n\n") == 0)
|
||||
return;
|
||||
else if (strcmp (buf, "s\n") == 0)
|
||||
debug (progname, STACK_TRACE);
|
||||
else if (strcmp (buf, "a\n") == 0)
|
||||
debug (progname, INTERACTIVE);
|
||||
else
|
||||
exit (0);
|
||||
}
|
||||
|
||||
void
|
||||
g_attach_process (const gchar *progname,
|
||||
int query)
|
||||
{
|
||||
if (!query || do_query ("attach to process"))
|
||||
debug (progname, INTERACTIVE);
|
||||
}
|
||||
|
||||
void
|
||||
g_stack_trace (const gchar *progname,
|
||||
int query)
|
||||
{
|
||||
if (!query || do_query ("print stack trace"))
|
||||
debug (progname, STACK_TRACE);
|
||||
}
|
||||
|
||||
static int
|
||||
do_query (char *prompt)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
fprintf (stdout, "%s (y/n) ", prompt);
|
||||
fflush (stdout);
|
||||
|
||||
fgets (buf, 32, stdin);
|
||||
if ((strcmp (buf, "yes\n") == 0) ||
|
||||
(strcmp (buf, "y\n") == 0) ||
|
||||
(strcmp (buf, "YES\n") == 0) ||
|
||||
(strcmp (buf, "Y\n") == 0))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
debug (const char *progname,
|
||||
int method)
|
||||
{
|
||||
pid_t pid;
|
||||
char buf[16];
|
||||
char *args[4] = { "gdb", NULL, NULL, NULL };
|
||||
volatile int x;
|
||||
|
||||
sprintf (buf, "%d", (int) getpid ());
|
||||
|
||||
args[1] = (gchar*) progname;
|
||||
args[2] = buf;
|
||||
|
||||
switch (method)
|
||||
{
|
||||
case INTERACTIVE:
|
||||
fprintf (stdout, "pid: %s\n", buf);
|
||||
break;
|
||||
case STACK_TRACE:
|
||||
pid = fork ();
|
||||
if (pid == 0)
|
||||
{
|
||||
stack_trace (args);
|
||||
_exit (0);
|
||||
}
|
||||
else if (pid == (pid_t) -1)
|
||||
{
|
||||
perror ("could not fork");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
x = 1;
|
||||
while (x)
|
||||
;
|
||||
}
|
||||
|
||||
static void
|
||||
stack_trace (char **args)
|
||||
{
|
||||
pid_t pid;
|
||||
int in_fd[2];
|
||||
int out_fd[2];
|
||||
SELECT_MASK fdset;
|
||||
SELECT_MASK readset;
|
||||
struct timeval tv;
|
||||
int sel, index, state;
|
||||
char buffer[256];
|
||||
char c;
|
||||
|
||||
stack_trace_done = 0;
|
||||
signal (SIGCHLD, stack_trace_sigchld);
|
||||
|
||||
if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1))
|
||||
{
|
||||
perror ("could open pipe");
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
pid = fork ();
|
||||
if (pid == 0)
|
||||
{
|
||||
close (0); dup (in_fd[0]); /* set the stdin to the in pipe */
|
||||
close (1); dup (out_fd[1]); /* set the stdout to the out pipe */
|
||||
close (2); dup (out_fd[1]); /* set the stderr to the out pipe */
|
||||
|
||||
execvp (args[0], args); /* exec gdb */
|
||||
perror ("exec failed");
|
||||
_exit (0);
|
||||
}
|
||||
else if (pid == (pid_t) -1)
|
||||
{
|
||||
perror ("could not fork");
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
FD_ZERO (&fdset);
|
||||
FD_SET (out_fd[0], &fdset);
|
||||
|
||||
write (in_fd[1], "backtrace\n", 10);
|
||||
write (in_fd[1], "p x = 0\n", 8);
|
||||
write (in_fd[1], "quit\n", 5);
|
||||
|
||||
index = 0;
|
||||
state = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
readset = fdset;
|
||||
tv.tv_sec = 1;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv);
|
||||
if (sel == -1)
|
||||
break;
|
||||
|
||||
if ((sel > 0) && (FD_ISSET (out_fd[0], &readset)))
|
||||
{
|
||||
if (read (out_fd[0], &c, 1))
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
if (c == '#')
|
||||
{
|
||||
state = 1;
|
||||
index = 0;
|
||||
buffer[index++] = c;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
buffer[index++] = c;
|
||||
if ((c == '\n') || (c == '\r'))
|
||||
{
|
||||
buffer[index] = 0;
|
||||
fprintf (stdout, "%s", buffer);
|
||||
state = 0;
|
||||
index = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (stack_trace_done)
|
||||
break;
|
||||
}
|
||||
|
||||
close (in_fd[0]);
|
||||
close (in_fd[1]);
|
||||
close (out_fd[0]);
|
||||
close (out_fd[1]);
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
static void
|
||||
stack_trace_sigchld (int signum)
|
||||
{
|
||||
stack_trace_done = 1;
|
||||
}
|
212
glib/gcache.c
Normal file
212
glib/gcache.c
Normal file
@ -0,0 +1,212 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GCacheNode GCacheNode;
|
||||
typedef struct _GRealCache GRealCache;
|
||||
|
||||
struct _GCacheNode
|
||||
{
|
||||
/* A reference counted node */
|
||||
gpointer value;
|
||||
gint ref_count;
|
||||
};
|
||||
|
||||
struct _GRealCache
|
||||
{
|
||||
/* Called to create a value from a key */
|
||||
GCacheNewFunc value_new_func;
|
||||
|
||||
/* Called to destroy a value */
|
||||
GCacheDestroyFunc value_destroy_func;
|
||||
|
||||
/* Called to duplicate a key */
|
||||
GCacheDupFunc key_dup_func;
|
||||
|
||||
/* Called to destroy a key */
|
||||
GCacheDestroyFunc key_destroy_func;
|
||||
|
||||
/* Associates keys with nodes */
|
||||
GHashTable *key_table;
|
||||
|
||||
/* Associates nodes with keys */
|
||||
GHashTable *value_table;
|
||||
};
|
||||
|
||||
|
||||
static GCacheNode* g_cache_node_new (gpointer value);
|
||||
static void g_cache_node_destroy (GCacheNode *node);
|
||||
|
||||
|
||||
static GMemChunk *node_mem_chunk = NULL;
|
||||
|
||||
|
||||
GCache*
|
||||
g_cache_new (GCacheNewFunc value_new_func,
|
||||
GCacheDestroyFunc value_destroy_func,
|
||||
GCacheDupFunc key_dup_func,
|
||||
GCacheDestroyFunc key_destroy_func,
|
||||
GHashFunc hash_key_func,
|
||||
GHashFunc hash_value_func,
|
||||
GCompareFunc key_compare_func)
|
||||
{
|
||||
GRealCache *cache;
|
||||
|
||||
g_return_val_if_fail (value_new_func != NULL, NULL);
|
||||
g_return_val_if_fail (value_destroy_func != NULL, NULL);
|
||||
g_return_val_if_fail (key_dup_func != NULL, NULL);
|
||||
g_return_val_if_fail (key_destroy_func != NULL, NULL);
|
||||
g_return_val_if_fail (hash_key_func != NULL, NULL);
|
||||
g_return_val_if_fail (hash_value_func != NULL, NULL);
|
||||
g_return_val_if_fail (key_compare_func != NULL, NULL);
|
||||
|
||||
cache = g_new (GRealCache, 1);
|
||||
cache->value_new_func = value_new_func;
|
||||
cache->value_destroy_func = value_destroy_func;
|
||||
cache->key_dup_func = key_dup_func;
|
||||
cache->key_destroy_func = key_destroy_func;
|
||||
cache->key_table = g_hash_table_new (hash_key_func, key_compare_func);
|
||||
cache->value_table = g_hash_table_new (hash_value_func, NULL);
|
||||
|
||||
return (GCache*) cache;
|
||||
}
|
||||
|
||||
void
|
||||
g_cache_destroy (GCache *cache)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
|
||||
g_return_if_fail (cache != NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
g_hash_table_destroy (rcache->key_table);
|
||||
g_hash_table_destroy (rcache->value_table);
|
||||
g_free (rcache);
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_cache_insert (GCache *cache,
|
||||
gpointer key)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
GCacheNode *node;
|
||||
gpointer value;
|
||||
|
||||
g_return_val_if_fail (cache != NULL, NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
|
||||
node = g_hash_table_lookup (rcache->key_table, key);
|
||||
if (node)
|
||||
{
|
||||
node->ref_count += 1;
|
||||
return node->value;
|
||||
}
|
||||
|
||||
key = (* rcache->key_dup_func) (key);
|
||||
value = (* rcache->value_new_func) (key);
|
||||
node = g_cache_node_new (value);
|
||||
|
||||
g_hash_table_insert (rcache->key_table, key, node);
|
||||
g_hash_table_insert (rcache->value_table, value, key);
|
||||
|
||||
return node->value;
|
||||
}
|
||||
|
||||
void
|
||||
g_cache_remove (GCache *cache,
|
||||
gpointer value)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
GCacheNode *node;
|
||||
gpointer key;
|
||||
|
||||
g_return_if_fail (cache != NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
|
||||
key = g_hash_table_lookup (rcache->value_table, value);
|
||||
node = g_hash_table_lookup (rcache->key_table, key);
|
||||
|
||||
node->ref_count -= 1;
|
||||
if (node->ref_count == 0)
|
||||
{
|
||||
g_hash_table_remove (rcache->value_table, value);
|
||||
g_hash_table_remove (rcache->key_table, key);
|
||||
|
||||
(* rcache->key_destroy_func) (key);
|
||||
(* rcache->value_destroy_func) (node->value);
|
||||
g_cache_node_destroy (node);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_cache_key_foreach (GCache *cache,
|
||||
GHFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
|
||||
g_return_if_fail (cache != NULL);
|
||||
g_return_if_fail (func != NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
|
||||
g_hash_table_foreach (rcache->value_table, func, user_data);
|
||||
}
|
||||
|
||||
void
|
||||
g_cache_value_foreach (GCache *cache,
|
||||
GHFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GRealCache *rcache;
|
||||
|
||||
g_return_if_fail (cache != NULL);
|
||||
g_return_if_fail (func != NULL);
|
||||
|
||||
rcache = (GRealCache*) cache;
|
||||
|
||||
g_hash_table_foreach (rcache->key_table, func, user_data);
|
||||
}
|
||||
|
||||
|
||||
static GCacheNode*
|
||||
g_cache_node_new (gpointer value)
|
||||
{
|
||||
GCacheNode *node;
|
||||
|
||||
if (!node_mem_chunk)
|
||||
node_mem_chunk = g_mem_chunk_new ("cache node mem chunk", sizeof (GCacheNode),
|
||||
1024, G_ALLOC_AND_FREE);
|
||||
|
||||
node = g_chunk_new (GCacheNode, node_mem_chunk);
|
||||
|
||||
node->value = value;
|
||||
node->ref_count = 1;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static void
|
||||
g_cache_node_destroy (GCacheNode *node)
|
||||
{
|
||||
g_mem_chunk_free (node_mem_chunk, node);
|
||||
}
|
238
glib/gcompletion.c
Normal file
238
glib/gcompletion.c
Normal file
@ -0,0 +1,238 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "glib.h"
|
||||
#include <string.h>
|
||||
|
||||
static void completion_check_cache (GCompletion* cmp, gchar** new_prefix);
|
||||
|
||||
GCompletion*
|
||||
g_completion_new (GCompletionFunc func) {
|
||||
GCompletion* gcomp;
|
||||
|
||||
gcomp = g_new(GCompletion, 1);
|
||||
gcomp->items = NULL;
|
||||
gcomp->cache = NULL;
|
||||
gcomp->prefix = NULL;
|
||||
if ( func )
|
||||
gcomp->func = func;
|
||||
else
|
||||
gcomp->func = NULL;
|
||||
return gcomp;
|
||||
}
|
||||
|
||||
void
|
||||
g_completion_add_items (GCompletion* cmp, GList* items) {
|
||||
GList* it;
|
||||
|
||||
g_return_if_fail( cmp != NULL);
|
||||
g_return_if_fail( items != NULL);
|
||||
|
||||
/* optimize adding to cache? */
|
||||
if ( cmp->cache ) {
|
||||
g_list_free(cmp->cache);
|
||||
cmp->cache = NULL;
|
||||
}
|
||||
if ( cmp->prefix ) {
|
||||
g_free(cmp->prefix);
|
||||
cmp->prefix = NULL;
|
||||
}
|
||||
|
||||
it = items;
|
||||
while ( it ) {
|
||||
cmp->items = g_list_prepend(cmp->items, it->data);
|
||||
it = it->next;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_completion_remove_items (GCompletion* cmp, GList* items) {
|
||||
GList* it;
|
||||
|
||||
g_return_if_fail( cmp != NULL);
|
||||
g_return_if_fail( items != NULL);
|
||||
|
||||
it = items;
|
||||
while ( cmp->items && it ) {
|
||||
cmp->items = g_list_remove(cmp->items, it->data);
|
||||
it = it->next;
|
||||
}
|
||||
it = items;
|
||||
while ( cmp->cache && it ) {
|
||||
cmp->cache = g_list_remove(cmp->cache, it->data);
|
||||
it = it->next;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_completion_clear_items (GCompletion* cmp) {
|
||||
g_return_if_fail(cmp != NULL);
|
||||
|
||||
g_list_free(cmp->items);
|
||||
cmp->items = NULL;
|
||||
g_list_free(cmp->cache);
|
||||
cmp->cache = NULL;
|
||||
g_free(cmp->prefix);
|
||||
cmp->prefix = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
completion_check_cache (GCompletion* cmp, gchar** new_prefix) {
|
||||
register GList* list;
|
||||
register gint len;
|
||||
register gint i;
|
||||
register gint plen;
|
||||
gchar* postfix=NULL;
|
||||
gchar* s;
|
||||
|
||||
if ( !new_prefix )
|
||||
return;
|
||||
if ( !cmp->cache ) {
|
||||
*new_prefix = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
len = strlen(cmp->prefix);
|
||||
list = cmp->cache;
|
||||
s = cmp->func?(*cmp->func)(list->data):(gchar*)list->data;
|
||||
postfix = s + len;
|
||||
plen = strlen(postfix);
|
||||
list = list->next;
|
||||
|
||||
while (list && plen) {
|
||||
s = cmp->func?(*cmp->func)(list->data):(gchar*)list->data;
|
||||
s += len;
|
||||
for (i=0; i < plen; ++i) {
|
||||
if ( postfix[i] != s[i] )
|
||||
break;
|
||||
}
|
||||
plen = i;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
*new_prefix = g_new0(gchar, len+plen+1);
|
||||
strncpy(*new_prefix, cmp->prefix, len);
|
||||
strncpy(*new_prefix+len, postfix, plen);
|
||||
}
|
||||
|
||||
GList*
|
||||
g_completion_complete (GCompletion* cmp, gchar* prefix, gchar** new_prefix) {
|
||||
gint plen, len;
|
||||
gint done=0;
|
||||
GList* list;
|
||||
|
||||
g_return_val_if_fail(cmp != NULL, NULL);
|
||||
g_return_val_if_fail(prefix != NULL, NULL);
|
||||
|
||||
len = strlen(prefix);
|
||||
if ( cmp->prefix && cmp->cache ) {
|
||||
plen = strlen(cmp->prefix);
|
||||
if ( plen <= len && !strncmp(prefix, cmp->prefix, plen) ) {
|
||||
/* use the cache */
|
||||
list = cmp->cache;
|
||||
while ( list ) {
|
||||
if ( strncmp(prefix, cmp->func?(*cmp->func)(list->data):(gchar*)list->data, len) ) {
|
||||
list = g_list_remove_link(cmp->cache, list);
|
||||
if ( list != cmp->cache )
|
||||
cmp->cache = list;
|
||||
} else
|
||||
list = list->next;
|
||||
}
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!done) { /* normal code */
|
||||
g_list_free(cmp->cache);
|
||||
cmp->cache = NULL;
|
||||
list = cmp->items;
|
||||
while (*prefix && list) {
|
||||
if ( !strncmp(prefix, cmp->func?(*cmp->func)(list->data):(gchar*)list->data, len) )
|
||||
cmp->cache = g_list_prepend(cmp->cache, list->data);
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
if ( cmp->prefix ) {
|
||||
g_free(cmp->prefix);
|
||||
cmp->prefix = NULL;
|
||||
}
|
||||
if ( cmp->cache )
|
||||
cmp->prefix = g_strdup(prefix);
|
||||
completion_check_cache(cmp, new_prefix);
|
||||
return *prefix?cmp->cache:cmp->items;
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
g_completion_free (GCompletion* cmp) {
|
||||
g_return_if_fail(cmp != NULL);
|
||||
|
||||
g_completion_clear_items(cmp);
|
||||
g_free(cmp);
|
||||
}
|
||||
|
||||
#ifdef TEST_COMPLETION
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int main (int argc, char* argv[]) {
|
||||
|
||||
FILE * file;
|
||||
gchar buf[1024];
|
||||
GList *list;
|
||||
GList *result;
|
||||
GList *tmp;
|
||||
GCompletion * cmp;
|
||||
gint i;
|
||||
gchar* longp=NULL;
|
||||
|
||||
if ( argc < 3 ) {
|
||||
g_warning("Usage: %s filename prefix1 [prefix2 ...]\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( !(file=fopen(argv[1], "r")) ) {
|
||||
g_warning("Cannot open %s\n", argv[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
cmp = g_completion_new(NULL);
|
||||
list = g_list_alloc();
|
||||
while (fgets(buf, 1024, file)) {
|
||||
list->data = g_strdup(buf);
|
||||
g_completion_add_items(cmp, list);
|
||||
}
|
||||
fclose(file);
|
||||
|
||||
for ( i= 2; i < argc; ++i) {
|
||||
printf("COMPLETING: %s\n", argv[i]);
|
||||
result = g_completion_complete(cmp, argv[i], &longp);
|
||||
g_list_foreach(result, (GFunc)printf, NULL);
|
||||
printf("LONG MATCH: %s\n", longp);
|
||||
g_free(longp);
|
||||
longp = NULL;
|
||||
}
|
||||
|
||||
g_list_foreach(cmp->items, (GFunc)g_free, NULL);
|
||||
g_completion_free(cmp);
|
||||
g_list_free(list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
342
glib/gdataset.c
Normal file
342
glib/gdataset.c
Normal file
@ -0,0 +1,342 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* gdataset.c: Generic dataset mechanism, similar to GtkObject data.
|
||||
* Copyright (C) 1998 Tim Janik
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
|
||||
/* --- defines --- */
|
||||
#define G_DATASET_ID_BLOCK_SIZE (1024)
|
||||
#define G_DATASET_MEM_CHUNK_PREALLOC (512)
|
||||
#define G_DATASET_DATA_MEM_CHUNK_PREALLOC (1024)
|
||||
|
||||
|
||||
/* --- structures --- */
|
||||
typedef struct _GDatasetData GDatasetData;
|
||||
typedef struct _GDataset GDataset;
|
||||
struct _GDatasetData
|
||||
{
|
||||
GDatasetData *next;
|
||||
guint id;
|
||||
gpointer data;
|
||||
GDestroyNotify destroy_func;
|
||||
};
|
||||
|
||||
struct _GDataset
|
||||
{
|
||||
gconstpointer location;
|
||||
GDatasetData *data_list;
|
||||
};
|
||||
|
||||
|
||||
/* --- prototypes --- */
|
||||
static inline GDataset* g_dataset_lookup (gconstpointer dataset_location);
|
||||
static inline void g_dataset_destroy_i (GDataset *dataset);
|
||||
static void g_dataset_initialize (void);
|
||||
static guint* g_dataset_id_new (void);
|
||||
|
||||
|
||||
/* --- variables --- */
|
||||
static GHashTable *g_dataset_location_ht = NULL;
|
||||
static GHashTable *g_dataset_key_ht = NULL;
|
||||
static GDataset *g_dataset_cached = NULL;
|
||||
static GMemChunk *g_dataset_mem_chunk = NULL;
|
||||
static GMemChunk *g_dataset_data_mem_chunk = NULL;
|
||||
static guint *g_dataset_id_block = NULL;
|
||||
static guint g_dataset_id_index = G_DATASET_ID_BLOCK_SIZE + 1;
|
||||
|
||||
|
||||
/* --- functions --- */
|
||||
static inline GDataset*
|
||||
g_dataset_lookup (gconstpointer dataset_location)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
|
||||
if (g_dataset_cached && g_dataset_cached->location == dataset_location)
|
||||
return g_dataset_cached;
|
||||
|
||||
if (!g_dataset_location_ht)
|
||||
g_dataset_initialize ();
|
||||
|
||||
dataset = g_hash_table_lookup (g_dataset_location_ht, dataset_location);
|
||||
if (dataset)
|
||||
g_dataset_cached = dataset;
|
||||
|
||||
return dataset;
|
||||
}
|
||||
|
||||
static inline void
|
||||
g_dataset_destroy_i (GDataset *dataset)
|
||||
{
|
||||
register GDatasetData *list;
|
||||
|
||||
if (dataset == g_dataset_cached)
|
||||
g_dataset_cached = NULL;
|
||||
g_hash_table_remove (g_dataset_location_ht, dataset->location);
|
||||
|
||||
list = dataset->data_list;
|
||||
g_mem_chunk_free (g_dataset_mem_chunk, dataset);
|
||||
|
||||
while (list)
|
||||
{
|
||||
register GDatasetData *prev;
|
||||
|
||||
prev = list;
|
||||
list = prev->next;
|
||||
|
||||
if (prev->destroy_func)
|
||||
prev->destroy_func (prev->data);
|
||||
|
||||
g_mem_chunk_free (g_dataset_data_mem_chunk, prev);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_dataset_destroy (gconstpointer dataset_location)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
|
||||
g_return_if_fail (dataset_location != NULL);
|
||||
|
||||
dataset = g_dataset_lookup (dataset_location);
|
||||
if (dataset)
|
||||
g_dataset_destroy_i (dataset);
|
||||
}
|
||||
|
||||
void
|
||||
g_dataset_id_set_destroy (gconstpointer dataset_location,
|
||||
guint key_id,
|
||||
GDestroyNotify destroy_func)
|
||||
{
|
||||
g_return_if_fail (dataset_location != NULL);
|
||||
|
||||
if (key_id)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
|
||||
dataset = g_dataset_lookup (dataset_location);
|
||||
if (dataset)
|
||||
{
|
||||
register GDatasetData *list;
|
||||
|
||||
list = dataset->data_list;
|
||||
while (list)
|
||||
{
|
||||
if (list->id == key_id)
|
||||
{
|
||||
list->destroy_func = destroy_func;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_dataset_id_get_data (gconstpointer dataset_location,
|
||||
guint key_id)
|
||||
{
|
||||
g_return_val_if_fail (dataset_location != NULL, NULL);
|
||||
|
||||
if (key_id)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
|
||||
dataset = g_dataset_lookup (dataset_location);
|
||||
if (dataset)
|
||||
{
|
||||
register GDatasetData *list;
|
||||
|
||||
for (list = dataset->data_list; list; list = list->next)
|
||||
if (list->id == key_id)
|
||||
return list->data;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
g_dataset_id_set_data_full (gconstpointer dataset_location,
|
||||
guint key_id,
|
||||
gpointer data,
|
||||
GDestroyNotify destroy_func)
|
||||
{
|
||||
register GDataset *dataset;
|
||||
register GDatasetData *list;
|
||||
|
||||
g_return_if_fail (dataset_location != NULL);
|
||||
g_return_if_fail (key_id > 0);
|
||||
|
||||
dataset = g_dataset_lookup (dataset_location);
|
||||
if (!dataset)
|
||||
{
|
||||
dataset = g_chunk_new (GDataset, g_dataset_mem_chunk);
|
||||
dataset->location = dataset_location;
|
||||
dataset->data_list = NULL;
|
||||
g_hash_table_insert (g_dataset_location_ht,
|
||||
(gpointer) dataset->location, /* Yuck */
|
||||
dataset);
|
||||
}
|
||||
|
||||
list = dataset->data_list;
|
||||
if (!data)
|
||||
{
|
||||
register GDatasetData *prev;
|
||||
|
||||
prev = NULL;
|
||||
while (list)
|
||||
{
|
||||
if (list->id == key_id)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = list->next;
|
||||
else
|
||||
{
|
||||
dataset->data_list = list->next;
|
||||
|
||||
if (!dataset->data_list)
|
||||
g_dataset_destroy_i (dataset);
|
||||
}
|
||||
|
||||
/* we need to have unlinked before invoking the destroy function
|
||||
*/
|
||||
if (list->destroy_func)
|
||||
list->destroy_func (list->data);
|
||||
|
||||
g_mem_chunk_free (g_dataset_data_mem_chunk, list);
|
||||
break;
|
||||
}
|
||||
|
||||
prev = list;
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
register GDatasetData *prev;
|
||||
|
||||
prev = NULL;
|
||||
while (list)
|
||||
{
|
||||
if (list->id == key_id)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = list->next;
|
||||
else
|
||||
dataset->data_list = list->next;
|
||||
|
||||
/* we need to have unlinked before invoking the destroy function
|
||||
*/
|
||||
if (list->destroy_func)
|
||||
list->destroy_func (list->data);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
prev = list;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
if (!list)
|
||||
list = g_chunk_new (GDatasetData, g_dataset_data_mem_chunk);
|
||||
list->next = dataset->data_list;
|
||||
list->id = key_id;
|
||||
list->data = data;
|
||||
list->destroy_func = destroy_func;
|
||||
dataset->data_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
guint
|
||||
g_dataset_try_key (const gchar *key)
|
||||
{
|
||||
register guint *id;
|
||||
g_return_val_if_fail (key != NULL, 0);
|
||||
|
||||
if (g_dataset_key_ht)
|
||||
{
|
||||
id = g_hash_table_lookup (g_dataset_key_ht, (gpointer) key);
|
||||
|
||||
if (id)
|
||||
return *id;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
guint
|
||||
g_dataset_force_id (const gchar *key)
|
||||
{
|
||||
register guint *id;
|
||||
|
||||
g_return_val_if_fail (key != NULL, 0);
|
||||
|
||||
if (!g_dataset_key_ht)
|
||||
g_dataset_initialize ();
|
||||
|
||||
id = g_hash_table_lookup (g_dataset_key_ht, (gpointer) key);
|
||||
if (!id)
|
||||
{
|
||||
id = g_dataset_id_new ();
|
||||
g_hash_table_insert (g_dataset_key_ht, g_strdup (key), id);
|
||||
}
|
||||
|
||||
return *id;
|
||||
}
|
||||
|
||||
static void
|
||||
g_dataset_initialize (void)
|
||||
{
|
||||
if (!g_dataset_location_ht)
|
||||
{
|
||||
g_dataset_location_ht = g_hash_table_new (g_direct_hash, NULL);
|
||||
g_dataset_key_ht = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
g_dataset_cached = NULL;
|
||||
g_dataset_mem_chunk =
|
||||
g_mem_chunk_new ("GDataset MemChunk",
|
||||
sizeof (GDataset),
|
||||
sizeof (GDataset) * G_DATASET_MEM_CHUNK_PREALLOC,
|
||||
G_ALLOC_AND_FREE);
|
||||
g_dataset_data_mem_chunk =
|
||||
g_mem_chunk_new ("GDatasetData MemChunk",
|
||||
sizeof (GDatasetData),
|
||||
sizeof (GDatasetData) * G_DATASET_DATA_MEM_CHUNK_PREALLOC,
|
||||
G_ALLOC_AND_FREE);
|
||||
}
|
||||
}
|
||||
|
||||
static guint*
|
||||
g_dataset_id_new (void)
|
||||
{
|
||||
static guint seq_id = 1;
|
||||
register guint *id;
|
||||
|
||||
if (g_dataset_id_index >= G_DATASET_ID_BLOCK_SIZE)
|
||||
{
|
||||
g_dataset_id_block = g_new (guint, G_DATASET_ID_BLOCK_SIZE);
|
||||
g_dataset_id_index = 0;
|
||||
}
|
||||
|
||||
id = &g_dataset_id_block[g_dataset_id_index++];
|
||||
*id = seq_id++;
|
||||
|
||||
return id;
|
||||
}
|
260
glib/gerror.c
Normal file
260
glib/gerror.c
Normal file
@ -0,0 +1,260 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/times.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include "glib.h"
|
||||
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif /* HAVE_SYS_SELECT_H */
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <string.h> /* for bzero on BSD systems */
|
||||
#endif
|
||||
|
||||
#define INTERACTIVE 0
|
||||
#define STACK_TRACE 1
|
||||
|
||||
|
||||
#ifndef NO_FD_SET
|
||||
# define SELECT_MASK fd_set
|
||||
#else
|
||||
# ifndef _AIX
|
||||
typedef long fd_mask;
|
||||
# endif
|
||||
# if defined(_IBMR2)
|
||||
# define SELECT_MASK void
|
||||
# else
|
||||
# define SELECT_MASK int
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
static int do_query (char *prompt);
|
||||
static void debug (const gchar *progname, int method);
|
||||
static void stack_trace (char **);
|
||||
static void stack_trace_sigchld (int);
|
||||
|
||||
|
||||
static int stack_trace_done;
|
||||
|
||||
void
|
||||
g_debug (const gchar *progname)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
fprintf (stdout, "[n]othing, [e]xit, [s]tack trace, [a]ttach to process: ");
|
||||
fflush (stdout);
|
||||
|
||||
fgets (buf, 32, stdin);
|
||||
if (strcmp (buf, "n\n") == 0)
|
||||
return;
|
||||
else if (strcmp (buf, "s\n") == 0)
|
||||
debug (progname, STACK_TRACE);
|
||||
else if (strcmp (buf, "a\n") == 0)
|
||||
debug (progname, INTERACTIVE);
|
||||
else
|
||||
exit (0);
|
||||
}
|
||||
|
||||
void
|
||||
g_attach_process (const gchar *progname,
|
||||
int query)
|
||||
{
|
||||
if (!query || do_query ("attach to process"))
|
||||
debug (progname, INTERACTIVE);
|
||||
}
|
||||
|
||||
void
|
||||
g_stack_trace (const gchar *progname,
|
||||
int query)
|
||||
{
|
||||
if (!query || do_query ("print stack trace"))
|
||||
debug (progname, STACK_TRACE);
|
||||
}
|
||||
|
||||
static int
|
||||
do_query (char *prompt)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
fprintf (stdout, "%s (y/n) ", prompt);
|
||||
fflush (stdout);
|
||||
|
||||
fgets (buf, 32, stdin);
|
||||
if ((strcmp (buf, "yes\n") == 0) ||
|
||||
(strcmp (buf, "y\n") == 0) ||
|
||||
(strcmp (buf, "YES\n") == 0) ||
|
||||
(strcmp (buf, "Y\n") == 0))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
debug (const char *progname,
|
||||
int method)
|
||||
{
|
||||
pid_t pid;
|
||||
char buf[16];
|
||||
char *args[4] = { "gdb", NULL, NULL, NULL };
|
||||
volatile int x;
|
||||
|
||||
sprintf (buf, "%d", (int) getpid ());
|
||||
|
||||
args[1] = (gchar*) progname;
|
||||
args[2] = buf;
|
||||
|
||||
switch (method)
|
||||
{
|
||||
case INTERACTIVE:
|
||||
fprintf (stdout, "pid: %s\n", buf);
|
||||
break;
|
||||
case STACK_TRACE:
|
||||
pid = fork ();
|
||||
if (pid == 0)
|
||||
{
|
||||
stack_trace (args);
|
||||
_exit (0);
|
||||
}
|
||||
else if (pid == (pid_t) -1)
|
||||
{
|
||||
perror ("could not fork");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
x = 1;
|
||||
while (x)
|
||||
;
|
||||
}
|
||||
|
||||
static void
|
||||
stack_trace (char **args)
|
||||
{
|
||||
pid_t pid;
|
||||
int in_fd[2];
|
||||
int out_fd[2];
|
||||
SELECT_MASK fdset;
|
||||
SELECT_MASK readset;
|
||||
struct timeval tv;
|
||||
int sel, index, state;
|
||||
char buffer[256];
|
||||
char c;
|
||||
|
||||
stack_trace_done = 0;
|
||||
signal (SIGCHLD, stack_trace_sigchld);
|
||||
|
||||
if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1))
|
||||
{
|
||||
perror ("could open pipe");
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
pid = fork ();
|
||||
if (pid == 0)
|
||||
{
|
||||
close (0); dup (in_fd[0]); /* set the stdin to the in pipe */
|
||||
close (1); dup (out_fd[1]); /* set the stdout to the out pipe */
|
||||
close (2); dup (out_fd[1]); /* set the stderr to the out pipe */
|
||||
|
||||
execvp (args[0], args); /* exec gdb */
|
||||
perror ("exec failed");
|
||||
_exit (0);
|
||||
}
|
||||
else if (pid == (pid_t) -1)
|
||||
{
|
||||
perror ("could not fork");
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
FD_ZERO (&fdset);
|
||||
FD_SET (out_fd[0], &fdset);
|
||||
|
||||
write (in_fd[1], "backtrace\n", 10);
|
||||
write (in_fd[1], "p x = 0\n", 8);
|
||||
write (in_fd[1], "quit\n", 5);
|
||||
|
||||
index = 0;
|
||||
state = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
readset = fdset;
|
||||
tv.tv_sec = 1;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv);
|
||||
if (sel == -1)
|
||||
break;
|
||||
|
||||
if ((sel > 0) && (FD_ISSET (out_fd[0], &readset)))
|
||||
{
|
||||
if (read (out_fd[0], &c, 1))
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
if (c == '#')
|
||||
{
|
||||
state = 1;
|
||||
index = 0;
|
||||
buffer[index++] = c;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
buffer[index++] = c;
|
||||
if ((c == '\n') || (c == '\r'))
|
||||
{
|
||||
buffer[index] = 0;
|
||||
fprintf (stdout, "%s", buffer);
|
||||
state = 0;
|
||||
index = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (stack_trace_done)
|
||||
break;
|
||||
}
|
||||
|
||||
close (in_fd[0]);
|
||||
close (in_fd[1]);
|
||||
close (out_fd[0]);
|
||||
close (out_fd[1]);
|
||||
_exit (0);
|
||||
}
|
||||
|
||||
static void
|
||||
stack_trace_sigchld (int signum)
|
||||
{
|
||||
stack_trace_done = 1;
|
||||
}
|
426
glib/ghash.c
Normal file
426
glib/ghash.c
Normal file
@ -0,0 +1,426 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
#define HASH_TABLE_MIN_SIZE 11
|
||||
#define HASH_TABLE_MAX_SIZE 13845163
|
||||
|
||||
|
||||
typedef struct _GHashNode GHashNode;
|
||||
typedef struct _GRealHashTable GRealHashTable;
|
||||
|
||||
struct _GHashNode
|
||||
{
|
||||
gpointer key;
|
||||
gpointer value;
|
||||
GHashNode *next;
|
||||
};
|
||||
|
||||
struct _GRealHashTable
|
||||
{
|
||||
gint size;
|
||||
gint nnodes;
|
||||
gint frozen;
|
||||
GHashNode **nodes;
|
||||
GHashFunc hash_func;
|
||||
GCompareFunc key_compare_func;
|
||||
};
|
||||
|
||||
|
||||
static void g_hash_table_resize (GHashTable *hash_table);
|
||||
static gint g_hash_closest_prime (gint num);
|
||||
static GHashNode* g_hash_node_new (gpointer key,
|
||||
gpointer value);
|
||||
static void g_hash_node_destroy (GHashNode *hash_node);
|
||||
static void g_hash_nodes_destroy (GHashNode *hash_node);
|
||||
|
||||
|
||||
extern gint g_primes[];
|
||||
extern gint g_nprimes;
|
||||
|
||||
static GMemChunk *node_mem_chunk = NULL;
|
||||
static GHashNode *node_free_list = NULL;
|
||||
|
||||
|
||||
GHashTable*
|
||||
g_hash_table_new (GHashFunc hash_func,
|
||||
GCompareFunc key_compare_func)
|
||||
{
|
||||
GRealHashTable *hash_table;
|
||||
|
||||
g_return_val_if_fail (hash_func != NULL, NULL);
|
||||
|
||||
hash_table = g_new (GRealHashTable, 1);
|
||||
hash_table->size = 0;
|
||||
hash_table->nnodes = 0;
|
||||
hash_table->frozen = FALSE;
|
||||
hash_table->nodes = NULL;
|
||||
hash_table->hash_func = hash_func;
|
||||
hash_table->key_compare_func = key_compare_func;
|
||||
|
||||
return ((GHashTable*) hash_table);
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_destroy (GHashTable *hash_table)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
gint i;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
|
||||
for (i = 0; i < rhash_table->size; i++)
|
||||
g_hash_nodes_destroy (rhash_table->nodes[i]);
|
||||
|
||||
if (rhash_table->nodes)
|
||||
g_free (rhash_table->nodes);
|
||||
g_free (rhash_table);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_insert (GHashTable *hash_table,
|
||||
gpointer key,
|
||||
gpointer value)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode *node;
|
||||
guint hash_val;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
|
||||
if (rhash_table->size == 0)
|
||||
g_hash_table_resize (hash_table);
|
||||
|
||||
hash_val = (* rhash_table->hash_func) (key) % rhash_table->size;
|
||||
|
||||
node = rhash_table->nodes[hash_val];
|
||||
while (node)
|
||||
{
|
||||
if ((rhash_table->key_compare_func &&
|
||||
(* rhash_table->key_compare_func) (node->key, key)) ||
|
||||
(node->key == key))
|
||||
{
|
||||
/* do not reset node->key in this place, keeping
|
||||
* the old key might be intended.
|
||||
* a g_hash_table_remove/g_hash_table_insert pair
|
||||
* can be used otherwise.
|
||||
*
|
||||
* node->key = key;
|
||||
*/
|
||||
node->value = value;
|
||||
return;
|
||||
}
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
node = g_hash_node_new (key, value);
|
||||
node->next = rhash_table->nodes[hash_val];
|
||||
rhash_table->nodes[hash_val] = node;
|
||||
|
||||
rhash_table->nnodes += 1;
|
||||
g_hash_table_resize (hash_table);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_remove (GHashTable *hash_table,
|
||||
gconstpointer key)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode *node;
|
||||
GHashNode *prev;
|
||||
guint hash_val;
|
||||
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
if (hash_table && rhash_table->size)
|
||||
{
|
||||
hash_val = (* rhash_table->hash_func) (key) % rhash_table->size;
|
||||
|
||||
prev = NULL;
|
||||
node = rhash_table->nodes[hash_val];
|
||||
|
||||
while (node)
|
||||
{
|
||||
if ((rhash_table->key_compare_func &&
|
||||
(* rhash_table->key_compare_func) (node->key, key)) ||
|
||||
(node->key == key))
|
||||
{
|
||||
if (prev)
|
||||
prev->next = node->next;
|
||||
if (node == rhash_table->nodes[hash_val])
|
||||
rhash_table->nodes[hash_val] = node->next;
|
||||
|
||||
g_hash_node_destroy (node);
|
||||
|
||||
rhash_table->nnodes -= 1;
|
||||
g_hash_table_resize (hash_table);
|
||||
break;
|
||||
}
|
||||
|
||||
prev = node;
|
||||
node = node->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_hash_table_lookup (GHashTable *hash_table,
|
||||
gconstpointer key)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode *node;
|
||||
guint hash_val;
|
||||
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
if (hash_table && rhash_table->size)
|
||||
{
|
||||
hash_val = (* rhash_table->hash_func) (key) % rhash_table->size;
|
||||
|
||||
node = rhash_table->nodes[hash_val];
|
||||
|
||||
/* Hash table lookup needs to be fast.
|
||||
* We therefore remove the extra conditional of testing
|
||||
* whether to call the key_compare_func or not from
|
||||
* the inner loop.
|
||||
*/
|
||||
if (rhash_table->key_compare_func)
|
||||
{
|
||||
while (node)
|
||||
{
|
||||
if ((* rhash_table->key_compare_func) (node->key, key))
|
||||
return node->value;
|
||||
node = node->next;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (node)
|
||||
{
|
||||
if (node->key == key)
|
||||
return node->value;
|
||||
node = node->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_freeze (GHashTable *hash_table)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
rhash_table->frozen = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_thaw (GHashTable *hash_table)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
rhash_table->frozen = FALSE;
|
||||
|
||||
g_hash_table_resize (hash_table);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_hash_table_foreach (GHashTable *hash_table,
|
||||
GHFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode *node;
|
||||
gint i;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
|
||||
for (i = 0; i < rhash_table->size; i++)
|
||||
{
|
||||
node = rhash_table->nodes[i];
|
||||
|
||||
while (node)
|
||||
{
|
||||
(* func) (node->key, node->value, user_data);
|
||||
node = node->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
g_hash_table_resize (GHashTable *hash_table)
|
||||
{
|
||||
GRealHashTable *rhash_table;
|
||||
GHashNode **new_nodes;
|
||||
GHashNode *node;
|
||||
GHashNode *next;
|
||||
gfloat nodes_per_list;
|
||||
guint hash_val;
|
||||
gint new_size;
|
||||
gint need_resize;
|
||||
gint i;
|
||||
|
||||
if (hash_table)
|
||||
{
|
||||
rhash_table = (GRealHashTable*) hash_table;
|
||||
|
||||
if (rhash_table->size == 0)
|
||||
{
|
||||
rhash_table->size = HASH_TABLE_MIN_SIZE;
|
||||
rhash_table->nodes = g_new (GHashNode*, rhash_table->size);
|
||||
|
||||
for (i = 0; i < rhash_table->size; i++)
|
||||
rhash_table->nodes[i] = NULL;
|
||||
}
|
||||
else if (!rhash_table->frozen)
|
||||
{
|
||||
need_resize = FALSE;
|
||||
nodes_per_list = (gfloat) rhash_table->nnodes / (gfloat) rhash_table->size;
|
||||
|
||||
if (nodes_per_list < 0.3)
|
||||
{
|
||||
if (rhash_table->size > HASH_TABLE_MIN_SIZE)
|
||||
need_resize = TRUE;
|
||||
}
|
||||
else if (nodes_per_list > 3.0)
|
||||
{
|
||||
if (rhash_table->size < HASH_TABLE_MAX_SIZE)
|
||||
need_resize = TRUE;
|
||||
}
|
||||
|
||||
if (need_resize)
|
||||
{
|
||||
new_size = g_hash_closest_prime (rhash_table->nnodes);
|
||||
if (new_size < HASH_TABLE_MIN_SIZE)
|
||||
new_size = HASH_TABLE_MIN_SIZE;
|
||||
else if (new_size > HASH_TABLE_MAX_SIZE)
|
||||
new_size = HASH_TABLE_MAX_SIZE;
|
||||
|
||||
new_nodes = g_new (GHashNode*, new_size);
|
||||
|
||||
for (i = 0; i < new_size; i++)
|
||||
new_nodes[i] = NULL;
|
||||
|
||||
for (i = 0; i < rhash_table->size; i++)
|
||||
{
|
||||
node = rhash_table->nodes[i];
|
||||
|
||||
while (node)
|
||||
{
|
||||
next = node->next;
|
||||
|
||||
hash_val = (* rhash_table->hash_func) (node->key) % new_size;
|
||||
node->next = new_nodes[hash_val];
|
||||
new_nodes[hash_val] = node;
|
||||
|
||||
node = next;
|
||||
}
|
||||
}
|
||||
|
||||
g_free (rhash_table->nodes);
|
||||
|
||||
rhash_table->nodes = new_nodes;
|
||||
rhash_table->size = new_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static gint
|
||||
g_hash_closest_prime (gint num)
|
||||
{
|
||||
gint i;
|
||||
|
||||
for (i = 0; i < g_nprimes; i++)
|
||||
if ((g_primes[i] - num) > 0)
|
||||
return g_primes[i];
|
||||
|
||||
return g_primes[g_nprimes - 1];
|
||||
}
|
||||
|
||||
static GHashNode*
|
||||
g_hash_node_new (gpointer key,
|
||||
gpointer value)
|
||||
{
|
||||
GHashNode *hash_node;
|
||||
|
||||
if (node_free_list)
|
||||
{
|
||||
hash_node = node_free_list;
|
||||
node_free_list = node_free_list->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!node_mem_chunk)
|
||||
node_mem_chunk = g_mem_chunk_new ("hash node mem chunk",
|
||||
sizeof (GHashNode),
|
||||
1024, G_ALLOC_ONLY);
|
||||
|
||||
hash_node = g_chunk_new (GHashNode, node_mem_chunk);
|
||||
}
|
||||
|
||||
hash_node->key = key;
|
||||
hash_node->value = value;
|
||||
hash_node->next = NULL;
|
||||
|
||||
return hash_node;
|
||||
}
|
||||
|
||||
static void
|
||||
g_hash_node_destroy (GHashNode *hash_node)
|
||||
{
|
||||
if (hash_node)
|
||||
{
|
||||
hash_node->next = node_free_list;
|
||||
node_free_list = hash_node;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
g_hash_nodes_destroy (GHashNode *hash_node)
|
||||
{
|
||||
GHashNode *node;
|
||||
|
||||
if (hash_node)
|
||||
{
|
||||
node = hash_node;
|
||||
while (node->next)
|
||||
node = node->next;
|
||||
node->next = node_free_list;
|
||||
node_free_list = hash_node;
|
||||
}
|
||||
}
|
481
glib/glist.c
Normal file
481
glib/glist.c
Normal file
@ -0,0 +1,481 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GRealListAllocator GRealListAllocator;
|
||||
|
||||
struct _GRealListAllocator
|
||||
{
|
||||
GMemChunk *list_mem_chunk;
|
||||
GList *free_list;
|
||||
};
|
||||
|
||||
|
||||
static GRealListAllocator *default_allocator = NULL;
|
||||
static GRealListAllocator *current_allocator = NULL;
|
||||
|
||||
|
||||
GListAllocator*
|
||||
g_list_allocator_new (void)
|
||||
{
|
||||
GRealListAllocator* allocator = g_new (GRealListAllocator, 1);
|
||||
|
||||
allocator->list_mem_chunk = NULL;
|
||||
allocator->free_list = NULL;
|
||||
|
||||
return (GListAllocator*) allocator;
|
||||
}
|
||||
|
||||
void
|
||||
g_list_allocator_free (GListAllocator* fallocator)
|
||||
{
|
||||
GRealListAllocator* allocator = (GRealListAllocator *) fallocator;
|
||||
|
||||
if (allocator && allocator->list_mem_chunk)
|
||||
g_mem_chunk_destroy (allocator->list_mem_chunk);
|
||||
if (allocator)
|
||||
g_free (allocator);
|
||||
}
|
||||
|
||||
GListAllocator*
|
||||
g_list_set_allocator (GListAllocator* fallocator)
|
||||
{
|
||||
GRealListAllocator* allocator = (GRealListAllocator *) fallocator;
|
||||
GRealListAllocator* old_allocator = current_allocator;
|
||||
|
||||
if (allocator)
|
||||
current_allocator = allocator;
|
||||
else
|
||||
{
|
||||
if (!default_allocator)
|
||||
default_allocator = (GRealListAllocator*) g_list_allocator_new ();
|
||||
current_allocator = default_allocator;
|
||||
}
|
||||
|
||||
if (!current_allocator->list_mem_chunk)
|
||||
current_allocator->list_mem_chunk = g_mem_chunk_new ("list mem chunk",
|
||||
sizeof (GList),
|
||||
1024,
|
||||
G_ALLOC_ONLY);
|
||||
|
||||
return (GListAllocator*) (old_allocator == default_allocator ? NULL : old_allocator);
|
||||
}
|
||||
|
||||
|
||||
GList*
|
||||
g_list_alloc (void)
|
||||
{
|
||||
GList *new_list;
|
||||
|
||||
g_list_set_allocator (NULL);
|
||||
if (current_allocator->free_list)
|
||||
{
|
||||
new_list = current_allocator->free_list;
|
||||
current_allocator->free_list = current_allocator->free_list->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_list = g_chunk_new (GList, current_allocator->list_mem_chunk);
|
||||
}
|
||||
|
||||
new_list->data = NULL;
|
||||
new_list->next = NULL;
|
||||
new_list->prev = NULL;
|
||||
|
||||
return new_list;
|
||||
}
|
||||
|
||||
void
|
||||
g_list_free (GList *list)
|
||||
{
|
||||
GList *last;
|
||||
|
||||
if (list)
|
||||
{
|
||||
last = g_list_last (list);
|
||||
last->next = current_allocator->free_list;
|
||||
current_allocator->free_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_list_free_1 (GList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
list->next = current_allocator->free_list;
|
||||
current_allocator->free_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_append (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GList *new_list;
|
||||
GList *last;
|
||||
|
||||
new_list = g_list_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (list)
|
||||
{
|
||||
last = g_list_last (list);
|
||||
/* g_assert (last != NULL); */
|
||||
last->next = new_list;
|
||||
new_list->prev = last;
|
||||
|
||||
return list;
|
||||
}
|
||||
else
|
||||
return new_list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_prepend (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GList *new_list;
|
||||
|
||||
new_list = g_list_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (list)
|
||||
{
|
||||
if (list->prev)
|
||||
{
|
||||
list->prev->next = new_list;
|
||||
new_list->prev = list->prev;
|
||||
}
|
||||
list->prev = new_list;
|
||||
new_list->next = list;
|
||||
}
|
||||
|
||||
return new_list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_insert (GList *list,
|
||||
gpointer data,
|
||||
gint position)
|
||||
{
|
||||
GList *new_list;
|
||||
GList *tmp_list;
|
||||
|
||||
if (position < 0)
|
||||
return g_list_append (list, data);
|
||||
else if (position == 0)
|
||||
return g_list_prepend (list, data);
|
||||
|
||||
tmp_list = g_list_nth (list, position);
|
||||
if (!tmp_list)
|
||||
return g_list_append (list, data);
|
||||
|
||||
new_list = g_list_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (tmp_list->prev)
|
||||
{
|
||||
tmp_list->prev->next = new_list;
|
||||
new_list->prev = tmp_list->prev;
|
||||
}
|
||||
new_list->next = tmp_list;
|
||||
tmp_list->prev = new_list;
|
||||
|
||||
if (tmp_list == list)
|
||||
return new_list;
|
||||
else
|
||||
return list;
|
||||
}
|
||||
|
||||
GList *
|
||||
g_list_concat (GList *list1, GList *list2)
|
||||
{
|
||||
GList *tmp_list;
|
||||
|
||||
if (list2)
|
||||
{
|
||||
tmp_list = g_list_last (list1);
|
||||
if (tmp_list)
|
||||
tmp_list->next = list2;
|
||||
else
|
||||
list1 = list2;
|
||||
list2->prev = tmp_list;
|
||||
}
|
||||
|
||||
return list1;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_remove (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GList *tmp;
|
||||
|
||||
tmp = list;
|
||||
while (tmp)
|
||||
{
|
||||
if (tmp->data != data)
|
||||
tmp = tmp->next;
|
||||
else
|
||||
{
|
||||
if (tmp->prev)
|
||||
tmp->prev->next = tmp->next;
|
||||
if (tmp->next)
|
||||
tmp->next->prev = tmp->prev;
|
||||
|
||||
if (list == tmp)
|
||||
list = list->next;
|
||||
|
||||
g_list_free_1 (tmp);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_remove_link (GList *list,
|
||||
GList *link)
|
||||
{
|
||||
if (link)
|
||||
{
|
||||
if (link->prev)
|
||||
link->prev->next = link->next;
|
||||
if (link->next)
|
||||
link->next->prev = link->prev;
|
||||
|
||||
if (link == list)
|
||||
list = list->next;
|
||||
|
||||
link->next = NULL;
|
||||
link->prev = NULL;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_reverse (GList *list)
|
||||
{
|
||||
GList *last;
|
||||
|
||||
last = NULL;
|
||||
while (list)
|
||||
{
|
||||
last = list;
|
||||
list = last->next;
|
||||
last->next = last->prev;
|
||||
last->prev = list;
|
||||
}
|
||||
|
||||
return last;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_nth (GList *list,
|
||||
guint n)
|
||||
{
|
||||
while ((n-- > 0) && list)
|
||||
list = list->next;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_list_nth_data (GList *list,
|
||||
guint n)
|
||||
{
|
||||
while ((n-- > 0) && list)
|
||||
list = list->next;
|
||||
|
||||
return list ? list->data : NULL;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_find (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
while (list)
|
||||
{
|
||||
if (list->data == data)
|
||||
break;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_find_custom (GList *list,
|
||||
gpointer data,
|
||||
GCompareFunc func)
|
||||
{
|
||||
g_return_val_if_fail (func != NULL, list);
|
||||
|
||||
while (list)
|
||||
{
|
||||
if (! func (list->data, data))
|
||||
return list;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
gint
|
||||
g_list_position (GList *list,
|
||||
GList *link)
|
||||
{
|
||||
gint i;
|
||||
|
||||
i = 0;
|
||||
while (list)
|
||||
{
|
||||
if (list == link)
|
||||
return i;
|
||||
i++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
gint
|
||||
g_list_index (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
gint i;
|
||||
|
||||
i = 0;
|
||||
while (list)
|
||||
{
|
||||
if (list->data == data)
|
||||
return i;
|
||||
i++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_last (GList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
while (list->next)
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_first (GList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
while (list->prev)
|
||||
list = list->prev;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
guint
|
||||
g_list_length (GList *list)
|
||||
{
|
||||
guint length;
|
||||
|
||||
length = 0;
|
||||
while (list)
|
||||
{
|
||||
length++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
void
|
||||
g_list_foreach (GList *list,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
while (list)
|
||||
{
|
||||
(*func) (list->data, user_data);
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GList*
|
||||
g_list_insert_sorted (GList *list,
|
||||
gpointer data,
|
||||
GCompareFunc func)
|
||||
{
|
||||
GList *tmp_list = list;
|
||||
GList *new_list;
|
||||
gint cmp;
|
||||
|
||||
g_return_val_if_fail (func != NULL, list);
|
||||
|
||||
if (!list)
|
||||
{
|
||||
new_list = g_list_alloc();
|
||||
new_list->data = data;
|
||||
return new_list;
|
||||
}
|
||||
|
||||
cmp = (*func) (data, tmp_list->data);
|
||||
|
||||
while ((tmp_list->next) && (cmp > 0))
|
||||
{
|
||||
tmp_list = tmp_list->next;
|
||||
cmp = (*func) (data, tmp_list->data);
|
||||
}
|
||||
|
||||
new_list = g_list_alloc();
|
||||
new_list->data = data;
|
||||
|
||||
if ((!tmp_list->next) && (cmp > 0))
|
||||
{
|
||||
tmp_list->next = new_list;
|
||||
new_list->prev = tmp_list;
|
||||
return list;
|
||||
}
|
||||
|
||||
if (tmp_list->prev)
|
||||
{
|
||||
tmp_list->prev->next = new_list;
|
||||
new_list->prev = tmp_list->prev;
|
||||
}
|
||||
new_list->next = tmp_list;
|
||||
tmp_list->prev = new_list;
|
||||
|
||||
if (tmp_list == list)
|
||||
return new_list;
|
||||
else
|
||||
return list;
|
||||
}
|
807
glib/gmem.c
Normal file
807
glib/gmem.c
Normal file
@ -0,0 +1,807 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "glib.h"
|
||||
|
||||
/* #define ENABLE_MEM_PROFILE */
|
||||
/* #define ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
#define MAX_MEM_AREA 65536L
|
||||
#define MEM_AREA_SIZE 4L
|
||||
|
||||
#if SIZEOF_VOID_P > SIZEOF_LONG
|
||||
#define MEM_ALIGN SIZEOF_VOID_P
|
||||
#else
|
||||
#define MEM_ALIGN SIZEOF_LONG
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct _GFreeAtom GFreeAtom;
|
||||
typedef struct _GMemArea GMemArea;
|
||||
typedef struct _GRealMemChunk GRealMemChunk;
|
||||
|
||||
struct _GFreeAtom
|
||||
{
|
||||
GFreeAtom *next;
|
||||
};
|
||||
|
||||
struct _GMemArea
|
||||
{
|
||||
GMemArea *next; /* the next mem area */
|
||||
GMemArea *prev; /* the previous mem area */
|
||||
gulong index; /* the current index into the "mem" array */
|
||||
gulong free; /* the number of free bytes in this mem area */
|
||||
gulong allocated; /* the number of atoms allocated from this area */
|
||||
gulong mark; /* is this mem area marked for deletion */
|
||||
gchar mem[MEM_AREA_SIZE]; /* the mem array from which atoms get allocated
|
||||
* the actual size of this array is determined by
|
||||
* the mem chunk "area_size". ANSI says that it
|
||||
* must be declared to be the maximum size it
|
||||
* can possibly be (even though the actual size
|
||||
* may be less).
|
||||
*/
|
||||
};
|
||||
|
||||
struct _GRealMemChunk
|
||||
{
|
||||
gchar *name; /* name of this MemChunk...used for debugging output */
|
||||
gint type; /* the type of MemChunk: ALLOC_ONLY or ALLOC_AND_FREE */
|
||||
gint num_mem_areas; /* the number of memory areas */
|
||||
gint num_marked_areas; /* the number of areas marked for deletion */
|
||||
guint atom_size; /* the size of an atom */
|
||||
gulong area_size; /* the size of a memory area */
|
||||
GMemArea *mem_area; /* the current memory area */
|
||||
GMemArea *mem_areas; /* a list of all the mem areas owned by this chunk */
|
||||
GMemArea *free_mem_area; /* the free area...which is about to be destroyed */
|
||||
GFreeAtom *free_atoms; /* the free atoms list */
|
||||
GTree *mem_tree; /* tree of mem areas sorted by memory address */
|
||||
GRealMemChunk *next; /* pointer to the next chunk */
|
||||
GRealMemChunk *prev; /* pointer to the previous chunk */
|
||||
};
|
||||
|
||||
|
||||
static gulong g_mem_chunk_compute_size (gulong size);
|
||||
static gint g_mem_chunk_area_compare (GMemArea *a,
|
||||
GMemArea *b);
|
||||
static gint g_mem_chunk_area_search (GMemArea *a,
|
||||
gchar *addr);
|
||||
|
||||
|
||||
static GRealMemChunk *mem_chunks = NULL;
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
static gulong allocations[4096] = { 0 };
|
||||
static gulong allocated_mem = 0;
|
||||
static gulong freed_mem = 0;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
|
||||
|
||||
#ifndef USE_DMALLOC
|
||||
|
||||
gpointer
|
||||
g_malloc (gulong size)
|
||||
{
|
||||
gpointer p;
|
||||
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
gulong *t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
if (size == 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
p = (gpointer) malloc (size);
|
||||
if (!p)
|
||||
g_error ("could not allocate %ld bytes", size);
|
||||
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = 0;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = size;
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
if (size <= 4095)
|
||||
allocations[size-1] += 1;
|
||||
else
|
||||
allocations[4095] += 1;
|
||||
allocated_mem += size;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_malloc0 (gulong size)
|
||||
{
|
||||
gpointer p;
|
||||
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
gulong *t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
if (size == 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
p = (gpointer) calloc (size, 1);
|
||||
if (!p)
|
||||
g_error ("could not allocate %ld bytes", size);
|
||||
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = 0;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = size;
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
if (size <= 4095)
|
||||
allocations[size-1] += 1;
|
||||
else
|
||||
allocations[4095] += 1;
|
||||
allocated_mem += size;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_realloc (gpointer mem,
|
||||
gulong size)
|
||||
{
|
||||
gpointer p;
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
gulong *t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
if (size == 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
if (!mem)
|
||||
p = (gpointer) malloc (size);
|
||||
else
|
||||
{
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
freed_mem += *t;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
mem = t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
|
||||
if (*t >= 1)
|
||||
g_warning ("trying to realloc freed memory\n");
|
||||
mem = t;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
p = (gpointer) realloc (mem, size);
|
||||
}
|
||||
|
||||
if (!p)
|
||||
g_error ("could not reallocate %ld bytes", size);
|
||||
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = 0;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = size;
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
if (size <= 4095)
|
||||
allocations[size-1] += 1;
|
||||
else
|
||||
allocations[4095] += 1;
|
||||
allocated_mem += size;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
g_free (gpointer mem)
|
||||
{
|
||||
if (mem)
|
||||
{
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
gulong *t;
|
||||
gulong size;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
|
||||
size = *t;
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
freed_mem += size;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
mem = t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
|
||||
if (*t >= 1)
|
||||
g_warning ("freeing previously freed memory\n");
|
||||
*t += 1;
|
||||
mem = t;
|
||||
|
||||
memset ((guchar*) mem + 8, 0, size);
|
||||
#else /* ENABLE_MEM_CHECK */
|
||||
free (mem);
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* ! USE_DMALLOC */
|
||||
|
||||
|
||||
void
|
||||
g_mem_profile (void)
|
||||
{
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
gint i;
|
||||
|
||||
for (i = 0; i < 4095; i++)
|
||||
if (allocations[i] > 0)
|
||||
g_print ("%lu allocations of %d bytes\n", allocations[i], i + 1);
|
||||
|
||||
if (allocations[4095] > 0)
|
||||
g_print ("%lu allocations of greater than 4095 bytes\n", allocations[4095]);
|
||||
g_print ("%lu bytes allocated\n", allocated_mem);
|
||||
g_print ("%lu bytes freed\n", freed_mem);
|
||||
g_print ("%lu bytes in use\n", allocated_mem - freed_mem);
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_check (gpointer mem)
|
||||
{
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
gulong *t;
|
||||
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG - SIZEOF_LONG);
|
||||
|
||||
if (*t >= 1)
|
||||
g_warning ("mem: 0x%08x has been freed: %lu\n", (gulong) mem, *t);
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
}
|
||||
|
||||
GMemChunk*
|
||||
g_mem_chunk_new (gchar *name,
|
||||
gint atom_size,
|
||||
gulong area_size,
|
||||
gint type)
|
||||
{
|
||||
GRealMemChunk *mem_chunk;
|
||||
gulong rarea_size;
|
||||
|
||||
mem_chunk = g_new (struct _GRealMemChunk, 1);
|
||||
mem_chunk->name = name;
|
||||
mem_chunk->type = type;
|
||||
mem_chunk->num_mem_areas = 0;
|
||||
mem_chunk->num_marked_areas = 0;
|
||||
mem_chunk->mem_area = NULL;
|
||||
mem_chunk->free_mem_area = NULL;
|
||||
mem_chunk->free_atoms = NULL;
|
||||
mem_chunk->mem_tree = NULL;
|
||||
mem_chunk->mem_areas = NULL;
|
||||
mem_chunk->atom_size = atom_size;
|
||||
|
||||
if (mem_chunk->type == G_ALLOC_AND_FREE)
|
||||
mem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare);
|
||||
|
||||
if (mem_chunk->atom_size % MEM_ALIGN)
|
||||
mem_chunk->atom_size += MEM_ALIGN - (mem_chunk->atom_size % MEM_ALIGN);
|
||||
|
||||
mem_chunk->area_size = area_size;
|
||||
if (mem_chunk->area_size > MAX_MEM_AREA)
|
||||
mem_chunk->area_size = MAX_MEM_AREA;
|
||||
while (mem_chunk->area_size < mem_chunk->atom_size)
|
||||
mem_chunk->area_size *= 2;
|
||||
|
||||
rarea_size = mem_chunk->area_size + sizeof (GMemArea) - MEM_AREA_SIZE;
|
||||
rarea_size = g_mem_chunk_compute_size (rarea_size);
|
||||
mem_chunk->area_size = rarea_size - (sizeof (GMemArea) - MEM_AREA_SIZE);
|
||||
|
||||
/*
|
||||
mem_chunk->area_size -= (sizeof (GMemArea) - MEM_AREA_SIZE);
|
||||
if (mem_chunk->area_size < mem_chunk->atom_size)
|
||||
{
|
||||
mem_chunk->area_size = (mem_chunk->area_size + sizeof (GMemArea) - MEM_AREA_SIZE) * 2;
|
||||
mem_chunk->area_size -= (sizeof (GMemArea) - MEM_AREA_SIZE);
|
||||
}
|
||||
|
||||
if (mem_chunk->area_size % mem_chunk->atom_size)
|
||||
mem_chunk->area_size += mem_chunk->atom_size - (mem_chunk->area_size % mem_chunk->atom_size);
|
||||
*/
|
||||
|
||||
mem_chunk->next = mem_chunks;
|
||||
mem_chunk->prev = NULL;
|
||||
if (mem_chunks)
|
||||
mem_chunks->prev = mem_chunk;
|
||||
mem_chunks = mem_chunk;
|
||||
|
||||
return ((GMemChunk*) mem_chunk);
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_destroy (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *mem_areas;
|
||||
GMemArea *temp_area;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
mem_areas = rmem_chunk->mem_areas;
|
||||
while (mem_areas)
|
||||
{
|
||||
temp_area = mem_areas;
|
||||
mem_areas = mem_areas->next;
|
||||
g_free (temp_area);
|
||||
}
|
||||
|
||||
if (rmem_chunk->next)
|
||||
rmem_chunk->next->prev = rmem_chunk->prev;
|
||||
if (rmem_chunk->prev)
|
||||
rmem_chunk->prev->next = rmem_chunk->next;
|
||||
|
||||
if (rmem_chunk == mem_chunks)
|
||||
mem_chunks = mem_chunks->next;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
g_tree_destroy (rmem_chunk->mem_tree);
|
||||
|
||||
g_free (rmem_chunk);
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_mem_chunk_alloc (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *temp_area;
|
||||
gpointer mem;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
while (rmem_chunk->free_atoms)
|
||||
{
|
||||
/* Get the first piece of memory on the "free_atoms" list.
|
||||
* We can go ahead and destroy the list node we used to keep
|
||||
* track of it with and to update the "free_atoms" list to
|
||||
* point to its next element.
|
||||
*/
|
||||
mem = rmem_chunk->free_atoms;
|
||||
rmem_chunk->free_atoms = rmem_chunk->free_atoms->next;
|
||||
|
||||
/* Determine which area this piece of memory is allocated from */
|
||||
temp_area = g_tree_search (rmem_chunk->mem_tree,
|
||||
(GSearchFunc) g_mem_chunk_area_search,
|
||||
mem);
|
||||
|
||||
/* If the area has been marked, then it is being destroyed.
|
||||
* (ie marked to be destroyed).
|
||||
* We check to see if all of the segments on the free list that
|
||||
* reference this area have been removed. This occurs when
|
||||
* the ammount of free memory is less than the allocatable size.
|
||||
* If the chunk should be freed, then we place it in the "free_mem_area".
|
||||
* This is so we make sure not to free the mem area here and then
|
||||
* allocate it again a few lines down.
|
||||
* If we don't allocate a chunk a few lines down then the "free_mem_area"
|
||||
* will be freed.
|
||||
* If there is already a "free_mem_area" then we'll just free this mem area.
|
||||
*/
|
||||
if (temp_area->mark)
|
||||
{
|
||||
/* Update the "free" memory available in that area */
|
||||
temp_area->free += rmem_chunk->atom_size;
|
||||
|
||||
if (temp_area->free == rmem_chunk->area_size)
|
||||
{
|
||||
if (temp_area == rmem_chunk->mem_area)
|
||||
rmem_chunk->mem_area = NULL;
|
||||
|
||||
if (rmem_chunk->free_mem_area)
|
||||
{
|
||||
rmem_chunk->num_mem_areas -= 1;
|
||||
|
||||
if (temp_area->next)
|
||||
temp_area->next->prev = temp_area->prev;
|
||||
if (temp_area->prev)
|
||||
temp_area->prev->next = temp_area->next;
|
||||
if (temp_area == rmem_chunk->mem_areas)
|
||||
rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
g_tree_remove (rmem_chunk->mem_tree, temp_area);
|
||||
g_free (temp_area);
|
||||
}
|
||||
else
|
||||
rmem_chunk->free_mem_area = temp_area;
|
||||
|
||||
rmem_chunk->num_marked_areas -= 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Update the number of allocated atoms count.
|
||||
*/
|
||||
temp_area->allocated += 1;
|
||||
|
||||
/* The area wasn't marked...return the memory
|
||||
*/
|
||||
goto outa_here;
|
||||
}
|
||||
}
|
||||
|
||||
/* If there isn't a current mem area or the current mem area is out of space
|
||||
* then allocate a new mem area. We'll first check and see if we can use
|
||||
* the "free_mem_area". Otherwise we'll just malloc the mem area.
|
||||
*/
|
||||
if ((!rmem_chunk->mem_area) ||
|
||||
((rmem_chunk->mem_area->index + rmem_chunk->atom_size) > rmem_chunk->area_size))
|
||||
{
|
||||
if (rmem_chunk->free_mem_area)
|
||||
{
|
||||
rmem_chunk->mem_area = rmem_chunk->free_mem_area;
|
||||
rmem_chunk->free_mem_area = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
rmem_chunk->mem_area = (GMemArea*) g_malloc (sizeof (GMemArea) -
|
||||
MEM_AREA_SIZE +
|
||||
rmem_chunk->area_size);
|
||||
|
||||
rmem_chunk->num_mem_areas += 1;
|
||||
rmem_chunk->mem_area->next = rmem_chunk->mem_areas;
|
||||
rmem_chunk->mem_area->prev = NULL;
|
||||
|
||||
if (rmem_chunk->mem_areas)
|
||||
rmem_chunk->mem_areas->prev = rmem_chunk->mem_area;
|
||||
rmem_chunk->mem_areas = rmem_chunk->mem_area;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
g_tree_insert (rmem_chunk->mem_tree, rmem_chunk->mem_area, rmem_chunk->mem_area);
|
||||
}
|
||||
|
||||
rmem_chunk->mem_area->index = 0;
|
||||
rmem_chunk->mem_area->free = rmem_chunk->area_size;
|
||||
rmem_chunk->mem_area->allocated = 0;
|
||||
rmem_chunk->mem_area->mark = 0;
|
||||
}
|
||||
|
||||
/* Get the memory and modify the state variables appropriately.
|
||||
*/
|
||||
mem = (gpointer) &rmem_chunk->mem_area->mem[rmem_chunk->mem_area->index];
|
||||
rmem_chunk->mem_area->index += rmem_chunk->atom_size;
|
||||
rmem_chunk->mem_area->free -= rmem_chunk->atom_size;
|
||||
rmem_chunk->mem_area->allocated += 1;
|
||||
|
||||
outa_here:
|
||||
return mem;
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_free (GMemChunk *mem_chunk,
|
||||
gpointer mem)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *temp_area;
|
||||
GFreeAtom *free_atom;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
g_assert (mem != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
/* Don't do anything if this is an ALLOC_ONLY chunk
|
||||
*/
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
{
|
||||
/* Place the memory on the "free_atoms" list
|
||||
*/
|
||||
free_atom = (GFreeAtom*) mem;
|
||||
free_atom->next = rmem_chunk->free_atoms;
|
||||
rmem_chunk->free_atoms = free_atom;
|
||||
|
||||
temp_area = g_tree_search (rmem_chunk->mem_tree,
|
||||
(GSearchFunc) g_mem_chunk_area_search,
|
||||
mem);
|
||||
|
||||
temp_area->allocated -= 1;
|
||||
|
||||
if (temp_area->allocated == 0)
|
||||
{
|
||||
temp_area->mark = 1;
|
||||
rmem_chunk->num_marked_areas += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* This doesn't free the free_area if there is one */
|
||||
void
|
||||
g_mem_chunk_clean (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *mem_area;
|
||||
GFreeAtom *prev_free_atom;
|
||||
GFreeAtom *temp_free_atom;
|
||||
gpointer mem;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
{
|
||||
prev_free_atom = NULL;
|
||||
temp_free_atom = rmem_chunk->free_atoms;
|
||||
|
||||
while (temp_free_atom)
|
||||
{
|
||||
mem = (gpointer) temp_free_atom;
|
||||
|
||||
mem_area = g_tree_search (rmem_chunk->mem_tree,
|
||||
(GSearchFunc) g_mem_chunk_area_search,
|
||||
mem);
|
||||
|
||||
/* If this mem area is marked for destruction then delete the
|
||||
* area and list node and decrement the free mem.
|
||||
*/
|
||||
if (mem_area->mark)
|
||||
{
|
||||
if (prev_free_atom)
|
||||
prev_free_atom->next = temp_free_atom->next;
|
||||
else
|
||||
rmem_chunk->free_atoms = temp_free_atom->next;
|
||||
temp_free_atom = temp_free_atom->next;
|
||||
|
||||
mem_area->free += rmem_chunk->atom_size;
|
||||
if (mem_area->free == rmem_chunk->area_size)
|
||||
{
|
||||
rmem_chunk->num_mem_areas -= 1;
|
||||
rmem_chunk->num_marked_areas -= 1;
|
||||
|
||||
if (mem_area->next)
|
||||
mem_area->next->prev = mem_area->prev;
|
||||
if (mem_area->prev)
|
||||
mem_area->prev->next = mem_area->next;
|
||||
if (mem_area == rmem_chunk->mem_areas)
|
||||
rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
|
||||
if (mem_area == rmem_chunk->mem_area)
|
||||
rmem_chunk->mem_area = NULL;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
g_tree_remove (rmem_chunk->mem_tree, mem_area);
|
||||
g_free (mem_area);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
prev_free_atom = temp_free_atom;
|
||||
temp_free_atom = temp_free_atom->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_reset (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *mem_areas;
|
||||
GMemArea *temp_area;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
mem_areas = rmem_chunk->mem_areas;
|
||||
rmem_chunk->num_mem_areas = 0;
|
||||
rmem_chunk->mem_areas = NULL;
|
||||
rmem_chunk->mem_area = NULL;
|
||||
|
||||
while (mem_areas)
|
||||
{
|
||||
temp_area = mem_areas;
|
||||
mem_areas = mem_areas->next;
|
||||
g_free (temp_area);
|
||||
}
|
||||
|
||||
rmem_chunk->free_atoms = NULL;
|
||||
|
||||
if (rmem_chunk->mem_tree)
|
||||
g_tree_destroy (rmem_chunk->mem_tree);
|
||||
rmem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare);
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_print (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *mem_areas;
|
||||
gulong mem;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
mem_areas = rmem_chunk->mem_areas;
|
||||
mem = 0;
|
||||
|
||||
while (mem_areas)
|
||||
{
|
||||
mem += rmem_chunk->area_size - mem_areas->free;
|
||||
mem_areas = mem_areas->next;
|
||||
}
|
||||
|
||||
g_print ("%s: %ld bytes using %d mem areas\n", rmem_chunk->name, mem, rmem_chunk->num_mem_areas);
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_info (void)
|
||||
{
|
||||
GRealMemChunk *mem_chunk;
|
||||
gint count;
|
||||
|
||||
count = 0;
|
||||
mem_chunk = mem_chunks;
|
||||
while (mem_chunk)
|
||||
{
|
||||
count += 1;
|
||||
mem_chunk = mem_chunk->next;
|
||||
}
|
||||
|
||||
g_print ("%d mem chunks\n", count);
|
||||
|
||||
mem_chunk = mem_chunks;
|
||||
while (mem_chunk)
|
||||
{
|
||||
g_mem_chunk_print ((GMemChunk*) mem_chunk);
|
||||
mem_chunk = mem_chunk->next;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_blow_chunks (void)
|
||||
{
|
||||
GRealMemChunk *mem_chunk;
|
||||
|
||||
mem_chunk = mem_chunks;
|
||||
while (mem_chunk)
|
||||
{
|
||||
g_mem_chunk_clean ((GMemChunk*) mem_chunk);
|
||||
mem_chunk = mem_chunk->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static gulong
|
||||
g_mem_chunk_compute_size (gulong size)
|
||||
{
|
||||
gulong power_of_2;
|
||||
gulong lower, upper;
|
||||
|
||||
power_of_2 = 16;
|
||||
while (power_of_2 < size)
|
||||
power_of_2 <<= 1;
|
||||
|
||||
lower = power_of_2 >> 1;
|
||||
upper = power_of_2;
|
||||
|
||||
if ((size - lower) < (upper - size))
|
||||
return lower;
|
||||
return upper;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_mem_chunk_area_compare (GMemArea *a,
|
||||
GMemArea *b)
|
||||
{
|
||||
return (a->mem - b->mem);
|
||||
}
|
||||
|
||||
static gint
|
||||
g_mem_chunk_area_search (GMemArea *a,
|
||||
gchar *addr)
|
||||
{
|
||||
if (a->mem <= addr)
|
||||
{
|
||||
if (addr < &a->mem[a->index])
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
180
glib/gmessages.c
Normal file
180
glib/gmessages.c
Normal file
@ -0,0 +1,180 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "glib.h"
|
||||
|
||||
static GErrorFunc glib_error_func = NULL;
|
||||
static GWarningFunc glib_warning_func = NULL;
|
||||
static GPrintFunc glib_message_func = NULL;
|
||||
static GPrintFunc glib_print_func = NULL;
|
||||
|
||||
extern char* g_vsprintf (const gchar *fmt, va_list *args, va_list *args2);
|
||||
|
||||
void
|
||||
g_error (const gchar *format, ...)
|
||||
{
|
||||
va_list args, args2;
|
||||
char *buf;
|
||||
static gboolean errored = 0;
|
||||
|
||||
if (errored++)
|
||||
{
|
||||
write (2, "g_error: recursed!\n", 19);
|
||||
return;
|
||||
}
|
||||
|
||||
va_start (args, format);
|
||||
va_start (args2, format);
|
||||
buf = g_vsprintf (format, &args, &args2);
|
||||
va_end (args);
|
||||
va_end (args2);
|
||||
|
||||
if (glib_error_func)
|
||||
{
|
||||
(* glib_error_func) (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Use write() here because we might be out of memory */
|
||||
write (2, "\n** ERROR **: ", 14);
|
||||
write (2, buf, strlen(buf));
|
||||
write (2, "\n", 1);
|
||||
}
|
||||
|
||||
abort ();
|
||||
}
|
||||
|
||||
void
|
||||
g_warning (const gchar *format, ...)
|
||||
{
|
||||
va_list args, args2;
|
||||
char *buf;
|
||||
|
||||
va_start (args, format);
|
||||
va_start (args2, format);
|
||||
buf = g_vsprintf (format, &args, &args2);
|
||||
va_end (args);
|
||||
va_end (args2);
|
||||
|
||||
if (glib_warning_func)
|
||||
{
|
||||
(* glib_warning_func) (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs ("\n** WARNING **: ", stderr);
|
||||
fputs (buf, stderr);
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_message (const gchar *format, ...)
|
||||
{
|
||||
va_list args, args2;
|
||||
char *buf;
|
||||
|
||||
va_start (args, format);
|
||||
va_start (args2, format);
|
||||
buf = g_vsprintf (format, &args, &args2);
|
||||
va_end (args);
|
||||
va_end (args2);
|
||||
|
||||
if (glib_message_func)
|
||||
{
|
||||
(* glib_message_func) (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs ("message: ", stdout);
|
||||
fputs (buf, stdout);
|
||||
fputc ('\n', stdout);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_print (const gchar *format, ...)
|
||||
{
|
||||
va_list args, args2;
|
||||
char *buf;
|
||||
|
||||
va_start (args, format);
|
||||
va_start (args2, format);
|
||||
buf = g_vsprintf (format, &args, &args2);
|
||||
va_end (args);
|
||||
va_end (args2);
|
||||
|
||||
if (glib_print_func)
|
||||
{
|
||||
(* glib_print_func) (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs (buf, stdout);
|
||||
}
|
||||
}
|
||||
|
||||
GErrorFunc
|
||||
g_set_error_handler (GErrorFunc func)
|
||||
{
|
||||
GErrorFunc old_error_func;
|
||||
|
||||
old_error_func = glib_error_func;
|
||||
glib_error_func = func;
|
||||
|
||||
return old_error_func;
|
||||
}
|
||||
|
||||
GWarningFunc
|
||||
g_set_warning_handler (GWarningFunc func)
|
||||
{
|
||||
GWarningFunc old_warning_func;
|
||||
|
||||
old_warning_func = glib_warning_func;
|
||||
glib_warning_func = func;
|
||||
|
||||
return old_warning_func;
|
||||
}
|
||||
|
||||
GPrintFunc
|
||||
g_set_message_handler (GPrintFunc func)
|
||||
{
|
||||
GPrintFunc old_message_func;
|
||||
|
||||
old_message_func = glib_message_func;
|
||||
glib_message_func = func;
|
||||
|
||||
return old_message_func;
|
||||
}
|
||||
|
||||
GPrintFunc
|
||||
g_set_print_handler (GPrintFunc func)
|
||||
{
|
||||
GPrintFunc old_print_func;
|
||||
|
||||
old_print_func = glib_print_func;
|
||||
glib_print_func = func;
|
||||
|
||||
return old_print_func;
|
||||
}
|
||||
|
62
glib/gprimes.c
Normal file
62
glib/gprimes.c
Normal file
@ -0,0 +1,62 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
gint g_primes[] =
|
||||
{
|
||||
11,
|
||||
15,
|
||||
23,
|
||||
35,
|
||||
49,
|
||||
73,
|
||||
109,
|
||||
163,
|
||||
251,
|
||||
367,
|
||||
557,
|
||||
823,
|
||||
1237,
|
||||
1861,
|
||||
2777,
|
||||
4177,
|
||||
6247,
|
||||
9371,
|
||||
14057,
|
||||
21089,
|
||||
31627,
|
||||
47431,
|
||||
71143,
|
||||
106721,
|
||||
160073,
|
||||
240101,
|
||||
360163,
|
||||
540217,
|
||||
810343,
|
||||
1215497,
|
||||
1823231,
|
||||
2734867,
|
||||
4102283,
|
||||
6153409,
|
||||
9230113,
|
||||
13845163,
|
||||
};
|
||||
|
||||
gint g_nprimes = sizeof (g_primes) / sizeof (g_primes[0]);
|
1551
glib/gscanner.c
Normal file
1551
glib/gscanner.c
Normal file
File diff suppressed because it is too large
Load Diff
456
glib/gslist.c
Normal file
456
glib/gslist.c
Normal file
@ -0,0 +1,456 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GRealListAllocator GRealListAllocator;
|
||||
|
||||
struct _GRealListAllocator
|
||||
{
|
||||
GMemChunk *list_mem_chunk;
|
||||
GSList *free_list;
|
||||
};
|
||||
|
||||
|
||||
static GRealListAllocator *default_allocator = NULL;
|
||||
static GRealListAllocator *current_allocator = NULL;
|
||||
|
||||
GListAllocator*
|
||||
g_slist_set_allocator (GListAllocator* fallocator)
|
||||
{
|
||||
GRealListAllocator* allocator = (GRealListAllocator *) fallocator;
|
||||
GRealListAllocator* old_allocator = current_allocator;
|
||||
|
||||
if (allocator)
|
||||
current_allocator = allocator;
|
||||
else
|
||||
{
|
||||
if (!default_allocator)
|
||||
default_allocator = (GRealListAllocator*) g_list_allocator_new ();
|
||||
current_allocator = default_allocator;
|
||||
}
|
||||
|
||||
if (!current_allocator->list_mem_chunk)
|
||||
current_allocator->list_mem_chunk = g_mem_chunk_new ("slist mem chunk",
|
||||
sizeof (GSList),
|
||||
1024,
|
||||
G_ALLOC_ONLY);
|
||||
|
||||
return (GListAllocator*) (old_allocator == default_allocator ? NULL : old_allocator);
|
||||
}
|
||||
|
||||
|
||||
GSList*
|
||||
g_slist_alloc (void)
|
||||
{
|
||||
GSList *new_list;
|
||||
|
||||
g_slist_set_allocator (NULL);
|
||||
if (current_allocator->free_list)
|
||||
{
|
||||
new_list = current_allocator->free_list;
|
||||
current_allocator->free_list = current_allocator->free_list->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_list = g_chunk_new (GSList, current_allocator->list_mem_chunk);
|
||||
}
|
||||
|
||||
new_list->data = NULL;
|
||||
new_list->next = NULL;
|
||||
|
||||
return new_list;
|
||||
}
|
||||
|
||||
void
|
||||
g_slist_free (GSList *list)
|
||||
{
|
||||
GSList *last;
|
||||
|
||||
if (list)
|
||||
{
|
||||
last = g_slist_last (list);
|
||||
last->next = current_allocator->free_list;
|
||||
current_allocator->free_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_slist_free_1 (GSList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
list->next = current_allocator->free_list;
|
||||
current_allocator->free_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_append (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GSList *new_list;
|
||||
GSList *last;
|
||||
|
||||
new_list = g_slist_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (list)
|
||||
{
|
||||
last = g_slist_last (list);
|
||||
/* g_assert (last != NULL); */
|
||||
last->next = new_list;
|
||||
|
||||
return list;
|
||||
}
|
||||
else
|
||||
return new_list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_prepend (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GSList *new_list;
|
||||
|
||||
new_list = g_slist_alloc ();
|
||||
new_list->data = data;
|
||||
new_list->next = list;
|
||||
|
||||
return new_list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_insert (GSList *list,
|
||||
gpointer data,
|
||||
gint position)
|
||||
{
|
||||
GSList *prev_list;
|
||||
GSList *tmp_list;
|
||||
GSList *new_list;
|
||||
|
||||
if (position < 0)
|
||||
return g_slist_append (list, data);
|
||||
else if (position == 0)
|
||||
return g_slist_prepend (list, data);
|
||||
|
||||
new_list = g_slist_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (!list)
|
||||
return new_list;
|
||||
|
||||
prev_list = NULL;
|
||||
tmp_list = list;
|
||||
|
||||
while ((position-- > 0) && tmp_list)
|
||||
{
|
||||
prev_list = tmp_list;
|
||||
tmp_list = tmp_list->next;
|
||||
}
|
||||
|
||||
if (prev_list)
|
||||
{
|
||||
new_list->next = prev_list->next;
|
||||
prev_list->next = new_list;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_list->next = list;
|
||||
list = new_list;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GSList *
|
||||
g_slist_concat (GSList *list1, GSList *list2)
|
||||
{
|
||||
if (list2)
|
||||
{
|
||||
if (list1)
|
||||
g_slist_last (list1)->next = list2;
|
||||
else
|
||||
list1 = list2;
|
||||
}
|
||||
|
||||
return list1;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_remove (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GSList *tmp;
|
||||
GSList *prev;
|
||||
|
||||
prev = NULL;
|
||||
tmp = list;
|
||||
|
||||
while (tmp)
|
||||
{
|
||||
if (tmp->data == data)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = tmp->next;
|
||||
if (list == tmp)
|
||||
list = list->next;
|
||||
|
||||
tmp->next = NULL;
|
||||
g_slist_free (tmp);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
prev = tmp;
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_remove_link (GSList *list,
|
||||
GSList *link)
|
||||
{
|
||||
GSList *tmp;
|
||||
GSList *prev;
|
||||
|
||||
prev = NULL;
|
||||
tmp = list;
|
||||
|
||||
while (tmp)
|
||||
{
|
||||
if (tmp == link)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = tmp->next;
|
||||
if (list == tmp)
|
||||
list = list->next;
|
||||
|
||||
tmp->next = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
prev = tmp;
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_reverse (GSList *list)
|
||||
{
|
||||
GSList *tmp;
|
||||
GSList *prev;
|
||||
GSList *last;
|
||||
|
||||
last = NULL;
|
||||
prev = NULL;
|
||||
|
||||
while (list)
|
||||
{
|
||||
last = list;
|
||||
|
||||
tmp = list->next;
|
||||
list->next = prev;
|
||||
|
||||
prev = list;
|
||||
list = tmp;
|
||||
}
|
||||
|
||||
return last;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_nth (GSList *list,
|
||||
guint n)
|
||||
{
|
||||
while ((n-- > 0) && list)
|
||||
list = list->next;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_slist_nth_data (GSList *list,
|
||||
guint n)
|
||||
{
|
||||
while ((n-- > 0) && list)
|
||||
list = list->next;
|
||||
|
||||
return list ? list->data : NULL;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_find (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
while (list)
|
||||
{
|
||||
if (list->data == data)
|
||||
break;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_find_custom (GSList *list,
|
||||
gpointer data,
|
||||
GCompareFunc func)
|
||||
{
|
||||
g_return_val_if_fail (func != NULL, list);
|
||||
|
||||
while (list)
|
||||
{
|
||||
if (! func (list->data, data))
|
||||
return list;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gint
|
||||
g_slist_position (GSList *list,
|
||||
GSList *link)
|
||||
{
|
||||
gint i;
|
||||
|
||||
i = 0;
|
||||
while (list)
|
||||
{
|
||||
if (list == link)
|
||||
return i;
|
||||
i++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
gint
|
||||
g_slist_index (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
gint i;
|
||||
|
||||
i = 0;
|
||||
while (list)
|
||||
{
|
||||
if (list->data == data)
|
||||
return i;
|
||||
i++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_last (GSList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
while (list->next)
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
guint
|
||||
g_slist_length (GSList *list)
|
||||
{
|
||||
guint length;
|
||||
|
||||
length = 0;
|
||||
while (list)
|
||||
{
|
||||
length++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
void
|
||||
g_slist_foreach (GSList *list,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
while (list)
|
||||
{
|
||||
(*func) (list->data, user_data);
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_insert_sorted (GSList *list,
|
||||
gpointer data,
|
||||
GCompareFunc func)
|
||||
{
|
||||
GSList *tmp_list = list;
|
||||
GSList *prev_list = NULL;
|
||||
GSList *new_list;
|
||||
gint cmp;
|
||||
|
||||
g_return_val_if_fail (func != NULL, list);
|
||||
|
||||
if (!list)
|
||||
{
|
||||
new_list = g_slist_alloc();
|
||||
new_list->data = data;
|
||||
return new_list;
|
||||
}
|
||||
|
||||
cmp = (*func) (data, tmp_list->data);
|
||||
|
||||
while ((tmp_list->next) && (cmp > 0))
|
||||
{
|
||||
prev_list = tmp_list;
|
||||
tmp_list = tmp_list->next;
|
||||
cmp = (*func) (data, tmp_list->data);
|
||||
}
|
||||
|
||||
new_list = g_slist_alloc();
|
||||
new_list->data = data;
|
||||
|
||||
if ((!tmp_list->next) && (cmp > 0))
|
||||
{
|
||||
tmp_list->next = new_list;
|
||||
return list;
|
||||
}
|
||||
|
||||
if (prev_list)
|
||||
{
|
||||
prev_list->next = new_list;
|
||||
new_list->next = tmp_list;
|
||||
return list;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_list->next = list;
|
||||
return new_list;
|
||||
}
|
||||
}
|
647
glib/gstring.c
Normal file
647
glib/gstring.c
Normal file
@ -0,0 +1,647 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <glib.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
typedef struct _GRealStringChunk GRealStringChunk;
|
||||
typedef struct _GRealString GRealString;
|
||||
|
||||
struct _GRealStringChunk
|
||||
{
|
||||
GHashTable *const_table;
|
||||
GSList *storage_list;
|
||||
gint storage_next;
|
||||
gint this_size;
|
||||
gint default_size;
|
||||
};
|
||||
|
||||
struct _GRealString
|
||||
{
|
||||
gchar *str;
|
||||
gint len;
|
||||
gint alloc;
|
||||
};
|
||||
|
||||
|
||||
static GMemChunk *string_mem_chunk = NULL;
|
||||
|
||||
/* Hash Functions.
|
||||
*/
|
||||
|
||||
gint
|
||||
g_str_equal (gconstpointer v, gconstpointer v2)
|
||||
{
|
||||
return strcmp ((const gchar*) v, (const gchar*)v2) == 0;
|
||||
}
|
||||
|
||||
/* a char* hash function from ASU */
|
||||
guint
|
||||
g_str_hash (gconstpointer v)
|
||||
{
|
||||
const char *s = (char*)v;
|
||||
const char *p;
|
||||
guint h=0, g;
|
||||
|
||||
for(p = s; *p != '\0'; p += 1) {
|
||||
h = ( h << 4 ) + *p;
|
||||
if ( ( g = h & 0xf0000000 ) ) {
|
||||
h = h ^ (g >> 24);
|
||||
h = h ^ g;
|
||||
}
|
||||
}
|
||||
|
||||
return h /* % M */;
|
||||
}
|
||||
|
||||
|
||||
/* String Chunks.
|
||||
*/
|
||||
|
||||
GStringChunk*
|
||||
g_string_chunk_new (gint default_size)
|
||||
{
|
||||
GRealStringChunk *new_chunk = g_new (GRealStringChunk, 1);
|
||||
gint size = 1;
|
||||
|
||||
while (size < default_size)
|
||||
size <<= 1;
|
||||
|
||||
new_chunk->const_table = NULL;
|
||||
new_chunk->storage_list = NULL;
|
||||
new_chunk->storage_next = size;
|
||||
new_chunk->default_size = size;
|
||||
new_chunk->this_size = size;
|
||||
|
||||
return (GStringChunk*) new_chunk;
|
||||
}
|
||||
|
||||
void
|
||||
g_string_chunk_free (GStringChunk *fchunk)
|
||||
{
|
||||
GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
|
||||
GSList *tmp_list;
|
||||
|
||||
g_return_if_fail (chunk != NULL);
|
||||
|
||||
if (chunk->storage_list)
|
||||
{
|
||||
GListAllocator *tmp_allocator = g_slist_set_allocator (NULL);
|
||||
|
||||
for (tmp_list = chunk->storage_list; tmp_list; tmp_list = tmp_list->next)
|
||||
g_free (tmp_list->data);
|
||||
|
||||
g_slist_free (chunk->storage_list);
|
||||
|
||||
g_slist_set_allocator (tmp_allocator);
|
||||
}
|
||||
|
||||
if (chunk->const_table)
|
||||
g_hash_table_destroy (chunk->const_table);
|
||||
|
||||
g_free (chunk);
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_string_chunk_insert (GStringChunk *fchunk,
|
||||
const gchar *string)
|
||||
{
|
||||
GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
|
||||
gint len = strlen (string);
|
||||
char* pos;
|
||||
|
||||
g_return_val_if_fail (chunk != NULL, NULL);
|
||||
|
||||
if ((chunk->storage_next + len + 1) > chunk->this_size)
|
||||
{
|
||||
GListAllocator *tmp_allocator = g_slist_set_allocator (NULL);
|
||||
gint new_size = chunk->default_size;
|
||||
|
||||
while (new_size < len+1)
|
||||
new_size <<= 1;
|
||||
|
||||
chunk->storage_list = g_slist_prepend (chunk->storage_list,
|
||||
g_new (char, new_size));
|
||||
|
||||
chunk->this_size = new_size;
|
||||
chunk->storage_next = 0;
|
||||
|
||||
g_slist_set_allocator (tmp_allocator);
|
||||
}
|
||||
|
||||
pos = ((char*)chunk->storage_list->data) + chunk->storage_next;
|
||||
|
||||
strcpy (pos, string);
|
||||
|
||||
chunk->storage_next += len + 1;
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_string_chunk_insert_const (GStringChunk *fchunk,
|
||||
const gchar *string)
|
||||
{
|
||||
GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
|
||||
char* lookup;
|
||||
|
||||
g_return_val_if_fail (chunk != NULL, NULL);
|
||||
|
||||
if (!chunk->const_table)
|
||||
chunk->const_table = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
|
||||
lookup = (char*) g_hash_table_lookup (chunk->const_table, (gchar *)string);
|
||||
|
||||
if (!lookup)
|
||||
{
|
||||
lookup = g_string_chunk_insert (fchunk, string);
|
||||
g_hash_table_insert (chunk->const_table, lookup, lookup);
|
||||
}
|
||||
|
||||
return lookup;
|
||||
}
|
||||
|
||||
/* Strings.
|
||||
*/
|
||||
static gint
|
||||
nearest_pow (gint num)
|
||||
{
|
||||
gint n = 1;
|
||||
|
||||
while (n < num)
|
||||
n <<= 1;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static void
|
||||
g_string_maybe_expand (GRealString* string, gint len)
|
||||
{
|
||||
if (string->len + len >= string->alloc)
|
||||
{
|
||||
string->alloc = nearest_pow (string->len + len + 1);
|
||||
string->str = g_realloc (string->str, string->alloc);
|
||||
}
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_sized_new (guint dfl_size)
|
||||
{
|
||||
GRealString *string;
|
||||
|
||||
if (!string_mem_chunk)
|
||||
string_mem_chunk = g_mem_chunk_new ("string mem chunk",
|
||||
sizeof (GRealString),
|
||||
1024, G_ALLOC_AND_FREE);
|
||||
|
||||
string = g_chunk_new (GRealString, string_mem_chunk);
|
||||
|
||||
string->alloc = 0;
|
||||
string->len = 0;
|
||||
string->str = NULL;
|
||||
|
||||
g_string_maybe_expand (string, MAX (dfl_size, 2));
|
||||
string->str[0] = 0;
|
||||
|
||||
return (GString*) string;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_new (const gchar *init)
|
||||
{
|
||||
GString *string;
|
||||
|
||||
string = g_string_sized_new (2);
|
||||
|
||||
if (init)
|
||||
g_string_append (string, init);
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
void
|
||||
g_string_free (GString *string,
|
||||
gint free_segment)
|
||||
{
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
if (free_segment)
|
||||
g_free (string->str);
|
||||
|
||||
g_mem_chunk_free (string_mem_chunk, string);
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_assign (GString *lval,
|
||||
const gchar *rval)
|
||||
{
|
||||
g_string_truncate (lval, 0);
|
||||
g_string_append (lval, rval);
|
||||
|
||||
return lval;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_truncate (GString* fstring,
|
||||
gint len)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
|
||||
string->len = len;
|
||||
|
||||
string->str[len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_append (GString *fstring,
|
||||
const gchar *val)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
int len;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (val != NULL, fstring);
|
||||
|
||||
len = strlen (val);
|
||||
g_string_maybe_expand (string, len);
|
||||
|
||||
strcpy (string->str + string->len, val);
|
||||
|
||||
string->len += len;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_append_c (GString *fstring,
|
||||
gchar c)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_string_maybe_expand (string, 1);
|
||||
|
||||
string->str[string->len++] = c;
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_prepend (GString *fstring,
|
||||
const gchar *val)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
gint len;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (val != NULL, fstring);
|
||||
|
||||
len = strlen (val);
|
||||
g_string_maybe_expand (string, len);
|
||||
|
||||
g_memmove (string->str + len, string->str, string->len);
|
||||
|
||||
strncpy (string->str, val, len);
|
||||
|
||||
string->len += len;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_prepend_c (GString *fstring,
|
||||
gchar c)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_string_maybe_expand (string, 1);
|
||||
|
||||
g_memmove (string->str + 1, string->str, string->len);
|
||||
|
||||
string->str[0] = c;
|
||||
|
||||
string->len += 1;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_insert (GString *fstring,
|
||||
gint pos,
|
||||
const gchar *val)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
gint len;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (val != NULL, fstring);
|
||||
g_return_val_if_fail (pos >= 0, fstring);
|
||||
g_return_val_if_fail (pos <= string->len, fstring);
|
||||
|
||||
len = strlen (val);
|
||||
g_string_maybe_expand (string, len);
|
||||
|
||||
g_memmove (string->str + pos + len, string->str + pos, string->len - pos);
|
||||
|
||||
strncpy (string->str + pos, val, len);
|
||||
|
||||
string->len += len;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString *
|
||||
g_string_insert_c (GString *fstring,
|
||||
gint pos,
|
||||
gchar c)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (pos <= string->len, fstring);
|
||||
|
||||
g_string_maybe_expand (string, 1);
|
||||
|
||||
g_memmove (string->str + pos + 1, string->str + pos, string->len - pos);
|
||||
|
||||
string->str[pos] = c;
|
||||
|
||||
string->len += 1;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_erase (GString *fstring,
|
||||
gint pos,
|
||||
gint len)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (len >= 0, fstring);
|
||||
g_return_val_if_fail (pos >= 0, fstring);
|
||||
g_return_val_if_fail (pos <= string->len, fstring);
|
||||
g_return_val_if_fail (pos + len <= string->len, fstring);
|
||||
|
||||
if (pos + len < string->len)
|
||||
g_memmove (string->str + pos, string->str + pos + len, string->len - (pos + len));
|
||||
|
||||
string->len -= len;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_down (GString *fstring)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
gchar *s;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
|
||||
s = string->str;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
*s = tolower (*s);
|
||||
s++;
|
||||
}
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_up (GString *fstring)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
gchar *s;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
|
||||
s = string->str;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
*s = toupper (*s);
|
||||
s++;
|
||||
}
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
static int
|
||||
get_length_upper_bound (const gchar* fmt, va_list *args)
|
||||
{
|
||||
int len = 0;
|
||||
int short_int;
|
||||
int long_int;
|
||||
int done;
|
||||
char *tmp;
|
||||
|
||||
while (*fmt)
|
||||
{
|
||||
char c = *fmt++;
|
||||
|
||||
short_int = FALSE;
|
||||
long_int = FALSE;
|
||||
|
||||
if (c == '%')
|
||||
{
|
||||
done = FALSE;
|
||||
while (*fmt && !done)
|
||||
{
|
||||
switch (*fmt++)
|
||||
{
|
||||
case '*':
|
||||
len += va_arg(*args, int);
|
||||
break;
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
fmt -= 1;
|
||||
len += strtol (fmt, (char **)&fmt, 10);
|
||||
break;
|
||||
case 'h':
|
||||
short_int = TRUE;
|
||||
break;
|
||||
case 'l':
|
||||
long_int = TRUE;
|
||||
break;
|
||||
|
||||
/* I ignore 'q' and 'L', they're not portable anyway. */
|
||||
|
||||
case 's':
|
||||
tmp = va_arg(*args, char *);
|
||||
if(tmp)
|
||||
len += strlen (tmp);
|
||||
else
|
||||
len += strlen ("(null)");
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'd':
|
||||
case 'i':
|
||||
case 'o':
|
||||
case 'u':
|
||||
case 'x':
|
||||
case 'X':
|
||||
if (long_int)
|
||||
(void)va_arg (*args, long);
|
||||
else if (short_int)
|
||||
(void)va_arg (*args, int);
|
||||
else
|
||||
(void)va_arg (*args, int);
|
||||
len += 32;
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'D':
|
||||
case 'O':
|
||||
case 'U':
|
||||
(void)va_arg (*args, long);
|
||||
len += 32;
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'e':
|
||||
case 'E':
|
||||
case 'f':
|
||||
case 'g':
|
||||
(void)va_arg (*args, double);
|
||||
len += 32;
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'c':
|
||||
(void)va_arg (*args, int);
|
||||
len += 1;
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'p':
|
||||
case 'n':
|
||||
(void)va_arg (*args, void*);
|
||||
len += 32;
|
||||
done = TRUE;
|
||||
break;
|
||||
case '%':
|
||||
len += 1;
|
||||
done = TRUE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
len += 1;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
char*
|
||||
g_vsprintf (const gchar *fmt,
|
||||
va_list *args,
|
||||
va_list *args2)
|
||||
{
|
||||
static gchar *buf = NULL;
|
||||
static gint alloc = 0;
|
||||
|
||||
gint len = get_length_upper_bound (fmt, args);
|
||||
|
||||
if (len >= alloc)
|
||||
{
|
||||
if (buf)
|
||||
g_free (buf);
|
||||
|
||||
alloc = nearest_pow (MAX(len + 1, 1024));
|
||||
|
||||
buf = g_new (char, alloc);
|
||||
}
|
||||
|
||||
vsprintf (buf, fmt, *args2);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void
|
||||
g_string_sprintfa_int (GString *string,
|
||||
const gchar *fmt,
|
||||
va_list *args,
|
||||
va_list *args2)
|
||||
{
|
||||
g_string_append (string, g_vsprintf (fmt, args, args2));
|
||||
}
|
||||
|
||||
void
|
||||
g_string_sprintf (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
{
|
||||
va_list args, args2;
|
||||
|
||||
va_start(args, fmt);
|
||||
va_start(args2, fmt);
|
||||
|
||||
g_string_truncate (string, 0);
|
||||
|
||||
g_string_sprintfa_int (string, fmt, &args, &args2);
|
||||
|
||||
va_end(args);
|
||||
va_end(args2);
|
||||
}
|
||||
|
||||
void
|
||||
g_string_sprintfa (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
{
|
||||
va_list args, args2;
|
||||
|
||||
va_start(args, fmt);
|
||||
va_start(args2, fmt);
|
||||
|
||||
g_string_sprintfa_int (string, fmt, &args, &args2);
|
||||
|
||||
va_end(args);
|
||||
va_end(args2);
|
||||
}
|
120
glib/gtimer.c
Normal file
120
glib/gtimer.c
Normal file
@ -0,0 +1,120 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GRealTimer GRealTimer;
|
||||
|
||||
struct _GRealTimer
|
||||
{
|
||||
struct timeval start;
|
||||
struct timeval end;
|
||||
gint active;
|
||||
};
|
||||
|
||||
|
||||
GTimer*
|
||||
g_timer_new (void)
|
||||
{
|
||||
GRealTimer *timer;
|
||||
|
||||
timer = g_new (GRealTimer, 1);
|
||||
timer->active = TRUE;
|
||||
|
||||
gettimeofday (&timer->start, NULL);
|
||||
|
||||
return ((GTimer*) timer);
|
||||
}
|
||||
|
||||
void
|
||||
g_timer_destroy (GTimer *timer)
|
||||
{
|
||||
g_assert (timer != NULL);
|
||||
|
||||
g_free (timer);
|
||||
}
|
||||
|
||||
void
|
||||
g_timer_start (GTimer *timer)
|
||||
{
|
||||
GRealTimer *rtimer;
|
||||
|
||||
g_assert (timer != NULL);
|
||||
|
||||
rtimer = (GRealTimer*) timer;
|
||||
gettimeofday (&rtimer->start, NULL);
|
||||
rtimer->active = 1;
|
||||
}
|
||||
|
||||
void
|
||||
g_timer_stop (GTimer *timer)
|
||||
{
|
||||
GRealTimer *rtimer;
|
||||
|
||||
g_assert (timer != NULL);
|
||||
|
||||
rtimer = (GRealTimer*) timer;
|
||||
gettimeofday (&rtimer->end, NULL);
|
||||
rtimer->active = 0;
|
||||
}
|
||||
|
||||
void
|
||||
g_timer_reset (GTimer *timer)
|
||||
{
|
||||
GRealTimer *rtimer;
|
||||
|
||||
g_assert (timer != NULL);
|
||||
|
||||
rtimer = (GRealTimer*) timer;
|
||||
gettimeofday (&rtimer->start, NULL);
|
||||
}
|
||||
|
||||
gdouble
|
||||
g_timer_elapsed (GTimer *timer,
|
||||
gulong *microseconds)
|
||||
{
|
||||
GRealTimer *rtimer;
|
||||
struct timeval elapsed;
|
||||
gdouble total;
|
||||
|
||||
g_assert (timer != NULL);
|
||||
|
||||
rtimer = (GRealTimer*) timer;
|
||||
|
||||
if (rtimer->active)
|
||||
gettimeofday (&rtimer->end, NULL);
|
||||
|
||||
if (rtimer->start.tv_usec > rtimer->end.tv_usec)
|
||||
{
|
||||
rtimer->end.tv_usec += 1000000;
|
||||
rtimer->end.tv_sec--;
|
||||
}
|
||||
|
||||
elapsed.tv_usec = rtimer->end.tv_usec - rtimer->start.tv_usec;
|
||||
elapsed.tv_sec = rtimer->end.tv_sec - rtimer->start.tv_sec;
|
||||
|
||||
total = elapsed.tv_sec + ((gdouble) elapsed.tv_usec / 1e6);
|
||||
|
||||
if (microseconds)
|
||||
*microseconds = elapsed.tv_usec;
|
||||
|
||||
return total;
|
||||
}
|
719
glib/gtree.c
Normal file
719
glib/gtree.c
Normal file
@ -0,0 +1,719 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GRealTree GRealTree;
|
||||
typedef struct _GTreeNode GTreeNode;
|
||||
|
||||
struct _GRealTree
|
||||
{
|
||||
GTreeNode *root;
|
||||
GCompareFunc key_compare;
|
||||
};
|
||||
|
||||
struct _GTreeNode
|
||||
{
|
||||
gint balance; /* height (left) - height (right) */
|
||||
GTreeNode *left; /* left subtree */
|
||||
GTreeNode *right; /* right subtree */
|
||||
gpointer key; /* key for this node */
|
||||
gpointer value; /* value stored at this node */
|
||||
};
|
||||
|
||||
|
||||
static GTreeNode* g_tree_node_new (gpointer key,
|
||||
gpointer value);
|
||||
static void g_tree_node_destroy (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_insert (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key,
|
||||
gpointer value,
|
||||
gint *inserted);
|
||||
static GTreeNode* g_tree_node_remove (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key);
|
||||
static GTreeNode* g_tree_node_balance (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_remove_leftmost (GTreeNode *node,
|
||||
GTreeNode **leftmost);
|
||||
static GTreeNode* g_tree_node_restore_left_balance (GTreeNode *node,
|
||||
gint old_balance);
|
||||
static GTreeNode* g_tree_node_restore_right_balance (GTreeNode *node,
|
||||
gint old_balance);
|
||||
static gpointer g_tree_node_lookup (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key);
|
||||
static gint g_tree_node_count (GTreeNode *node);
|
||||
static gint g_tree_node_pre_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data);
|
||||
static gint g_tree_node_in_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data);
|
||||
static gint g_tree_node_post_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data);
|
||||
static gpointer g_tree_node_search (GTreeNode *node,
|
||||
GSearchFunc search_func,
|
||||
gpointer data);
|
||||
static gint g_tree_node_height (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_rotate_left (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_rotate_right (GTreeNode *node);
|
||||
static void g_tree_node_check (GTreeNode *node);
|
||||
|
||||
|
||||
static GMemChunk *node_mem_chunk = NULL;
|
||||
static GSList *node_free_list = NULL;
|
||||
|
||||
|
||||
GTree*
|
||||
g_tree_new (GCompareFunc key_compare_func)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
rtree = g_new (GRealTree, 1);
|
||||
rtree->root = NULL;
|
||||
rtree->key_compare = key_compare_func;
|
||||
|
||||
return (GTree*) rtree;
|
||||
}
|
||||
|
||||
void
|
||||
g_tree_destroy (GTree *tree)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_if_fail (tree != NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
g_tree_node_destroy (rtree->root);
|
||||
g_free (rtree);
|
||||
}
|
||||
|
||||
void
|
||||
g_tree_insert (GTree *tree,
|
||||
gpointer key,
|
||||
gpointer value)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
gint inserted;
|
||||
|
||||
g_return_if_fail (tree != NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
inserted = FALSE;
|
||||
rtree->root = g_tree_node_insert (rtree->root, rtree->key_compare,
|
||||
key, value, &inserted);
|
||||
}
|
||||
|
||||
void
|
||||
g_tree_remove (GTree *tree,
|
||||
gpointer key)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_if_fail (tree != NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
rtree->root = g_tree_node_remove (rtree->root, rtree->key_compare, key);
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_tree_lookup (GTree *tree,
|
||||
gpointer key)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_val_if_fail (tree != NULL, NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
return g_tree_node_lookup (rtree->root, rtree->key_compare, key);
|
||||
}
|
||||
|
||||
void
|
||||
g_tree_traverse (GTree *tree,
|
||||
GTraverseFunc traverse_func,
|
||||
GTraverseType traverse_type,
|
||||
gpointer data)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_if_fail (tree != NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
g_return_if_fail (rtree->root != NULL);
|
||||
|
||||
switch (traverse_type)
|
||||
{
|
||||
case G_PRE_ORDER:
|
||||
g_tree_node_pre_order (rtree->root, traverse_func, data);
|
||||
break;
|
||||
|
||||
case G_IN_ORDER:
|
||||
g_tree_node_in_order (rtree->root, traverse_func, data);
|
||||
break;
|
||||
|
||||
case G_POST_ORDER:
|
||||
g_tree_node_post_order (rtree->root, traverse_func, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_tree_search (GTree *tree,
|
||||
GSearchFunc search_func,
|
||||
gpointer data)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_val_if_fail (tree != NULL, NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
if (rtree->root)
|
||||
return g_tree_node_search (rtree->root, search_func, data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gint
|
||||
g_tree_height (GTree *tree)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_val_if_fail (tree != NULL, 0);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
if (rtree->root)
|
||||
return g_tree_node_height (rtree->root);
|
||||
return 0;
|
||||
}
|
||||
|
||||
gint
|
||||
g_tree_nnodes (GTree *tree)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_val_if_fail (tree != NULL, 0);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
if (rtree->root)
|
||||
return g_tree_node_count (rtree->root);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_new (gpointer key,
|
||||
gpointer value)
|
||||
{
|
||||
GTreeNode *node;
|
||||
GSList *tmp_list;
|
||||
|
||||
if (node_free_list)
|
||||
{
|
||||
tmp_list = node_free_list;
|
||||
node_free_list = node_free_list->next;
|
||||
|
||||
node = tmp_list->data;
|
||||
|
||||
{
|
||||
GListAllocator *tmp_allocator = g_list_set_allocator (NULL);
|
||||
g_slist_free_1 (tmp_list);
|
||||
g_list_set_allocator (tmp_allocator);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!node_mem_chunk)
|
||||
node_mem_chunk = g_mem_chunk_new ("tree node mem chunk", sizeof (GTreeNode), 1024, G_ALLOC_ONLY);
|
||||
|
||||
node = g_chunk_new (GTreeNode, node_mem_chunk);
|
||||
}
|
||||
|
||||
node->balance = 0;
|
||||
node->left = NULL;
|
||||
node->right = NULL;
|
||||
node->key = key;
|
||||
node->value = value;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static void
|
||||
g_tree_node_destroy (GTreeNode *node)
|
||||
{
|
||||
if (node)
|
||||
{
|
||||
node_free_list = g_slist_prepend (node_free_list, node);
|
||||
g_tree_node_destroy (node->right);
|
||||
g_tree_node_destroy (node->left);
|
||||
}
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_insert (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key,
|
||||
gpointer value,
|
||||
gint *inserted)
|
||||
{
|
||||
gint old_balance;
|
||||
gint cmp;
|
||||
|
||||
if (!node)
|
||||
{
|
||||
*inserted = TRUE;
|
||||
return g_tree_node_new (key, value);
|
||||
}
|
||||
|
||||
cmp = (* compare) (key, node->key);
|
||||
if (cmp == 0)
|
||||
{
|
||||
*inserted = FALSE;
|
||||
node->value = value;
|
||||
return node;
|
||||
}
|
||||
|
||||
if (cmp < 0)
|
||||
{
|
||||
if (node->left)
|
||||
{
|
||||
old_balance = node->left->balance;
|
||||
node->left = g_tree_node_insert (node->left, compare, key, value, inserted);
|
||||
|
||||
if ((old_balance != node->left->balance) && node->left->balance)
|
||||
node->balance -= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
*inserted = TRUE;
|
||||
node->left = g_tree_node_new (key, value);
|
||||
node->balance -= 1;
|
||||
}
|
||||
}
|
||||
else if (cmp > 0)
|
||||
{
|
||||
if (node->right)
|
||||
{
|
||||
old_balance = node->right->balance;
|
||||
node->right = g_tree_node_insert (node->right, compare, key, value, inserted);
|
||||
|
||||
if ((old_balance != node->right->balance) && node->right->balance)
|
||||
node->balance += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
*inserted = TRUE;
|
||||
node->right = g_tree_node_new (key, value);
|
||||
node->balance += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (*inserted)
|
||||
{
|
||||
if ((node->balance < -1) || (node->balance > 1))
|
||||
node = g_tree_node_balance (node);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_remove (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key)
|
||||
{
|
||||
GTreeNode *garbage;
|
||||
GTreeNode *new_root;
|
||||
gint old_balance;
|
||||
gint cmp;
|
||||
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
cmp = (* compare) (key, node->key);
|
||||
if (cmp == 0)
|
||||
{
|
||||
garbage = node;
|
||||
|
||||
if (!node->right)
|
||||
{
|
||||
node = node->left;
|
||||
}
|
||||
else
|
||||
{
|
||||
old_balance = node->right->balance;
|
||||
node->right = g_tree_node_remove_leftmost (node->right, &new_root);
|
||||
new_root->left = node->left;
|
||||
new_root->right = node->right;
|
||||
new_root->balance = node->balance;
|
||||
node = g_tree_node_restore_right_balance (new_root, old_balance);
|
||||
}
|
||||
|
||||
node_free_list = g_slist_prepend (node_free_list, garbage);
|
||||
}
|
||||
else if (cmp < 0)
|
||||
{
|
||||
if (node->left)
|
||||
{
|
||||
old_balance = node->left->balance;
|
||||
node->left = g_tree_node_remove (node->left, compare, key);
|
||||
node = g_tree_node_restore_left_balance (node, old_balance);
|
||||
}
|
||||
}
|
||||
else if (cmp > 0)
|
||||
{
|
||||
if (node->right)
|
||||
{
|
||||
old_balance = node->right->balance;
|
||||
node->right = g_tree_node_remove (node->right, compare, key);
|
||||
node = g_tree_node_restore_right_balance (node, old_balance);
|
||||
}
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_balance (GTreeNode *node)
|
||||
{
|
||||
if (node->balance < -1)
|
||||
{
|
||||
if (node->left->balance > 0)
|
||||
node->left = g_tree_node_rotate_left (node->left);
|
||||
node = g_tree_node_rotate_right (node);
|
||||
}
|
||||
else if (node->balance > 1)
|
||||
{
|
||||
if (node->right->balance < 0)
|
||||
node->right = g_tree_node_rotate_right (node->right);
|
||||
node = g_tree_node_rotate_left (node);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_remove_leftmost (GTreeNode *node,
|
||||
GTreeNode **leftmost)
|
||||
{
|
||||
gint old_balance;
|
||||
|
||||
if (!node->left)
|
||||
{
|
||||
*leftmost = node;
|
||||
return node->right;
|
||||
}
|
||||
|
||||
old_balance = node->left->balance;
|
||||
node->left = g_tree_node_remove_leftmost (node->left, leftmost);
|
||||
return g_tree_node_restore_left_balance (node, old_balance);
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_restore_left_balance (GTreeNode *node,
|
||||
gint old_balance)
|
||||
{
|
||||
if (!node->left)
|
||||
node->balance += 1;
|
||||
else if ((node->left->balance != old_balance) &&
|
||||
(node->left->balance == 0))
|
||||
node->balance += 1;
|
||||
|
||||
if (node->balance > 1)
|
||||
return g_tree_node_balance (node);
|
||||
return node;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_restore_right_balance (GTreeNode *node,
|
||||
gint old_balance)
|
||||
{
|
||||
if (!node->right)
|
||||
node->balance -= 1;
|
||||
else if ((node->right->balance != old_balance) &&
|
||||
(node->right->balance == 0))
|
||||
node->balance -= 1;
|
||||
|
||||
if (node->balance < -1)
|
||||
return g_tree_node_balance (node);
|
||||
return node;
|
||||
}
|
||||
|
||||
static gpointer
|
||||
g_tree_node_lookup (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key)
|
||||
{
|
||||
gint cmp;
|
||||
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
cmp = (* compare) (key, node->key);
|
||||
if (cmp == 0)
|
||||
return node->value;
|
||||
|
||||
if (cmp < 0)
|
||||
{
|
||||
if (node->left)
|
||||
return g_tree_node_lookup (node->left, compare, key);
|
||||
}
|
||||
else if (cmp > 0)
|
||||
{
|
||||
if (node->right)
|
||||
return g_tree_node_lookup (node->right, compare, key);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_count (GTreeNode *node)
|
||||
{
|
||||
gint count;
|
||||
|
||||
count = 1;
|
||||
if (node->left)
|
||||
count += g_tree_node_count (node->left);
|
||||
if (node->right)
|
||||
count += g_tree_node_count (node->right);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_pre_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data)
|
||||
{
|
||||
if ((*traverse_func) (node->key, node->value, data))
|
||||
return TRUE;
|
||||
if (node->left)
|
||||
{
|
||||
if (g_tree_node_pre_order (node->left, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
if (node->right)
|
||||
{
|
||||
if (g_tree_node_pre_order (node->right, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_in_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data)
|
||||
{
|
||||
if (node->left)
|
||||
{
|
||||
if (g_tree_node_in_order (node->left, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
if ((*traverse_func) (node->key, node->value, data))
|
||||
return TRUE;
|
||||
if (node->right)
|
||||
{
|
||||
if (g_tree_node_in_order (node->right, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_post_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data)
|
||||
{
|
||||
if (node->left)
|
||||
{
|
||||
if (g_tree_node_post_order (node->left, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
if (node->right)
|
||||
{
|
||||
if (g_tree_node_post_order (node->right, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
if ((*traverse_func) (node->key, node->value, data))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gpointer
|
||||
g_tree_node_search (GTreeNode *node,
|
||||
GSearchFunc search_func,
|
||||
gpointer data)
|
||||
{
|
||||
gint dir;
|
||||
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
do {
|
||||
dir = (* search_func) (node->key, data);
|
||||
if (dir == 0)
|
||||
return node->value;
|
||||
|
||||
if (dir < 0)
|
||||
node = node->left;
|
||||
else if (dir > 0)
|
||||
node = node->right;
|
||||
} while (node && (dir != 0));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_height (GTreeNode *node)
|
||||
{
|
||||
gint left_height;
|
||||
gint right_height;
|
||||
|
||||
if (node)
|
||||
{
|
||||
left_height = 0;
|
||||
right_height = 0;
|
||||
|
||||
if (node->left)
|
||||
left_height = g_tree_node_height (node->left);
|
||||
|
||||
if (node->right)
|
||||
right_height = g_tree_node_height (node->right);
|
||||
|
||||
return MAX (left_height, right_height) + 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_rotate_left (GTreeNode *node)
|
||||
{
|
||||
GTreeNode *left;
|
||||
GTreeNode *right;
|
||||
gint a_bal;
|
||||
gint b_bal;
|
||||
|
||||
left = node->left;
|
||||
right = node->right;
|
||||
|
||||
node->right = right->left;
|
||||
right->left = node;
|
||||
|
||||
a_bal = node->balance;
|
||||
b_bal = right->balance;
|
||||
|
||||
if (b_bal <= 0)
|
||||
{
|
||||
if (a_bal >= 1)
|
||||
right->balance = b_bal - 1;
|
||||
else
|
||||
right->balance = a_bal + b_bal - 2;
|
||||
node->balance = a_bal - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (a_bal <= b_bal)
|
||||
right->balance = a_bal - 2;
|
||||
else
|
||||
right->balance = b_bal - 1;
|
||||
node->balance = a_bal - b_bal - 1;
|
||||
}
|
||||
|
||||
return right;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_rotate_right (GTreeNode *node)
|
||||
{
|
||||
GTreeNode *left;
|
||||
GTreeNode *right;
|
||||
gint a_bal;
|
||||
gint b_bal;
|
||||
|
||||
left = node->left;
|
||||
right = node->right;
|
||||
|
||||
node->left = left->right;
|
||||
left->right = node;
|
||||
|
||||
a_bal = node->balance;
|
||||
b_bal = left->balance;
|
||||
|
||||
if (b_bal <= 0)
|
||||
{
|
||||
if (b_bal > a_bal)
|
||||
left->balance = b_bal + 1;
|
||||
else
|
||||
left->balance = a_bal + 2;
|
||||
node->balance = a_bal - b_bal + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (a_bal <= -1)
|
||||
left->balance = b_bal + 1;
|
||||
else
|
||||
left->balance = a_bal + b_bal + 2;
|
||||
node->balance = a_bal + 1;
|
||||
}
|
||||
|
||||
return left;
|
||||
}
|
||||
|
||||
static void
|
||||
g_tree_node_check (GTreeNode *node)
|
||||
{
|
||||
gint left_height;
|
||||
gint right_height;
|
||||
gint balance;
|
||||
|
||||
if (node)
|
||||
{
|
||||
left_height = 0;
|
||||
right_height = 0;
|
||||
|
||||
if (node->left)
|
||||
left_height = g_tree_node_height (node->left);
|
||||
if (node->right)
|
||||
right_height = g_tree_node_height (node->right);
|
||||
|
||||
balance = right_height - left_height;
|
||||
if (balance != node->balance)
|
||||
g_print ("g_tree_node_check: failed: %d ( %d )\n",
|
||||
balance, node->balance);
|
||||
|
||||
if (node->left)
|
||||
g_tree_node_check (node->left);
|
||||
if (node->right)
|
||||
g_tree_node_check (node->right);
|
||||
}
|
||||
}
|
858
glib/gutils.c
Normal file
858
glib/gutils.c
Normal file
@ -0,0 +1,858 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <locale.h>
|
||||
#include <ctype.h> /* For tolower() */
|
||||
#include "glib.h"
|
||||
|
||||
const guint glib_major_version = GLIB_MAJOR_VERSION;
|
||||
const guint glib_minor_version = GLIB_MINOR_VERSION;
|
||||
const guint glib_micro_version = GLIB_MICRO_VERSION;
|
||||
|
||||
extern char* g_vsprintf (const gchar *fmt, va_list *args, va_list *args2);
|
||||
|
||||
gchar*
|
||||
g_strdup (const gchar *str)
|
||||
{
|
||||
gchar *new_str;
|
||||
|
||||
new_str = NULL;
|
||||
if (str)
|
||||
{
|
||||
new_str = g_new (char, strlen (str) + 1);
|
||||
strcpy (new_str, str);
|
||||
}
|
||||
|
||||
return new_str;
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_strconcat (const gchar *string1, ...)
|
||||
{
|
||||
guint l;
|
||||
va_list args;
|
||||
gchar *s;
|
||||
gchar *concat;
|
||||
|
||||
g_return_val_if_fail (string1 != NULL, NULL);
|
||||
|
||||
l = 1 + strlen (string1);
|
||||
va_start (args, string1);
|
||||
s = va_arg (args, gchar*);
|
||||
while (s)
|
||||
{
|
||||
l += strlen (s);
|
||||
s = va_arg (args, gchar*);
|
||||
}
|
||||
va_end (args);
|
||||
|
||||
concat = g_new (gchar, l);
|
||||
concat[0] = 0;
|
||||
|
||||
strcat (concat, string1);
|
||||
va_start (args, string1);
|
||||
s = va_arg (args, gchar*);
|
||||
while (s)
|
||||
{
|
||||
strcat (concat, s);
|
||||
s = va_arg (args, gchar*);
|
||||
}
|
||||
va_end (args);
|
||||
|
||||
return concat;
|
||||
}
|
||||
|
||||
gdouble
|
||||
g_strtod (const gchar *nptr,
|
||||
gchar **endptr)
|
||||
{
|
||||
gchar *fail_pos_1;
|
||||
gchar *fail_pos_2;
|
||||
gdouble val_1;
|
||||
gdouble val_2 = 0;
|
||||
|
||||
g_return_val_if_fail (nptr != NULL, 0);
|
||||
|
||||
fail_pos_1 = NULL;
|
||||
fail_pos_2 = NULL;
|
||||
|
||||
val_1 = strtod (nptr, &fail_pos_1);
|
||||
|
||||
if (fail_pos_1 && fail_pos_1[0] != 0)
|
||||
{
|
||||
gchar *old_locale;
|
||||
|
||||
old_locale = setlocale (LC_NUMERIC, "C");
|
||||
val_2 = strtod (nptr, &fail_pos_2);
|
||||
setlocale (LC_NUMERIC, old_locale);
|
||||
}
|
||||
|
||||
if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2)
|
||||
{
|
||||
if (endptr)
|
||||
*endptr = fail_pos_1;
|
||||
return val_1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (endptr)
|
||||
*endptr = fail_pos_2;
|
||||
return val_2;
|
||||
}
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_strerror (gint errnum)
|
||||
{
|
||||
static char msg[64];
|
||||
|
||||
#ifdef HAVE_STRERROR
|
||||
return strerror (errnum);
|
||||
#elif NO_SYS_ERRLIST
|
||||
switch (errnum)
|
||||
{
|
||||
#ifdef E2BIG
|
||||
case E2BIG: return "argument list too long";
|
||||
#endif
|
||||
#ifdef EACCES
|
||||
case EACCES: return "permission denied";
|
||||
#endif
|
||||
#ifdef EADDRINUSE
|
||||
case EADDRINUSE: return "address already in use";
|
||||
#endif
|
||||
#ifdef EADDRNOTAVAIL
|
||||
case EADDRNOTAVAIL: return "can't assign requested address";
|
||||
#endif
|
||||
#ifdef EADV
|
||||
case EADV: return "advertise error";
|
||||
#endif
|
||||
#ifdef EAFNOSUPPORT
|
||||
case EAFNOSUPPORT: return "address family not supported by protocol family";
|
||||
#endif
|
||||
#ifdef EAGAIN
|
||||
case EAGAIN: return "try again";
|
||||
#endif
|
||||
#ifdef EALIGN
|
||||
case EALIGN: return "EALIGN";
|
||||
#endif
|
||||
#ifdef EALREADY
|
||||
case EALREADY: return "operation already in progress";
|
||||
#endif
|
||||
#ifdef EBADE
|
||||
case EBADE: return "bad exchange descriptor";
|
||||
#endif
|
||||
#ifdef EBADF
|
||||
case EBADF: return "bad file number";
|
||||
#endif
|
||||
#ifdef EBADFD
|
||||
case EBADFD: return "file descriptor in bad state";
|
||||
#endif
|
||||
#ifdef EBADMSG
|
||||
case EBADMSG: return "not a data message";
|
||||
#endif
|
||||
#ifdef EBADR
|
||||
case EBADR: return "bad request descriptor";
|
||||
#endif
|
||||
#ifdef EBADRPC
|
||||
case EBADRPC: return "RPC structure is bad";
|
||||
#endif
|
||||
#ifdef EBADRQC
|
||||
case EBADRQC: return "bad request code";
|
||||
#endif
|
||||
#ifdef EBADSLT
|
||||
case EBADSLT: return "invalid slot";
|
||||
#endif
|
||||
#ifdef EBFONT
|
||||
case EBFONT: return "bad font file format";
|
||||
#endif
|
||||
#ifdef EBUSY
|
||||
case EBUSY: return "mount device busy";
|
||||
#endif
|
||||
#ifdef ECHILD
|
||||
case ECHILD: return "no children";
|
||||
#endif
|
||||
#ifdef ECHRNG
|
||||
case ECHRNG: return "channel number out of range";
|
||||
#endif
|
||||
#ifdef ECOMM
|
||||
case ECOMM: return "communication error on send";
|
||||
#endif
|
||||
#ifdef ECONNABORTED
|
||||
case ECONNABORTED: return "software caused connection abort";
|
||||
#endif
|
||||
#ifdef ECONNREFUSED
|
||||
case ECONNREFUSED: return "connection refused";
|
||||
#endif
|
||||
#ifdef ECONNRESET
|
||||
case ECONNRESET: return "connection reset by peer";
|
||||
#endif
|
||||
#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK))
|
||||
case EDEADLK: return "resource deadlock avoided";
|
||||
#endif
|
||||
#ifdef EDEADLOCK
|
||||
case EDEADLOCK: return "resource deadlock avoided";
|
||||
#endif
|
||||
#ifdef EDESTADDRREQ
|
||||
case EDESTADDRREQ: return "destination address required";
|
||||
#endif
|
||||
#ifdef EDIRTY
|
||||
case EDIRTY: return "mounting a dirty fs w/o force";
|
||||
#endif
|
||||
#ifdef EDOM
|
||||
case EDOM: return "math argument out of range";
|
||||
#endif
|
||||
#ifdef EDOTDOT
|
||||
case EDOTDOT: return "cross mount point";
|
||||
#endif
|
||||
#ifdef EDQUOT
|
||||
case EDQUOT: return "disk quota exceeded";
|
||||
#endif
|
||||
#ifdef EDUPPKG
|
||||
case EDUPPKG: return "duplicate package name";
|
||||
#endif
|
||||
#ifdef EEXIST
|
||||
case EEXIST: return "file already exists";
|
||||
#endif
|
||||
#ifdef EFAULT
|
||||
case EFAULT: return "bad address in system call argument";
|
||||
#endif
|
||||
#ifdef EFBIG
|
||||
case EFBIG: return "file too large";
|
||||
#endif
|
||||
#ifdef EHOSTDOWN
|
||||
case EHOSTDOWN: return "host is down";
|
||||
#endif
|
||||
#ifdef EHOSTUNREACH
|
||||
case EHOSTUNREACH: return "host is unreachable";
|
||||
#endif
|
||||
#ifdef EIDRM
|
||||
case EIDRM: return "identifier removed";
|
||||
#endif
|
||||
#ifdef EINIT
|
||||
case EINIT: return "initialization error";
|
||||
#endif
|
||||
#ifdef EINPROGRESS
|
||||
case EINPROGRESS: return "operation now in progress";
|
||||
#endif
|
||||
#ifdef EINTR
|
||||
case EINTR: return "interrupted system call";
|
||||
#endif
|
||||
#ifdef EINVAL
|
||||
case EINVAL: return "invalid argument";
|
||||
#endif
|
||||
#ifdef EIO
|
||||
case EIO: return "I/O error";
|
||||
#endif
|
||||
#ifdef EISCONN
|
||||
case EISCONN: return "socket is already connected";
|
||||
#endif
|
||||
#ifdef EISDIR
|
||||
case EISDIR: return "illegal operation on a directory";
|
||||
#endif
|
||||
#ifdef EISNAME
|
||||
case EISNAM: return "is a name file";
|
||||
#endif
|
||||
#ifdef ELBIN
|
||||
case ELBIN: return "ELBIN";
|
||||
#endif
|
||||
#ifdef EL2HLT
|
||||
case EL2HLT: return "level 2 halted";
|
||||
#endif
|
||||
#ifdef EL2NSYNC
|
||||
case EL2NSYNC: return "level 2 not synchronized";
|
||||
#endif
|
||||
#ifdef EL3HLT
|
||||
case EL3HLT: return "level 3 halted";
|
||||
#endif
|
||||
#ifdef EL3RST
|
||||
case EL3RST: return "level 3 reset";
|
||||
#endif
|
||||
#ifdef ELIBACC
|
||||
case ELIBACC: return "can not access a needed shared library";
|
||||
#endif
|
||||
#ifdef ELIBBAD
|
||||
case ELIBBAD: return "accessing a corrupted shared library";
|
||||
#endif
|
||||
#ifdef ELIBEXEC
|
||||
case ELIBEXEC: return "can not exec a shared library directly";
|
||||
#endif
|
||||
#ifdef ELIBMAX
|
||||
case ELIBMAX: return "attempting to link in more shared libraries than system limit";
|
||||
#endif
|
||||
#ifdef ELIBSCN
|
||||
case ELIBSCN: return ".lib section in a.out corrupted";
|
||||
#endif
|
||||
#ifdef ELNRNG
|
||||
case ELNRNG: return "link number out of range";
|
||||
#endif
|
||||
#ifdef ELOOP
|
||||
case ELOOP: return "too many levels of symbolic links";
|
||||
#endif
|
||||
#ifdef EMFILE
|
||||
case EMFILE: return "too many open files";
|
||||
#endif
|
||||
#ifdef EMLINK
|
||||
case EMLINK: return "too many links";
|
||||
#endif
|
||||
#ifdef EMSGSIZE
|
||||
case EMSGSIZE: return "message too long";
|
||||
#endif
|
||||
#ifdef EMULTIHOP
|
||||
case EMULTIHOP: return "multihop attempted";
|
||||
#endif
|
||||
#ifdef ENAMETOOLONG
|
||||
case ENAMETOOLONG: return "file name too long";
|
||||
#endif
|
||||
#ifdef ENAVAIL
|
||||
case ENAVAIL: return "not available";
|
||||
#endif
|
||||
#ifdef ENET
|
||||
case ENET: return "ENET";
|
||||
#endif
|
||||
#ifdef ENETDOWN
|
||||
case ENETDOWN: return "network is down";
|
||||
#endif
|
||||
#ifdef ENETRESET
|
||||
case ENETRESET: return "network dropped connection on reset";
|
||||
#endif
|
||||
#ifdef ENETUNREACH
|
||||
case ENETUNREACH: return "network is unreachable";
|
||||
#endif
|
||||
#ifdef ENFILE
|
||||
case ENFILE: return "file table overflow";
|
||||
#endif
|
||||
#ifdef ENOANO
|
||||
case ENOANO: return "anode table overflow";
|
||||
#endif
|
||||
#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
|
||||
case ENOBUFS: return "no buffer space available";
|
||||
#endif
|
||||
#ifdef ENOCSI
|
||||
case ENOCSI: return "no CSI structure available";
|
||||
#endif
|
||||
#ifdef ENODATA
|
||||
case ENODATA: return "no data available";
|
||||
#endif
|
||||
#ifdef ENODEV
|
||||
case ENODEV: return "no such device";
|
||||
#endif
|
||||
#ifdef ENOENT
|
||||
case ENOENT: return "no such file or directory";
|
||||
#endif
|
||||
#ifdef ENOEXEC
|
||||
case ENOEXEC: return "exec format error";
|
||||
#endif
|
||||
#ifdef ENOLCK
|
||||
case ENOLCK: return "no locks available";
|
||||
#endif
|
||||
#ifdef ENOLINK
|
||||
case ENOLINK: return "link has be severed";
|
||||
#endif
|
||||
#ifdef ENOMEM
|
||||
case ENOMEM: return "not enough memory";
|
||||
#endif
|
||||
#ifdef ENOMSG
|
||||
case ENOMSG: return "no message of desired type";
|
||||
#endif
|
||||
#ifdef ENONET
|
||||
case ENONET: return "machine is not on the network";
|
||||
#endif
|
||||
#ifdef ENOPKG
|
||||
case ENOPKG: return "package not installed";
|
||||
#endif
|
||||
#ifdef ENOPROTOOPT
|
||||
case ENOPROTOOPT: return "bad proocol option";
|
||||
#endif
|
||||
#ifdef ENOSPC
|
||||
case ENOSPC: return "no space left on device";
|
||||
#endif
|
||||
#ifdef ENOSR
|
||||
case ENOSR: return "out of stream resources";
|
||||
#endif
|
||||
#ifdef ENOSTR
|
||||
case ENOSTR: return "not a stream device";
|
||||
#endif
|
||||
#ifdef ENOSYM
|
||||
case ENOSYM: return "unresolved symbol name";
|
||||
#endif
|
||||
#ifdef ENOSYS
|
||||
case ENOSYS: return "function not implemented";
|
||||
#endif
|
||||
#ifdef ENOTBLK
|
||||
case ENOTBLK: return "block device required";
|
||||
#endif
|
||||
#ifdef ENOTCONN
|
||||
case ENOTCONN: return "socket is not connected";
|
||||
#endif
|
||||
#ifdef ENOTDIR
|
||||
case ENOTDIR: return "not a directory";
|
||||
#endif
|
||||
#ifdef ENOTEMPTY
|
||||
case ENOTEMPTY: return "directory not empty";
|
||||
#endif
|
||||
#ifdef ENOTNAM
|
||||
case ENOTNAM: return "not a name file";
|
||||
#endif
|
||||
#ifdef ENOTSOCK
|
||||
case ENOTSOCK: return "socket operation on non-socket";
|
||||
#endif
|
||||
#ifdef ENOTTY
|
||||
case ENOTTY: return "inappropriate device for ioctl";
|
||||
#endif
|
||||
#ifdef ENOTUNIQ
|
||||
case ENOTUNIQ: return "name not unique on network";
|
||||
#endif
|
||||
#ifdef ENXIO
|
||||
case ENXIO: return "no such device or address";
|
||||
#endif
|
||||
#ifdef EOPNOTSUPP
|
||||
case EOPNOTSUPP: return "operation not supported on socket";
|
||||
#endif
|
||||
#ifdef EPERM
|
||||
case EPERM: return "not owner";
|
||||
#endif
|
||||
#ifdef EPFNOSUPPORT
|
||||
case EPFNOSUPPORT: return "protocol family not supported";
|
||||
#endif
|
||||
#ifdef EPIPE
|
||||
case EPIPE: return "broken pipe";
|
||||
#endif
|
||||
#ifdef EPROCLIM
|
||||
case EPROCLIM: return "too many processes";
|
||||
#endif
|
||||
#ifdef EPROCUNAVAIL
|
||||
case EPROCUNAVAIL: return "bad procedure for program";
|
||||
#endif
|
||||
#ifdef EPROGMISMATCH
|
||||
case EPROGMISMATCH: return "program version wrong";
|
||||
#endif
|
||||
#ifdef EPROGUNAVAIL
|
||||
case EPROGUNAVAIL: return "RPC program not available";
|
||||
#endif
|
||||
#ifdef EPROTO
|
||||
case EPROTO: return "protocol error";
|
||||
#endif
|
||||
#ifdef EPROTONOSUPPORT
|
||||
case EPROTONOSUPPORT: return "protocol not suppored";
|
||||
#endif
|
||||
#ifdef EPROTOTYPE
|
||||
case EPROTOTYPE: return "protocol wrong type for socket";
|
||||
#endif
|
||||
#ifdef ERANGE
|
||||
case ERANGE: return "math result unrepresentable";
|
||||
#endif
|
||||
#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
|
||||
case EREFUSED: return "EREFUSED";
|
||||
#endif
|
||||
#ifdef EREMCHG
|
||||
case EREMCHG: return "remote address changed";
|
||||
#endif
|
||||
#ifdef EREMDEV
|
||||
case EREMDEV: return "remote device";
|
||||
#endif
|
||||
#ifdef EREMOTE
|
||||
case EREMOTE: return "pathname hit remote file system";
|
||||
#endif
|
||||
#ifdef EREMOTEIO
|
||||
case EREMOTEIO: return "remote i/o error";
|
||||
#endif
|
||||
#ifdef EREMOTERELEASE
|
||||
case EREMOTERELEASE: return "EREMOTERELEASE";
|
||||
#endif
|
||||
#ifdef EROFS
|
||||
case EROFS: return "read-only file system";
|
||||
#endif
|
||||
#ifdef ERPCMISMATCH
|
||||
case ERPCMISMATCH: return "RPC version is wrong";
|
||||
#endif
|
||||
#ifdef ERREMOTE
|
||||
case ERREMOTE: return "object is remote";
|
||||
#endif
|
||||
#ifdef ESHUTDOWN
|
||||
case ESHUTDOWN: return "can't send afer socket shutdown";
|
||||
#endif
|
||||
#ifdef ESOCKTNOSUPPORT
|
||||
case ESOCKTNOSUPPORT: return "socket type not supported";
|
||||
#endif
|
||||
#ifdef ESPIPE
|
||||
case ESPIPE: return "invalid seek";
|
||||
#endif
|
||||
#ifdef ESRCH
|
||||
case ESRCH: return "no such process";
|
||||
#endif
|
||||
#ifdef ESRMNT
|
||||
case ESRMNT: return "srmount error";
|
||||
#endif
|
||||
#ifdef ESTALE
|
||||
case ESTALE: return "stale remote file handle";
|
||||
#endif
|
||||
#ifdef ESUCCESS
|
||||
case ESUCCESS: return "Error 0";
|
||||
#endif
|
||||
#ifdef ETIME
|
||||
case ETIME: return "timer expired";
|
||||
#endif
|
||||
#ifdef ETIMEDOUT
|
||||
case ETIMEDOUT: return "connection timed out";
|
||||
#endif
|
||||
#ifdef ETOOMANYREFS
|
||||
case ETOOMANYREFS: return "too many references: can't splice";
|
||||
#endif
|
||||
#ifdef ETXTBSY
|
||||
case ETXTBSY: return "text file or pseudo-device busy";
|
||||
#endif
|
||||
#ifdef EUCLEAN
|
||||
case EUCLEAN: return "structure needs cleaning";
|
||||
#endif
|
||||
#ifdef EUNATCH
|
||||
case EUNATCH: return "protocol driver not attached";
|
||||
#endif
|
||||
#ifdef EUSERS
|
||||
case EUSERS: return "too many users";
|
||||
#endif
|
||||
#ifdef EVERSION
|
||||
case EVERSION: return "version mismatch";
|
||||
#endif
|
||||
#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
|
||||
case EWOULDBLOCK: return "operation would block";
|
||||
#endif
|
||||
#ifdef EXDEV
|
||||
case EXDEV: return "cross-domain link";
|
||||
#endif
|
||||
#ifdef EXFULL
|
||||
case EXFULL: return "message tables full";
|
||||
#endif
|
||||
}
|
||||
#else /* NO_SYS_ERRLIST */
|
||||
extern int sys_nerr;
|
||||
extern char *sys_errlist[];
|
||||
|
||||
if ((errnum > 0) && (errnum <= sys_nerr))
|
||||
return sys_errlist [errnum];
|
||||
#endif /* NO_SYS_ERRLIST */
|
||||
|
||||
sprintf (msg, "unknown error (%d)", errnum);
|
||||
return msg;
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_strsignal (gint signum)
|
||||
{
|
||||
static char msg[64];
|
||||
|
||||
#ifdef HAVE_STRSIGNAL
|
||||
extern char *strsignal (int sig);
|
||||
return strsignal (signum);
|
||||
#elif NO_SYS_SIGLIST
|
||||
switch (signum)
|
||||
{
|
||||
#ifdef SIGHUP
|
||||
case SIGHUP: return "Hangup";
|
||||
#endif
|
||||
#ifdef SIGINT
|
||||
case SIGINT: return "Interrupt";
|
||||
#endif
|
||||
#ifdef SIGQUIT
|
||||
case SIGQUIT: return "Quit";
|
||||
#endif
|
||||
#ifdef SIGILL
|
||||
case SIGILL: return "Illegal instruction";
|
||||
#endif
|
||||
#ifdef SIGTRAP
|
||||
case SIGTRAP: return "Trace/breakpoint trap";
|
||||
#endif
|
||||
#ifdef SIGABRT
|
||||
case SIGABRT: return "IOT trap/Abort";
|
||||
#endif
|
||||
#ifdef SIGBUS
|
||||
case SIGBUS: return "Bus error";
|
||||
#endif
|
||||
#ifdef SIGFPE
|
||||
case SIGFPE: return "Floating point exception";
|
||||
#endif
|
||||
#ifdef SIGKILL
|
||||
case SIGKILL: return "Killed";
|
||||
#endif
|
||||
#ifdef SIGUSR1
|
||||
case SIGUSR1: return "User defined signal 1";
|
||||
#endif
|
||||
#ifdef SIGSEGV
|
||||
case SIGSEGV: return "Segmentation fault";
|
||||
#endif
|
||||
#ifdef SIGUSR2
|
||||
case SIGUSR2: return "User defined signal 2";
|
||||
#endif
|
||||
#ifdef SIGPIPE
|
||||
case SIGPIPE: return "Broken pipe";
|
||||
#endif
|
||||
#ifdef SIGALRM
|
||||
case SIGALRM: return "Alarm clock";
|
||||
#endif
|
||||
#ifdef SIGTERM
|
||||
case SIGTERM: return "Terminated";
|
||||
#endif
|
||||
#ifdef SIGSTKFLT
|
||||
case SIGSTKFLT: return "Stack fault";
|
||||
#endif
|
||||
#ifdef SIGCHLD
|
||||
case SIGCHLD: return "Child exited";
|
||||
#endif
|
||||
#ifdef SIGCONT
|
||||
case SIGCONT: return "Continued";
|
||||
#endif
|
||||
#ifdef SIGSTOP
|
||||
case SIGSTOP: return "Stopped (signal)";
|
||||
#endif
|
||||
#ifdef SIGTSTP
|
||||
case SIGTSTP: return "Stopped";
|
||||
#endif
|
||||
#ifdef SIGTTIN
|
||||
case SIGTTIN: return "Stopped (tty input)";
|
||||
#endif
|
||||
#ifdef SIGTTOU
|
||||
case SIGTTOU: return "Stopped (tty output)";
|
||||
#endif
|
||||
#ifdef SIGURG
|
||||
case SIGURG: return "Urgent condition";
|
||||
#endif
|
||||
#ifdef SIGXCPU
|
||||
case SIGXCPU: return "CPU time limit exceeded";
|
||||
#endif
|
||||
#ifdef SIGXFSZ
|
||||
case SIGXFSZ: return "File size limit exceeded";
|
||||
#endif
|
||||
#ifdef SIGVTALRM
|
||||
case SIGVTALRM: return "Virtual time alarm";
|
||||
#endif
|
||||
#ifdef SIGPROF
|
||||
case SIGPROF: return "Profile signal";
|
||||
#endif
|
||||
#ifdef SIGWINCH
|
||||
case SIGWINCH: return "Window size changed";
|
||||
#endif
|
||||
#ifdef SIGIO
|
||||
case SIGIO: return "Possible I/O";
|
||||
#endif
|
||||
#ifdef SIGPWR
|
||||
case SIGPWR: return "Power failure";
|
||||
#endif
|
||||
#ifdef SIGUNUSED
|
||||
case SIGUNUSED: return "Unused signal";
|
||||
#endif
|
||||
}
|
||||
#else /* NO_SYS_SIGLIST */
|
||||
extern char *sys_siglist[];
|
||||
return sys_siglist [signum];
|
||||
#endif /* NO_SYS_SIGLIST */
|
||||
|
||||
sprintf (msg, "unknown signal (%d)", signum);
|
||||
return msg;
|
||||
}
|
||||
|
||||
gint
|
||||
g_snprintf (gchar *str,
|
||||
gulong n,
|
||||
gchar const *fmt,
|
||||
...)
|
||||
{
|
||||
#ifdef HAVE_VSNPRINTF
|
||||
va_list args;
|
||||
gint retval;
|
||||
|
||||
va_start (args, fmt);
|
||||
retval = vsnprintf (str, n, fmt, args);
|
||||
va_end (args);
|
||||
|
||||
return retval;
|
||||
|
||||
#else
|
||||
gchar *printed;
|
||||
va_list args, args2;
|
||||
|
||||
va_start (args, fmt);
|
||||
va_start (args2, fmt);
|
||||
|
||||
printed = g_vsprintf (fmt, &args, &args2);
|
||||
strncpy (str, printed, n);
|
||||
str[n-1] = '\0';
|
||||
|
||||
va_end (args2);
|
||||
va_end (args);
|
||||
|
||||
return strlen (str);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
g_strdown (gchar *string)
|
||||
{
|
||||
register gchar *s;
|
||||
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
s = string;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
*s = tolower (*s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_strup (gchar *string)
|
||||
{
|
||||
register gchar *s;
|
||||
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
s = string;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
*s = toupper (*s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_strreverse (gchar *string)
|
||||
{
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
if (*string)
|
||||
{
|
||||
register gchar *h, *t;
|
||||
|
||||
h = string;
|
||||
t = string + strlen (string) - 1;
|
||||
|
||||
while (h < t)
|
||||
{
|
||||
register gchar c;
|
||||
|
||||
c = *h;
|
||||
*h = *t;
|
||||
h++;
|
||||
*t = c;
|
||||
t--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gint
|
||||
g_strcasecmp (const gchar *s1,
|
||||
const gchar *s2)
|
||||
{
|
||||
#ifdef HAVE_STRCASECMP
|
||||
return strcasecmp (s1, s2);
|
||||
#else
|
||||
gint c1, c2;
|
||||
|
||||
while (*s1 && *s2)
|
||||
{
|
||||
/* According to A. Cox, some platforms have islower's that
|
||||
* don't work right on non-uppercase
|
||||
*/
|
||||
c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
|
||||
c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
|
||||
if (c1 != c2)
|
||||
return (c1 - c2);
|
||||
s1++; s2++;
|
||||
}
|
||||
|
||||
return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
g_strdelimit (gchar *string,
|
||||
const gchar *delimiters,
|
||||
gchar new_delim)
|
||||
{
|
||||
register gchar *c;
|
||||
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
if (!delimiters)
|
||||
delimiters = G_STR_DELIMITERS;
|
||||
|
||||
for (c = string; *c; c++)
|
||||
{
|
||||
if (strchr (delimiters, *c))
|
||||
*c = new_delim;
|
||||
}
|
||||
}
|
||||
|
||||
guint
|
||||
g_parse_debug_string (const gchar *string,
|
||||
GDebugKey *keys,
|
||||
guint nkeys)
|
||||
{
|
||||
guint i;
|
||||
guint result = 0;
|
||||
|
||||
g_return_val_if_fail (string != NULL, 0);
|
||||
|
||||
if (!g_strcasecmp (string, "all"))
|
||||
{
|
||||
for (i=0; i<nkeys; i++)
|
||||
result |= keys[i].value;
|
||||
}
|
||||
else
|
||||
{
|
||||
gchar *str = g_strdup (string);
|
||||
gchar *p = str;
|
||||
gchar *q;
|
||||
gboolean done = FALSE;
|
||||
|
||||
while (*p && !done)
|
||||
{
|
||||
q = strchr (p, ':');
|
||||
if (!q)
|
||||
{
|
||||
q = p + strlen(p);
|
||||
done = TRUE;
|
||||
}
|
||||
|
||||
*q = 0;
|
||||
|
||||
for (i=0; i<nkeys; i++)
|
||||
if (!g_strcasecmp(keys[i].key, p))
|
||||
result |= keys[i].value;
|
||||
|
||||
p = q+1;
|
||||
}
|
||||
|
||||
g_free (str);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
guint
|
||||
g_direct_hash(gconstpointer key)
|
||||
{
|
||||
return GPOINTER_TO_UINT (key);
|
||||
}
|
||||
|
87
glibconfig.h.in
Normal file
87
glibconfig.h.in
Normal file
@ -0,0 +1,87 @@
|
||||
/* glibconfig.h.in. Generated automatically from configure.in by autoheader. */
|
||||
|
||||
/* Define to empty if the keyword does not work. */
|
||||
#undef const
|
||||
|
||||
/* Define if you don't have vprintf but do have _doprnt. */
|
||||
#undef HAVE_DOPRNT
|
||||
|
||||
/* Define if you have the vprintf function. */
|
||||
#undef HAVE_VPRINTF
|
||||
|
||||
/* Define as __inline if that's what the C compiler calls it. */
|
||||
#undef inline
|
||||
|
||||
/* Define if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
#undef ENABLE_MEM_CHECK
|
||||
#undef ENABLE_MEM_PROFILE
|
||||
|
||||
#undef G_COMPILED_WITH_DEBUGGING
|
||||
#undef HAVE_BROKEN_WCTYPE
|
||||
#undef HAVE_DOPRNT
|
||||
#undef HAVE_FLOAT_H
|
||||
#undef HAVE_LIMITS_H
|
||||
#undef HAVE_LONG_DOUBLE
|
||||
#undef HAVE_SYS_SELECT_H
|
||||
#undef HAVE_STRERROR
|
||||
#undef HAVE_STRSIGNAL
|
||||
#undef HAVE_VSNPRINTF
|
||||
#undef HAVE_VALUES_H
|
||||
#undef HAVE_VPRINTF
|
||||
#undef HAVE_WCHAR_H
|
||||
#undef HAVE_WCTYPE_H
|
||||
|
||||
#undef NO_FD_SET
|
||||
#undef NO_SYS_ERRLIST
|
||||
#undef NO_SYS_SIGLIST
|
||||
|
||||
#undef GLIB_MAJOR_VERSION
|
||||
#undef GLIB_MINOR_VERSION
|
||||
#undef GLIB_MICRO_VERSION
|
||||
|
||||
/* The number of bytes in a char. */
|
||||
#undef SIZEOF_CHAR
|
||||
|
||||
/* The number of bytes in a int. */
|
||||
#undef SIZEOF_INT
|
||||
|
||||
/* The number of bytes in a long. */
|
||||
#undef SIZEOF_LONG
|
||||
|
||||
/* The number of bytes in a short. */
|
||||
#undef SIZEOF_SHORT
|
||||
|
||||
/* The number of bytes in a void *. */
|
||||
#undef SIZEOF_VOID_P
|
||||
|
||||
/* Define if you have the atexit function. */
|
||||
#undef HAVE_ATEXIT
|
||||
|
||||
/* Define if you have the memmove function. */
|
||||
#undef HAVE_MEMMOVE
|
||||
|
||||
/* Define if you have the on_exit function. */
|
||||
#undef HAVE_ON_EXIT
|
||||
|
||||
/* Define if you have the strcasecmp function. */
|
||||
#undef HAVE_STRCASECMP
|
||||
|
||||
/* Define if you have the strerror function. */
|
||||
#undef HAVE_STRERROR
|
||||
|
||||
/* Define if you have the strsignal function. */
|
||||
#undef HAVE_STRSIGNAL
|
||||
|
||||
/* Define if you have the vsnprintf function. */
|
||||
#undef HAVE_VSNPRINTF
|
||||
|
||||
/* Define if you have the <float.h> header file. */
|
||||
#undef HAVE_FLOAT_H
|
||||
|
||||
/* Define if you have the <limits.h> header file. */
|
||||
#undef HAVE_LIMITS_H
|
||||
|
||||
/* Define if you have the <values.h> header file. */
|
||||
#undef HAVE_VALUES_H
|
481
glist.c
Normal file
481
glist.c
Normal file
@ -0,0 +1,481 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GRealListAllocator GRealListAllocator;
|
||||
|
||||
struct _GRealListAllocator
|
||||
{
|
||||
GMemChunk *list_mem_chunk;
|
||||
GList *free_list;
|
||||
};
|
||||
|
||||
|
||||
static GRealListAllocator *default_allocator = NULL;
|
||||
static GRealListAllocator *current_allocator = NULL;
|
||||
|
||||
|
||||
GListAllocator*
|
||||
g_list_allocator_new (void)
|
||||
{
|
||||
GRealListAllocator* allocator = g_new (GRealListAllocator, 1);
|
||||
|
||||
allocator->list_mem_chunk = NULL;
|
||||
allocator->free_list = NULL;
|
||||
|
||||
return (GListAllocator*) allocator;
|
||||
}
|
||||
|
||||
void
|
||||
g_list_allocator_free (GListAllocator* fallocator)
|
||||
{
|
||||
GRealListAllocator* allocator = (GRealListAllocator *) fallocator;
|
||||
|
||||
if (allocator && allocator->list_mem_chunk)
|
||||
g_mem_chunk_destroy (allocator->list_mem_chunk);
|
||||
if (allocator)
|
||||
g_free (allocator);
|
||||
}
|
||||
|
||||
GListAllocator*
|
||||
g_list_set_allocator (GListAllocator* fallocator)
|
||||
{
|
||||
GRealListAllocator* allocator = (GRealListAllocator *) fallocator;
|
||||
GRealListAllocator* old_allocator = current_allocator;
|
||||
|
||||
if (allocator)
|
||||
current_allocator = allocator;
|
||||
else
|
||||
{
|
||||
if (!default_allocator)
|
||||
default_allocator = (GRealListAllocator*) g_list_allocator_new ();
|
||||
current_allocator = default_allocator;
|
||||
}
|
||||
|
||||
if (!current_allocator->list_mem_chunk)
|
||||
current_allocator->list_mem_chunk = g_mem_chunk_new ("list mem chunk",
|
||||
sizeof (GList),
|
||||
1024,
|
||||
G_ALLOC_ONLY);
|
||||
|
||||
return (GListAllocator*) (old_allocator == default_allocator ? NULL : old_allocator);
|
||||
}
|
||||
|
||||
|
||||
GList*
|
||||
g_list_alloc (void)
|
||||
{
|
||||
GList *new_list;
|
||||
|
||||
g_list_set_allocator (NULL);
|
||||
if (current_allocator->free_list)
|
||||
{
|
||||
new_list = current_allocator->free_list;
|
||||
current_allocator->free_list = current_allocator->free_list->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_list = g_chunk_new (GList, current_allocator->list_mem_chunk);
|
||||
}
|
||||
|
||||
new_list->data = NULL;
|
||||
new_list->next = NULL;
|
||||
new_list->prev = NULL;
|
||||
|
||||
return new_list;
|
||||
}
|
||||
|
||||
void
|
||||
g_list_free (GList *list)
|
||||
{
|
||||
GList *last;
|
||||
|
||||
if (list)
|
||||
{
|
||||
last = g_list_last (list);
|
||||
last->next = current_allocator->free_list;
|
||||
current_allocator->free_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_list_free_1 (GList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
list->next = current_allocator->free_list;
|
||||
current_allocator->free_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_append (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GList *new_list;
|
||||
GList *last;
|
||||
|
||||
new_list = g_list_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (list)
|
||||
{
|
||||
last = g_list_last (list);
|
||||
/* g_assert (last != NULL); */
|
||||
last->next = new_list;
|
||||
new_list->prev = last;
|
||||
|
||||
return list;
|
||||
}
|
||||
else
|
||||
return new_list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_prepend (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GList *new_list;
|
||||
|
||||
new_list = g_list_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (list)
|
||||
{
|
||||
if (list->prev)
|
||||
{
|
||||
list->prev->next = new_list;
|
||||
new_list->prev = list->prev;
|
||||
}
|
||||
list->prev = new_list;
|
||||
new_list->next = list;
|
||||
}
|
||||
|
||||
return new_list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_insert (GList *list,
|
||||
gpointer data,
|
||||
gint position)
|
||||
{
|
||||
GList *new_list;
|
||||
GList *tmp_list;
|
||||
|
||||
if (position < 0)
|
||||
return g_list_append (list, data);
|
||||
else if (position == 0)
|
||||
return g_list_prepend (list, data);
|
||||
|
||||
tmp_list = g_list_nth (list, position);
|
||||
if (!tmp_list)
|
||||
return g_list_append (list, data);
|
||||
|
||||
new_list = g_list_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (tmp_list->prev)
|
||||
{
|
||||
tmp_list->prev->next = new_list;
|
||||
new_list->prev = tmp_list->prev;
|
||||
}
|
||||
new_list->next = tmp_list;
|
||||
tmp_list->prev = new_list;
|
||||
|
||||
if (tmp_list == list)
|
||||
return new_list;
|
||||
else
|
||||
return list;
|
||||
}
|
||||
|
||||
GList *
|
||||
g_list_concat (GList *list1, GList *list2)
|
||||
{
|
||||
GList *tmp_list;
|
||||
|
||||
if (list2)
|
||||
{
|
||||
tmp_list = g_list_last (list1);
|
||||
if (tmp_list)
|
||||
tmp_list->next = list2;
|
||||
else
|
||||
list1 = list2;
|
||||
list2->prev = tmp_list;
|
||||
}
|
||||
|
||||
return list1;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_remove (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GList *tmp;
|
||||
|
||||
tmp = list;
|
||||
while (tmp)
|
||||
{
|
||||
if (tmp->data != data)
|
||||
tmp = tmp->next;
|
||||
else
|
||||
{
|
||||
if (tmp->prev)
|
||||
tmp->prev->next = tmp->next;
|
||||
if (tmp->next)
|
||||
tmp->next->prev = tmp->prev;
|
||||
|
||||
if (list == tmp)
|
||||
list = list->next;
|
||||
|
||||
g_list_free_1 (tmp);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_remove_link (GList *list,
|
||||
GList *link)
|
||||
{
|
||||
if (link)
|
||||
{
|
||||
if (link->prev)
|
||||
link->prev->next = link->next;
|
||||
if (link->next)
|
||||
link->next->prev = link->prev;
|
||||
|
||||
if (link == list)
|
||||
list = list->next;
|
||||
|
||||
link->next = NULL;
|
||||
link->prev = NULL;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_reverse (GList *list)
|
||||
{
|
||||
GList *last;
|
||||
|
||||
last = NULL;
|
||||
while (list)
|
||||
{
|
||||
last = list;
|
||||
list = last->next;
|
||||
last->next = last->prev;
|
||||
last->prev = list;
|
||||
}
|
||||
|
||||
return last;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_nth (GList *list,
|
||||
guint n)
|
||||
{
|
||||
while ((n-- > 0) && list)
|
||||
list = list->next;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_list_nth_data (GList *list,
|
||||
guint n)
|
||||
{
|
||||
while ((n-- > 0) && list)
|
||||
list = list->next;
|
||||
|
||||
return list ? list->data : NULL;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_find (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
while (list)
|
||||
{
|
||||
if (list->data == data)
|
||||
break;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_find_custom (GList *list,
|
||||
gpointer data,
|
||||
GCompareFunc func)
|
||||
{
|
||||
g_return_val_if_fail (func != NULL, list);
|
||||
|
||||
while (list)
|
||||
{
|
||||
if (! func (list->data, data))
|
||||
return list;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
gint
|
||||
g_list_position (GList *list,
|
||||
GList *link)
|
||||
{
|
||||
gint i;
|
||||
|
||||
i = 0;
|
||||
while (list)
|
||||
{
|
||||
if (list == link)
|
||||
return i;
|
||||
i++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
gint
|
||||
g_list_index (GList *list,
|
||||
gpointer data)
|
||||
{
|
||||
gint i;
|
||||
|
||||
i = 0;
|
||||
while (list)
|
||||
{
|
||||
if (list->data == data)
|
||||
return i;
|
||||
i++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_last (GList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
while (list->next)
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GList*
|
||||
g_list_first (GList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
while (list->prev)
|
||||
list = list->prev;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
guint
|
||||
g_list_length (GList *list)
|
||||
{
|
||||
guint length;
|
||||
|
||||
length = 0;
|
||||
while (list)
|
||||
{
|
||||
length++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
void
|
||||
g_list_foreach (GList *list,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
while (list)
|
||||
{
|
||||
(*func) (list->data, user_data);
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GList*
|
||||
g_list_insert_sorted (GList *list,
|
||||
gpointer data,
|
||||
GCompareFunc func)
|
||||
{
|
||||
GList *tmp_list = list;
|
||||
GList *new_list;
|
||||
gint cmp;
|
||||
|
||||
g_return_val_if_fail (func != NULL, list);
|
||||
|
||||
if (!list)
|
||||
{
|
||||
new_list = g_list_alloc();
|
||||
new_list->data = data;
|
||||
return new_list;
|
||||
}
|
||||
|
||||
cmp = (*func) (data, tmp_list->data);
|
||||
|
||||
while ((tmp_list->next) && (cmp > 0))
|
||||
{
|
||||
tmp_list = tmp_list->next;
|
||||
cmp = (*func) (data, tmp_list->data);
|
||||
}
|
||||
|
||||
new_list = g_list_alloc();
|
||||
new_list->data = data;
|
||||
|
||||
if ((!tmp_list->next) && (cmp > 0))
|
||||
{
|
||||
tmp_list->next = new_list;
|
||||
new_list->prev = tmp_list;
|
||||
return list;
|
||||
}
|
||||
|
||||
if (tmp_list->prev)
|
||||
{
|
||||
tmp_list->prev->next = new_list;
|
||||
new_list->prev = tmp_list->prev;
|
||||
}
|
||||
new_list->next = tmp_list;
|
||||
tmp_list->prev = new_list;
|
||||
|
||||
if (tmp_list == list)
|
||||
return new_list;
|
||||
else
|
||||
return list;
|
||||
}
|
807
gmem.c
Normal file
807
gmem.c
Normal file
@ -0,0 +1,807 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "glib.h"
|
||||
|
||||
/* #define ENABLE_MEM_PROFILE */
|
||||
/* #define ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
#define MAX_MEM_AREA 65536L
|
||||
#define MEM_AREA_SIZE 4L
|
||||
|
||||
#if SIZEOF_VOID_P > SIZEOF_LONG
|
||||
#define MEM_ALIGN SIZEOF_VOID_P
|
||||
#else
|
||||
#define MEM_ALIGN SIZEOF_LONG
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct _GFreeAtom GFreeAtom;
|
||||
typedef struct _GMemArea GMemArea;
|
||||
typedef struct _GRealMemChunk GRealMemChunk;
|
||||
|
||||
struct _GFreeAtom
|
||||
{
|
||||
GFreeAtom *next;
|
||||
};
|
||||
|
||||
struct _GMemArea
|
||||
{
|
||||
GMemArea *next; /* the next mem area */
|
||||
GMemArea *prev; /* the previous mem area */
|
||||
gulong index; /* the current index into the "mem" array */
|
||||
gulong free; /* the number of free bytes in this mem area */
|
||||
gulong allocated; /* the number of atoms allocated from this area */
|
||||
gulong mark; /* is this mem area marked for deletion */
|
||||
gchar mem[MEM_AREA_SIZE]; /* the mem array from which atoms get allocated
|
||||
* the actual size of this array is determined by
|
||||
* the mem chunk "area_size". ANSI says that it
|
||||
* must be declared to be the maximum size it
|
||||
* can possibly be (even though the actual size
|
||||
* may be less).
|
||||
*/
|
||||
};
|
||||
|
||||
struct _GRealMemChunk
|
||||
{
|
||||
gchar *name; /* name of this MemChunk...used for debugging output */
|
||||
gint type; /* the type of MemChunk: ALLOC_ONLY or ALLOC_AND_FREE */
|
||||
gint num_mem_areas; /* the number of memory areas */
|
||||
gint num_marked_areas; /* the number of areas marked for deletion */
|
||||
guint atom_size; /* the size of an atom */
|
||||
gulong area_size; /* the size of a memory area */
|
||||
GMemArea *mem_area; /* the current memory area */
|
||||
GMemArea *mem_areas; /* a list of all the mem areas owned by this chunk */
|
||||
GMemArea *free_mem_area; /* the free area...which is about to be destroyed */
|
||||
GFreeAtom *free_atoms; /* the free atoms list */
|
||||
GTree *mem_tree; /* tree of mem areas sorted by memory address */
|
||||
GRealMemChunk *next; /* pointer to the next chunk */
|
||||
GRealMemChunk *prev; /* pointer to the previous chunk */
|
||||
};
|
||||
|
||||
|
||||
static gulong g_mem_chunk_compute_size (gulong size);
|
||||
static gint g_mem_chunk_area_compare (GMemArea *a,
|
||||
GMemArea *b);
|
||||
static gint g_mem_chunk_area_search (GMemArea *a,
|
||||
gchar *addr);
|
||||
|
||||
|
||||
static GRealMemChunk *mem_chunks = NULL;
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
static gulong allocations[4096] = { 0 };
|
||||
static gulong allocated_mem = 0;
|
||||
static gulong freed_mem = 0;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
|
||||
|
||||
#ifndef USE_DMALLOC
|
||||
|
||||
gpointer
|
||||
g_malloc (gulong size)
|
||||
{
|
||||
gpointer p;
|
||||
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
gulong *t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
if (size == 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
p = (gpointer) malloc (size);
|
||||
if (!p)
|
||||
g_error ("could not allocate %ld bytes", size);
|
||||
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = 0;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = size;
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
if (size <= 4095)
|
||||
allocations[size-1] += 1;
|
||||
else
|
||||
allocations[4095] += 1;
|
||||
allocated_mem += size;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_malloc0 (gulong size)
|
||||
{
|
||||
gpointer p;
|
||||
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
gulong *t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
if (size == 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
p = (gpointer) calloc (size, 1);
|
||||
if (!p)
|
||||
g_error ("could not allocate %ld bytes", size);
|
||||
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = 0;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = size;
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
if (size <= 4095)
|
||||
allocations[size-1] += 1;
|
||||
else
|
||||
allocations[4095] += 1;
|
||||
allocated_mem += size;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_realloc (gpointer mem,
|
||||
gulong size)
|
||||
{
|
||||
gpointer p;
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
gulong *t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
if (size == 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size += SIZEOF_LONG;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
if (!mem)
|
||||
p = (gpointer) malloc (size);
|
||||
else
|
||||
{
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
freed_mem += *t;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
mem = t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
|
||||
if (*t >= 1)
|
||||
g_warning ("trying to realloc freed memory\n");
|
||||
mem = t;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
p = (gpointer) realloc (mem, size);
|
||||
}
|
||||
|
||||
if (!p)
|
||||
g_error ("could not reallocate %ld bytes", size);
|
||||
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = 0;
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
size -= SIZEOF_LONG;
|
||||
|
||||
t = p;
|
||||
p = ((guchar*) p + SIZEOF_LONG);
|
||||
*t = size;
|
||||
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
if (size <= 4095)
|
||||
allocations[size-1] += 1;
|
||||
else
|
||||
allocations[4095] += 1;
|
||||
allocated_mem += size;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
g_free (gpointer mem)
|
||||
{
|
||||
if (mem)
|
||||
{
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
gulong *t;
|
||||
gulong size;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#if defined(ENABLE_MEM_PROFILE) || defined(ENABLE_MEM_CHECK)
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
|
||||
size = *t;
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
freed_mem += size;
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
mem = t;
|
||||
#endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */
|
||||
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG);
|
||||
if (*t >= 1)
|
||||
g_warning ("freeing previously freed memory\n");
|
||||
*t += 1;
|
||||
mem = t;
|
||||
|
||||
memset ((guchar*) mem + 8, 0, size);
|
||||
#else /* ENABLE_MEM_CHECK */
|
||||
free (mem);
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* ! USE_DMALLOC */
|
||||
|
||||
|
||||
void
|
||||
g_mem_profile (void)
|
||||
{
|
||||
#ifdef ENABLE_MEM_PROFILE
|
||||
gint i;
|
||||
|
||||
for (i = 0; i < 4095; i++)
|
||||
if (allocations[i] > 0)
|
||||
g_print ("%lu allocations of %d bytes\n", allocations[i], i + 1);
|
||||
|
||||
if (allocations[4095] > 0)
|
||||
g_print ("%lu allocations of greater than 4095 bytes\n", allocations[4095]);
|
||||
g_print ("%lu bytes allocated\n", allocated_mem);
|
||||
g_print ("%lu bytes freed\n", freed_mem);
|
||||
g_print ("%lu bytes in use\n", allocated_mem - freed_mem);
|
||||
#endif /* ENABLE_MEM_PROFILE */
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_check (gpointer mem)
|
||||
{
|
||||
#ifdef ENABLE_MEM_CHECK
|
||||
gulong *t;
|
||||
|
||||
t = (gulong*) ((guchar*) mem - SIZEOF_LONG - SIZEOF_LONG);
|
||||
|
||||
if (*t >= 1)
|
||||
g_warning ("mem: 0x%08x has been freed: %lu\n", (gulong) mem, *t);
|
||||
#endif /* ENABLE_MEM_CHECK */
|
||||
}
|
||||
|
||||
GMemChunk*
|
||||
g_mem_chunk_new (gchar *name,
|
||||
gint atom_size,
|
||||
gulong area_size,
|
||||
gint type)
|
||||
{
|
||||
GRealMemChunk *mem_chunk;
|
||||
gulong rarea_size;
|
||||
|
||||
mem_chunk = g_new (struct _GRealMemChunk, 1);
|
||||
mem_chunk->name = name;
|
||||
mem_chunk->type = type;
|
||||
mem_chunk->num_mem_areas = 0;
|
||||
mem_chunk->num_marked_areas = 0;
|
||||
mem_chunk->mem_area = NULL;
|
||||
mem_chunk->free_mem_area = NULL;
|
||||
mem_chunk->free_atoms = NULL;
|
||||
mem_chunk->mem_tree = NULL;
|
||||
mem_chunk->mem_areas = NULL;
|
||||
mem_chunk->atom_size = atom_size;
|
||||
|
||||
if (mem_chunk->type == G_ALLOC_AND_FREE)
|
||||
mem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare);
|
||||
|
||||
if (mem_chunk->atom_size % MEM_ALIGN)
|
||||
mem_chunk->atom_size += MEM_ALIGN - (mem_chunk->atom_size % MEM_ALIGN);
|
||||
|
||||
mem_chunk->area_size = area_size;
|
||||
if (mem_chunk->area_size > MAX_MEM_AREA)
|
||||
mem_chunk->area_size = MAX_MEM_AREA;
|
||||
while (mem_chunk->area_size < mem_chunk->atom_size)
|
||||
mem_chunk->area_size *= 2;
|
||||
|
||||
rarea_size = mem_chunk->area_size + sizeof (GMemArea) - MEM_AREA_SIZE;
|
||||
rarea_size = g_mem_chunk_compute_size (rarea_size);
|
||||
mem_chunk->area_size = rarea_size - (sizeof (GMemArea) - MEM_AREA_SIZE);
|
||||
|
||||
/*
|
||||
mem_chunk->area_size -= (sizeof (GMemArea) - MEM_AREA_SIZE);
|
||||
if (mem_chunk->area_size < mem_chunk->atom_size)
|
||||
{
|
||||
mem_chunk->area_size = (mem_chunk->area_size + sizeof (GMemArea) - MEM_AREA_SIZE) * 2;
|
||||
mem_chunk->area_size -= (sizeof (GMemArea) - MEM_AREA_SIZE);
|
||||
}
|
||||
|
||||
if (mem_chunk->area_size % mem_chunk->atom_size)
|
||||
mem_chunk->area_size += mem_chunk->atom_size - (mem_chunk->area_size % mem_chunk->atom_size);
|
||||
*/
|
||||
|
||||
mem_chunk->next = mem_chunks;
|
||||
mem_chunk->prev = NULL;
|
||||
if (mem_chunks)
|
||||
mem_chunks->prev = mem_chunk;
|
||||
mem_chunks = mem_chunk;
|
||||
|
||||
return ((GMemChunk*) mem_chunk);
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_destroy (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *mem_areas;
|
||||
GMemArea *temp_area;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
mem_areas = rmem_chunk->mem_areas;
|
||||
while (mem_areas)
|
||||
{
|
||||
temp_area = mem_areas;
|
||||
mem_areas = mem_areas->next;
|
||||
g_free (temp_area);
|
||||
}
|
||||
|
||||
if (rmem_chunk->next)
|
||||
rmem_chunk->next->prev = rmem_chunk->prev;
|
||||
if (rmem_chunk->prev)
|
||||
rmem_chunk->prev->next = rmem_chunk->next;
|
||||
|
||||
if (rmem_chunk == mem_chunks)
|
||||
mem_chunks = mem_chunks->next;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
g_tree_destroy (rmem_chunk->mem_tree);
|
||||
|
||||
g_free (rmem_chunk);
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_mem_chunk_alloc (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *temp_area;
|
||||
gpointer mem;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
while (rmem_chunk->free_atoms)
|
||||
{
|
||||
/* Get the first piece of memory on the "free_atoms" list.
|
||||
* We can go ahead and destroy the list node we used to keep
|
||||
* track of it with and to update the "free_atoms" list to
|
||||
* point to its next element.
|
||||
*/
|
||||
mem = rmem_chunk->free_atoms;
|
||||
rmem_chunk->free_atoms = rmem_chunk->free_atoms->next;
|
||||
|
||||
/* Determine which area this piece of memory is allocated from */
|
||||
temp_area = g_tree_search (rmem_chunk->mem_tree,
|
||||
(GSearchFunc) g_mem_chunk_area_search,
|
||||
mem);
|
||||
|
||||
/* If the area has been marked, then it is being destroyed.
|
||||
* (ie marked to be destroyed).
|
||||
* We check to see if all of the segments on the free list that
|
||||
* reference this area have been removed. This occurs when
|
||||
* the ammount of free memory is less than the allocatable size.
|
||||
* If the chunk should be freed, then we place it in the "free_mem_area".
|
||||
* This is so we make sure not to free the mem area here and then
|
||||
* allocate it again a few lines down.
|
||||
* If we don't allocate a chunk a few lines down then the "free_mem_area"
|
||||
* will be freed.
|
||||
* If there is already a "free_mem_area" then we'll just free this mem area.
|
||||
*/
|
||||
if (temp_area->mark)
|
||||
{
|
||||
/* Update the "free" memory available in that area */
|
||||
temp_area->free += rmem_chunk->atom_size;
|
||||
|
||||
if (temp_area->free == rmem_chunk->area_size)
|
||||
{
|
||||
if (temp_area == rmem_chunk->mem_area)
|
||||
rmem_chunk->mem_area = NULL;
|
||||
|
||||
if (rmem_chunk->free_mem_area)
|
||||
{
|
||||
rmem_chunk->num_mem_areas -= 1;
|
||||
|
||||
if (temp_area->next)
|
||||
temp_area->next->prev = temp_area->prev;
|
||||
if (temp_area->prev)
|
||||
temp_area->prev->next = temp_area->next;
|
||||
if (temp_area == rmem_chunk->mem_areas)
|
||||
rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
g_tree_remove (rmem_chunk->mem_tree, temp_area);
|
||||
g_free (temp_area);
|
||||
}
|
||||
else
|
||||
rmem_chunk->free_mem_area = temp_area;
|
||||
|
||||
rmem_chunk->num_marked_areas -= 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Update the number of allocated atoms count.
|
||||
*/
|
||||
temp_area->allocated += 1;
|
||||
|
||||
/* The area wasn't marked...return the memory
|
||||
*/
|
||||
goto outa_here;
|
||||
}
|
||||
}
|
||||
|
||||
/* If there isn't a current mem area or the current mem area is out of space
|
||||
* then allocate a new mem area. We'll first check and see if we can use
|
||||
* the "free_mem_area". Otherwise we'll just malloc the mem area.
|
||||
*/
|
||||
if ((!rmem_chunk->mem_area) ||
|
||||
((rmem_chunk->mem_area->index + rmem_chunk->atom_size) > rmem_chunk->area_size))
|
||||
{
|
||||
if (rmem_chunk->free_mem_area)
|
||||
{
|
||||
rmem_chunk->mem_area = rmem_chunk->free_mem_area;
|
||||
rmem_chunk->free_mem_area = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
rmem_chunk->mem_area = (GMemArea*) g_malloc (sizeof (GMemArea) -
|
||||
MEM_AREA_SIZE +
|
||||
rmem_chunk->area_size);
|
||||
|
||||
rmem_chunk->num_mem_areas += 1;
|
||||
rmem_chunk->mem_area->next = rmem_chunk->mem_areas;
|
||||
rmem_chunk->mem_area->prev = NULL;
|
||||
|
||||
if (rmem_chunk->mem_areas)
|
||||
rmem_chunk->mem_areas->prev = rmem_chunk->mem_area;
|
||||
rmem_chunk->mem_areas = rmem_chunk->mem_area;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
g_tree_insert (rmem_chunk->mem_tree, rmem_chunk->mem_area, rmem_chunk->mem_area);
|
||||
}
|
||||
|
||||
rmem_chunk->mem_area->index = 0;
|
||||
rmem_chunk->mem_area->free = rmem_chunk->area_size;
|
||||
rmem_chunk->mem_area->allocated = 0;
|
||||
rmem_chunk->mem_area->mark = 0;
|
||||
}
|
||||
|
||||
/* Get the memory and modify the state variables appropriately.
|
||||
*/
|
||||
mem = (gpointer) &rmem_chunk->mem_area->mem[rmem_chunk->mem_area->index];
|
||||
rmem_chunk->mem_area->index += rmem_chunk->atom_size;
|
||||
rmem_chunk->mem_area->free -= rmem_chunk->atom_size;
|
||||
rmem_chunk->mem_area->allocated += 1;
|
||||
|
||||
outa_here:
|
||||
return mem;
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_free (GMemChunk *mem_chunk,
|
||||
gpointer mem)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *temp_area;
|
||||
GFreeAtom *free_atom;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
g_assert (mem != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
/* Don't do anything if this is an ALLOC_ONLY chunk
|
||||
*/
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
{
|
||||
/* Place the memory on the "free_atoms" list
|
||||
*/
|
||||
free_atom = (GFreeAtom*) mem;
|
||||
free_atom->next = rmem_chunk->free_atoms;
|
||||
rmem_chunk->free_atoms = free_atom;
|
||||
|
||||
temp_area = g_tree_search (rmem_chunk->mem_tree,
|
||||
(GSearchFunc) g_mem_chunk_area_search,
|
||||
mem);
|
||||
|
||||
temp_area->allocated -= 1;
|
||||
|
||||
if (temp_area->allocated == 0)
|
||||
{
|
||||
temp_area->mark = 1;
|
||||
rmem_chunk->num_marked_areas += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* This doesn't free the free_area if there is one */
|
||||
void
|
||||
g_mem_chunk_clean (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *mem_area;
|
||||
GFreeAtom *prev_free_atom;
|
||||
GFreeAtom *temp_free_atom;
|
||||
gpointer mem;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
{
|
||||
prev_free_atom = NULL;
|
||||
temp_free_atom = rmem_chunk->free_atoms;
|
||||
|
||||
while (temp_free_atom)
|
||||
{
|
||||
mem = (gpointer) temp_free_atom;
|
||||
|
||||
mem_area = g_tree_search (rmem_chunk->mem_tree,
|
||||
(GSearchFunc) g_mem_chunk_area_search,
|
||||
mem);
|
||||
|
||||
/* If this mem area is marked for destruction then delete the
|
||||
* area and list node and decrement the free mem.
|
||||
*/
|
||||
if (mem_area->mark)
|
||||
{
|
||||
if (prev_free_atom)
|
||||
prev_free_atom->next = temp_free_atom->next;
|
||||
else
|
||||
rmem_chunk->free_atoms = temp_free_atom->next;
|
||||
temp_free_atom = temp_free_atom->next;
|
||||
|
||||
mem_area->free += rmem_chunk->atom_size;
|
||||
if (mem_area->free == rmem_chunk->area_size)
|
||||
{
|
||||
rmem_chunk->num_mem_areas -= 1;
|
||||
rmem_chunk->num_marked_areas -= 1;
|
||||
|
||||
if (mem_area->next)
|
||||
mem_area->next->prev = mem_area->prev;
|
||||
if (mem_area->prev)
|
||||
mem_area->prev->next = mem_area->next;
|
||||
if (mem_area == rmem_chunk->mem_areas)
|
||||
rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
|
||||
if (mem_area == rmem_chunk->mem_area)
|
||||
rmem_chunk->mem_area = NULL;
|
||||
|
||||
if (rmem_chunk->type == G_ALLOC_AND_FREE)
|
||||
g_tree_remove (rmem_chunk->mem_tree, mem_area);
|
||||
g_free (mem_area);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
prev_free_atom = temp_free_atom;
|
||||
temp_free_atom = temp_free_atom->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_reset (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *mem_areas;
|
||||
GMemArea *temp_area;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
|
||||
mem_areas = rmem_chunk->mem_areas;
|
||||
rmem_chunk->num_mem_areas = 0;
|
||||
rmem_chunk->mem_areas = NULL;
|
||||
rmem_chunk->mem_area = NULL;
|
||||
|
||||
while (mem_areas)
|
||||
{
|
||||
temp_area = mem_areas;
|
||||
mem_areas = mem_areas->next;
|
||||
g_free (temp_area);
|
||||
}
|
||||
|
||||
rmem_chunk->free_atoms = NULL;
|
||||
|
||||
if (rmem_chunk->mem_tree)
|
||||
g_tree_destroy (rmem_chunk->mem_tree);
|
||||
rmem_chunk->mem_tree = g_tree_new ((GCompareFunc) g_mem_chunk_area_compare);
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_print (GMemChunk *mem_chunk)
|
||||
{
|
||||
GRealMemChunk *rmem_chunk;
|
||||
GMemArea *mem_areas;
|
||||
gulong mem;
|
||||
|
||||
g_assert (mem_chunk != NULL);
|
||||
|
||||
rmem_chunk = (GRealMemChunk*) mem_chunk;
|
||||
mem_areas = rmem_chunk->mem_areas;
|
||||
mem = 0;
|
||||
|
||||
while (mem_areas)
|
||||
{
|
||||
mem += rmem_chunk->area_size - mem_areas->free;
|
||||
mem_areas = mem_areas->next;
|
||||
}
|
||||
|
||||
g_print ("%s: %ld bytes using %d mem areas\n", rmem_chunk->name, mem, rmem_chunk->num_mem_areas);
|
||||
}
|
||||
|
||||
void
|
||||
g_mem_chunk_info (void)
|
||||
{
|
||||
GRealMemChunk *mem_chunk;
|
||||
gint count;
|
||||
|
||||
count = 0;
|
||||
mem_chunk = mem_chunks;
|
||||
while (mem_chunk)
|
||||
{
|
||||
count += 1;
|
||||
mem_chunk = mem_chunk->next;
|
||||
}
|
||||
|
||||
g_print ("%d mem chunks\n", count);
|
||||
|
||||
mem_chunk = mem_chunks;
|
||||
while (mem_chunk)
|
||||
{
|
||||
g_mem_chunk_print ((GMemChunk*) mem_chunk);
|
||||
mem_chunk = mem_chunk->next;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_blow_chunks (void)
|
||||
{
|
||||
GRealMemChunk *mem_chunk;
|
||||
|
||||
mem_chunk = mem_chunks;
|
||||
while (mem_chunk)
|
||||
{
|
||||
g_mem_chunk_clean ((GMemChunk*) mem_chunk);
|
||||
mem_chunk = mem_chunk->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static gulong
|
||||
g_mem_chunk_compute_size (gulong size)
|
||||
{
|
||||
gulong power_of_2;
|
||||
gulong lower, upper;
|
||||
|
||||
power_of_2 = 16;
|
||||
while (power_of_2 < size)
|
||||
power_of_2 <<= 1;
|
||||
|
||||
lower = power_of_2 >> 1;
|
||||
upper = power_of_2;
|
||||
|
||||
if ((size - lower) < (upper - size))
|
||||
return lower;
|
||||
return upper;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_mem_chunk_area_compare (GMemArea *a,
|
||||
GMemArea *b)
|
||||
{
|
||||
return (a->mem - b->mem);
|
||||
}
|
||||
|
||||
static gint
|
||||
g_mem_chunk_area_search (GMemArea *a,
|
||||
gchar *addr)
|
||||
{
|
||||
if (a->mem <= addr)
|
||||
{
|
||||
if (addr < &a->mem[a->index])
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
180
gmessages.c
Normal file
180
gmessages.c
Normal file
@ -0,0 +1,180 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "glib.h"
|
||||
|
||||
static GErrorFunc glib_error_func = NULL;
|
||||
static GWarningFunc glib_warning_func = NULL;
|
||||
static GPrintFunc glib_message_func = NULL;
|
||||
static GPrintFunc glib_print_func = NULL;
|
||||
|
||||
extern char* g_vsprintf (const gchar *fmt, va_list *args, va_list *args2);
|
||||
|
||||
void
|
||||
g_error (const gchar *format, ...)
|
||||
{
|
||||
va_list args, args2;
|
||||
char *buf;
|
||||
static gboolean errored = 0;
|
||||
|
||||
if (errored++)
|
||||
{
|
||||
write (2, "g_error: recursed!\n", 19);
|
||||
return;
|
||||
}
|
||||
|
||||
va_start (args, format);
|
||||
va_start (args2, format);
|
||||
buf = g_vsprintf (format, &args, &args2);
|
||||
va_end (args);
|
||||
va_end (args2);
|
||||
|
||||
if (glib_error_func)
|
||||
{
|
||||
(* glib_error_func) (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Use write() here because we might be out of memory */
|
||||
write (2, "\n** ERROR **: ", 14);
|
||||
write (2, buf, strlen(buf));
|
||||
write (2, "\n", 1);
|
||||
}
|
||||
|
||||
abort ();
|
||||
}
|
||||
|
||||
void
|
||||
g_warning (const gchar *format, ...)
|
||||
{
|
||||
va_list args, args2;
|
||||
char *buf;
|
||||
|
||||
va_start (args, format);
|
||||
va_start (args2, format);
|
||||
buf = g_vsprintf (format, &args, &args2);
|
||||
va_end (args);
|
||||
va_end (args2);
|
||||
|
||||
if (glib_warning_func)
|
||||
{
|
||||
(* glib_warning_func) (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs ("\n** WARNING **: ", stderr);
|
||||
fputs (buf, stderr);
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_message (const gchar *format, ...)
|
||||
{
|
||||
va_list args, args2;
|
||||
char *buf;
|
||||
|
||||
va_start (args, format);
|
||||
va_start (args2, format);
|
||||
buf = g_vsprintf (format, &args, &args2);
|
||||
va_end (args);
|
||||
va_end (args2);
|
||||
|
||||
if (glib_message_func)
|
||||
{
|
||||
(* glib_message_func) (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs ("message: ", stdout);
|
||||
fputs (buf, stdout);
|
||||
fputc ('\n', stdout);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_print (const gchar *format, ...)
|
||||
{
|
||||
va_list args, args2;
|
||||
char *buf;
|
||||
|
||||
va_start (args, format);
|
||||
va_start (args2, format);
|
||||
buf = g_vsprintf (format, &args, &args2);
|
||||
va_end (args);
|
||||
va_end (args2);
|
||||
|
||||
if (glib_print_func)
|
||||
{
|
||||
(* glib_print_func) (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs (buf, stdout);
|
||||
}
|
||||
}
|
||||
|
||||
GErrorFunc
|
||||
g_set_error_handler (GErrorFunc func)
|
||||
{
|
||||
GErrorFunc old_error_func;
|
||||
|
||||
old_error_func = glib_error_func;
|
||||
glib_error_func = func;
|
||||
|
||||
return old_error_func;
|
||||
}
|
||||
|
||||
GWarningFunc
|
||||
g_set_warning_handler (GWarningFunc func)
|
||||
{
|
||||
GWarningFunc old_warning_func;
|
||||
|
||||
old_warning_func = glib_warning_func;
|
||||
glib_warning_func = func;
|
||||
|
||||
return old_warning_func;
|
||||
}
|
||||
|
||||
GPrintFunc
|
||||
g_set_message_handler (GPrintFunc func)
|
||||
{
|
||||
GPrintFunc old_message_func;
|
||||
|
||||
old_message_func = glib_message_func;
|
||||
glib_message_func = func;
|
||||
|
||||
return old_message_func;
|
||||
}
|
||||
|
||||
GPrintFunc
|
||||
g_set_print_handler (GPrintFunc func)
|
||||
{
|
||||
GPrintFunc old_print_func;
|
||||
|
||||
old_print_func = glib_print_func;
|
||||
glib_print_func = func;
|
||||
|
||||
return old_print_func;
|
||||
}
|
||||
|
62
gprimes.c
Normal file
62
gprimes.c
Normal file
@ -0,0 +1,62 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
gint g_primes[] =
|
||||
{
|
||||
11,
|
||||
15,
|
||||
23,
|
||||
35,
|
||||
49,
|
||||
73,
|
||||
109,
|
||||
163,
|
||||
251,
|
||||
367,
|
||||
557,
|
||||
823,
|
||||
1237,
|
||||
1861,
|
||||
2777,
|
||||
4177,
|
||||
6247,
|
||||
9371,
|
||||
14057,
|
||||
21089,
|
||||
31627,
|
||||
47431,
|
||||
71143,
|
||||
106721,
|
||||
160073,
|
||||
240101,
|
||||
360163,
|
||||
540217,
|
||||
810343,
|
||||
1215497,
|
||||
1823231,
|
||||
2734867,
|
||||
4102283,
|
||||
6153409,
|
||||
9230113,
|
||||
13845163,
|
||||
};
|
||||
|
||||
gint g_nprimes = sizeof (g_primes) / sizeof (g_primes[0]);
|
1551
gscanner.c
Normal file
1551
gscanner.c
Normal file
File diff suppressed because it is too large
Load Diff
456
gslist.c
Normal file
456
gslist.c
Normal file
@ -0,0 +1,456 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GRealListAllocator GRealListAllocator;
|
||||
|
||||
struct _GRealListAllocator
|
||||
{
|
||||
GMemChunk *list_mem_chunk;
|
||||
GSList *free_list;
|
||||
};
|
||||
|
||||
|
||||
static GRealListAllocator *default_allocator = NULL;
|
||||
static GRealListAllocator *current_allocator = NULL;
|
||||
|
||||
GListAllocator*
|
||||
g_slist_set_allocator (GListAllocator* fallocator)
|
||||
{
|
||||
GRealListAllocator* allocator = (GRealListAllocator *) fallocator;
|
||||
GRealListAllocator* old_allocator = current_allocator;
|
||||
|
||||
if (allocator)
|
||||
current_allocator = allocator;
|
||||
else
|
||||
{
|
||||
if (!default_allocator)
|
||||
default_allocator = (GRealListAllocator*) g_list_allocator_new ();
|
||||
current_allocator = default_allocator;
|
||||
}
|
||||
|
||||
if (!current_allocator->list_mem_chunk)
|
||||
current_allocator->list_mem_chunk = g_mem_chunk_new ("slist mem chunk",
|
||||
sizeof (GSList),
|
||||
1024,
|
||||
G_ALLOC_ONLY);
|
||||
|
||||
return (GListAllocator*) (old_allocator == default_allocator ? NULL : old_allocator);
|
||||
}
|
||||
|
||||
|
||||
GSList*
|
||||
g_slist_alloc (void)
|
||||
{
|
||||
GSList *new_list;
|
||||
|
||||
g_slist_set_allocator (NULL);
|
||||
if (current_allocator->free_list)
|
||||
{
|
||||
new_list = current_allocator->free_list;
|
||||
current_allocator->free_list = current_allocator->free_list->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_list = g_chunk_new (GSList, current_allocator->list_mem_chunk);
|
||||
}
|
||||
|
||||
new_list->data = NULL;
|
||||
new_list->next = NULL;
|
||||
|
||||
return new_list;
|
||||
}
|
||||
|
||||
void
|
||||
g_slist_free (GSList *list)
|
||||
{
|
||||
GSList *last;
|
||||
|
||||
if (list)
|
||||
{
|
||||
last = g_slist_last (list);
|
||||
last->next = current_allocator->free_list;
|
||||
current_allocator->free_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_slist_free_1 (GSList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
list->next = current_allocator->free_list;
|
||||
current_allocator->free_list = list;
|
||||
}
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_append (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GSList *new_list;
|
||||
GSList *last;
|
||||
|
||||
new_list = g_slist_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (list)
|
||||
{
|
||||
last = g_slist_last (list);
|
||||
/* g_assert (last != NULL); */
|
||||
last->next = new_list;
|
||||
|
||||
return list;
|
||||
}
|
||||
else
|
||||
return new_list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_prepend (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GSList *new_list;
|
||||
|
||||
new_list = g_slist_alloc ();
|
||||
new_list->data = data;
|
||||
new_list->next = list;
|
||||
|
||||
return new_list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_insert (GSList *list,
|
||||
gpointer data,
|
||||
gint position)
|
||||
{
|
||||
GSList *prev_list;
|
||||
GSList *tmp_list;
|
||||
GSList *new_list;
|
||||
|
||||
if (position < 0)
|
||||
return g_slist_append (list, data);
|
||||
else if (position == 0)
|
||||
return g_slist_prepend (list, data);
|
||||
|
||||
new_list = g_slist_alloc ();
|
||||
new_list->data = data;
|
||||
|
||||
if (!list)
|
||||
return new_list;
|
||||
|
||||
prev_list = NULL;
|
||||
tmp_list = list;
|
||||
|
||||
while ((position-- > 0) && tmp_list)
|
||||
{
|
||||
prev_list = tmp_list;
|
||||
tmp_list = tmp_list->next;
|
||||
}
|
||||
|
||||
if (prev_list)
|
||||
{
|
||||
new_list->next = prev_list->next;
|
||||
prev_list->next = new_list;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_list->next = list;
|
||||
list = new_list;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GSList *
|
||||
g_slist_concat (GSList *list1, GSList *list2)
|
||||
{
|
||||
if (list2)
|
||||
{
|
||||
if (list1)
|
||||
g_slist_last (list1)->next = list2;
|
||||
else
|
||||
list1 = list2;
|
||||
}
|
||||
|
||||
return list1;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_remove (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
GSList *tmp;
|
||||
GSList *prev;
|
||||
|
||||
prev = NULL;
|
||||
tmp = list;
|
||||
|
||||
while (tmp)
|
||||
{
|
||||
if (tmp->data == data)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = tmp->next;
|
||||
if (list == tmp)
|
||||
list = list->next;
|
||||
|
||||
tmp->next = NULL;
|
||||
g_slist_free (tmp);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
prev = tmp;
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_remove_link (GSList *list,
|
||||
GSList *link)
|
||||
{
|
||||
GSList *tmp;
|
||||
GSList *prev;
|
||||
|
||||
prev = NULL;
|
||||
tmp = list;
|
||||
|
||||
while (tmp)
|
||||
{
|
||||
if (tmp == link)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = tmp->next;
|
||||
if (list == tmp)
|
||||
list = list->next;
|
||||
|
||||
tmp->next = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
prev = tmp;
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_reverse (GSList *list)
|
||||
{
|
||||
GSList *tmp;
|
||||
GSList *prev;
|
||||
GSList *last;
|
||||
|
||||
last = NULL;
|
||||
prev = NULL;
|
||||
|
||||
while (list)
|
||||
{
|
||||
last = list;
|
||||
|
||||
tmp = list->next;
|
||||
list->next = prev;
|
||||
|
||||
prev = list;
|
||||
list = tmp;
|
||||
}
|
||||
|
||||
return last;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_nth (GSList *list,
|
||||
guint n)
|
||||
{
|
||||
while ((n-- > 0) && list)
|
||||
list = list->next;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_slist_nth_data (GSList *list,
|
||||
guint n)
|
||||
{
|
||||
while ((n-- > 0) && list)
|
||||
list = list->next;
|
||||
|
||||
return list ? list->data : NULL;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_find (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
while (list)
|
||||
{
|
||||
if (list->data == data)
|
||||
break;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_find_custom (GSList *list,
|
||||
gpointer data,
|
||||
GCompareFunc func)
|
||||
{
|
||||
g_return_val_if_fail (func != NULL, list);
|
||||
|
||||
while (list)
|
||||
{
|
||||
if (! func (list->data, data))
|
||||
return list;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gint
|
||||
g_slist_position (GSList *list,
|
||||
GSList *link)
|
||||
{
|
||||
gint i;
|
||||
|
||||
i = 0;
|
||||
while (list)
|
||||
{
|
||||
if (list == link)
|
||||
return i;
|
||||
i++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
gint
|
||||
g_slist_index (GSList *list,
|
||||
gpointer data)
|
||||
{
|
||||
gint i;
|
||||
|
||||
i = 0;
|
||||
while (list)
|
||||
{
|
||||
if (list->data == data)
|
||||
return i;
|
||||
i++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_last (GSList *list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
while (list->next)
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
guint
|
||||
g_slist_length (GSList *list)
|
||||
{
|
||||
guint length;
|
||||
|
||||
length = 0;
|
||||
while (list)
|
||||
{
|
||||
length++;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
void
|
||||
g_slist_foreach (GSList *list,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
while (list)
|
||||
{
|
||||
(*func) (list->data, user_data);
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
|
||||
GSList*
|
||||
g_slist_insert_sorted (GSList *list,
|
||||
gpointer data,
|
||||
GCompareFunc func)
|
||||
{
|
||||
GSList *tmp_list = list;
|
||||
GSList *prev_list = NULL;
|
||||
GSList *new_list;
|
||||
gint cmp;
|
||||
|
||||
g_return_val_if_fail (func != NULL, list);
|
||||
|
||||
if (!list)
|
||||
{
|
||||
new_list = g_slist_alloc();
|
||||
new_list->data = data;
|
||||
return new_list;
|
||||
}
|
||||
|
||||
cmp = (*func) (data, tmp_list->data);
|
||||
|
||||
while ((tmp_list->next) && (cmp > 0))
|
||||
{
|
||||
prev_list = tmp_list;
|
||||
tmp_list = tmp_list->next;
|
||||
cmp = (*func) (data, tmp_list->data);
|
||||
}
|
||||
|
||||
new_list = g_slist_alloc();
|
||||
new_list->data = data;
|
||||
|
||||
if ((!tmp_list->next) && (cmp > 0))
|
||||
{
|
||||
tmp_list->next = new_list;
|
||||
return list;
|
||||
}
|
||||
|
||||
if (prev_list)
|
||||
{
|
||||
prev_list->next = new_list;
|
||||
new_list->next = tmp_list;
|
||||
return list;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_list->next = list;
|
||||
return new_list;
|
||||
}
|
||||
}
|
647
gstring.c
Normal file
647
gstring.c
Normal file
@ -0,0 +1,647 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <glib.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
typedef struct _GRealStringChunk GRealStringChunk;
|
||||
typedef struct _GRealString GRealString;
|
||||
|
||||
struct _GRealStringChunk
|
||||
{
|
||||
GHashTable *const_table;
|
||||
GSList *storage_list;
|
||||
gint storage_next;
|
||||
gint this_size;
|
||||
gint default_size;
|
||||
};
|
||||
|
||||
struct _GRealString
|
||||
{
|
||||
gchar *str;
|
||||
gint len;
|
||||
gint alloc;
|
||||
};
|
||||
|
||||
|
||||
static GMemChunk *string_mem_chunk = NULL;
|
||||
|
||||
/* Hash Functions.
|
||||
*/
|
||||
|
||||
gint
|
||||
g_str_equal (gconstpointer v, gconstpointer v2)
|
||||
{
|
||||
return strcmp ((const gchar*) v, (const gchar*)v2) == 0;
|
||||
}
|
||||
|
||||
/* a char* hash function from ASU */
|
||||
guint
|
||||
g_str_hash (gconstpointer v)
|
||||
{
|
||||
const char *s = (char*)v;
|
||||
const char *p;
|
||||
guint h=0, g;
|
||||
|
||||
for(p = s; *p != '\0'; p += 1) {
|
||||
h = ( h << 4 ) + *p;
|
||||
if ( ( g = h & 0xf0000000 ) ) {
|
||||
h = h ^ (g >> 24);
|
||||
h = h ^ g;
|
||||
}
|
||||
}
|
||||
|
||||
return h /* % M */;
|
||||
}
|
||||
|
||||
|
||||
/* String Chunks.
|
||||
*/
|
||||
|
||||
GStringChunk*
|
||||
g_string_chunk_new (gint default_size)
|
||||
{
|
||||
GRealStringChunk *new_chunk = g_new (GRealStringChunk, 1);
|
||||
gint size = 1;
|
||||
|
||||
while (size < default_size)
|
||||
size <<= 1;
|
||||
|
||||
new_chunk->const_table = NULL;
|
||||
new_chunk->storage_list = NULL;
|
||||
new_chunk->storage_next = size;
|
||||
new_chunk->default_size = size;
|
||||
new_chunk->this_size = size;
|
||||
|
||||
return (GStringChunk*) new_chunk;
|
||||
}
|
||||
|
||||
void
|
||||
g_string_chunk_free (GStringChunk *fchunk)
|
||||
{
|
||||
GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
|
||||
GSList *tmp_list;
|
||||
|
||||
g_return_if_fail (chunk != NULL);
|
||||
|
||||
if (chunk->storage_list)
|
||||
{
|
||||
GListAllocator *tmp_allocator = g_slist_set_allocator (NULL);
|
||||
|
||||
for (tmp_list = chunk->storage_list; tmp_list; tmp_list = tmp_list->next)
|
||||
g_free (tmp_list->data);
|
||||
|
||||
g_slist_free (chunk->storage_list);
|
||||
|
||||
g_slist_set_allocator (tmp_allocator);
|
||||
}
|
||||
|
||||
if (chunk->const_table)
|
||||
g_hash_table_destroy (chunk->const_table);
|
||||
|
||||
g_free (chunk);
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_string_chunk_insert (GStringChunk *fchunk,
|
||||
const gchar *string)
|
||||
{
|
||||
GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
|
||||
gint len = strlen (string);
|
||||
char* pos;
|
||||
|
||||
g_return_val_if_fail (chunk != NULL, NULL);
|
||||
|
||||
if ((chunk->storage_next + len + 1) > chunk->this_size)
|
||||
{
|
||||
GListAllocator *tmp_allocator = g_slist_set_allocator (NULL);
|
||||
gint new_size = chunk->default_size;
|
||||
|
||||
while (new_size < len+1)
|
||||
new_size <<= 1;
|
||||
|
||||
chunk->storage_list = g_slist_prepend (chunk->storage_list,
|
||||
g_new (char, new_size));
|
||||
|
||||
chunk->this_size = new_size;
|
||||
chunk->storage_next = 0;
|
||||
|
||||
g_slist_set_allocator (tmp_allocator);
|
||||
}
|
||||
|
||||
pos = ((char*)chunk->storage_list->data) + chunk->storage_next;
|
||||
|
||||
strcpy (pos, string);
|
||||
|
||||
chunk->storage_next += len + 1;
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_string_chunk_insert_const (GStringChunk *fchunk,
|
||||
const gchar *string)
|
||||
{
|
||||
GRealStringChunk *chunk = (GRealStringChunk*) fchunk;
|
||||
char* lookup;
|
||||
|
||||
g_return_val_if_fail (chunk != NULL, NULL);
|
||||
|
||||
if (!chunk->const_table)
|
||||
chunk->const_table = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
|
||||
lookup = (char*) g_hash_table_lookup (chunk->const_table, (gchar *)string);
|
||||
|
||||
if (!lookup)
|
||||
{
|
||||
lookup = g_string_chunk_insert (fchunk, string);
|
||||
g_hash_table_insert (chunk->const_table, lookup, lookup);
|
||||
}
|
||||
|
||||
return lookup;
|
||||
}
|
||||
|
||||
/* Strings.
|
||||
*/
|
||||
static gint
|
||||
nearest_pow (gint num)
|
||||
{
|
||||
gint n = 1;
|
||||
|
||||
while (n < num)
|
||||
n <<= 1;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static void
|
||||
g_string_maybe_expand (GRealString* string, gint len)
|
||||
{
|
||||
if (string->len + len >= string->alloc)
|
||||
{
|
||||
string->alloc = nearest_pow (string->len + len + 1);
|
||||
string->str = g_realloc (string->str, string->alloc);
|
||||
}
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_sized_new (guint dfl_size)
|
||||
{
|
||||
GRealString *string;
|
||||
|
||||
if (!string_mem_chunk)
|
||||
string_mem_chunk = g_mem_chunk_new ("string mem chunk",
|
||||
sizeof (GRealString),
|
||||
1024, G_ALLOC_AND_FREE);
|
||||
|
||||
string = g_chunk_new (GRealString, string_mem_chunk);
|
||||
|
||||
string->alloc = 0;
|
||||
string->len = 0;
|
||||
string->str = NULL;
|
||||
|
||||
g_string_maybe_expand (string, MAX (dfl_size, 2));
|
||||
string->str[0] = 0;
|
||||
|
||||
return (GString*) string;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_new (const gchar *init)
|
||||
{
|
||||
GString *string;
|
||||
|
||||
string = g_string_sized_new (2);
|
||||
|
||||
if (init)
|
||||
g_string_append (string, init);
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
void
|
||||
g_string_free (GString *string,
|
||||
gint free_segment)
|
||||
{
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
if (free_segment)
|
||||
g_free (string->str);
|
||||
|
||||
g_mem_chunk_free (string_mem_chunk, string);
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_assign (GString *lval,
|
||||
const gchar *rval)
|
||||
{
|
||||
g_string_truncate (lval, 0);
|
||||
g_string_append (lval, rval);
|
||||
|
||||
return lval;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_truncate (GString* fstring,
|
||||
gint len)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
|
||||
string->len = len;
|
||||
|
||||
string->str[len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_append (GString *fstring,
|
||||
const gchar *val)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
int len;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (val != NULL, fstring);
|
||||
|
||||
len = strlen (val);
|
||||
g_string_maybe_expand (string, len);
|
||||
|
||||
strcpy (string->str + string->len, val);
|
||||
|
||||
string->len += len;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_append_c (GString *fstring,
|
||||
gchar c)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_string_maybe_expand (string, 1);
|
||||
|
||||
string->str[string->len++] = c;
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_prepend (GString *fstring,
|
||||
const gchar *val)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
gint len;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (val != NULL, fstring);
|
||||
|
||||
len = strlen (val);
|
||||
g_string_maybe_expand (string, len);
|
||||
|
||||
g_memmove (string->str + len, string->str, string->len);
|
||||
|
||||
strncpy (string->str, val, len);
|
||||
|
||||
string->len += len;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_prepend_c (GString *fstring,
|
||||
gchar c)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_string_maybe_expand (string, 1);
|
||||
|
||||
g_memmove (string->str + 1, string->str, string->len);
|
||||
|
||||
string->str[0] = c;
|
||||
|
||||
string->len += 1;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_insert (GString *fstring,
|
||||
gint pos,
|
||||
const gchar *val)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
gint len;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (val != NULL, fstring);
|
||||
g_return_val_if_fail (pos >= 0, fstring);
|
||||
g_return_val_if_fail (pos <= string->len, fstring);
|
||||
|
||||
len = strlen (val);
|
||||
g_string_maybe_expand (string, len);
|
||||
|
||||
g_memmove (string->str + pos + len, string->str + pos, string->len - pos);
|
||||
|
||||
strncpy (string->str + pos, val, len);
|
||||
|
||||
string->len += len;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString *
|
||||
g_string_insert_c (GString *fstring,
|
||||
gint pos,
|
||||
gchar c)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (pos <= string->len, fstring);
|
||||
|
||||
g_string_maybe_expand (string, 1);
|
||||
|
||||
g_memmove (string->str + pos + 1, string->str + pos, string->len - pos);
|
||||
|
||||
string->str[pos] = c;
|
||||
|
||||
string->len += 1;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_erase (GString *fstring,
|
||||
gint pos,
|
||||
gint len)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
g_return_val_if_fail (len >= 0, fstring);
|
||||
g_return_val_if_fail (pos >= 0, fstring);
|
||||
g_return_val_if_fail (pos <= string->len, fstring);
|
||||
g_return_val_if_fail (pos + len <= string->len, fstring);
|
||||
|
||||
if (pos + len < string->len)
|
||||
g_memmove (string->str + pos, string->str + pos + len, string->len - (pos + len));
|
||||
|
||||
string->len -= len;
|
||||
|
||||
string->str[string->len] = 0;
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_down (GString *fstring)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
gchar *s;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
|
||||
s = string->str;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
*s = tolower (*s);
|
||||
s++;
|
||||
}
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
GString*
|
||||
g_string_up (GString *fstring)
|
||||
{
|
||||
GRealString *string = (GRealString*)fstring;
|
||||
gchar *s;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
|
||||
s = string->str;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
*s = toupper (*s);
|
||||
s++;
|
||||
}
|
||||
|
||||
return fstring;
|
||||
}
|
||||
|
||||
static int
|
||||
get_length_upper_bound (const gchar* fmt, va_list *args)
|
||||
{
|
||||
int len = 0;
|
||||
int short_int;
|
||||
int long_int;
|
||||
int done;
|
||||
char *tmp;
|
||||
|
||||
while (*fmt)
|
||||
{
|
||||
char c = *fmt++;
|
||||
|
||||
short_int = FALSE;
|
||||
long_int = FALSE;
|
||||
|
||||
if (c == '%')
|
||||
{
|
||||
done = FALSE;
|
||||
while (*fmt && !done)
|
||||
{
|
||||
switch (*fmt++)
|
||||
{
|
||||
case '*':
|
||||
len += va_arg(*args, int);
|
||||
break;
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
fmt -= 1;
|
||||
len += strtol (fmt, (char **)&fmt, 10);
|
||||
break;
|
||||
case 'h':
|
||||
short_int = TRUE;
|
||||
break;
|
||||
case 'l':
|
||||
long_int = TRUE;
|
||||
break;
|
||||
|
||||
/* I ignore 'q' and 'L', they're not portable anyway. */
|
||||
|
||||
case 's':
|
||||
tmp = va_arg(*args, char *);
|
||||
if(tmp)
|
||||
len += strlen (tmp);
|
||||
else
|
||||
len += strlen ("(null)");
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'd':
|
||||
case 'i':
|
||||
case 'o':
|
||||
case 'u':
|
||||
case 'x':
|
||||
case 'X':
|
||||
if (long_int)
|
||||
(void)va_arg (*args, long);
|
||||
else if (short_int)
|
||||
(void)va_arg (*args, int);
|
||||
else
|
||||
(void)va_arg (*args, int);
|
||||
len += 32;
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'D':
|
||||
case 'O':
|
||||
case 'U':
|
||||
(void)va_arg (*args, long);
|
||||
len += 32;
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'e':
|
||||
case 'E':
|
||||
case 'f':
|
||||
case 'g':
|
||||
(void)va_arg (*args, double);
|
||||
len += 32;
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'c':
|
||||
(void)va_arg (*args, int);
|
||||
len += 1;
|
||||
done = TRUE;
|
||||
break;
|
||||
case 'p':
|
||||
case 'n':
|
||||
(void)va_arg (*args, void*);
|
||||
len += 32;
|
||||
done = TRUE;
|
||||
break;
|
||||
case '%':
|
||||
len += 1;
|
||||
done = TRUE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
len += 1;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
char*
|
||||
g_vsprintf (const gchar *fmt,
|
||||
va_list *args,
|
||||
va_list *args2)
|
||||
{
|
||||
static gchar *buf = NULL;
|
||||
static gint alloc = 0;
|
||||
|
||||
gint len = get_length_upper_bound (fmt, args);
|
||||
|
||||
if (len >= alloc)
|
||||
{
|
||||
if (buf)
|
||||
g_free (buf);
|
||||
|
||||
alloc = nearest_pow (MAX(len + 1, 1024));
|
||||
|
||||
buf = g_new (char, alloc);
|
||||
}
|
||||
|
||||
vsprintf (buf, fmt, *args2);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void
|
||||
g_string_sprintfa_int (GString *string,
|
||||
const gchar *fmt,
|
||||
va_list *args,
|
||||
va_list *args2)
|
||||
{
|
||||
g_string_append (string, g_vsprintf (fmt, args, args2));
|
||||
}
|
||||
|
||||
void
|
||||
g_string_sprintf (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
{
|
||||
va_list args, args2;
|
||||
|
||||
va_start(args, fmt);
|
||||
va_start(args2, fmt);
|
||||
|
||||
g_string_truncate (string, 0);
|
||||
|
||||
g_string_sprintfa_int (string, fmt, &args, &args2);
|
||||
|
||||
va_end(args);
|
||||
va_end(args2);
|
||||
}
|
||||
|
||||
void
|
||||
g_string_sprintfa (GString *string,
|
||||
const gchar *fmt,
|
||||
...)
|
||||
{
|
||||
va_list args, args2;
|
||||
|
||||
va_start(args, fmt);
|
||||
va_start(args2, fmt);
|
||||
|
||||
g_string_sprintfa_int (string, fmt, &args, &args2);
|
||||
|
||||
va_end(args);
|
||||
va_end(args2);
|
||||
}
|
120
gtimer.c
Normal file
120
gtimer.c
Normal file
@ -0,0 +1,120 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GRealTimer GRealTimer;
|
||||
|
||||
struct _GRealTimer
|
||||
{
|
||||
struct timeval start;
|
||||
struct timeval end;
|
||||
gint active;
|
||||
};
|
||||
|
||||
|
||||
GTimer*
|
||||
g_timer_new (void)
|
||||
{
|
||||
GRealTimer *timer;
|
||||
|
||||
timer = g_new (GRealTimer, 1);
|
||||
timer->active = TRUE;
|
||||
|
||||
gettimeofday (&timer->start, NULL);
|
||||
|
||||
return ((GTimer*) timer);
|
||||
}
|
||||
|
||||
void
|
||||
g_timer_destroy (GTimer *timer)
|
||||
{
|
||||
g_assert (timer != NULL);
|
||||
|
||||
g_free (timer);
|
||||
}
|
||||
|
||||
void
|
||||
g_timer_start (GTimer *timer)
|
||||
{
|
||||
GRealTimer *rtimer;
|
||||
|
||||
g_assert (timer != NULL);
|
||||
|
||||
rtimer = (GRealTimer*) timer;
|
||||
gettimeofday (&rtimer->start, NULL);
|
||||
rtimer->active = 1;
|
||||
}
|
||||
|
||||
void
|
||||
g_timer_stop (GTimer *timer)
|
||||
{
|
||||
GRealTimer *rtimer;
|
||||
|
||||
g_assert (timer != NULL);
|
||||
|
||||
rtimer = (GRealTimer*) timer;
|
||||
gettimeofday (&rtimer->end, NULL);
|
||||
rtimer->active = 0;
|
||||
}
|
||||
|
||||
void
|
||||
g_timer_reset (GTimer *timer)
|
||||
{
|
||||
GRealTimer *rtimer;
|
||||
|
||||
g_assert (timer != NULL);
|
||||
|
||||
rtimer = (GRealTimer*) timer;
|
||||
gettimeofday (&rtimer->start, NULL);
|
||||
}
|
||||
|
||||
gdouble
|
||||
g_timer_elapsed (GTimer *timer,
|
||||
gulong *microseconds)
|
||||
{
|
||||
GRealTimer *rtimer;
|
||||
struct timeval elapsed;
|
||||
gdouble total;
|
||||
|
||||
g_assert (timer != NULL);
|
||||
|
||||
rtimer = (GRealTimer*) timer;
|
||||
|
||||
if (rtimer->active)
|
||||
gettimeofday (&rtimer->end, NULL);
|
||||
|
||||
if (rtimer->start.tv_usec > rtimer->end.tv_usec)
|
||||
{
|
||||
rtimer->end.tv_usec += 1000000;
|
||||
rtimer->end.tv_sec--;
|
||||
}
|
||||
|
||||
elapsed.tv_usec = rtimer->end.tv_usec - rtimer->start.tv_usec;
|
||||
elapsed.tv_sec = rtimer->end.tv_sec - rtimer->start.tv_sec;
|
||||
|
||||
total = elapsed.tv_sec + ((gdouble) elapsed.tv_usec / 1e6);
|
||||
|
||||
if (microseconds)
|
||||
*microseconds = elapsed.tv_usec;
|
||||
|
||||
return total;
|
||||
}
|
719
gtree.c
Normal file
719
gtree.c
Normal file
@ -0,0 +1,719 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include "glib.h"
|
||||
|
||||
|
||||
typedef struct _GRealTree GRealTree;
|
||||
typedef struct _GTreeNode GTreeNode;
|
||||
|
||||
struct _GRealTree
|
||||
{
|
||||
GTreeNode *root;
|
||||
GCompareFunc key_compare;
|
||||
};
|
||||
|
||||
struct _GTreeNode
|
||||
{
|
||||
gint balance; /* height (left) - height (right) */
|
||||
GTreeNode *left; /* left subtree */
|
||||
GTreeNode *right; /* right subtree */
|
||||
gpointer key; /* key for this node */
|
||||
gpointer value; /* value stored at this node */
|
||||
};
|
||||
|
||||
|
||||
static GTreeNode* g_tree_node_new (gpointer key,
|
||||
gpointer value);
|
||||
static void g_tree_node_destroy (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_insert (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key,
|
||||
gpointer value,
|
||||
gint *inserted);
|
||||
static GTreeNode* g_tree_node_remove (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key);
|
||||
static GTreeNode* g_tree_node_balance (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_remove_leftmost (GTreeNode *node,
|
||||
GTreeNode **leftmost);
|
||||
static GTreeNode* g_tree_node_restore_left_balance (GTreeNode *node,
|
||||
gint old_balance);
|
||||
static GTreeNode* g_tree_node_restore_right_balance (GTreeNode *node,
|
||||
gint old_balance);
|
||||
static gpointer g_tree_node_lookup (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key);
|
||||
static gint g_tree_node_count (GTreeNode *node);
|
||||
static gint g_tree_node_pre_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data);
|
||||
static gint g_tree_node_in_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data);
|
||||
static gint g_tree_node_post_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data);
|
||||
static gpointer g_tree_node_search (GTreeNode *node,
|
||||
GSearchFunc search_func,
|
||||
gpointer data);
|
||||
static gint g_tree_node_height (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_rotate_left (GTreeNode *node);
|
||||
static GTreeNode* g_tree_node_rotate_right (GTreeNode *node);
|
||||
static void g_tree_node_check (GTreeNode *node);
|
||||
|
||||
|
||||
static GMemChunk *node_mem_chunk = NULL;
|
||||
static GSList *node_free_list = NULL;
|
||||
|
||||
|
||||
GTree*
|
||||
g_tree_new (GCompareFunc key_compare_func)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
rtree = g_new (GRealTree, 1);
|
||||
rtree->root = NULL;
|
||||
rtree->key_compare = key_compare_func;
|
||||
|
||||
return (GTree*) rtree;
|
||||
}
|
||||
|
||||
void
|
||||
g_tree_destroy (GTree *tree)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_if_fail (tree != NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
g_tree_node_destroy (rtree->root);
|
||||
g_free (rtree);
|
||||
}
|
||||
|
||||
void
|
||||
g_tree_insert (GTree *tree,
|
||||
gpointer key,
|
||||
gpointer value)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
gint inserted;
|
||||
|
||||
g_return_if_fail (tree != NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
inserted = FALSE;
|
||||
rtree->root = g_tree_node_insert (rtree->root, rtree->key_compare,
|
||||
key, value, &inserted);
|
||||
}
|
||||
|
||||
void
|
||||
g_tree_remove (GTree *tree,
|
||||
gpointer key)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_if_fail (tree != NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
rtree->root = g_tree_node_remove (rtree->root, rtree->key_compare, key);
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_tree_lookup (GTree *tree,
|
||||
gpointer key)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_val_if_fail (tree != NULL, NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
return g_tree_node_lookup (rtree->root, rtree->key_compare, key);
|
||||
}
|
||||
|
||||
void
|
||||
g_tree_traverse (GTree *tree,
|
||||
GTraverseFunc traverse_func,
|
||||
GTraverseType traverse_type,
|
||||
gpointer data)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_if_fail (tree != NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
g_return_if_fail (rtree->root != NULL);
|
||||
|
||||
switch (traverse_type)
|
||||
{
|
||||
case G_PRE_ORDER:
|
||||
g_tree_node_pre_order (rtree->root, traverse_func, data);
|
||||
break;
|
||||
|
||||
case G_IN_ORDER:
|
||||
g_tree_node_in_order (rtree->root, traverse_func, data);
|
||||
break;
|
||||
|
||||
case G_POST_ORDER:
|
||||
g_tree_node_post_order (rtree->root, traverse_func, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gpointer
|
||||
g_tree_search (GTree *tree,
|
||||
GSearchFunc search_func,
|
||||
gpointer data)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_val_if_fail (tree != NULL, NULL);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
if (rtree->root)
|
||||
return g_tree_node_search (rtree->root, search_func, data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gint
|
||||
g_tree_height (GTree *tree)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_val_if_fail (tree != NULL, 0);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
if (rtree->root)
|
||||
return g_tree_node_height (rtree->root);
|
||||
return 0;
|
||||
}
|
||||
|
||||
gint
|
||||
g_tree_nnodes (GTree *tree)
|
||||
{
|
||||
GRealTree *rtree;
|
||||
|
||||
g_return_val_if_fail (tree != NULL, 0);
|
||||
|
||||
rtree = (GRealTree*) tree;
|
||||
|
||||
if (rtree->root)
|
||||
return g_tree_node_count (rtree->root);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_new (gpointer key,
|
||||
gpointer value)
|
||||
{
|
||||
GTreeNode *node;
|
||||
GSList *tmp_list;
|
||||
|
||||
if (node_free_list)
|
||||
{
|
||||
tmp_list = node_free_list;
|
||||
node_free_list = node_free_list->next;
|
||||
|
||||
node = tmp_list->data;
|
||||
|
||||
{
|
||||
GListAllocator *tmp_allocator = g_list_set_allocator (NULL);
|
||||
g_slist_free_1 (tmp_list);
|
||||
g_list_set_allocator (tmp_allocator);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!node_mem_chunk)
|
||||
node_mem_chunk = g_mem_chunk_new ("tree node mem chunk", sizeof (GTreeNode), 1024, G_ALLOC_ONLY);
|
||||
|
||||
node = g_chunk_new (GTreeNode, node_mem_chunk);
|
||||
}
|
||||
|
||||
node->balance = 0;
|
||||
node->left = NULL;
|
||||
node->right = NULL;
|
||||
node->key = key;
|
||||
node->value = value;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static void
|
||||
g_tree_node_destroy (GTreeNode *node)
|
||||
{
|
||||
if (node)
|
||||
{
|
||||
node_free_list = g_slist_prepend (node_free_list, node);
|
||||
g_tree_node_destroy (node->right);
|
||||
g_tree_node_destroy (node->left);
|
||||
}
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_insert (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key,
|
||||
gpointer value,
|
||||
gint *inserted)
|
||||
{
|
||||
gint old_balance;
|
||||
gint cmp;
|
||||
|
||||
if (!node)
|
||||
{
|
||||
*inserted = TRUE;
|
||||
return g_tree_node_new (key, value);
|
||||
}
|
||||
|
||||
cmp = (* compare) (key, node->key);
|
||||
if (cmp == 0)
|
||||
{
|
||||
*inserted = FALSE;
|
||||
node->value = value;
|
||||
return node;
|
||||
}
|
||||
|
||||
if (cmp < 0)
|
||||
{
|
||||
if (node->left)
|
||||
{
|
||||
old_balance = node->left->balance;
|
||||
node->left = g_tree_node_insert (node->left, compare, key, value, inserted);
|
||||
|
||||
if ((old_balance != node->left->balance) && node->left->balance)
|
||||
node->balance -= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
*inserted = TRUE;
|
||||
node->left = g_tree_node_new (key, value);
|
||||
node->balance -= 1;
|
||||
}
|
||||
}
|
||||
else if (cmp > 0)
|
||||
{
|
||||
if (node->right)
|
||||
{
|
||||
old_balance = node->right->balance;
|
||||
node->right = g_tree_node_insert (node->right, compare, key, value, inserted);
|
||||
|
||||
if ((old_balance != node->right->balance) && node->right->balance)
|
||||
node->balance += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
*inserted = TRUE;
|
||||
node->right = g_tree_node_new (key, value);
|
||||
node->balance += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (*inserted)
|
||||
{
|
||||
if ((node->balance < -1) || (node->balance > 1))
|
||||
node = g_tree_node_balance (node);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_remove (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key)
|
||||
{
|
||||
GTreeNode *garbage;
|
||||
GTreeNode *new_root;
|
||||
gint old_balance;
|
||||
gint cmp;
|
||||
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
cmp = (* compare) (key, node->key);
|
||||
if (cmp == 0)
|
||||
{
|
||||
garbage = node;
|
||||
|
||||
if (!node->right)
|
||||
{
|
||||
node = node->left;
|
||||
}
|
||||
else
|
||||
{
|
||||
old_balance = node->right->balance;
|
||||
node->right = g_tree_node_remove_leftmost (node->right, &new_root);
|
||||
new_root->left = node->left;
|
||||
new_root->right = node->right;
|
||||
new_root->balance = node->balance;
|
||||
node = g_tree_node_restore_right_balance (new_root, old_balance);
|
||||
}
|
||||
|
||||
node_free_list = g_slist_prepend (node_free_list, garbage);
|
||||
}
|
||||
else if (cmp < 0)
|
||||
{
|
||||
if (node->left)
|
||||
{
|
||||
old_balance = node->left->balance;
|
||||
node->left = g_tree_node_remove (node->left, compare, key);
|
||||
node = g_tree_node_restore_left_balance (node, old_balance);
|
||||
}
|
||||
}
|
||||
else if (cmp > 0)
|
||||
{
|
||||
if (node->right)
|
||||
{
|
||||
old_balance = node->right->balance;
|
||||
node->right = g_tree_node_remove (node->right, compare, key);
|
||||
node = g_tree_node_restore_right_balance (node, old_balance);
|
||||
}
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_balance (GTreeNode *node)
|
||||
{
|
||||
if (node->balance < -1)
|
||||
{
|
||||
if (node->left->balance > 0)
|
||||
node->left = g_tree_node_rotate_left (node->left);
|
||||
node = g_tree_node_rotate_right (node);
|
||||
}
|
||||
else if (node->balance > 1)
|
||||
{
|
||||
if (node->right->balance < 0)
|
||||
node->right = g_tree_node_rotate_right (node->right);
|
||||
node = g_tree_node_rotate_left (node);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_remove_leftmost (GTreeNode *node,
|
||||
GTreeNode **leftmost)
|
||||
{
|
||||
gint old_balance;
|
||||
|
||||
if (!node->left)
|
||||
{
|
||||
*leftmost = node;
|
||||
return node->right;
|
||||
}
|
||||
|
||||
old_balance = node->left->balance;
|
||||
node->left = g_tree_node_remove_leftmost (node->left, leftmost);
|
||||
return g_tree_node_restore_left_balance (node, old_balance);
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_restore_left_balance (GTreeNode *node,
|
||||
gint old_balance)
|
||||
{
|
||||
if (!node->left)
|
||||
node->balance += 1;
|
||||
else if ((node->left->balance != old_balance) &&
|
||||
(node->left->balance == 0))
|
||||
node->balance += 1;
|
||||
|
||||
if (node->balance > 1)
|
||||
return g_tree_node_balance (node);
|
||||
return node;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_restore_right_balance (GTreeNode *node,
|
||||
gint old_balance)
|
||||
{
|
||||
if (!node->right)
|
||||
node->balance -= 1;
|
||||
else if ((node->right->balance != old_balance) &&
|
||||
(node->right->balance == 0))
|
||||
node->balance -= 1;
|
||||
|
||||
if (node->balance < -1)
|
||||
return g_tree_node_balance (node);
|
||||
return node;
|
||||
}
|
||||
|
||||
static gpointer
|
||||
g_tree_node_lookup (GTreeNode *node,
|
||||
GCompareFunc compare,
|
||||
gpointer key)
|
||||
{
|
||||
gint cmp;
|
||||
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
cmp = (* compare) (key, node->key);
|
||||
if (cmp == 0)
|
||||
return node->value;
|
||||
|
||||
if (cmp < 0)
|
||||
{
|
||||
if (node->left)
|
||||
return g_tree_node_lookup (node->left, compare, key);
|
||||
}
|
||||
else if (cmp > 0)
|
||||
{
|
||||
if (node->right)
|
||||
return g_tree_node_lookup (node->right, compare, key);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_count (GTreeNode *node)
|
||||
{
|
||||
gint count;
|
||||
|
||||
count = 1;
|
||||
if (node->left)
|
||||
count += g_tree_node_count (node->left);
|
||||
if (node->right)
|
||||
count += g_tree_node_count (node->right);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_pre_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data)
|
||||
{
|
||||
if ((*traverse_func) (node->key, node->value, data))
|
||||
return TRUE;
|
||||
if (node->left)
|
||||
{
|
||||
if (g_tree_node_pre_order (node->left, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
if (node->right)
|
||||
{
|
||||
if (g_tree_node_pre_order (node->right, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_in_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data)
|
||||
{
|
||||
if (node->left)
|
||||
{
|
||||
if (g_tree_node_in_order (node->left, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
if ((*traverse_func) (node->key, node->value, data))
|
||||
return TRUE;
|
||||
if (node->right)
|
||||
{
|
||||
if (g_tree_node_in_order (node->right, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_post_order (GTreeNode *node,
|
||||
GTraverseFunc traverse_func,
|
||||
gpointer data)
|
||||
{
|
||||
if (node->left)
|
||||
{
|
||||
if (g_tree_node_post_order (node->left, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
if (node->right)
|
||||
{
|
||||
if (g_tree_node_post_order (node->right, traverse_func, data))
|
||||
return TRUE;
|
||||
}
|
||||
if ((*traverse_func) (node->key, node->value, data))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gpointer
|
||||
g_tree_node_search (GTreeNode *node,
|
||||
GSearchFunc search_func,
|
||||
gpointer data)
|
||||
{
|
||||
gint dir;
|
||||
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
do {
|
||||
dir = (* search_func) (node->key, data);
|
||||
if (dir == 0)
|
||||
return node->value;
|
||||
|
||||
if (dir < 0)
|
||||
node = node->left;
|
||||
else if (dir > 0)
|
||||
node = node->right;
|
||||
} while (node && (dir != 0));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gint
|
||||
g_tree_node_height (GTreeNode *node)
|
||||
{
|
||||
gint left_height;
|
||||
gint right_height;
|
||||
|
||||
if (node)
|
||||
{
|
||||
left_height = 0;
|
||||
right_height = 0;
|
||||
|
||||
if (node->left)
|
||||
left_height = g_tree_node_height (node->left);
|
||||
|
||||
if (node->right)
|
||||
right_height = g_tree_node_height (node->right);
|
||||
|
||||
return MAX (left_height, right_height) + 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_rotate_left (GTreeNode *node)
|
||||
{
|
||||
GTreeNode *left;
|
||||
GTreeNode *right;
|
||||
gint a_bal;
|
||||
gint b_bal;
|
||||
|
||||
left = node->left;
|
||||
right = node->right;
|
||||
|
||||
node->right = right->left;
|
||||
right->left = node;
|
||||
|
||||
a_bal = node->balance;
|
||||
b_bal = right->balance;
|
||||
|
||||
if (b_bal <= 0)
|
||||
{
|
||||
if (a_bal >= 1)
|
||||
right->balance = b_bal - 1;
|
||||
else
|
||||
right->balance = a_bal + b_bal - 2;
|
||||
node->balance = a_bal - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (a_bal <= b_bal)
|
||||
right->balance = a_bal - 2;
|
||||
else
|
||||
right->balance = b_bal - 1;
|
||||
node->balance = a_bal - b_bal - 1;
|
||||
}
|
||||
|
||||
return right;
|
||||
}
|
||||
|
||||
static GTreeNode*
|
||||
g_tree_node_rotate_right (GTreeNode *node)
|
||||
{
|
||||
GTreeNode *left;
|
||||
GTreeNode *right;
|
||||
gint a_bal;
|
||||
gint b_bal;
|
||||
|
||||
left = node->left;
|
||||
right = node->right;
|
||||
|
||||
node->left = left->right;
|
||||
left->right = node;
|
||||
|
||||
a_bal = node->balance;
|
||||
b_bal = left->balance;
|
||||
|
||||
if (b_bal <= 0)
|
||||
{
|
||||
if (b_bal > a_bal)
|
||||
left->balance = b_bal + 1;
|
||||
else
|
||||
left->balance = a_bal + 2;
|
||||
node->balance = a_bal - b_bal + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (a_bal <= -1)
|
||||
left->balance = b_bal + 1;
|
||||
else
|
||||
left->balance = a_bal + b_bal + 2;
|
||||
node->balance = a_bal + 1;
|
||||
}
|
||||
|
||||
return left;
|
||||
}
|
||||
|
||||
static void
|
||||
g_tree_node_check (GTreeNode *node)
|
||||
{
|
||||
gint left_height;
|
||||
gint right_height;
|
||||
gint balance;
|
||||
|
||||
if (node)
|
||||
{
|
||||
left_height = 0;
|
||||
right_height = 0;
|
||||
|
||||
if (node->left)
|
||||
left_height = g_tree_node_height (node->left);
|
||||
if (node->right)
|
||||
right_height = g_tree_node_height (node->right);
|
||||
|
||||
balance = right_height - left_height;
|
||||
if (balance != node->balance)
|
||||
g_print ("g_tree_node_check: failed: %d ( %d )\n",
|
||||
balance, node->balance);
|
||||
|
||||
if (node->left)
|
||||
g_tree_node_check (node->left);
|
||||
if (node->right)
|
||||
g_tree_node_check (node->right);
|
||||
}
|
||||
}
|
858
gutils.c
Normal file
858
gutils.c
Normal file
@ -0,0 +1,858 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <locale.h>
|
||||
#include <ctype.h> /* For tolower() */
|
||||
#include "glib.h"
|
||||
|
||||
const guint glib_major_version = GLIB_MAJOR_VERSION;
|
||||
const guint glib_minor_version = GLIB_MINOR_VERSION;
|
||||
const guint glib_micro_version = GLIB_MICRO_VERSION;
|
||||
|
||||
extern char* g_vsprintf (const gchar *fmt, va_list *args, va_list *args2);
|
||||
|
||||
gchar*
|
||||
g_strdup (const gchar *str)
|
||||
{
|
||||
gchar *new_str;
|
||||
|
||||
new_str = NULL;
|
||||
if (str)
|
||||
{
|
||||
new_str = g_new (char, strlen (str) + 1);
|
||||
strcpy (new_str, str);
|
||||
}
|
||||
|
||||
return new_str;
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_strconcat (const gchar *string1, ...)
|
||||
{
|
||||
guint l;
|
||||
va_list args;
|
||||
gchar *s;
|
||||
gchar *concat;
|
||||
|
||||
g_return_val_if_fail (string1 != NULL, NULL);
|
||||
|
||||
l = 1 + strlen (string1);
|
||||
va_start (args, string1);
|
||||
s = va_arg (args, gchar*);
|
||||
while (s)
|
||||
{
|
||||
l += strlen (s);
|
||||
s = va_arg (args, gchar*);
|
||||
}
|
||||
va_end (args);
|
||||
|
||||
concat = g_new (gchar, l);
|
||||
concat[0] = 0;
|
||||
|
||||
strcat (concat, string1);
|
||||
va_start (args, string1);
|
||||
s = va_arg (args, gchar*);
|
||||
while (s)
|
||||
{
|
||||
strcat (concat, s);
|
||||
s = va_arg (args, gchar*);
|
||||
}
|
||||
va_end (args);
|
||||
|
||||
return concat;
|
||||
}
|
||||
|
||||
gdouble
|
||||
g_strtod (const gchar *nptr,
|
||||
gchar **endptr)
|
||||
{
|
||||
gchar *fail_pos_1;
|
||||
gchar *fail_pos_2;
|
||||
gdouble val_1;
|
||||
gdouble val_2 = 0;
|
||||
|
||||
g_return_val_if_fail (nptr != NULL, 0);
|
||||
|
||||
fail_pos_1 = NULL;
|
||||
fail_pos_2 = NULL;
|
||||
|
||||
val_1 = strtod (nptr, &fail_pos_1);
|
||||
|
||||
if (fail_pos_1 && fail_pos_1[0] != 0)
|
||||
{
|
||||
gchar *old_locale;
|
||||
|
||||
old_locale = setlocale (LC_NUMERIC, "C");
|
||||
val_2 = strtod (nptr, &fail_pos_2);
|
||||
setlocale (LC_NUMERIC, old_locale);
|
||||
}
|
||||
|
||||
if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2)
|
||||
{
|
||||
if (endptr)
|
||||
*endptr = fail_pos_1;
|
||||
return val_1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (endptr)
|
||||
*endptr = fail_pos_2;
|
||||
return val_2;
|
||||
}
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_strerror (gint errnum)
|
||||
{
|
||||
static char msg[64];
|
||||
|
||||
#ifdef HAVE_STRERROR
|
||||
return strerror (errnum);
|
||||
#elif NO_SYS_ERRLIST
|
||||
switch (errnum)
|
||||
{
|
||||
#ifdef E2BIG
|
||||
case E2BIG: return "argument list too long";
|
||||
#endif
|
||||
#ifdef EACCES
|
||||
case EACCES: return "permission denied";
|
||||
#endif
|
||||
#ifdef EADDRINUSE
|
||||
case EADDRINUSE: return "address already in use";
|
||||
#endif
|
||||
#ifdef EADDRNOTAVAIL
|
||||
case EADDRNOTAVAIL: return "can't assign requested address";
|
||||
#endif
|
||||
#ifdef EADV
|
||||
case EADV: return "advertise error";
|
||||
#endif
|
||||
#ifdef EAFNOSUPPORT
|
||||
case EAFNOSUPPORT: return "address family not supported by protocol family";
|
||||
#endif
|
||||
#ifdef EAGAIN
|
||||
case EAGAIN: return "try again";
|
||||
#endif
|
||||
#ifdef EALIGN
|
||||
case EALIGN: return "EALIGN";
|
||||
#endif
|
||||
#ifdef EALREADY
|
||||
case EALREADY: return "operation already in progress";
|
||||
#endif
|
||||
#ifdef EBADE
|
||||
case EBADE: return "bad exchange descriptor";
|
||||
#endif
|
||||
#ifdef EBADF
|
||||
case EBADF: return "bad file number";
|
||||
#endif
|
||||
#ifdef EBADFD
|
||||
case EBADFD: return "file descriptor in bad state";
|
||||
#endif
|
||||
#ifdef EBADMSG
|
||||
case EBADMSG: return "not a data message";
|
||||
#endif
|
||||
#ifdef EBADR
|
||||
case EBADR: return "bad request descriptor";
|
||||
#endif
|
||||
#ifdef EBADRPC
|
||||
case EBADRPC: return "RPC structure is bad";
|
||||
#endif
|
||||
#ifdef EBADRQC
|
||||
case EBADRQC: return "bad request code";
|
||||
#endif
|
||||
#ifdef EBADSLT
|
||||
case EBADSLT: return "invalid slot";
|
||||
#endif
|
||||
#ifdef EBFONT
|
||||
case EBFONT: return "bad font file format";
|
||||
#endif
|
||||
#ifdef EBUSY
|
||||
case EBUSY: return "mount device busy";
|
||||
#endif
|
||||
#ifdef ECHILD
|
||||
case ECHILD: return "no children";
|
||||
#endif
|
||||
#ifdef ECHRNG
|
||||
case ECHRNG: return "channel number out of range";
|
||||
#endif
|
||||
#ifdef ECOMM
|
||||
case ECOMM: return "communication error on send";
|
||||
#endif
|
||||
#ifdef ECONNABORTED
|
||||
case ECONNABORTED: return "software caused connection abort";
|
||||
#endif
|
||||
#ifdef ECONNREFUSED
|
||||
case ECONNREFUSED: return "connection refused";
|
||||
#endif
|
||||
#ifdef ECONNRESET
|
||||
case ECONNRESET: return "connection reset by peer";
|
||||
#endif
|
||||
#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK))
|
||||
case EDEADLK: return "resource deadlock avoided";
|
||||
#endif
|
||||
#ifdef EDEADLOCK
|
||||
case EDEADLOCK: return "resource deadlock avoided";
|
||||
#endif
|
||||
#ifdef EDESTADDRREQ
|
||||
case EDESTADDRREQ: return "destination address required";
|
||||
#endif
|
||||
#ifdef EDIRTY
|
||||
case EDIRTY: return "mounting a dirty fs w/o force";
|
||||
#endif
|
||||
#ifdef EDOM
|
||||
case EDOM: return "math argument out of range";
|
||||
#endif
|
||||
#ifdef EDOTDOT
|
||||
case EDOTDOT: return "cross mount point";
|
||||
#endif
|
||||
#ifdef EDQUOT
|
||||
case EDQUOT: return "disk quota exceeded";
|
||||
#endif
|
||||
#ifdef EDUPPKG
|
||||
case EDUPPKG: return "duplicate package name";
|
||||
#endif
|
||||
#ifdef EEXIST
|
||||
case EEXIST: return "file already exists";
|
||||
#endif
|
||||
#ifdef EFAULT
|
||||
case EFAULT: return "bad address in system call argument";
|
||||
#endif
|
||||
#ifdef EFBIG
|
||||
case EFBIG: return "file too large";
|
||||
#endif
|
||||
#ifdef EHOSTDOWN
|
||||
case EHOSTDOWN: return "host is down";
|
||||
#endif
|
||||
#ifdef EHOSTUNREACH
|
||||
case EHOSTUNREACH: return "host is unreachable";
|
||||
#endif
|
||||
#ifdef EIDRM
|
||||
case EIDRM: return "identifier removed";
|
||||
#endif
|
||||
#ifdef EINIT
|
||||
case EINIT: return "initialization error";
|
||||
#endif
|
||||
#ifdef EINPROGRESS
|
||||
case EINPROGRESS: return "operation now in progress";
|
||||
#endif
|
||||
#ifdef EINTR
|
||||
case EINTR: return "interrupted system call";
|
||||
#endif
|
||||
#ifdef EINVAL
|
||||
case EINVAL: return "invalid argument";
|
||||
#endif
|
||||
#ifdef EIO
|
||||
case EIO: return "I/O error";
|
||||
#endif
|
||||
#ifdef EISCONN
|
||||
case EISCONN: return "socket is already connected";
|
||||
#endif
|
||||
#ifdef EISDIR
|
||||
case EISDIR: return "illegal operation on a directory";
|
||||
#endif
|
||||
#ifdef EISNAME
|
||||
case EISNAM: return "is a name file";
|
||||
#endif
|
||||
#ifdef ELBIN
|
||||
case ELBIN: return "ELBIN";
|
||||
#endif
|
||||
#ifdef EL2HLT
|
||||
case EL2HLT: return "level 2 halted";
|
||||
#endif
|
||||
#ifdef EL2NSYNC
|
||||
case EL2NSYNC: return "level 2 not synchronized";
|
||||
#endif
|
||||
#ifdef EL3HLT
|
||||
case EL3HLT: return "level 3 halted";
|
||||
#endif
|
||||
#ifdef EL3RST
|
||||
case EL3RST: return "level 3 reset";
|
||||
#endif
|
||||
#ifdef ELIBACC
|
||||
case ELIBACC: return "can not access a needed shared library";
|
||||
#endif
|
||||
#ifdef ELIBBAD
|
||||
case ELIBBAD: return "accessing a corrupted shared library";
|
||||
#endif
|
||||
#ifdef ELIBEXEC
|
||||
case ELIBEXEC: return "can not exec a shared library directly";
|
||||
#endif
|
||||
#ifdef ELIBMAX
|
||||
case ELIBMAX: return "attempting to link in more shared libraries than system limit";
|
||||
#endif
|
||||
#ifdef ELIBSCN
|
||||
case ELIBSCN: return ".lib section in a.out corrupted";
|
||||
#endif
|
||||
#ifdef ELNRNG
|
||||
case ELNRNG: return "link number out of range";
|
||||
#endif
|
||||
#ifdef ELOOP
|
||||
case ELOOP: return "too many levels of symbolic links";
|
||||
#endif
|
||||
#ifdef EMFILE
|
||||
case EMFILE: return "too many open files";
|
||||
#endif
|
||||
#ifdef EMLINK
|
||||
case EMLINK: return "too many links";
|
||||
#endif
|
||||
#ifdef EMSGSIZE
|
||||
case EMSGSIZE: return "message too long";
|
||||
#endif
|
||||
#ifdef EMULTIHOP
|
||||
case EMULTIHOP: return "multihop attempted";
|
||||
#endif
|
||||
#ifdef ENAMETOOLONG
|
||||
case ENAMETOOLONG: return "file name too long";
|
||||
#endif
|
||||
#ifdef ENAVAIL
|
||||
case ENAVAIL: return "not available";
|
||||
#endif
|
||||
#ifdef ENET
|
||||
case ENET: return "ENET";
|
||||
#endif
|
||||
#ifdef ENETDOWN
|
||||
case ENETDOWN: return "network is down";
|
||||
#endif
|
||||
#ifdef ENETRESET
|
||||
case ENETRESET: return "network dropped connection on reset";
|
||||
#endif
|
||||
#ifdef ENETUNREACH
|
||||
case ENETUNREACH: return "network is unreachable";
|
||||
#endif
|
||||
#ifdef ENFILE
|
||||
case ENFILE: return "file table overflow";
|
||||
#endif
|
||||
#ifdef ENOANO
|
||||
case ENOANO: return "anode table overflow";
|
||||
#endif
|
||||
#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
|
||||
case ENOBUFS: return "no buffer space available";
|
||||
#endif
|
||||
#ifdef ENOCSI
|
||||
case ENOCSI: return "no CSI structure available";
|
||||
#endif
|
||||
#ifdef ENODATA
|
||||
case ENODATA: return "no data available";
|
||||
#endif
|
||||
#ifdef ENODEV
|
||||
case ENODEV: return "no such device";
|
||||
#endif
|
||||
#ifdef ENOENT
|
||||
case ENOENT: return "no such file or directory";
|
||||
#endif
|
||||
#ifdef ENOEXEC
|
||||
case ENOEXEC: return "exec format error";
|
||||
#endif
|
||||
#ifdef ENOLCK
|
||||
case ENOLCK: return "no locks available";
|
||||
#endif
|
||||
#ifdef ENOLINK
|
||||
case ENOLINK: return "link has be severed";
|
||||
#endif
|
||||
#ifdef ENOMEM
|
||||
case ENOMEM: return "not enough memory";
|
||||
#endif
|
||||
#ifdef ENOMSG
|
||||
case ENOMSG: return "no message of desired type";
|
||||
#endif
|
||||
#ifdef ENONET
|
||||
case ENONET: return "machine is not on the network";
|
||||
#endif
|
||||
#ifdef ENOPKG
|
||||
case ENOPKG: return "package not installed";
|
||||
#endif
|
||||
#ifdef ENOPROTOOPT
|
||||
case ENOPROTOOPT: return "bad proocol option";
|
||||
#endif
|
||||
#ifdef ENOSPC
|
||||
case ENOSPC: return "no space left on device";
|
||||
#endif
|
||||
#ifdef ENOSR
|
||||
case ENOSR: return "out of stream resources";
|
||||
#endif
|
||||
#ifdef ENOSTR
|
||||
case ENOSTR: return "not a stream device";
|
||||
#endif
|
||||
#ifdef ENOSYM
|
||||
case ENOSYM: return "unresolved symbol name";
|
||||
#endif
|
||||
#ifdef ENOSYS
|
||||
case ENOSYS: return "function not implemented";
|
||||
#endif
|
||||
#ifdef ENOTBLK
|
||||
case ENOTBLK: return "block device required";
|
||||
#endif
|
||||
#ifdef ENOTCONN
|
||||
case ENOTCONN: return "socket is not connected";
|
||||
#endif
|
||||
#ifdef ENOTDIR
|
||||
case ENOTDIR: return "not a directory";
|
||||
#endif
|
||||
#ifdef ENOTEMPTY
|
||||
case ENOTEMPTY: return "directory not empty";
|
||||
#endif
|
||||
#ifdef ENOTNAM
|
||||
case ENOTNAM: return "not a name file";
|
||||
#endif
|
||||
#ifdef ENOTSOCK
|
||||
case ENOTSOCK: return "socket operation on non-socket";
|
||||
#endif
|
||||
#ifdef ENOTTY
|
||||
case ENOTTY: return "inappropriate device for ioctl";
|
||||
#endif
|
||||
#ifdef ENOTUNIQ
|
||||
case ENOTUNIQ: return "name not unique on network";
|
||||
#endif
|
||||
#ifdef ENXIO
|
||||
case ENXIO: return "no such device or address";
|
||||
#endif
|
||||
#ifdef EOPNOTSUPP
|
||||
case EOPNOTSUPP: return "operation not supported on socket";
|
||||
#endif
|
||||
#ifdef EPERM
|
||||
case EPERM: return "not owner";
|
||||
#endif
|
||||
#ifdef EPFNOSUPPORT
|
||||
case EPFNOSUPPORT: return "protocol family not supported";
|
||||
#endif
|
||||
#ifdef EPIPE
|
||||
case EPIPE: return "broken pipe";
|
||||
#endif
|
||||
#ifdef EPROCLIM
|
||||
case EPROCLIM: return "too many processes";
|
||||
#endif
|
||||
#ifdef EPROCUNAVAIL
|
||||
case EPROCUNAVAIL: return "bad procedure for program";
|
||||
#endif
|
||||
#ifdef EPROGMISMATCH
|
||||
case EPROGMISMATCH: return "program version wrong";
|
||||
#endif
|
||||
#ifdef EPROGUNAVAIL
|
||||
case EPROGUNAVAIL: return "RPC program not available";
|
||||
#endif
|
||||
#ifdef EPROTO
|
||||
case EPROTO: return "protocol error";
|
||||
#endif
|
||||
#ifdef EPROTONOSUPPORT
|
||||
case EPROTONOSUPPORT: return "protocol not suppored";
|
||||
#endif
|
||||
#ifdef EPROTOTYPE
|
||||
case EPROTOTYPE: return "protocol wrong type for socket";
|
||||
#endif
|
||||
#ifdef ERANGE
|
||||
case ERANGE: return "math result unrepresentable";
|
||||
#endif
|
||||
#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
|
||||
case EREFUSED: return "EREFUSED";
|
||||
#endif
|
||||
#ifdef EREMCHG
|
||||
case EREMCHG: return "remote address changed";
|
||||
#endif
|
||||
#ifdef EREMDEV
|
||||
case EREMDEV: return "remote device";
|
||||
#endif
|
||||
#ifdef EREMOTE
|
||||
case EREMOTE: return "pathname hit remote file system";
|
||||
#endif
|
||||
#ifdef EREMOTEIO
|
||||
case EREMOTEIO: return "remote i/o error";
|
||||
#endif
|
||||
#ifdef EREMOTERELEASE
|
||||
case EREMOTERELEASE: return "EREMOTERELEASE";
|
||||
#endif
|
||||
#ifdef EROFS
|
||||
case EROFS: return "read-only file system";
|
||||
#endif
|
||||
#ifdef ERPCMISMATCH
|
||||
case ERPCMISMATCH: return "RPC version is wrong";
|
||||
#endif
|
||||
#ifdef ERREMOTE
|
||||
case ERREMOTE: return "object is remote";
|
||||
#endif
|
||||
#ifdef ESHUTDOWN
|
||||
case ESHUTDOWN: return "can't send afer socket shutdown";
|
||||
#endif
|
||||
#ifdef ESOCKTNOSUPPORT
|
||||
case ESOCKTNOSUPPORT: return "socket type not supported";
|
||||
#endif
|
||||
#ifdef ESPIPE
|
||||
case ESPIPE: return "invalid seek";
|
||||
#endif
|
||||
#ifdef ESRCH
|
||||
case ESRCH: return "no such process";
|
||||
#endif
|
||||
#ifdef ESRMNT
|
||||
case ESRMNT: return "srmount error";
|
||||
#endif
|
||||
#ifdef ESTALE
|
||||
case ESTALE: return "stale remote file handle";
|
||||
#endif
|
||||
#ifdef ESUCCESS
|
||||
case ESUCCESS: return "Error 0";
|
||||
#endif
|
||||
#ifdef ETIME
|
||||
case ETIME: return "timer expired";
|
||||
#endif
|
||||
#ifdef ETIMEDOUT
|
||||
case ETIMEDOUT: return "connection timed out";
|
||||
#endif
|
||||
#ifdef ETOOMANYREFS
|
||||
case ETOOMANYREFS: return "too many references: can't splice";
|
||||
#endif
|
||||
#ifdef ETXTBSY
|
||||
case ETXTBSY: return "text file or pseudo-device busy";
|
||||
#endif
|
||||
#ifdef EUCLEAN
|
||||
case EUCLEAN: return "structure needs cleaning";
|
||||
#endif
|
||||
#ifdef EUNATCH
|
||||
case EUNATCH: return "protocol driver not attached";
|
||||
#endif
|
||||
#ifdef EUSERS
|
||||
case EUSERS: return "too many users";
|
||||
#endif
|
||||
#ifdef EVERSION
|
||||
case EVERSION: return "version mismatch";
|
||||
#endif
|
||||
#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
|
||||
case EWOULDBLOCK: return "operation would block";
|
||||
#endif
|
||||
#ifdef EXDEV
|
||||
case EXDEV: return "cross-domain link";
|
||||
#endif
|
||||
#ifdef EXFULL
|
||||
case EXFULL: return "message tables full";
|
||||
#endif
|
||||
}
|
||||
#else /* NO_SYS_ERRLIST */
|
||||
extern int sys_nerr;
|
||||
extern char *sys_errlist[];
|
||||
|
||||
if ((errnum > 0) && (errnum <= sys_nerr))
|
||||
return sys_errlist [errnum];
|
||||
#endif /* NO_SYS_ERRLIST */
|
||||
|
||||
sprintf (msg, "unknown error (%d)", errnum);
|
||||
return msg;
|
||||
}
|
||||
|
||||
gchar*
|
||||
g_strsignal (gint signum)
|
||||
{
|
||||
static char msg[64];
|
||||
|
||||
#ifdef HAVE_STRSIGNAL
|
||||
extern char *strsignal (int sig);
|
||||
return strsignal (signum);
|
||||
#elif NO_SYS_SIGLIST
|
||||
switch (signum)
|
||||
{
|
||||
#ifdef SIGHUP
|
||||
case SIGHUP: return "Hangup";
|
||||
#endif
|
||||
#ifdef SIGINT
|
||||
case SIGINT: return "Interrupt";
|
||||
#endif
|
||||
#ifdef SIGQUIT
|
||||
case SIGQUIT: return "Quit";
|
||||
#endif
|
||||
#ifdef SIGILL
|
||||
case SIGILL: return "Illegal instruction";
|
||||
#endif
|
||||
#ifdef SIGTRAP
|
||||
case SIGTRAP: return "Trace/breakpoint trap";
|
||||
#endif
|
||||
#ifdef SIGABRT
|
||||
case SIGABRT: return "IOT trap/Abort";
|
||||
#endif
|
||||
#ifdef SIGBUS
|
||||
case SIGBUS: return "Bus error";
|
||||
#endif
|
||||
#ifdef SIGFPE
|
||||
case SIGFPE: return "Floating point exception";
|
||||
#endif
|
||||
#ifdef SIGKILL
|
||||
case SIGKILL: return "Killed";
|
||||
#endif
|
||||
#ifdef SIGUSR1
|
||||
case SIGUSR1: return "User defined signal 1";
|
||||
#endif
|
||||
#ifdef SIGSEGV
|
||||
case SIGSEGV: return "Segmentation fault";
|
||||
#endif
|
||||
#ifdef SIGUSR2
|
||||
case SIGUSR2: return "User defined signal 2";
|
||||
#endif
|
||||
#ifdef SIGPIPE
|
||||
case SIGPIPE: return "Broken pipe";
|
||||
#endif
|
||||
#ifdef SIGALRM
|
||||
case SIGALRM: return "Alarm clock";
|
||||
#endif
|
||||
#ifdef SIGTERM
|
||||
case SIGTERM: return "Terminated";
|
||||
#endif
|
||||
#ifdef SIGSTKFLT
|
||||
case SIGSTKFLT: return "Stack fault";
|
||||
#endif
|
||||
#ifdef SIGCHLD
|
||||
case SIGCHLD: return "Child exited";
|
||||
#endif
|
||||
#ifdef SIGCONT
|
||||
case SIGCONT: return "Continued";
|
||||
#endif
|
||||
#ifdef SIGSTOP
|
||||
case SIGSTOP: return "Stopped (signal)";
|
||||
#endif
|
||||
#ifdef SIGTSTP
|
||||
case SIGTSTP: return "Stopped";
|
||||
#endif
|
||||
#ifdef SIGTTIN
|
||||
case SIGTTIN: return "Stopped (tty input)";
|
||||
#endif
|
||||
#ifdef SIGTTOU
|
||||
case SIGTTOU: return "Stopped (tty output)";
|
||||
#endif
|
||||
#ifdef SIGURG
|
||||
case SIGURG: return "Urgent condition";
|
||||
#endif
|
||||
#ifdef SIGXCPU
|
||||
case SIGXCPU: return "CPU time limit exceeded";
|
||||
#endif
|
||||
#ifdef SIGXFSZ
|
||||
case SIGXFSZ: return "File size limit exceeded";
|
||||
#endif
|
||||
#ifdef SIGVTALRM
|
||||
case SIGVTALRM: return "Virtual time alarm";
|
||||
#endif
|
||||
#ifdef SIGPROF
|
||||
case SIGPROF: return "Profile signal";
|
||||
#endif
|
||||
#ifdef SIGWINCH
|
||||
case SIGWINCH: return "Window size changed";
|
||||
#endif
|
||||
#ifdef SIGIO
|
||||
case SIGIO: return "Possible I/O";
|
||||
#endif
|
||||
#ifdef SIGPWR
|
||||
case SIGPWR: return "Power failure";
|
||||
#endif
|
||||
#ifdef SIGUNUSED
|
||||
case SIGUNUSED: return "Unused signal";
|
||||
#endif
|
||||
}
|
||||
#else /* NO_SYS_SIGLIST */
|
||||
extern char *sys_siglist[];
|
||||
return sys_siglist [signum];
|
||||
#endif /* NO_SYS_SIGLIST */
|
||||
|
||||
sprintf (msg, "unknown signal (%d)", signum);
|
||||
return msg;
|
||||
}
|
||||
|
||||
gint
|
||||
g_snprintf (gchar *str,
|
||||
gulong n,
|
||||
gchar const *fmt,
|
||||
...)
|
||||
{
|
||||
#ifdef HAVE_VSNPRINTF
|
||||
va_list args;
|
||||
gint retval;
|
||||
|
||||
va_start (args, fmt);
|
||||
retval = vsnprintf (str, n, fmt, args);
|
||||
va_end (args);
|
||||
|
||||
return retval;
|
||||
|
||||
#else
|
||||
gchar *printed;
|
||||
va_list args, args2;
|
||||
|
||||
va_start (args, fmt);
|
||||
va_start (args2, fmt);
|
||||
|
||||
printed = g_vsprintf (fmt, &args, &args2);
|
||||
strncpy (str, printed, n);
|
||||
str[n-1] = '\0';
|
||||
|
||||
va_end (args2);
|
||||
va_end (args);
|
||||
|
||||
return strlen (str);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
g_strdown (gchar *string)
|
||||
{
|
||||
register gchar *s;
|
||||
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
s = string;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
*s = tolower (*s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_strup (gchar *string)
|
||||
{
|
||||
register gchar *s;
|
||||
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
s = string;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
*s = toupper (*s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_strreverse (gchar *string)
|
||||
{
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
if (*string)
|
||||
{
|
||||
register gchar *h, *t;
|
||||
|
||||
h = string;
|
||||
t = string + strlen (string) - 1;
|
||||
|
||||
while (h < t)
|
||||
{
|
||||
register gchar c;
|
||||
|
||||
c = *h;
|
||||
*h = *t;
|
||||
h++;
|
||||
*t = c;
|
||||
t--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gint
|
||||
g_strcasecmp (const gchar *s1,
|
||||
const gchar *s2)
|
||||
{
|
||||
#ifdef HAVE_STRCASECMP
|
||||
return strcasecmp (s1, s2);
|
||||
#else
|
||||
gint c1, c2;
|
||||
|
||||
while (*s1 && *s2)
|
||||
{
|
||||
/* According to A. Cox, some platforms have islower's that
|
||||
* don't work right on non-uppercase
|
||||
*/
|
||||
c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
|
||||
c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
|
||||
if (c1 != c2)
|
||||
return (c1 - c2);
|
||||
s1++; s2++;
|
||||
}
|
||||
|
||||
return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
g_strdelimit (gchar *string,
|
||||
const gchar *delimiters,
|
||||
gchar new_delim)
|
||||
{
|
||||
register gchar *c;
|
||||
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
if (!delimiters)
|
||||
delimiters = G_STR_DELIMITERS;
|
||||
|
||||
for (c = string; *c; c++)
|
||||
{
|
||||
if (strchr (delimiters, *c))
|
||||
*c = new_delim;
|
||||
}
|
||||
}
|
||||
|
||||
guint
|
||||
g_parse_debug_string (const gchar *string,
|
||||
GDebugKey *keys,
|
||||
guint nkeys)
|
||||
{
|
||||
guint i;
|
||||
guint result = 0;
|
||||
|
||||
g_return_val_if_fail (string != NULL, 0);
|
||||
|
||||
if (!g_strcasecmp (string, "all"))
|
||||
{
|
||||
for (i=0; i<nkeys; i++)
|
||||
result |= keys[i].value;
|
||||
}
|
||||
else
|
||||
{
|
||||
gchar *str = g_strdup (string);
|
||||
gchar *p = str;
|
||||
gchar *q;
|
||||
gboolean done = FALSE;
|
||||
|
||||
while (*p && !done)
|
||||
{
|
||||
q = strchr (p, ':');
|
||||
if (!q)
|
||||
{
|
||||
q = p + strlen(p);
|
||||
done = TRUE;
|
||||
}
|
||||
|
||||
*q = 0;
|
||||
|
||||
for (i=0; i<nkeys; i++)
|
||||
if (!g_strcasecmp(keys[i].key, p))
|
||||
result |= keys[i].value;
|
||||
|
||||
p = q+1;
|
||||
}
|
||||
|
||||
g_free (str);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
guint
|
||||
g_direct_hash(gconstpointer key)
|
||||
{
|
||||
return GPOINTER_TO_UINT (key);
|
||||
}
|
||||
|
238
install-sh
Executable file
238
install-sh
Executable file
@ -0,0 +1,238 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# install - install a program, script, or datafile
|
||||
# This comes from X11R5.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# `make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch.
|
||||
#
|
||||
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit="${DOITPROG-}"
|
||||
|
||||
|
||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||
|
||||
mvprog="${MVPROG-mv}"
|
||||
cpprog="${CPPROG-cp}"
|
||||
chmodprog="${CHMODPROG-chmod}"
|
||||
chownprog="${CHOWNPROG-chown}"
|
||||
chgrpprog="${CHGRPPROG-chgrp}"
|
||||
stripprog="${STRIPPROG-strip}"
|
||||
rmprog="${RMPROG-rm}"
|
||||
mkdirprog="${MKDIRPROG-mkdir}"
|
||||
|
||||
tranformbasename=""
|
||||
transform_arg=""
|
||||
instcmd="$mvprog"
|
||||
chmodcmd="$chmodprog 0755"
|
||||
chowncmd=""
|
||||
chgrpcmd=""
|
||||
stripcmd=""
|
||||
rmcmd="$rmprog -f"
|
||||
mvcmd="$mvprog"
|
||||
src=""
|
||||
dst=""
|
||||
dir_arg=""
|
||||
|
||||
while [ x"$1" != x ]; do
|
||||
case $1 in
|
||||
-c) instcmd="$cpprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-d) dir_arg=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-m) chmodcmd="$chmodprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-s) stripcmd="$stripprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
*) if [ x"$src" = x ]
|
||||
then
|
||||
src=$1
|
||||
else
|
||||
# this colon is to work around a 386BSD /bin/sh bug
|
||||
:
|
||||
dst=$1
|
||||
fi
|
||||
shift
|
||||
continue;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ x"$src" = x ]
|
||||
then
|
||||
echo "install: no input file specified"
|
||||
exit 1
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]; then
|
||||
dst=$src
|
||||
src=""
|
||||
|
||||
if [ -d $dst ]; then
|
||||
instcmd=:
|
||||
else
|
||||
instcmd=mkdir
|
||||
fi
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
|
||||
if [ -f $src -o -d $src ]
|
||||
then
|
||||
true
|
||||
else
|
||||
echo "install: $src does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ x"$dst" = x ]
|
||||
then
|
||||
echo "install: no destination specified"
|
||||
exit 1
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
# If destination is a directory, append the input filename; if your system
|
||||
# does not like double slashes in filenames, you may need to add some logic
|
||||
|
||||
if [ -d $dst ]
|
||||
then
|
||||
dst="$dst"/`basename $src`
|
||||
else
|
||||
true
|
||||
fi
|
||||
fi
|
||||
|
||||
## this sed command emulates the dirname command
|
||||
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
||||
|
||||
# Make sure that the destination directory exists.
|
||||
# this part is taken from Noah Friedman's mkinstalldirs script
|
||||
|
||||
# Skip lots of stat calls in the usual case.
|
||||
if [ ! -d "$dstdir" ]; then
|
||||
defaultIFS='
|
||||
'
|
||||
IFS="${IFS-${defaultIFS}}"
|
||||
|
||||
oIFS="${IFS}"
|
||||
# Some sh's can't handle IFS=/ for some reason.
|
||||
IFS='%'
|
||||
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||
IFS="${oIFS}"
|
||||
|
||||
pathcomp=''
|
||||
|
||||
while [ $# -ne 0 ] ; do
|
||||
pathcomp="${pathcomp}${1}"
|
||||
shift
|
||||
|
||||
if [ ! -d "${pathcomp}" ] ;
|
||||
then
|
||||
$mkdirprog "${pathcomp}"
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
pathcomp="${pathcomp}/"
|
||||
done
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]
|
||||
then
|
||||
$doit $instcmd $dst &&
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
|
||||
else
|
||||
|
||||
# If we're going to rename the final executable, determine the name now.
|
||||
|
||||
if [ x"$transformarg" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
dstfile=`basename $dst $transformbasename |
|
||||
sed $transformarg`$transformbasename
|
||||
fi
|
||||
|
||||
# don't allow the sed command to completely eliminate the filename
|
||||
|
||||
if [ x"$dstfile" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
# Make a temp file name in the proper directory.
|
||||
|
||||
dsttmp=$dstdir/#inst.$$#
|
||||
|
||||
# Move or copy the file name to the temp name
|
||||
|
||||
$doit $instcmd $src $dsttmp &&
|
||||
|
||||
trap "rm -f ${dsttmp}" 0 &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits
|
||||
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
|
||||
$doit $rmcmd -f $dstdir/$dstfile &&
|
||||
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
||||
|
||||
fi &&
|
||||
|
||||
|
||||
exit 0
|
134
missing
Executable file
134
missing
Executable file
@ -0,0 +1,134 @@
|
||||
#! /bin/sh
|
||||
# Common stub for a few missing GNU programs while installing.
|
||||
# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||
# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
# 02111-1307, USA.
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo 1>&2 "Try \`$0 --help' for more information"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
|
||||
-h|--h|--he|--hel|--help)
|
||||
echo "\
|
||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||
|
||||
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
||||
error status if there is no known handling for PROGRAM.
|
||||
|
||||
Options:
|
||||
-h, --help display this help and exit
|
||||
-v, --version output version information and exit
|
||||
|
||||
Supported PROGRAM values:
|
||||
aclocal touch file \`aclocal.m4'
|
||||
autoconf touch file \`configure'
|
||||
autoheader touch file \`config.h.in'
|
||||
automake touch all \`Makefile.in' files
|
||||
bison touch file \`y.tab.c'
|
||||
makeinfo touch the output file
|
||||
yacc touch file \`y.tab.c'"
|
||||
;;
|
||||
|
||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||
echo "missing - GNU libit 0.0"
|
||||
;;
|
||||
|
||||
-*)
|
||||
echo 1>&2 "$0: Unknown \`$1' option"
|
||||
echo 1>&2 "Try \`$0 --help' for more information"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
aclocal)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||
you modified \`acinclude.m4' or \`configure.in'. You might want
|
||||
to install the \`Automake' and \`Perl' packages. Grab them from
|
||||
any GNU archive site."
|
||||
touch aclocal.m4
|
||||
;;
|
||||
|
||||
autoconf)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||
you modified \`configure.in'. You might want to install the
|
||||
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
||||
archive site."
|
||||
touch configure
|
||||
;;
|
||||
|
||||
autoheader)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||
you modified \`acconfig.h' or \`configure.in'. You might want
|
||||
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
||||
from any GNU archive site."
|
||||
touch config.h.in
|
||||
;;
|
||||
|
||||
automake)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||
you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
|
||||
You might want to install the \`Automake' and \`Perl' packages.
|
||||
Grab them from any GNU archive site."
|
||||
find . -type f -name Makefile.am -print \
|
||||
| sed 's/^\(.*\).am$/touch \1.in/' \
|
||||
| sh
|
||||
;;
|
||||
|
||||
bison|yacc)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||
your modified any \`.y' file. For being effective, your
|
||||
modifications might require the \`Bison' package. Grab it from
|
||||
any GNU archive site."
|
||||
touch y.tab.c
|
||||
;;
|
||||
|
||||
makeinfo)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is missing on your system. It should be needed only if
|
||||
you modified a \`.texi' or \`.texinfo' file, or any other file
|
||||
indirectly affecting the aspect of the manual. The spurious
|
||||
call might also be the consequence of using a buggy \`make' (AIX,
|
||||
DU, IRIX). You might want to install the \`Texinfo' package or
|
||||
the \`GNU make' package. Grab either from any GNU archive site."
|
||||
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
||||
if test -z "$file"; then
|
||||
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
|
||||
fi
|
||||
touch $file
|
||||
;;
|
||||
|
||||
*)
|
||||
echo 1>&2 "\
|
||||
WARNING: \`$1' is needed, and you do not seem to have it handy on your
|
||||
system. You might have modified some files without having the
|
||||
proper tools for further handling them. Check the \`README' file,
|
||||
it often tells you about the needed prerequirements for installing
|
||||
this package. You may also peek at any GNU archive site, in case
|
||||
some other package would contain this missing \`$1' program."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
36
mkinstalldirs
Executable file
36
mkinstalldirs
Executable file
@ -0,0 +1,36 @@
|
||||
#! /bin/sh
|
||||
# mkinstalldirs --- make directory hierarchy
|
||||
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
|
||||
# Created: 1993-05-16
|
||||
# Last modified: 1994-03-25
|
||||
# Public domain
|
||||
|
||||
errstatus=0
|
||||
|
||||
for file in ${1+"$@"} ; do
|
||||
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
|
||||
shift
|
||||
|
||||
pathcomp=
|
||||
for d in ${1+"$@"} ; do
|
||||
pathcomp="$pathcomp$d"
|
||||
case "$pathcomp" in
|
||||
-* ) pathcomp=./$pathcomp ;;
|
||||
esac
|
||||
|
||||
if test ! -d "$pathcomp"; then
|
||||
echo "mkdir $pathcomp" 1>&2
|
||||
mkdir "$pathcomp" > /dev/null 2>&1 || lasterr=$?
|
||||
fi
|
||||
|
||||
if test ! -d "$pathcomp"; then
|
||||
errstatus=$lasterr
|
||||
fi
|
||||
|
||||
pathcomp="$pathcomp/"
|
||||
done
|
||||
done
|
||||
|
||||
exit $errstatus
|
||||
|
||||
# mkinstalldirs ends here
|
1
stamp-h.in
Normal file
1
stamp-h.in
Normal file
@ -0,0 +1 @@
|
||||
timestamp
|
401
testglib.c
Normal file
401
testglib.c
Normal file
@ -0,0 +1,401 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "glib.h"
|
||||
|
||||
int array[10000];
|
||||
|
||||
void
|
||||
my_hash_callback (gpointer key,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
{
|
||||
int *d = value;
|
||||
*d = 1;
|
||||
}
|
||||
|
||||
guint
|
||||
my_hash (gconstpointer key)
|
||||
{
|
||||
return (guint) *((const gint*) key);
|
||||
}
|
||||
|
||||
gint
|
||||
my_hash_compare (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
return *((const gint*) a) == *((const gint*) b);
|
||||
}
|
||||
|
||||
gint
|
||||
my_list_compare_one (gconstpointer a, gconstpointer b)
|
||||
{
|
||||
gint one = *((const gint*)a);
|
||||
gint two = *((const gint*)b);
|
||||
return one-two;
|
||||
}
|
||||
|
||||
gint
|
||||
my_list_compare_two (gconstpointer a, gconstpointer b)
|
||||
{
|
||||
gint one = *((const gint*)a);
|
||||
gint two = *((const gint*)b);
|
||||
return two-one;
|
||||
}
|
||||
|
||||
/* void
|
||||
my_list_print (gpointer a, gpointer b)
|
||||
{
|
||||
gint three = *((gint*)a);
|
||||
g_print("%d", three);
|
||||
}; */
|
||||
|
||||
gint
|
||||
my_compare (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
const char *cha = a;
|
||||
const char *chb = b;
|
||||
|
||||
return *cha - *chb;
|
||||
}
|
||||
|
||||
gint
|
||||
my_traverse (gpointer key,
|
||||
gpointer value,
|
||||
gpointer data)
|
||||
{
|
||||
char *ch = key;
|
||||
g_print ("%c ", *ch);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc,
|
||||
char *argv[])
|
||||
{
|
||||
GList *list, *t;
|
||||
GSList *slist, *st;
|
||||
GHashTable *hash_table;
|
||||
GMemChunk *mem_chunk;
|
||||
GStringChunk *string_chunk;
|
||||
GTimer *timer;
|
||||
gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
||||
gint morenums[10] = { 8, 9, 7, 0, 3, 2, 5, 1, 4, 6};
|
||||
|
||||
gchar *mem[10000], *tmp_string, *tmp_string_2;
|
||||
gint i, j;
|
||||
GArray *garray;
|
||||
GString *string1, *string2;
|
||||
GTree *tree;
|
||||
char chars[62];
|
||||
|
||||
g_print ("checking size of gint8...%ld (should be 1)\n", (glong)sizeof (gint8));
|
||||
g_print ("checking size of gint16...%ld (should be 2)\n", (glong)sizeof (gint16));
|
||||
g_print ("checking size of gint32...%ld (should be 4)\n", (glong)sizeof (gint32));
|
||||
|
||||
g_print ("checking doubly linked lists...");
|
||||
|
||||
list = NULL;
|
||||
for (i = 0; i < 10; i++)
|
||||
list = g_list_append (list, &nums[i]);
|
||||
list = g_list_reverse (list);
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
t = g_list_nth (list, i);
|
||||
if (*((gint*) t->data) != (9 - i))
|
||||
g_error ("Regular insert failed");
|
||||
}
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
if(g_list_position(list, g_list_nth (list, i)) != i)
|
||||
g_error("g_list_position does not seem to be the inverse of g_list_nth\n");
|
||||
|
||||
g_list_free (list);
|
||||
list = NULL;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
list = g_list_insert_sorted (list, &morenums[i], my_list_compare_one);
|
||||
|
||||
/*
|
||||
g_print("\n");
|
||||
g_list_foreach (list, my_list_print, NULL);
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
t = g_list_nth (list, i);
|
||||
if (*((gint*) t->data) != i)
|
||||
g_error ("Sorted insert failed");
|
||||
}
|
||||
|
||||
g_list_free (list);
|
||||
list = NULL;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
list = g_list_insert_sorted (list, &morenums[i], my_list_compare_two);
|
||||
|
||||
/*
|
||||
g_print("\n");
|
||||
g_list_foreach (list, my_list_print, NULL);
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
t = g_list_nth (list, i);
|
||||
if (*((gint*) t->data) != (9 - i))
|
||||
g_error ("Sorted insert failed");
|
||||
}
|
||||
|
||||
g_list_free (list);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking singly linked lists...");
|
||||
|
||||
slist = NULL;
|
||||
for (i = 0; i < 10; i++)
|
||||
slist = g_slist_append (slist, &nums[i]);
|
||||
slist = g_slist_reverse (slist);
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
st = g_slist_nth (slist, i);
|
||||
if (*((gint*) st->data) != (9 - i))
|
||||
g_error ("failed");
|
||||
}
|
||||
|
||||
g_slist_free (slist);
|
||||
slist = NULL;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
slist = g_slist_insert_sorted (slist, &morenums[i], my_list_compare_one);
|
||||
|
||||
/*
|
||||
g_print("\n");
|
||||
g_slist_foreach (slist, my_list_print, NULL);
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
st = g_slist_nth (slist, i);
|
||||
if (*((gint*) st->data) != i)
|
||||
g_error ("Sorted insert failed");
|
||||
}
|
||||
|
||||
g_slist_free(slist);
|
||||
slist = NULL;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
slist = g_slist_insert_sorted (slist, &morenums[i], my_list_compare_two);
|
||||
|
||||
/*
|
||||
g_print("\n");
|
||||
g_slist_foreach (slist, my_list_print, NULL);
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
st = g_slist_nth (slist, i);
|
||||
if (*((gint*) st->data) != (9 - i))
|
||||
g_error("Sorted insert failed");
|
||||
}
|
||||
|
||||
g_slist_free(slist);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking trees...\n");
|
||||
|
||||
tree = g_tree_new (my_compare);
|
||||
i = 0;
|
||||
for (j = 0; j < 10; j++, i++)
|
||||
{
|
||||
chars[i] = '0' + j;
|
||||
g_tree_insert (tree, &chars[i], &chars[i]);
|
||||
}
|
||||
for (j = 0; j < 26; j++, i++)
|
||||
{
|
||||
chars[i] = 'A' + j;
|
||||
g_tree_insert (tree, &chars[i], &chars[i]);
|
||||
}
|
||||
for (j = 0; j < 26; j++, i++)
|
||||
{
|
||||
chars[i] = 'a' + j;
|
||||
g_tree_insert (tree, &chars[i], &chars[i]);
|
||||
}
|
||||
|
||||
g_print ("tree height: %d\n", g_tree_height (tree));
|
||||
g_print ("tree nnodes: %d\n", g_tree_nnodes (tree));
|
||||
|
||||
g_print ("tree: ");
|
||||
g_tree_traverse (tree, my_traverse, G_IN_ORDER, NULL);
|
||||
g_print ("\n");
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
g_tree_remove (tree, &chars[i]);
|
||||
|
||||
g_print ("tree height: %d\n", g_tree_height (tree));
|
||||
g_print ("tree nnodes: %d\n", g_tree_nnodes (tree));
|
||||
|
||||
g_print ("tree: ");
|
||||
g_tree_traverse (tree, my_traverse, G_IN_ORDER, NULL);
|
||||
g_print ("\n");
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking mem chunks...");
|
||||
|
||||
mem_chunk = g_mem_chunk_new ("test mem chunk", 50, 100, G_ALLOC_AND_FREE);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
{
|
||||
mem[i] = g_chunk_new (gchar, mem_chunk);
|
||||
|
||||
for (j = 0; j < 50; j++)
|
||||
mem[i][j] = i * j;
|
||||
}
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
{
|
||||
g_mem_chunk_free (mem_chunk, mem[i]);
|
||||
}
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking hash tables...");
|
||||
|
||||
hash_table = g_hash_table_new (my_hash, my_hash_compare);
|
||||
for (i = 0; i < 10000; i++)
|
||||
{
|
||||
array[i] = i;
|
||||
g_hash_table_insert (hash_table, &array[i], &array[i]);
|
||||
}
|
||||
g_hash_table_foreach (hash_table, my_hash_callback, NULL);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
if (array[i] == 0)
|
||||
g_print ("%d\n", i);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
g_hash_table_remove (hash_table, &array[i]);
|
||||
|
||||
g_hash_table_destroy (hash_table);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking string chunks...");
|
||||
|
||||
string_chunk = g_string_chunk_new (1024);
|
||||
|
||||
for (i = 0; i < 100000; i ++)
|
||||
{
|
||||
tmp_string = g_string_chunk_insert (string_chunk, "hi pete");
|
||||
|
||||
if (strcmp ("hi pete", tmp_string) != 0)
|
||||
g_error ("string chunks are broken.\n");
|
||||
}
|
||||
|
||||
tmp_string_2 = g_string_chunk_insert_const (string_chunk, tmp_string);
|
||||
|
||||
g_assert (tmp_string_2 != tmp_string &&
|
||||
strcmp(tmp_string_2, tmp_string) == 0);
|
||||
|
||||
tmp_string = g_string_chunk_insert_const (string_chunk, tmp_string);
|
||||
|
||||
g_assert (tmp_string_2 == tmp_string);
|
||||
|
||||
g_string_chunk_free (string_chunk);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking arrays...");
|
||||
|
||||
garray = g_array_new (FALSE);
|
||||
for (i = 0; i < 10000; i++)
|
||||
g_array_append_val (garray, gint, i);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
if (g_array_index (garray, gint, i) != i)
|
||||
g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), i);
|
||||
|
||||
g_array_free (garray, TRUE);
|
||||
|
||||
garray = g_array_new (FALSE);
|
||||
for (i = 0; i < 10000; i++)
|
||||
g_array_prepend_val (garray, gint, i);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
if (g_array_index (garray, gint, i) != (10000 - i - 1))
|
||||
g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), 10000 - i - 1);
|
||||
|
||||
g_array_free (garray, TRUE);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking strings...");
|
||||
|
||||
string1 = g_string_new ("hi pete!");
|
||||
string2 = g_string_new ("");
|
||||
|
||||
g_assert (strcmp ("hi pete!", string1->str) == 0);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
g_string_append_c (string1, 'a'+(i%26));
|
||||
|
||||
g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%10000.10000f",
|
||||
"this pete guy sure is a wuss, like he's the number ",
|
||||
1,
|
||||
" wuss. everyone agrees.\n",
|
||||
string1->str,
|
||||
10, 666, 15, 15, 666.666666666, 666.666666666);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
g_print ("checking timers...\n");
|
||||
|
||||
timer = g_timer_new ();
|
||||
g_print (" spinning for 3 seconds...\n");
|
||||
|
||||
g_timer_start (timer);
|
||||
while (g_timer_elapsed (timer, NULL) < 3)
|
||||
;
|
||||
|
||||
g_timer_stop (timer);
|
||||
g_timer_destroy (timer);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
g_print ("checking g_strcasecmp...\n");
|
||||
|
||||
/* g_debug (argv[0]); */
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
401
tests/testglib.c
Normal file
401
tests/testglib.c
Normal file
@ -0,0 +1,401 @@
|
||||
/* GLIB - Library of useful routines for C programming
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "glib.h"
|
||||
|
||||
int array[10000];
|
||||
|
||||
void
|
||||
my_hash_callback (gpointer key,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
{
|
||||
int *d = value;
|
||||
*d = 1;
|
||||
}
|
||||
|
||||
guint
|
||||
my_hash (gconstpointer key)
|
||||
{
|
||||
return (guint) *((const gint*) key);
|
||||
}
|
||||
|
||||
gint
|
||||
my_hash_compare (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
return *((const gint*) a) == *((const gint*) b);
|
||||
}
|
||||
|
||||
gint
|
||||
my_list_compare_one (gconstpointer a, gconstpointer b)
|
||||
{
|
||||
gint one = *((const gint*)a);
|
||||
gint two = *((const gint*)b);
|
||||
return one-two;
|
||||
}
|
||||
|
||||
gint
|
||||
my_list_compare_two (gconstpointer a, gconstpointer b)
|
||||
{
|
||||
gint one = *((const gint*)a);
|
||||
gint two = *((const gint*)b);
|
||||
return two-one;
|
||||
}
|
||||
|
||||
/* void
|
||||
my_list_print (gpointer a, gpointer b)
|
||||
{
|
||||
gint three = *((gint*)a);
|
||||
g_print("%d", three);
|
||||
}; */
|
||||
|
||||
gint
|
||||
my_compare (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
const char *cha = a;
|
||||
const char *chb = b;
|
||||
|
||||
return *cha - *chb;
|
||||
}
|
||||
|
||||
gint
|
||||
my_traverse (gpointer key,
|
||||
gpointer value,
|
||||
gpointer data)
|
||||
{
|
||||
char *ch = key;
|
||||
g_print ("%c ", *ch);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc,
|
||||
char *argv[])
|
||||
{
|
||||
GList *list, *t;
|
||||
GSList *slist, *st;
|
||||
GHashTable *hash_table;
|
||||
GMemChunk *mem_chunk;
|
||||
GStringChunk *string_chunk;
|
||||
GTimer *timer;
|
||||
gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
||||
gint morenums[10] = { 8, 9, 7, 0, 3, 2, 5, 1, 4, 6};
|
||||
|
||||
gchar *mem[10000], *tmp_string, *tmp_string_2;
|
||||
gint i, j;
|
||||
GArray *garray;
|
||||
GString *string1, *string2;
|
||||
GTree *tree;
|
||||
char chars[62];
|
||||
|
||||
g_print ("checking size of gint8...%ld (should be 1)\n", (glong)sizeof (gint8));
|
||||
g_print ("checking size of gint16...%ld (should be 2)\n", (glong)sizeof (gint16));
|
||||
g_print ("checking size of gint32...%ld (should be 4)\n", (glong)sizeof (gint32));
|
||||
|
||||
g_print ("checking doubly linked lists...");
|
||||
|
||||
list = NULL;
|
||||
for (i = 0; i < 10; i++)
|
||||
list = g_list_append (list, &nums[i]);
|
||||
list = g_list_reverse (list);
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
t = g_list_nth (list, i);
|
||||
if (*((gint*) t->data) != (9 - i))
|
||||
g_error ("Regular insert failed");
|
||||
}
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
if(g_list_position(list, g_list_nth (list, i)) != i)
|
||||
g_error("g_list_position does not seem to be the inverse of g_list_nth\n");
|
||||
|
||||
g_list_free (list);
|
||||
list = NULL;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
list = g_list_insert_sorted (list, &morenums[i], my_list_compare_one);
|
||||
|
||||
/*
|
||||
g_print("\n");
|
||||
g_list_foreach (list, my_list_print, NULL);
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
t = g_list_nth (list, i);
|
||||
if (*((gint*) t->data) != i)
|
||||
g_error ("Sorted insert failed");
|
||||
}
|
||||
|
||||
g_list_free (list);
|
||||
list = NULL;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
list = g_list_insert_sorted (list, &morenums[i], my_list_compare_two);
|
||||
|
||||
/*
|
||||
g_print("\n");
|
||||
g_list_foreach (list, my_list_print, NULL);
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
t = g_list_nth (list, i);
|
||||
if (*((gint*) t->data) != (9 - i))
|
||||
g_error ("Sorted insert failed");
|
||||
}
|
||||
|
||||
g_list_free (list);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking singly linked lists...");
|
||||
|
||||
slist = NULL;
|
||||
for (i = 0; i < 10; i++)
|
||||
slist = g_slist_append (slist, &nums[i]);
|
||||
slist = g_slist_reverse (slist);
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
st = g_slist_nth (slist, i);
|
||||
if (*((gint*) st->data) != (9 - i))
|
||||
g_error ("failed");
|
||||
}
|
||||
|
||||
g_slist_free (slist);
|
||||
slist = NULL;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
slist = g_slist_insert_sorted (slist, &morenums[i], my_list_compare_one);
|
||||
|
||||
/*
|
||||
g_print("\n");
|
||||
g_slist_foreach (slist, my_list_print, NULL);
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
st = g_slist_nth (slist, i);
|
||||
if (*((gint*) st->data) != i)
|
||||
g_error ("Sorted insert failed");
|
||||
}
|
||||
|
||||
g_slist_free(slist);
|
||||
slist = NULL;
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
slist = g_slist_insert_sorted (slist, &morenums[i], my_list_compare_two);
|
||||
|
||||
/*
|
||||
g_print("\n");
|
||||
g_slist_foreach (slist, my_list_print, NULL);
|
||||
*/
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
st = g_slist_nth (slist, i);
|
||||
if (*((gint*) st->data) != (9 - i))
|
||||
g_error("Sorted insert failed");
|
||||
}
|
||||
|
||||
g_slist_free(slist);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking trees...\n");
|
||||
|
||||
tree = g_tree_new (my_compare);
|
||||
i = 0;
|
||||
for (j = 0; j < 10; j++, i++)
|
||||
{
|
||||
chars[i] = '0' + j;
|
||||
g_tree_insert (tree, &chars[i], &chars[i]);
|
||||
}
|
||||
for (j = 0; j < 26; j++, i++)
|
||||
{
|
||||
chars[i] = 'A' + j;
|
||||
g_tree_insert (tree, &chars[i], &chars[i]);
|
||||
}
|
||||
for (j = 0; j < 26; j++, i++)
|
||||
{
|
||||
chars[i] = 'a' + j;
|
||||
g_tree_insert (tree, &chars[i], &chars[i]);
|
||||
}
|
||||
|
||||
g_print ("tree height: %d\n", g_tree_height (tree));
|
||||
g_print ("tree nnodes: %d\n", g_tree_nnodes (tree));
|
||||
|
||||
g_print ("tree: ");
|
||||
g_tree_traverse (tree, my_traverse, G_IN_ORDER, NULL);
|
||||
g_print ("\n");
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
g_tree_remove (tree, &chars[i]);
|
||||
|
||||
g_print ("tree height: %d\n", g_tree_height (tree));
|
||||
g_print ("tree nnodes: %d\n", g_tree_nnodes (tree));
|
||||
|
||||
g_print ("tree: ");
|
||||
g_tree_traverse (tree, my_traverse, G_IN_ORDER, NULL);
|
||||
g_print ("\n");
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking mem chunks...");
|
||||
|
||||
mem_chunk = g_mem_chunk_new ("test mem chunk", 50, 100, G_ALLOC_AND_FREE);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
{
|
||||
mem[i] = g_chunk_new (gchar, mem_chunk);
|
||||
|
||||
for (j = 0; j < 50; j++)
|
||||
mem[i][j] = i * j;
|
||||
}
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
{
|
||||
g_mem_chunk_free (mem_chunk, mem[i]);
|
||||
}
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking hash tables...");
|
||||
|
||||
hash_table = g_hash_table_new (my_hash, my_hash_compare);
|
||||
for (i = 0; i < 10000; i++)
|
||||
{
|
||||
array[i] = i;
|
||||
g_hash_table_insert (hash_table, &array[i], &array[i]);
|
||||
}
|
||||
g_hash_table_foreach (hash_table, my_hash_callback, NULL);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
if (array[i] == 0)
|
||||
g_print ("%d\n", i);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
g_hash_table_remove (hash_table, &array[i]);
|
||||
|
||||
g_hash_table_destroy (hash_table);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking string chunks...");
|
||||
|
||||
string_chunk = g_string_chunk_new (1024);
|
||||
|
||||
for (i = 0; i < 100000; i ++)
|
||||
{
|
||||
tmp_string = g_string_chunk_insert (string_chunk, "hi pete");
|
||||
|
||||
if (strcmp ("hi pete", tmp_string) != 0)
|
||||
g_error ("string chunks are broken.\n");
|
||||
}
|
||||
|
||||
tmp_string_2 = g_string_chunk_insert_const (string_chunk, tmp_string);
|
||||
|
||||
g_assert (tmp_string_2 != tmp_string &&
|
||||
strcmp(tmp_string_2, tmp_string) == 0);
|
||||
|
||||
tmp_string = g_string_chunk_insert_const (string_chunk, tmp_string);
|
||||
|
||||
g_assert (tmp_string_2 == tmp_string);
|
||||
|
||||
g_string_chunk_free (string_chunk);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking arrays...");
|
||||
|
||||
garray = g_array_new (FALSE);
|
||||
for (i = 0; i < 10000; i++)
|
||||
g_array_append_val (garray, gint, i);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
if (g_array_index (garray, gint, i) != i)
|
||||
g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), i);
|
||||
|
||||
g_array_free (garray, TRUE);
|
||||
|
||||
garray = g_array_new (FALSE);
|
||||
for (i = 0; i < 10000; i++)
|
||||
g_array_prepend_val (garray, gint, i);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
if (g_array_index (garray, gint, i) != (10000 - i - 1))
|
||||
g_print ("uh oh: %d ( %d )\n", g_array_index (garray, gint, i), 10000 - i - 1);
|
||||
|
||||
g_array_free (garray, TRUE);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
|
||||
g_print ("checking strings...");
|
||||
|
||||
string1 = g_string_new ("hi pete!");
|
||||
string2 = g_string_new ("");
|
||||
|
||||
g_assert (strcmp ("hi pete!", string1->str) == 0);
|
||||
|
||||
for (i = 0; i < 10000; i++)
|
||||
g_string_append_c (string1, 'a'+(i%26));
|
||||
|
||||
g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%10000.10000f",
|
||||
"this pete guy sure is a wuss, like he's the number ",
|
||||
1,
|
||||
" wuss. everyone agrees.\n",
|
||||
string1->str,
|
||||
10, 666, 15, 15, 666.666666666, 666.666666666);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
g_print ("checking timers...\n");
|
||||
|
||||
timer = g_timer_new ();
|
||||
g_print (" spinning for 3 seconds...\n");
|
||||
|
||||
g_timer_start (timer);
|
||||
while (g_timer_elapsed (timer, NULL) < 3)
|
||||
;
|
||||
|
||||
g_timer_stop (timer);
|
||||
g_timer_destroy (timer);
|
||||
|
||||
g_print ("ok\n");
|
||||
|
||||
g_print ("checking g_strcasecmp...\n");
|
||||
|
||||
/* g_debug (argv[0]); */
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user