explicitely include the prototypes for inline functions to cure gcc
[platform/upstream/glib.git] / glib.h
diff --git a/glib.h b/glib.h
index a0333d2..f4d738b 100644 (file)
--- a/glib.h
+++ b/glib.h
@@ -8,7 +8,7 @@
  *
  * 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
+ * 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
 #ifndef __G_LIB_H__
 #define __G_LIB_H__
 
+/* system specific config file
+ */
 #include <glibconfig.h>
 
+/* include varargs functions for assertment macros
+ */
+#include <stdarg.h>
+
+/* optionally feature DMALLOC memory allocation debugger
+ */
 #ifdef USE_DMALLOC
 #include "dmalloc.h"
 #endif
@@ -60,7 +68,6 @@
 
 #endif /* HAVE_VALUES_H */
 
-
 #ifdef HAVE_LIMITS_H
 
 #include <limits.h>
 #endif /* HAVE_VALUES_H */
 
 
+/* the #pragma } statment is used to fix up emacs' c-mode which gets
+ * confused by extern "C" {. the ansi standard says that compilers
+ * have to ignore #pragma directives that they don't know about,
+ * so we should be save in using this.
+ */
+#ifdef __cplusplus
+extern "C" {
+#pragma }
+#endif /* __cplusplus */
+
+
 /* Provide definitions for some commonly used macros.
  *  Some of them are only provided if they haven't already
  *  been defined. It is assumed that if they are already
 #define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
 
 
-/* Provide simple enum value macro wrappers that ease automated enum value
- * stringification code.
+/* Define G_VA_COPY() to do the right thing for copying va_list variables.
+ * glibconfig.h may have already defined G_VA_COPY as va_copy or __va_copy.
+ */
+#if !defined (G_VA_COPY)
+#  if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32))
+#  define G_VA_COPY(ap1, ap2)     (*(ap1) = *(ap2))
+#  elif defined (G_VA_COPY_AS_ARRAY)
+#  define G_VA_COPY(ap1, ap2)     g_memmove ((ap1), (ap2), sizeof (va_list))
+#  else /* va_list is a pointer */
+#  define G_VA_COPY(ap1, ap2)     ((ap1) = (ap2))
+#  endif /* va_list is a pointer */
+#endif /* !G_VA_COPY */
+
+
+/* Provide simple enum value macro wrappers that ease automated
+ * enum value stringification code. [abandoned]
  */
 #if    !defined (G_CODE_GENERATION)
 #define G_ENUM( EnumerationName )              EnumerationName
 #endif /* G_CODE_GENERATION */
 
 
+/* inlining hassle. for compilers that don't allow the `inline' keyword,
+ * mostly because of strict ANSI C compliance or dumbness, we try to fall
+ * back to either `__inline__' or `__inline'.
+ * we define G_CAN_INLINE, if the compiler seems to be actually
+ * *capable* to do function inlining, in which case inline function bodys
+ * do make sense. we also define G_INLINE_FUNC to properly export the
+ * function prototypes if no inlinig can be performed.
+ * we special case most of the stuff, so inline functions can have a normal
+ * implementation by defining G_INLINE_FUNC to extern and G_CAN_INLINE to 1.
+ */
+#ifndef G_INLINE_FUNC
+#  define G_CAN_INLINE 1
+#endif
+#ifdef G_HAVE_INLINE
+#  if defined (__GNUC__) && defined (__STRICT_ANSI__)
+#    undef inline
+#    define inline __inline__
+#  endif
+#else /* !G_HAVE_INLINE */
+#  undef inline
+#  if defined (G_HAVE___INLINE__)
+#    define inline __inline__
+#  else /* !inline && !__inline__ */
+#    if defined (G_HAVE___INLINE)
+#      define inline __inline
+#    else /* !inline && !__inline__ && !__inline */
+#      define inline /* don't inline, then */
+#      ifndef G_INLINE_FUNC
+#        undef G_CAN_INLINE
+#      endif
+#    endif
+#  endif
+#endif
+#ifndef G_INLINE_FUNC
+#  ifdef __GNUC__
+#    ifdef __OPTIMIZE__
+#      define G_INLINE_FUNC extern inline
+#    else
+#      undef G_CAN_INLINE
+#      define G_INLINE_FUNC extern
+#    endif
+#  else /* !__GNUC__ */
+#    ifdef G_CAN_INLINE
+#      define G_INLINE_FUNC static inline
+#    else
+#      define G_INLINE_FUNC extern
+#    endif
+#  endif /* !__GNUC__ */
+#endif /* !G_INLINE_FUNC */
+
+
 /* Provide simple macro statement wrappers (adapted from Perl):
  *  G_STMT_START { statements; } G_STMT_END;
  *  can be used as a single statement, as in
 #  endif
 #endif
 
+
 /* Provide macros to feature the GCC function attribute.
  */
 #if    __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
 #define G_GNUC_CONST
 #endif /* !__GNUC__ */
 
-/* Hacker macro to place breakpoints for x86 machines.
- * Actual use is strongly deprecated of course ;)
- */
-#if    defined (__i386__)
-#define        G_BREAKPOINT()          G_STMT_START{ __asm__ ("int $03"); }G_STMT_END
-#else  /* !__i386__ */
-#define        G_BREAKPOINT()
-#endif /* __i386__ */
 
-/* Wrap the __PRETTY_FUNCTION__ and __FUNCTION__ variables with macros,
- * so we can refer to them as strings unconditionally.
+/* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with
+ * macros, so we can refer to them as strings unconditionally.
  */
 #ifdef __GNUC__
 #define        G_GNUC_FUNCTION         (__FUNCTION__)
 #endif /* !__GNUC__ */
 
 
+/* we try to provide a usefull equivalent for ATEXIT if it is
+ * not defined, but use is actually abandoned. people should
+ * use g_atexit() instead.
+ * keep this in sync with gutils.c.
+ */
 #ifndef ATEXIT
 #  ifdef HAVE_ATEXIT
-#    define ATEXIT(proc)   (atexit (proc))
+#    ifdef NeXT /* @#%@! NeXTStep */
+#      define ATEXIT(proc)   (!atexit (proc))
+#    else /* !NeXT */
+#      define ATEXIT(proc)   (atexit (proc))
+#    endif /* !NeXT */
 #  elif defined (HAVE_ON_EXIT)
 #    define ATEXIT(proc)   (on_exit ((void (*)(int, void *))(proc), NULL))
-#  endif    
+#  else
+#  error Could not determine proper atexit() implementation
+#  endif
+#else
+#  define G_NATIVE_ATEXIT
 #endif /* ATEXIT */
 
+/* Hacker macro to place breakpoints for x86 machines.
+ * Actual use is strongly deprecated of course ;)
+ */
+#if    defined (__i386__) && defined (__GNUC__)
+#define        G_BREAKPOINT()          G_STMT_START{ __asm__ volatile ("int $03"); }G_STMT_END
+#else  /* !__i386__ */
+#define        G_BREAKPOINT()
+#endif /* __i386__ */
+
 
 /* Provide macros for easily allocating memory. The macros
  *  will cast the allocated memory to the specified type
 
 #ifdef __DMALLOC_H__
 
-#define g_new(type,count)       ALLOC(type,count)
-#define g_new0(type,count)      CALLOC(type,count)
+#define g_new(type, count)      (ALLOC (type, count))
+#define g_new0(type, count)     (CALLOC (type, count))
 
 #else /* __DMALLOC_H__ */
 
   (type *) g_mem_chunk_alloc (chunk) \
 )
 #define g_chunk_new0(type, chunk)      ( \
-  (type *) memset (g_mem_chunk_alloc (chunk), 0, sizeof (type)) \
+  (type *) g_mem_chunk_alloc0 (chunk) \
 )
 #define g_chunk_free(mem, mem_chunk)   G_STMT_START { \
   g_mem_chunk_free ((mem_chunk), (mem)); \
 } G_STMT_END
 
+
 #define g_string(x) #x
 
 
 /* Provide macros for error handling. The "assert" macros will
  *  exit on failure. The "return" macros will exit the current
  *  function. Two different definitions are given for the macros
- *  in order to support gcc's __PRETTY_FUNCTION__ capability.
+ *  if G_DISABLE_ASSERT is not defined, in order to support gcc's
+ *  __PRETTY_FUNCTION__ capability.
  */
 
 #ifdef G_DISABLE_ASSERT
 
 #ifdef __GNUC__
 
-#define g_assert(expr)                 G_STMT_START{\
-     if (!(expr))                                   \
-       g_error ("file %s: line %d (%s): \"%s\"",     \
-               __FILE__,                            \
-               __LINE__,                            \
-               __PRETTY_FUNCTION__,                 \
-               #expr);                 }G_STMT_END
-
-#define g_assert_not_reached()         G_STMT_START{                 \
-     g_error ("file %s: line %d (%s): \"should not be reached\"",     \
-             __FILE__,                                               \
-             __LINE__,                                               \
-             __PRETTY_FUNCTION__);     }G_STMT_END
+#define g_assert(expr)                 G_STMT_START{           \
+     if (!(expr))                                              \
+       g_log (G_LOG_DOMAIN,                                    \
+             G_LOG_LEVEL_ERROR,                                \
+             "file %s: line %d (%s): assertion failed: (%s)",  \
+             __FILE__,                                         \
+             __LINE__,                                         \
+             __PRETTY_FUNCTION__,                              \
+             #expr);                   }G_STMT_END
+
+#define g_assert_not_reached()         G_STMT_START{           \
+     g_log (G_LOG_DOMAIN,                                      \
+           G_LOG_LEVEL_ERROR,                                  \
+           "file %s: line %d (%s): should not be reached",     \
+           __FILE__,                                           \
+           __LINE__,                                           \
+           __PRETTY_FUNCTION__);       }G_STMT_END
 
 #else /* !__GNUC__ */
 
-#define g_assert(expr)                 G_STMT_START{\
-     if (!(expr))                                   \
-       g_error ("file %s: line %d: \"%s\"",         \
-               __FILE__,                            \
-               __LINE__,                            \
-               #expr);                 }G_STMT_END
-
-#define g_assert_not_reached()         G_STMT_START{                 \
-     g_error ("file %s: line %d: \"should not be reached\"",         \
-             __FILE__,                                               \
-             __LINE__);                }G_STMT_END
+#define g_assert(expr)                 G_STMT_START{           \
+     if (!(expr))                                              \
+       g_log (G_LOG_DOMAIN,                                    \
+             G_LOG_LEVEL_ERROR,                                \
+             "file %s: line %d: assertion failed: (%s)",       \
+             __FILE__,                                         \
+             __LINE__,                                         \
+             #expr);                   }G_STMT_END
+
+#define g_assert_not_reached()         G_STMT_START{   \
+     g_log (G_LOG_DOMAIN,                              \
+           G_LOG_LEVEL_ERROR,                          \
+           "file %s: line %d: should not be reached",  \
+           __FILE__,                                   \
+           __LINE__);          }G_STMT_END
 
 #endif /* __GNUC__ */
 
-#endif /* G_DISABLE_ASSERT */
+#endif /* !G_DISABLE_ASSERT */
+
 
 #ifdef G_DISABLE_CHECKS
 
 
 #ifdef __GNUC__
 
-#define g_return_if_fail(expr)         G_STMT_START{                  \
-     if (!(expr))                                                     \
-       {                                                              \
-        g_warning ("file %s: line %d (%s): assertion \"%s\" failed.", \
-                   __FILE__,                                          \
-                   __LINE__,                                          \
-                   __PRETTY_FUNCTION__,                               \
-                   #expr);                                            \
-        return;                                                       \
+#define g_return_if_fail(expr)         G_STMT_START{                   \
+     if (!(expr))                                                      \
+       {                                                               \
+        g_log (G_LOG_DOMAIN,                                           \
+               G_LOG_LEVEL_CRITICAL,                                   \
+               "file %s: line %d (%s): assertion `%s' failed.",        \
+               __FILE__,                                               \
+               __LINE__,                                               \
+               __PRETTY_FUNCTION__,                                    \
+               #expr);                                                 \
+        return;                                                        \
        };                              }G_STMT_END
 
-#define g_return_val_if_fail(expr,val) G_STMT_START{                  \
-     if (!(expr))                                                     \
-       {                                                              \
-        g_warning ("file %s: line %d (%s): assertion \"%s\" failed.", \
-                   __FILE__,                                          \
-                   __LINE__,                                          \
-                   __PRETTY_FUNCTION__,                               \
-                   #expr);                                            \
-        return val;                                                   \
+#define g_return_val_if_fail(expr,val) G_STMT_START{                   \
+     if (!(expr))                                                      \
+       {                                                               \
+        g_log (G_LOG_DOMAIN,                                           \
+               G_LOG_LEVEL_CRITICAL,                                   \
+               "file %s: line %d (%s): assertion `%s' failed.",        \
+               __FILE__,                                               \
+               __LINE__,                                               \
+               __PRETTY_FUNCTION__,                                    \
+               #expr);                                                 \
+        return val;                                                    \
        };                              }G_STMT_END
 
 #else /* !__GNUC__ */
 
-#define g_return_if_fail(expr)         G_STMT_START{             \
-     if (!(expr))                                                \
-       {                                                         \
-        g_warning ("file %s: line %d: assertion. \"%s\" failed", \
-                   __FILE__,                                     \
-                   __LINE__,                                     \
-                   #expr);                                       \
-        return;                                                  \
+#define g_return_if_fail(expr)         G_STMT_START{           \
+     if (!(expr))                                              \
+       {                                                       \
+        g_log (G_LOG_DOMAIN,                                   \
+               G_LOG_LEVEL_CRITICAL,                           \
+               "file %s: line %d: assertion `%s' failed.",     \
+               __FILE__,                                       \
+               __LINE__,                                       \
+               #expr);                                         \
+        return;                                                \
        };                              }G_STMT_END
 
-#define g_return_val_if_fail(expr, val)        G_STMT_START{             \
-     if (!(expr))                                                \
-       {                                                         \
-        g_warning ("file %s: line %d: assertion \"%s\" failed.", \
-                   __FILE__,                                     \
-                   __LINE__,                                     \
-                   #expr);                                       \
-        return val;                                              \
+#define g_return_val_if_fail(expr, val)        G_STMT_START{           \
+     if (!(expr))                                              \
+       {                                                       \
+        g_log (G_LOG_DOMAIN,                                   \
+               G_LOG_LEVEL_CRITICAL,                           \
+               "file %s: line %d: assertion `%s' failed.",     \
+               __FILE__,                                       \
+               __LINE__,                                       \
+               #expr);                                         \
+        return val;                                            \
        };                              }G_STMT_END
 
 #endif /* !__GNUC__ */
 
-#endif /* G_DISABLE_CHECKS */
+#endif /* !G_DISABLE_CHECKS */
 
 
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
 /* Provide type definitions for commonly used types.
  *  These are useful because a "gint8" can be adjusted
  *  to be 1 byte (8 bits) on all platforms. Similarly and
@@ -377,7 +489,7 @@ typedef unsigned int        guint;
 typedef float  gfloat;
 typedef double gdouble;
 
-/* HAVE_LONG_DOUBLE doesn't work correctly on all platforms. 
+/* HAVE_LONG_DOUBLE doesn't work correctly on all platforms.
  * Since gldouble isn't used anywhere, just disable it for now */
 
 #if 0
@@ -396,13 +508,11 @@ typedef signed char       gint8;
 typedef unsigned char  guint8;
 #endif /* SIZEOF_CHAR */
 
-
 #if (SIZEOF_SHORT == 2)
 typedef signed short   gint16;
 typedef unsigned short guint16;
 #endif /* SIZEOF_SHORT */
 
-
 #if (SIZEOF_INT == 4)
 typedef signed int     gint32;
 typedef unsigned int   guint32;
@@ -425,8 +535,8 @@ typedef unsigned long long guint64;
 #endif
 
 
-/* Define macros for storing integers inside pointers */
-
+/* Define macros for storing integers inside pointers
+ */
 #if (SIZEOF_INT == SIZEOF_VOID_P)
 
 #define GPOINTER_TO_INT(p) ((gint)(p))
@@ -444,13 +554,26 @@ typedef unsigned long long guint64;
 #define GUINT_TO_POINTER(u) ((gpointer)(gulong)(u))
 
 #else
-/* This should never happen */
+#error SIZEOF_VOID_P unknown - This should never happen
 #endif
 
-typedef gint32  gssize;
+typedef gint32 gssize;
 typedef guint32 gsize;
-typedef gint32  gtime;
 typedef guint32 GQuark;
+typedef gint32 GTime;
+
+
+/* Glib version.
+ */
+extern const guint glib_major_version;
+extern const guint glib_minor_version;
+extern const guint glib_micro_version;
+extern const guint glib_interface_age;
+extern const guint glib_binary_age;
+
+
+/* Forward declarations of glib types.
+ */
 
 typedef struct _GList          GList;
 typedef struct _GSList         GSList;
@@ -469,34 +592,87 @@ typedef struct _GDebugKey GDebugKey;
 typedef struct _GScannerConfig GScannerConfig;
 typedef struct _GScanner       GScanner;
 typedef union  _GValue         GValue;
+typedef struct _GCompletion    GCompletion;
 typedef struct _GRelation      GRelation;
 typedef struct _GTuples                GTuples;
+typedef struct _GNode          GNode;
+
 
+typedef enum
+{
+  G_TRAVERSE_LEAFS     = 1 << 0,
+  G_TRAVERSE_NON_LEAFS = 1 << 1,
+  G_TRAVERSE_ALL       = G_TRAVERSE_LEAFS | G_TRAVERSE_NON_LEAFS,
+  G_TRAVERSE_MASK      = 0x03
+} GTraverseFlags;
+
+typedef enum
+{
+  G_IN_ORDER,
+  G_PRE_ORDER,
+  G_POST_ORDER,
+  G_LEVEL_ORDER
+} GTraverseType;
+
+/* Log level shift offset for user defined
+ * log levels (0-7 are used by GLib).
+ */
+#define        G_LOG_LEVEL_USER_SHIFT  (8)
+
+/* Glib log levels and flags.
+ */
+typedef enum
+{
+  /* log flags */
+  G_LOG_FLAG_RECURSION         = 1 << 0,
+  G_LOG_FLAG_FATAL             = 1 << 1,
+
+  /* GLib log levels */
+  G_LOG_LEVEL_ERROR            = 1 << 2,       /* always fatal */
+  G_LOG_LEVEL_CRITICAL         = 1 << 3,
+  G_LOG_LEVEL_WARNING          = 1 << 4,
+  G_LOG_LEVEL_MESSAGE          = 1 << 5,
+  G_LOG_LEVEL_INFO             = 1 << 6,
+  G_LOG_LEVEL_DEBUG            = 1 << 7,
+
+  G_LOG_LEVEL_MASK             = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL)
+} GLogLevelFlags;
+
+/* GLib log levels that are considered fatal by default */
+#define        G_LOG_FATAL_MASK        (G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR)
+
+
+typedef gpointer       (*GCacheNewFunc)        (gpointer       key);
+typedef gpointer       (*GCacheDupFunc)        (gpointer       value);
+typedef void           (*GCacheDestroyFunc)    (gpointer       value);
+typedef gint           (*GCompareFunc)         (gconstpointer  a,
+                                                gconstpointer  b);
+typedef gchar*         (*GCompletionFunc)      (gpointer);
+typedef void           (*GDestroyNotify)       (gpointer       data);
+typedef void           (*GFunc)                (gpointer       data,
+                                                gpointer       user_data);
+typedef guint          (*GHashFunc)            (gconstpointer  key);
+typedef void           (*GHFunc)               (gpointer       key,
+                                                gpointer       value,
+                                                gpointer       user_data);
+typedef void           (*GLogFunc)             (const gchar   *log_domain,
+                                                GLogLevelFlags log_level,
+                                                const gchar   *message,
+                                                gpointer       user_data);
+typedef gboolean       (*GNodeTraverseFunc)    (GNode         *node,
+                                                gpointer       data);
+typedef void           (*GNodeForeachFunc)     (GNode         *node,
+                                                gpointer       data);
+typedef gint           (*GSearchFunc)          (gpointer       key,
+                                                gpointer       data);
+typedef void           (*GScannerMsgFunc)      (GScanner      *scanner,
+                                                gchar         *message,
+                                                gint           error);
+typedef gint           (*GTraverseFunc)        (gpointer       key,
+                                                gpointer       value,
+                                                gpointer       data);
+typedef        void            (*GVoidFunc)            (void);
 
-typedef void           (*GFunc)                (gpointer  data,
-                                                gpointer  user_data);
-typedef void           (*GHFunc)               (gpointer  key,
-                                                gpointer  value,
-                                                gpointer  user_data);
-typedef gpointer       (*GCacheNewFunc)        (gpointer  key);
-typedef gpointer       (*GCacheDupFunc)        (gpointer  value);
-typedef void           (*GCacheDestroyFunc)    (gpointer  value);
-typedef gint           (*GTraverseFunc)        (gpointer  key,
-                                                gpointer  value,
-                                                gpointer  data);
-typedef gint           (*GSearchFunc)          (gpointer  key,
-                                                gpointer  data);
-typedef void           (*GErrorFunc)           (gchar    *str);
-typedef void           (*GWarningFunc)         (gchar    *str);
-typedef void           (*GPrintFunc)           (gchar    *str);
-typedef void           (*GScannerMsgFunc)      (GScanner *scanner,
-                                                gchar    *message,
-                                                gint      error);
-typedef void           (*GDestroyNotify)       (gpointer  data);
-
-typedef guint          (*GHashFunc)            (gconstpointer    key);
-typedef gint           (*GCompareFunc)         (gconstpointer    a,
-                                                gconstpointer    b);
 
 struct _GList
 {
@@ -526,13 +702,13 @@ struct _GArray
 struct _GByteArray
 {
   guint8 *data;
-  guint   len;
+  guint          len;
 };
 
 struct _GPtrArray
 {
   gpointer *pdata;
-  guint     len;
+  guint            len;
 };
 
 struct _GTuples
@@ -543,7 +719,7 @@ struct _GTuples
 struct _GDebugKey
 {
   gchar *key;
-  guint  value;
+  guint         value;
 };
 
 struct _GCache { gint dummy; };
@@ -553,12 +729,6 @@ struct _GMemChunk { gint dummy; };
 struct _GListAllocator { gint dummy; };
 struct _GStringChunk { gint dummy; };
 
-typedef enum
-{
-  G_IN_ORDER,
-  G_PRE_ORDER,
-  G_POST_ORDER
-} GTraverseType;
 
 /* Doubly linked lists
  */
@@ -574,13 +744,13 @@ GList* g_list_insert              (GList          *list,
                                 gint            position);
 GList* g_list_insert_sorted    (GList          *list,
                                 gpointer        data,
-                                GCompareFunc    func);                     
-GList* g_list_concat           (GList          *list1, 
+                                GCompareFunc    func);
+GList* g_list_concat           (GList          *list1,
                                 GList          *list2);
 GList* g_list_remove           (GList          *list,
                                 gpointer        data);
 GList* g_list_remove_link      (GList          *list,
-                                GList          *link);
+                                GList          *llink);
 GList* g_list_reverse          (GList          *list);
 GList* g_list_nth              (GList          *list,
                                 guint           n);
@@ -590,7 +760,7 @@ GList* g_list_find_custom   (GList          *list,
                                 gpointer        data,
                                 GCompareFunc    func);
 gint   g_list_position         (GList          *list,
-                                GList          *link);
+                                GList          *llink);
 gint   g_list_index            (GList          *list,
                                 gpointer        data);
 GList* g_list_last             (GList          *list);
@@ -601,10 +771,10 @@ void   g_list_foreach             (GList          *list,
                                 gpointer        user_data);
 gpointer g_list_nth_data       (GList          *list,
                                 guint           n);
-
 #define g_list_previous(list)  ((list) ? (((GList *)(list))->prev) : NULL)
 #define g_list_next(list)      ((list) ? (((GList *)(list))->next) : NULL)
 
+
 /* Singly linked lists
  */
 GSList* g_slist_alloc          (void);
@@ -619,13 +789,13 @@ GSList* g_slist_insert            (GSList         *list,
                                 gint            position);
 GSList* g_slist_insert_sorted  (GSList         *list,
                                 gpointer        data,
-                                GCompareFunc    func);                     
-GSList* g_slist_concat         (GSList         *list1, 
+                                GCompareFunc    func);
+GSList* g_slist_concat         (GSList         *list1,
                                 GSList         *list2);
 GSList* g_slist_remove         (GSList         *list,
                                 gpointer        data);
 GSList* g_slist_remove_link    (GSList         *list,
-                                GSList         *link);
+                                GSList         *llink);
 GSList* g_slist_reverse                (GSList         *list);
 GSList* g_slist_nth            (GSList         *list,
                                 guint           n);
@@ -635,7 +805,7 @@ GSList* g_slist_find_custom (GSList         *list,
                                 gpointer        data,
                                 GCompareFunc    func);
 gint   g_slist_position        (GSList         *list,
-                                GSList         *link);
+                                GSList         *llink);
 gint   g_slist_index           (GSList         *list,
                                 gpointer        data);
 GSList* g_slist_last           (GSList         *list);
@@ -645,9 +815,9 @@ void        g_slist_foreach         (GSList         *list,
                                 gpointer        user_data);
 gpointer g_slist_nth_data      (GSList         *list,
                                 guint           n);
-
 #define g_slist_next(slist)    ((slist) ? (((GSList *)(slist))->next) : NULL)
 
+
 /* List Allocators
  */
 GListAllocator* g_list_allocator_new  (void);
@@ -702,7 +872,7 @@ void         g_cache_value_foreach (GCache            *cache,
                                gpointer           user_data);
 
 
-/* Trees
+/* Balanced binary trees
  */
 GTree*  g_tree_new      (GCompareFunc   key_compare_func);
 void    g_tree_destroy  (GTree         *tree);
@@ -724,17 +894,210 @@ gint      g_tree_height   (GTree         *tree);
 gint    g_tree_nnodes   (GTree         *tree);
 
 
-/* Memory
+
+/* N-way tree implementation
+ */
+struct _GNode
+{
+  gpointer data;
+  GNode          *next;
+  GNode          *prev;
+  GNode          *parent;
+  GNode          *children;
+};
+
+#define         G_NODE_IS_ROOT(node)   (((GNode*) (node))->parent == NULL && \
+                                ((GNode*) (node))->prev == NULL && \
+                                ((GNode*) (node))->next == NULL)
+#define         G_NODE_IS_LEAF(node)   (((GNode*) (node))->children == NULL)
+
+GNode*  g_node_new             (gpointer          data);
+void    g_node_destroy         (GNode            *root);
+void    g_node_unlink          (GNode            *node);
+GNode*  g_node_insert          (GNode            *parent,
+                                gint              position,
+                                GNode            *node);
+GNode*  g_node_insert_before   (GNode            *parent,
+                                GNode            *sibling,
+                                GNode            *node);
+GNode*  g_node_prepend         (GNode            *parent,
+                                GNode            *node);
+guint   g_node_n_nodes         (GNode            *root,
+                                GTraverseFlags    flags);
+GNode*  g_node_get_root        (GNode            *node);
+gboolean g_node_is_ancestor    (GNode            *node,
+                                GNode            *descendant);
+guint   g_node_depth           (GNode            *node);
+GNode*  g_node_find            (GNode            *root,
+                                GTraverseType     order,
+                                GTraverseFlags    flags,
+                                gpointer          data);
+
+/* convenience macros */
+#define g_node_append(parent, node)                            \
+     g_node_insert_before ((parent), NULL, (node))
+#define        g_node_insert_data(parent, position, data)              \
+     g_node_insert ((parent), (position), g_node_new (data))
+#define        g_node_insert_data_before(parent, sibling, data)        \
+     g_node_insert_before ((parent), (sibling), g_node_new (data))
+#define        g_node_prepend_data(parent, data)                       \
+     g_node_prepend ((parent), g_node_new (data))
+#define        g_node_append_data(parent, data)                        \
+     g_node_insert_before ((parent), NULL, g_node_new (data))
+
+/* traversal function, assumes that `node' is root
+ * (only traverses `node' and its subtree).
+ * this function is just a high level interface to
+ * low level traversal functions, optimized for speed.
  */
+void    g_node_traverse        (GNode            *root,
+                                GTraverseType     order,
+                                GTraverseFlags    flags,
+                                gint              max_depth,
+                                GNodeTraverseFunc func,
+                                gpointer          data);
+
+/* return the maximum tree height starting with `node', this is an expensive
+ * operation, since we need to visit all nodes. this could be shortened by
+ * adding `guint height' to struct _GNode, but then again, this is not very
+ * often needed, and would make g_node_insert() more time consuming.
+ */
+guint   g_node_max_height       (GNode *root);
+
+void    g_node_children_foreach (GNode           *node,
+                                 GTraverseFlags   flags,
+                                 GNodeForeachFunc func,
+                                 gpointer         data);
+void    g_node_reverse_children (GNode           *node);
+guint   g_node_n_children       (GNode           *node);
+GNode*  g_node_nth_child        (GNode           *node,
+                                 guint            n);
+GNode*  g_node_last_child       (GNode           *node);
+GNode*  g_node_find_child       (GNode           *node,
+                                 GTraverseFlags   flags,
+                                 gpointer         data);
+gint    g_node_child_position   (GNode           *node,
+                                 GNode           *child);
+gint    g_node_child_index      (GNode           *node,
+                                 gpointer         data);
+
+GNode*  g_node_first_sibling    (GNode           *node);
+GNode*  g_node_last_sibling     (GNode           *node);
+
+#define         g_node_prev_sibling(node)      ((node) ? \
+                                        ((GNode*) (node))->prev : NULL)
+#define         g_node_next_sibling(node)      ((node) ? \
+                                        ((GNode*) (node))->next : NULL)
+#define         g_node_first_child(node)       ((node) ? \
+                                        ((GNode*) (node))->children : NULL)
+
+
+/* Fatal error handlers.
+ * g_on_error_query() will prompt the user to either
+ * [E]xit, [H]alt, [P]roceed or show [S]tack trace.
+ * g_on_error_stack_trace() invokes gdb, which attaches to the current
+ * process and shows a stack trace.
+ * These function may cause different actions on non-unix platforms.
+ * The prg_name arg is required by gdb to find the executable, if it is
+ * passed as NULL, g_on_error_query() will try g_get_prgname().
+ */
+void g_on_error_query (const gchar *prg_name);
+void g_on_error_stack_trace (const gchar *prg_name);
+
 
+/* Logging mechanism
+ */
+extern const gchar                     *g_log_domain_glib;
+guint          g_log_set_handler       (const gchar    *log_domain,
+                                        GLogLevelFlags  log_levels,
+                                        GLogFunc        log_func,
+                                        gpointer        user_data);
+void           g_log_remove_handler    (const gchar    *log_domain,
+                                        guint           handler_id);
+void           g_log_default_handler   (const gchar    *log_domain,
+                                        GLogLevelFlags  log_level,
+                                        const gchar    *message,
+                                        gpointer        unused_data);
+void           g_log                   (const gchar    *log_domain,
+                                        GLogLevelFlags  log_level,
+                                        const gchar    *format,
+                                        ...) G_GNUC_PRINTF (3, 4);
+void           g_logv                  (const gchar    *log_domain,
+                                        GLogLevelFlags  log_level,
+                                        const gchar    *format,
+                                        va_list         args);
+GLogLevelFlags g_log_set_fatal_mask    (const gchar    *log_domain,
+                                        GLogLevelFlags  fatal_mask);
+GLogLevelFlags g_log_set_always_fatal  (GLogLevelFlags  fatal_mask);
+#ifndef        G_LOG_DOMAIN
+#define        G_LOG_DOMAIN    (NULL)
+#endif /* G_LOG_DOMAIN */
+#ifdef __GNUC__
+#define        g_error(format, args...)        g_log (G_LOG_DOMAIN, \
+                                              G_LOG_LEVEL_ERROR, \
+                                              format, ##args)
+#define        g_message(format, args...)      g_log (G_LOG_DOMAIN, \
+                                              G_LOG_LEVEL_MESSAGE, \
+                                              format, ##args)
+#define        g_warning(format, args...)      g_log (G_LOG_DOMAIN, \
+                                              G_LOG_LEVEL_WARNING, \
+                                              format, ##args)
+#else  /* !__GNUC__ */
+static inline void
+g_error (const gchar *format,
+        ...)
+{
+  va_list args;
+  va_start (args, format);
+  g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args);
+  va_end (args);
+}
+static inline void
+g_message (const gchar *format,
+          ...)
+{
+  va_list args;
+  va_start (args, format);
+  g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, args);
+  va_end (args);
+}
+static inline void
+g_warning (const gchar *format,
+          ...)
+{
+  va_list args;
+  va_start (args, format);
+  g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args);
+  va_end (args);
+}
+#endif /* !__GNUC__ */
+
+typedef void   (*GPrintFunc)           (const gchar    *string);
+void           g_print                 (const gchar    *format,
+                                        ...) G_GNUC_PRINTF (1, 2);
+GPrintFunc     g_set_print_handler     (GPrintFunc      func);
+void           g_printerr              (const gchar    *format,
+                                        ...) G_GNUC_PRINTF (1, 2);
+GPrintFunc     g_set_printerr_handler  (GPrintFunc      func);
+
+/* deprecated compatibility functions, use g_log_set_handler() instead */
+typedef void           (*GErrorFunc)           (const gchar *str);
+typedef void           (*GWarningFunc)         (const gchar *str);
+GErrorFunc   g_set_error_handler   (GErrorFunc  func);
+GWarningFunc g_set_warning_handler (GWarningFunc func);
+GPrintFunc   g_set_message_handler (GPrintFunc func);
+
+
+/* Memory allocation and debugging
+ */
 #ifdef USE_DMALLOC
 
-#define g_malloc(size)      (gpointer) MALLOC(size)
-#define g_malloc0(size)             (gpointer) CALLOC(char,size)
-#define g_realloc(mem,size)  (gpointer) REALLOC(mem,char,size)
-#define g_free(mem)         FREE(mem)
+#define g_malloc(size)      ((gpointer) MALLOC (size))
+#define g_malloc0(size)             ((gpointer) CALLOC (char, size))
+#define g_realloc(mem,size)  ((gpointer) REALLOC (mem, char, size))
+#define g_free(mem)         FREE (mem)
 
-#else /* USE_DMALLOC */
+#else /* !USE_DMALLOC */
 
 gpointer g_malloc      (gulong   size);
 gpointer g_malloc0     (gulong   size);
@@ -742,7 +1105,7 @@ gpointer g_realloc     (gpointer  mem,
                        gulong    size);
 void    g_free        (gpointer  mem);
 
-#endif /* USE_DMALLOC */
+#endif /* !USE_DMALLOC */
 
 void    g_mem_profile (void);
 void    g_mem_check   (gpointer  mem);
@@ -776,6 +1139,7 @@ GMemChunk* g_mem_chunk_new     (gchar        *name,
                                gint       type);
 void      g_mem_chunk_destroy (GMemChunk *mem_chunk);
 gpointer   g_mem_chunk_alloc   (GMemChunk *mem_chunk);
+gpointer   g_mem_chunk_alloc0  (GMemChunk *mem_chunk);
 void      g_mem_chunk_free    (GMemChunk *mem_chunk,
                                gpointer   mem);
 void      g_mem_chunk_clean   (GMemChunk *mem_chunk);
@@ -805,21 +1169,21 @@ gdouble g_timer_elapsed (GTimer   *timer,
                         gulong  *microseconds);
 
 
-/* Output
- */
-void g_error   (const gchar *format, ...) G_GNUC_PRINTF (1, 2);
-void g_warning (const gchar *format, ...) G_GNUC_PRINTF (1, 2);
-void g_message (const gchar *format, ...) G_GNUC_PRINTF (1, 2);
-void g_print   (const gchar *format, ...) G_GNUC_PRINTF (1, 2);
-
-
 /* String utility functions
  */
-#define G_STR_DELIMITERS     "_-|> <."
+#define G_STR_DELIMITERS       "_-|> <."
 void   g_strdelimit            (gchar       *string,
                                 const gchar *delimiters,
                                 gchar        new_delimiter);
 gchar* g_strdup                (const gchar *str);
+gchar* g_strdup_printf         (const gchar *format,
+                                ...) G_GNUC_PRINTF (1, 2);
+gchar* g_strdup_vprintf        (const gchar *format,
+                                va_list      args);
+gchar* g_strndup               (const gchar *str,
+                                guint        n);
+gchar*  g_strnfill             (guint        length,
+                                gchar        fill_char);
 gchar* g_strconcat             (const gchar *string1,
                                 ...); /* NULL terminated */
 gdouble g_strtod               (const gchar *nptr,
@@ -832,8 +1196,13 @@ void      g_strdown               (gchar       *string);
 void   g_strup                 (gchar       *string);
 void   g_strreverse            (gchar       *string);
 
+/* calculate a string size, guarranteed to fit format + args.
+ */
+guint  g_printf_string_upper_bound (const gchar* format,
+                                    va_list      args);
+
 
-/* Retrive static info
+/* Retrive static string info
  */
 gchar* g_get_user_name         (void);
 gchar* g_get_real_name         (void);
@@ -845,39 +1214,102 @@ void    g_set_prgname           (const gchar *prgname);
 
 /* Miscellaneous utility functions
  */
-guint  g_parse_debug_string    (const gchar *string, 
-                                GDebugKey   *keys, 
+guint  g_parse_debug_string    (const gchar *string,
+                                GDebugKey   *keys,
                                 guint        nkeys);
 gint   g_snprintf              (gchar       *string,
                                 gulong       n,
                                 gchar const *format,
                                 ...) G_GNUC_PRINTF (3, 4);
+gint   g_vsnprintf             (gchar       *string,
+                                gulong       n,
+                                gchar const *format,
+                                va_list      args);
 gchar* g_basename              (const gchar *file_name);
-gchar* g_getcwd                (void);
+
+/* strings are newly allocated with g_malloc() */
 gchar* g_dirname               (const gchar *file_name);
-     
+gchar* g_get_current_dir       (void);
 
 /* We make the assumption that if memmove isn't available, then
  * bcopy will do the job. This isn't safe everywhere. (bcopy can't
- * necessarily handle overlapping copies) */
+ * necessarily handle overlapping copies).
+ * Either way, g_memmove() will not return a value.
+ */
 #ifdef HAVE_MEMMOVE
-#define g_memmove memmove
-#else 
-#define g_memmove(a,b,c) bcopy(b,a,c)
+#define g_memmove(dest, src, size)     G_STMT_START {  \
+     memmove ((dest), (src), (size));                  \
+} G_STMT_END
+#else
+#define g_memmove(dest, src, size)     G_STMT_START {  \
+     bcopy ((src), (dest), (size));                    \
+} G_STMT_END
 #endif
 
-/* Errors
+/* we use a GLib function as a replacement for ATEXIT, so
+ * the programmer is not required to check the return value
+ * (if there is any in the implementation) and doesn't encounter
+ * missing include files.
  */
-GErrorFunc   g_set_error_handler   (GErrorFunc  func);
-GWarningFunc g_set_warning_handler (GWarningFunc func);
-GPrintFunc   g_set_message_handler (GPrintFunc func);
-GPrintFunc   g_set_print_handler   (GPrintFunc func);
+void   g_atexit                (GVoidFunc    func);
 
-void g_debug         (const gchar *progname);
-void g_attach_process (const gchar *progname,
-                      gint         query);
-void g_stack_trace    (const gchar *progname,
-                      gint         query);
+
+/* Bit tests
+ */
+G_INLINE_FUNC gint     g_bit_nth_lsf (guint32 mask,
+                                      gint    nth_bit);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC gint
+g_bit_nth_lsf (guint32 mask,
+              gint    nth_bit)
+{
+  do
+    {
+      nth_bit++;
+      if (mask & (1 << (guint) nth_bit))
+       return nth_bit;
+    }
+  while (nth_bit < 32);
+  return -1;
+}
+#endif /* G_CAN_INLINE */
+
+G_INLINE_FUNC gint     g_bit_nth_msf (guint32 mask,
+                                      gint    nth_bit);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC gint
+g_bit_nth_msf (guint32 mask,
+              gint    nth_bit)
+{
+  if (nth_bit < 0)
+    nth_bit = 33;
+  do
+    {
+      nth_bit--;
+      if (mask & (1 << (guint) nth_bit))
+       return nth_bit;
+    }
+  while (nth_bit > 0);
+  return -1;
+}
+#endif  /* G_CAN_INLINE */
+
+G_INLINE_FUNC guint    g_bit_storage (guint number);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC guint
+g_bit_storage (guint number)
+{
+  register guint n_bits = 0;
+
+  do
+    {
+      n_bits++;
+      number >>= 1;
+    }
+  while (number);
+  return n_bits;
+}
+#endif  /* G_CAN_INLINE */
 
 
 /* String Chunks
@@ -889,6 +1321,7 @@ gchar*           g_string_chunk_insert        (GStringChunk *chunk,
 gchar*       g_string_chunk_insert_const  (GStringChunk *chunk,
                                            const gchar  *string);
 
+
 /* Strings
  */
 GString* g_string_new      (const gchar *init);
@@ -907,14 +1340,14 @@ GString* g_string_prepend   (GString      *string,
                             const gchar *val);
 GString* g_string_prepend_c (GString    *string,
                             gchar        c);
-GString* g_string_insert    (GString    *string, 
-                            gint         pos, 
+GString* g_string_insert    (GString    *string,
+                            gint         pos,
                             const gchar *val);
-GString* g_string_insert_c  (GString    *string, 
-                            gint         pos, 
+GString* g_string_insert_c  (GString    *string,
+                            gint         pos,
                             gchar        c);
-GString* g_string_erase            (GString     *string, 
-                            gint         pos, 
+GString* g_string_erase            (GString     *string,
+                            gint         pos,
                             gint         len);
 GString* g_string_down     (GString     *string);
 GString* g_string_up       (GString     *string);
@@ -925,84 +1358,71 @@ void      g_string_sprintfa  (GString     *string,
                             const gchar *format,
                             ...) G_GNUC_PRINTF (2, 3);
 
+
 /* Resizable arrays
  */
-#define g_array_length(array,type) \
-     (((array)->len)/sizeof(type))
-#define g_array_append_val(array,type,val) \
-     g_rarray_append (array, (gpointer) &val, sizeof (type))
-#define g_array_append_vals(array,type,vals,nvals) \
-     g_rarray_append (array, (gpointer) vals, sizeof (type) * nvals)
-#define g_array_prepend_val(array,type,val) \
-     g_rarray_prepend (array, (gpointer) &val, sizeof (type))
-#define g_array_prepend_vals(array,type,vals,nvals) \
-     g_rarray_prepend (array, (gpointer) vals, sizeof (type) * nvals)
-#define g_array_truncate(array,type,length) \
-     g_rarray_truncate (array, length, sizeof (type))
-#define g_array_index(array,type,index) \
-     ((type*) array->data)[index]
-
-GArray* g_array_new      (gint      zero_terminated);
-void   g_array_free      (GArray   *array,
-                          gint      free_segment);
-GArray* g_rarray_append          (GArray   *array,
-                          gpointer  data,
-                          gint      size);
-GArray* g_rarray_prepend  (GArray   *array,
-                          gpointer  data,
-                          gint      size);
-GArray* g_rarray_truncate (GArray   *array,
-                          gint      length,
-                          gint      size);
+
+#define g_array_append_val(a,v) g_array_append_vals(a,&v,1)
+#define g_array_prepend_val(a,v) g_array_prepend_vals(a,&v,1)
+#define g_array_index(a,t,i) (((t*)a->data)[i])
+
+GArray* g_array_new         (gboolean      zero_terminated,
+                             gboolean      clear,
+                             guint         element_size);
+void   g_array_free         (GArray       *array,
+                             gboolean      free_segment);
+GArray* g_array_append_vals  (GArray       *array,
+                             gconstpointer data,
+                             guint         len);
+GArray* g_array_prepend_vals (GArray       *array,
+                             gconstpointer data,
+                             guint         len);
+GArray* g_array_set_size     (GArray       *array,
+                             guint         length);
 
 /* Resizable pointer array.  This interface is much less complicated
  * than the above.  Add appends appends a pointer.  Remove fills any
  * cleared spot and shortens the array.
  */
-
 #define            g_ptr_array_index(array,index) (array->pdata)[index]
-
 GPtrArray*  g_ptr_array_new               (void);
 void       g_ptr_array_free               (GPtrArray   *array,
                                            gboolean     free_seg);
 void       g_ptr_array_set_size           (GPtrArray   *array,
                                            gint         length);
-void       g_ptr_array_remove_index       (GPtrArray   *array,
-                                           gint         index);
-gboolean    g_ptr_array_remove            (GPtrArray   *array,
-                                           gpointer     data);
-void       g_ptr_array_add                (GPtrArray   *array,
-                                           gpointer     data);
+gpointer    g_ptr_array_remove_index       (GPtrArray   *array,
+                                           gint         index);
+gboolean    g_ptr_array_remove             (GPtrArray   *array,
+                                           gpointer     data);
+void        g_ptr_array_add                (GPtrArray   *array,
+                                           gpointer     data);
 
 /* Byte arrays, an array of guint8.  Implemented as a GArray,
  * but type-safe.
  */
 
-GByteArray* g_byte_array_new     (void);
-void       g_byte_array_free     (GByteArray *array,
-                                  gint        free_segment);
-
-GByteArray* g_byte_array_append          (GByteArray   *array,
+GByteArray* g_byte_array_new      (void);
+void       g_byte_array_free     (GByteArray   *array,
+                                  gboolean      free_segment);
+GByteArray* g_byte_array_append   (GByteArray   *array,
                                   const guint8 *data,
-                                  guint         len);
-
-GByteArray* g_byte_array_prepend  (GByteArray  *array,
+                                  guint         len);
+GByteArray* g_byte_array_prepend  (GByteArray   *array,
                                   const guint8 *data,
-                                  guint         len);
-
-GByteArray* g_byte_array_truncate (GByteArray *array,
-                                  gint        length);
+                                  guint         len);
+GByteArray* g_byte_array_set_size (GByteArray   *array,
+                                  guint         length);
 
 
 /* Hash Functions
  */
 gint  g_str_equal (gconstpointer   v,
                   gconstpointer   v2);
-guint g_str_hash  (gconstpointer v);
+guint g_str_hash  (gconstpointer   v);
 
-gint  g_int_equal (gconstpointer v,
-                  gconstpointer v2);
-guint g_int_hash  (gconstpointer v);
+gint  g_int_equal (gconstpointer   v,
+                  gconstpointer   v2);
+guint g_int_hash  (gconstpointer   v);
 
 /* This "hash" function will just return the key's adress as an
  * unsigned integer. Useful for hashing on plain adresses or
@@ -1020,6 +1440,7 @@ GQuark      g_quark_from_static_string    (const gchar    *string);
 GQuark   g_quark_from_string           (const gchar    *string);
 gchar*   g_quark_to_string             (GQuark          quark);
 
+
 /* Location Associated Data
  */
 void     g_dataset_destroy             (gconstpointer   dataset_location);
@@ -1032,14 +1453,20 @@ void      g_dataset_id_set_data_full    (gconstpointer   dataset_location,
 void     g_dataset_id_set_destroy      (gconstpointer   dataset_location,
                                         GQuark          key_id,
                                         GDestroyNotify  destroy_func);
-
-#define          g_dataset_id_set_data(l,k,d)  G_STMT_START{g_dataset_id_set_data_full((l),(k),(d),NULL);}G_STMT_END
-#define          g_dataset_id_remove_data(l,k) G_STMT_START{g_dataset_id_set_data((l),(k),NULL);}G_STMT_END
-#define          g_dataset_get_data(l,k)       (g_dataset_id_get_data((l),g_quark_try_string(k)))
-#define          g_dataset_set_data_full(l,k,d,f) G_STMT_START{g_dataset_id_set_data_full((l),g_quark_from_string(k),(d),(f));}G_STMT_END
-#define          g_dataset_set_destroy(l,k,f)  G_STMT_START{g_dataset_id_set_destroy((l),g_quark_from_string(k),(f));}G_STMT_END
-#define          g_dataset_set_data(l,k,d)     G_STMT_START{g_dataset_set_data_full((l),(k),(d),NULL);}G_STMT_END
-#define          g_dataset_remove_data(l,k)    G_STMT_START{g_dataset_set_data((l),(k),NULL);}G_STMT_END
+#define          g_dataset_id_set_data(l, k, d)        \
+     g_dataset_id_set_data_full ((l), (k), (d), NULL)
+#define          g_dataset_id_remove_data(l, k)        \
+     g_dataset_id_set_data ((l), (k), NULL)
+#define          g_dataset_get_data(l, k)              \
+     (g_dataset_id_get_data ((l), g_quark_try_string (k)))
+#define          g_dataset_set_data_full(l, k, d, f)   \
+     g_dataset_id_set_data_full ((l), g_quark_from_string (k), (d), (f))
+#define          g_dataset_set_destroy(l, k, f)        \
+     g_dataset_id_set_destroy ((l), g_quark_from_string (k), (f))
+#define          g_dataset_set_data(l, k, d)           \
+     g_dataset_set_data_full ((l), (k), (d), NULL)
+#define          g_dataset_remove_data(l,k)            \
+     g_dataset_set_data ((l), (k), NULL)
 
 
 /* GScanner: Flexible lexical scanner for general purpose.
@@ -1074,7 +1501,7 @@ typedef enum
 typedef enum
 {
   G_TOKEN_EOF                  =   0,
-  
+
   G_TOKEN_LEFT_PAREN           = '(',
   G_TOKEN_RIGHT_PAREN          = ')',
   G_TOKEN_LEFT_CURLY           = '{',
@@ -1083,11 +1510,11 @@ typedef enum
   G_TOKEN_RIGHT_BRACE          = ']',
   G_TOKEN_EQUAL_SIGN           = '=',
   G_TOKEN_COMMA                        = ',',
-  
+
   G_TOKEN_NONE                 = 256,
-  
+
   G_TOKEN_ERROR,
-  
+
   G_TOKEN_CHAR,
   G_TOKEN_BINARY,
   G_TOKEN_OCTAL,
@@ -1095,11 +1522,11 @@ typedef enum
   G_TOKEN_HEX,
   G_TOKEN_FLOAT,
   G_TOKEN_STRING,
-  
+
   G_TOKEN_SYMBOL,
   G_TOKEN_IDENTIFIER,
   G_TOKEN_IDENTIFIER_NULL,
-  
+
   G_TOKEN_COMMENT_SINGLE,
   G_TOKEN_COMMENT_MULTI,
   G_TOKEN_LAST
@@ -1128,11 +1555,11 @@ struct  _GScannerConfig
   gchar                *cset_identifier_first;
   gchar                *cset_identifier_nth;
   gchar                *cpair_comment_single;          /* default: "#\n" */
-  
+
   /* Should symbol lookup work case sensitive?
    */
   guint                case_sensitive : 1;
-  
+
   /* Boolean values to be adjusted "on the fly"
    * to configure scanning behaviour.
    */
@@ -1155,6 +1582,7 @@ struct    _GScannerConfig
   guint                identifier_2_string : 1;
   guint                char_2_token : 1;               /* return G_TOKEN_CHAR? */
   guint                symbol_2_token : 1;
+  guint                scope_0_fallback : 1;           /* try scope 0 on lookups? */
 };
 
 struct _GScanner
@@ -1193,6 +1621,7 @@ struct    _GScanner
   guint                        text_len;
   gint                 input_fd;
   gint                 peeked_char;
+  guint                        scope_id;
 
   /* handler function for _warn and _error */
   GScannerMsgFunc      msg_handler;
@@ -1212,15 +1641,23 @@ GValue          g_scanner_cur_value             (GScanner       *scanner);
 guint          g_scanner_cur_line              (GScanner       *scanner);
 guint          g_scanner_cur_position          (GScanner       *scanner);
 gboolean       g_scanner_eof                   (GScanner       *scanner);
-void           g_scanner_add_symbol            (GScanner       *scanner,
+guint          g_scanner_set_scope             (GScanner       *scanner,
+                                                guint           scope_id);
+void           g_scanner_scope_add_symbol      (GScanner       *scanner,
+                                                guint           scope_id,
                                                 const gchar    *symbol,
                                                 gpointer       value);
-gpointer       g_scanner_lookup_symbol         (GScanner       *scanner,
+void           g_scanner_scope_remove_symbol   (GScanner       *scanner,
+                                                guint           scope_id,
+                                                const gchar    *symbol);
+gpointer       g_scanner_scope_lookup_symbol   (GScanner       *scanner,
+                                                guint           scope_id,
                                                 const gchar    *symbol);
-void           g_scanner_foreach_symbol        (GScanner       *scanner,
+void           g_scanner_scope_foreach_symbol  (GScanner       *scanner,
+                                                guint           scope_id,
                                                 GHFunc          func,
                                                 gpointer        func_data);
-void           g_scanner_remove_symbol         (GScanner       *scanner,
+gpointer       g_scanner_lookup_symbol         (GScanner       *scanner,
                                                 const gchar    *symbol);
 void           g_scanner_freeze_symbol_table   (GScanner       *scanner);
 void           g_scanner_thaw_symbol_table     (GScanner       *scanner);
@@ -1238,33 +1675,40 @@ void            g_scanner_warn                  (GScanner       *scanner,
                                                 const gchar    *format,
                                                 ...) G_GNUC_PRINTF (2,3);
 gint           g_scanner_stat_mode             (const gchar    *filename);
+/* keep downward source compatibility */
+#define                g_scanner_add_symbol( scanner, symbol, value )  G_STMT_START { \
+  g_scanner_scope_add_symbol ((scanner), 0, (symbol), (value)); \
+} G_STMT_END
+#define                g_scanner_remove_symbol( scanner, symbol )      G_STMT_START { \
+  g_scanner_scope_remove_symbol ((scanner), 0, (symbol)); \
+} G_STMT_END
+#define                g_scanner_foreach_symbol( scanner, func, data ) G_STMT_START { \
+  g_scanner_scope_foreach_symbol ((scanner), 0, (func), (data)); \
+} G_STMT_END
 
 
 /* Completion */
 
-typedef gchar* (*GCompletionFunc)(gpointer);
-
-typedef struct _GCompletion GCompletion;
-
-struct _GCompletion {
-       GList* items;
-       GCompletionFunc func;
-
-       gchar* prefix;
-       GList* cache;
+struct _GCompletion
+{
+  GList* items;
+  GCompletionFunc func;
 
+  gchar* prefix;
+  GList* cache;
 };
 
 GCompletion* g_completion_new         (GCompletionFunc func);
-void        g_completion_add_items    (GCompletion* cmp, 
-                                       GList* items);
-void        g_completion_remove_items (GCompletion* cmp, 
-                                       GList* items);
-void        g_completion_clear_items  (GCompletion* cmp);
-GList*      g_completion_complete     (GCompletion* cmp, 
-                                       gchar* prefix,
-                                       gchar** new_prefix);
-void        g_completion_free         (GCompletion* cmp);
+void        g_completion_add_items    (GCompletion*    cmp,
+                                       GList*          items);
+void        g_completion_remove_items (GCompletion*    cmp,
+                                       GList*          items);
+void        g_completion_clear_items  (GCompletion*    cmp);
+GList*      g_completion_complete     (GCompletion*    cmp,
+                                       gchar*          prefix,
+                                       gchar**         new_prefix);
+void        g_completion_free         (GCompletion*    cmp);
+
 
 /* GRelation: Indexed Relations.  Imagine a really simple table in a
  * database.  Relations are not ordered.  This data type is meant for
@@ -1314,6 +1758,18 @@ gpointer   g_tuples_index     (GTuples      *tuples,
                               gint         field);
 
 
+/* Prime numbers.
+ */
+
+/* This function returns prime numbers spaced by approximately 1.5-2.0
+ * and is for use in resizing data structures which prefer
+ * prime-valued sizes.  The closest spaced prime function returns the
+ * next largest prime, or the highest it knows about which is about
+ * MAXINT/4.
+ */
+
+guint      g_spaced_primes_closest (guint num);
+
 /* Glib version.
  */
 extern const guint glib_major_version;