Renamed g_queue_create to g_queue_new in conformance to all other GLib
[platform/upstream/glib.git] / glib.h
diff --git a/glib.h b/glib.h
index df3dd5c..0772413 100644 (file)
--- a/glib.h
+++ b/glib.h
 #ifndef __G_LIB_H__
 #define __G_LIB_H__
 
+/* Here we provide G_GNUC_EXTENSION as an alias for __extension__,
+ * where this is valid. This allows for warningless compilation of
+ * "long long" types even in the presence of '-ansi -pedantic'. This
+ * of course should be with the other GCC-isms below, but then
+ * glibconfig.h wouldn't load cleanly and it is better to have that
+ * here, than in glibconfig.h.  
+ */
+#if    __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
+#  define G_GNUC_EXTENSION __extension__
+#else
+#  define G_GNUC_EXTENSION
+#endif
+
 /* system specific config file glibconfig.h provides definitions for
  * the extrema of many of the standard types. These are:
  *
  * And it provides a way to store and retrieve a `gint' in/from a `gpointer'.
  * This is useful to pass an integer instead of a pointer to a callback.
  *
- *  GINT_TO_POINTER(i), GUINT_TO_POINTER(i)
- *  GPOINTER_TO_INT(p), GPOINTER_TO_UINT(p)
+ *  GINT_TO_POINTER (i), GUINT_TO_POINTER (i)
+ *  GPOINTER_TO_INT (p), GPOINTER_TO_UINT (p)
  *
- * Finally, it provide the following wrappers to STDC functions:
+ * Finally, it provides the following wrappers to STDC functions:
  *
- *  g_ATEXIT
- *    To register hooks which are executed on exit().
- *    Usually a wrapper for STDC atexit.
- *
- *  void *g_memmove(void *dest, const void *src, guint count);
+ *  void g_memmove (gpointer dest, gconstpointer void *src, gulong count);
  *    A wrapper for STDC memmove, or an implementation, if memmove doesn't
  *    exist.  The prototype looks like the above, give or take a const,
  *    or size_t.
@@ -76,7 +85,7 @@
 #endif
 
 
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
 
 /* On native Win32, directory separator is the backslash, and search path
  * separator is the semicolon.
@@ -86,7 +95,7 @@
 #define G_SEARCHPATH_SEPARATOR ';'
 #define G_SEARCHPATH_SEPARATOR_S ";"
 
-#else  /* !NATIVE_WIN32 */
+#else  /* !G_OS_WIN32 */
 
 /* Unix */
 
 #define G_SEARCHPATH_SEPARATOR ':'
 #define G_SEARCHPATH_SEPARATOR_S ":"
 
-#endif /* !NATIVE_WIN32 */
+#endif /* !G_OS_WIN32 */
 
 #ifdef __cplusplus
 extern "C" {
@@ -107,8 +116,12 @@ extern "C" {
  *  been defined. It is assumed that if they are already
  *  defined then the current definition is correct.
  */
-#ifndef        NULL
-#define        NULL    ((void*) 0)
+#ifndef NULL
+#  ifdef __cplusplus
+#    define NULL        (0L)
+#  else /* !__cplusplus */
+#    define NULL        ((void*) 0)
+#  endif /* !__cplusplus */
 #endif
 
 #ifndef        FALSE
@@ -131,6 +144,14 @@ extern "C" {
 #undef CLAMP
 #define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
 
+#define G_STRINGIFY(macro_or_string)   G_STRINGIFY_ARG (macro_or_string)
+#define        G_STRINGIFY_ARG(contents)       #contents
+
+/* Count the number of elements in an array. The array must be defined
+ * as such; using this with a dynamically allocated array will give
+ * incorrect results.
+ */
+#define G_N_ELEMENTS(arr)              (sizeof (arr) / sizeof ((arr)[0]))
 
 /* 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.
@@ -257,16 +278,15 @@ extern "C" {
 #define        G_GNUC_UNUSED
 #endif /* !__GNUC__ */
 
-
 /* 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__)
-#define        G_GNUC_PRETTY_FUNCTION  (__PRETTY_FUNCTION__)
+#define        G_GNUC_FUNCTION         __FUNCTION__
+#define        G_GNUC_PRETTY_FUNCTION  __PRETTY_FUNCTION__
 #else  /* !__GNUC__ */
-#define        G_GNUC_FUNCTION         ("")
-#define        G_GNUC_PRETTY_FUNCTION  ("")
+#define        G_GNUC_FUNCTION         ""
+#define        G_GNUC_PRETTY_FUNCTION  ""
 #endif /* !__GNUC__ */
 
 /* we try to provide a usefull equivalent for ATEXIT if it is
@@ -326,9 +346,6 @@ extern "C" {
 } 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
@@ -659,15 +676,15 @@ typedef gint32    GTime;
  * we prefix variable declarations so they can
  * properly get exported in windows dlls.
  */
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
 #  ifdef GLIB_COMPILATION
 #    define GUTILS_C_VAR __declspec(dllexport)
 #  else /* !GLIB_COMPILATION */
 #    define GUTILS_C_VAR extern __declspec(dllimport)
 #  endif /* !GLIB_COMPILATION */
-#else /* !NATIVE_WIN32 */
+#else /* !G_OS_WIN32 */
 #  define GUTILS_C_VAR extern
-#endif /* !NATIVE_WIN32 */
+#endif /* !G_OS_WIN32 */
 
 GUTILS_C_VAR const guint glib_major_version;
 GUTILS_C_VAR const guint glib_minor_version;
@@ -690,6 +707,8 @@ typedef struct _GCache              GCache;
 typedef struct _GCompletion    GCompletion;
 typedef        struct _GData           GData;
 typedef struct _GDebugKey      GDebugKey;
+typedef union  _GDoubleIEEE754 GDoubleIEEE754;
+typedef union  _GFloatIEEE754  GFloatIEEE754;
 typedef struct _GHashTable     GHashTable;
 typedef struct _GHook          GHook;
 typedef struct _GHookList      GHookList;
@@ -703,15 +722,16 @@ typedef struct _GRelation GRelation;
 typedef struct _GScanner       GScanner;
 typedef struct _GScannerConfig GScannerConfig;
 typedef struct _GSList         GSList;
-typedef struct _GStack         GStack;
 typedef struct _GString                GString;
 typedef struct _GStringChunk   GStringChunk;
 typedef struct _GTimer         GTimer;
+typedef struct _GTrashStack     GTrashStack;
 typedef struct _GTree          GTree;
 typedef struct _GTuples                GTuples;
 typedef union  _GTokenValue    GTokenValue;
 typedef struct _GIOChannel     GIOChannel;
 
+/* Tree traverse flags */
 typedef enum
 {
   G_TRAVERSE_LEAFS     = 1 << 0,
@@ -720,6 +740,7 @@ typedef enum
   G_TRAVERSE_MASK      = 0x03
 } GTraverseFlags;
 
+/* Tree traverse orders */
 typedef enum
 {
   G_IN_ORDER,
@@ -807,6 +828,24 @@ typedef gint               (*GTraverseFunc)        (gpointer       key,
 typedef        void            (*GVoidFunc)            (void);
 
 
+struct _GArray
+{
+  gchar *data;
+  guint len;
+};
+
+struct _GByteArray
+{
+  guint8 *data;
+  guint          len;
+};
+
+struct _GDebugKey
+{
+  gchar *key;
+  guint         value;
+};
+
 struct _GList
 {
   gpointer data;
@@ -814,22 +853,23 @@ struct _GList
   GList *prev;
 };
 
-struct _GSList
+struct _GPtrArray
 {
-  gpointer data;
-  GSList *next;
+  gpointer *pdata;
+  guint            len;
 };
 
-struct _GStack
+struct _GQueue
 {
-  GList *list;
+  GList *head;
+  GList *tail;
+  guint  length;
 };
 
-struct _GQueue
+struct _GSList
 {
-  GList *list;
-  GList *list_end;
-  guint list_size;
+  gpointer data;
+  GSList *next;
 };
 
 struct _GString
@@ -838,34 +878,81 @@ struct _GString
   gint len;
 };
 
-struct _GArray
+struct _GTrashStack
 {
-  gchar *data;
-  guint len;
+  GTrashStack *next;
 };
 
-struct _GByteArray
+struct _GTuples
 {
-  guint8 *data;
-  guint          len;
+  guint len;
 };
 
-struct _GPtrArray
+
+/* IEEE Standard 754 Single Precision Storage Format (gfloat):
+ *
+ *        31 30           23 22            0
+ * +--------+---------------+---------------+
+ * | s 1bit | e[30:23] 8bit | f[22:0] 23bit |
+ * +--------+---------------+---------------+
+ * B0------------------->B1------->B2-->B3-->
+ *
+ * IEEE Standard 754 Double Precision Storage Format (gdouble):
+ *
+ *        63 62            52 51            32   31            0
+ * +--------+----------------+----------------+ +---------------+
+ * | s 1bit | e[62:52] 11bit | f[51:32] 20bit | | f[31:0] 32bit |
+ * +--------+----------------+----------------+ +---------------+
+ * B0--------------->B1---------->B2--->B3---->  B4->B5->B6->B7->
+ */
+/* subtract from biased_exponent to form base2 exponent (normal numbers) */
+#define G_IEEE754_FLOAT_BIAS   (127)
+#define G_IEEE754_DOUBLE_BIAS  (1023)
+/* multiply with base2 exponent to get base10 exponent (nomal numbers) */
+#define G_LOG_2_BASE_10                (0.30102999566398119521)
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+union _GFloatIEEE754
 {
-  gpointer *pdata;
-  guint            len;
+  gfloat v_float;
+  struct {
+    guint mantissa : 23;
+    guint biased_exponent : 8;
+    guint sign : 1;
+  } mpn;
 };
-
-struct _GTuples
+union _GDoubleIEEE754
 {
-  guint len;
+  gdouble v_double;
+  struct {
+    guint mantissa_low : 32;
+    guint mantissa_high : 20;
+    guint biased_exponent : 11;
+    guint sign : 1;
+  } mpn;
 };
-
-struct _GDebugKey
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+union _GFloatIEEE754
 {
-  gchar *key;
-  guint         value;
+  gfloat v_float;
+  struct {
+    guint sign : 1;
+    guint biased_exponent : 8;
+    guint mantissa : 23;
+  } mpn;
+};
+union _GDoubleIEEE754
+{
+  gdouble v_double;
+  struct {
+    guint sign : 1;
+    guint biased_exponent : 11;
+    guint mantissa_high : 20;
+    guint mantissa_low : 32;
+  } mpn;
 };
+#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
+#error unknown ENDIAN type
+#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
 
 
 /* Doubly linked lists
@@ -887,12 +974,12 @@ GList* g_list_insert_sorted       (GList          *list,
                                 GCompareFunc    func);
 GList* g_list_concat           (GList          *list1,
                                 GList          *list2);
-GList* g_list_delete           (GList          *list,
-                                GList          *link);
 GList* g_list_remove           (GList          *list,
                                 gpointer        data);
 GList* g_list_remove_link      (GList          *list,
                                 GList          *llink);
+GList* g_list_delete_link      (GList          *list,
+                                GList          *link);
 GList* g_list_reverse          (GList          *list);
 GList* g_list_copy             (GList          *list);
 GList* g_list_nth              (GList          *list,
@@ -942,7 +1029,9 @@ GSList* g_slist_concat             (GSList         *list1,
 GSList* g_slist_remove         (GSList         *list,
                                 gpointer        data);
 GSList* g_slist_remove_link    (GSList         *list,
-                                GSList         *llink);
+                                GSList         *link);
+GSList* g_slist_delete_link     (GSList         *list,
+                                GSList         *link);
 GSList* g_slist_reverse                (GSList         *list);
 GSList*        g_slist_copy            (GSList         *list);
 GSList* g_slist_nth            (GSList         *list,
@@ -965,67 +1054,28 @@ GSList*  g_slist_sort           (GSList          *list,
                                 GCompareFunc    compare_func);
 gpointer g_slist_nth_data      (GSList         *list,
                                 guint           n);
-#define g_slist_next(slist)    ((slist) ? (((GSList *)(slist))->next) : NULL)
-
-
-/* Stacks
- */
-
-GStack * g_stack_new   (void);
-void    g_stack_free   (GStack *stack);
-gpointer g_stack_pop   (GStack *stack);
-
-#define g_stack_empty(stack) \
-       ((((GStack *)(stack)) && ((GStack *)(stack))->list) ? FALSE : TRUE)
-
-#define g_stack_peek(stack) \
-       ((((GStack *)(stack)) && ((GStack *)(stack))->list) ? \
-               ((GStack *)(stack))->list->data : NULL)
-
-#define g_stack_index(stack,ptr) \
-       ((((GStack *)(stack)) && ((GStack *)(stack))->list) ? \
-               g_list_index (((GStack *)(stack))->list, (ptr)) : -1)
-
-#define g_stack_push(stack,data) G_STMT_START {                                \
-           if ((GStack *)(stack))                                      \
-             ((GStack *)(stack))->list =                               \
-                 g_list_prepend (((GStack *)(stack))->list, (data));   \
-         } G_STMT_END
-
+#define  g_slist_next(slist)   ((slist) ? (((GSList *)(slist))->next) : NULL)
 
 
 /* Queues
  */
-
-GQueue *       g_queue_new             (void);
-void           g_queue_free            (GQueue *q);
-guint          g_queue_get_size        (GQueue *q);
-void           g_queue_push_front      (GQueue *q, gpointer data);
-void           g_queue_push_back       (GQueue *q, gpointer data);
-gpointer       g_queue_pop_front       (GQueue *q);
-gpointer       g_queue_pop_back        (GQueue *q);
-
-#define g_queue_empty(queue) \
-       ((((GQueue *)(queue)) && ((GQueue *)(queue))->list) ? FALSE : TRUE)
-
-#define g_queue_peek_front(queue) \
-       ((((GQueue *)(queue)) && ((GQueue *)(queue))->list) ? \
-               ((GQueue *)(queue))->list->data : NULL)
-
-#define g_queue_peek_back(queue) \
-       ((((GQueue *)(queue)) && ((GQueue *)(queue))->list_end) ? \
-               ((GQueue *)(queue))->list_end->data : NULL)
-
-#define g_queue_index(queue,ptr) \
-       ((((GQueue *)(queue)) && ((GQueue *)(queue))->list) ? \
-               g_list_index (((GQueue *)(queue))->list, (ptr)) : -1)
-
-#define                g_queue_push            g_queue_push_back
-#define                g_queue_pop             g_queue_pop_front
-#define                g_queue_peek            g_queue_peek_front
-
-
-
+GQueue*  g_queue_new            (void);
+void     g_queue_free           (GQueue  *queue);
+void     g_queue_push_head      (GQueue  *queue,
+                                gpointer data);
+void     g_queue_push_tail      (GQueue  *queue,
+                                gpointer data);
+gpointer g_queue_pop_head       (GQueue  *queue);
+gpointer g_queue_pop_tail       (GQueue  *queue);
+gboolean g_queue_is_empty       (GQueue  *queue);
+gpointer g_queue_peek_head      (GQueue  *queue);
+gpointer g_queue_peek_tail      (GQueue  *queue);
+void     g_queue_push_head_link (GQueue  *queue,
+                                GList   *link);
+void     g_queue_push_tail_link (GQueue  *queue,
+                                GList   *link);
+GList*   g_queue_pop_head_link  (GQueue  *queue);
+GList*   g_queue_pop_tail_link  (GQueue  *queue);
 
 
 /* Hash tables
@@ -1121,6 +1171,7 @@ void     g_node_pop_allocator   (void);
 GNode*  g_node_new             (gpointer          data);
 void    g_node_destroy         (GNode            *root);
 void    g_node_unlink          (GNode            *node);
+GNode*   g_node_copy            (GNode            *node);
 GNode*  g_node_insert          (GNode            *parent,
                                 gint              position,
                                 GNode            *node);
@@ -1500,6 +1551,9 @@ void g_blow_chunks (void);
 
 /* Timer
  */
+
+#define G_MICROSEC 1000000
+
 GTimer* g_timer_new    (void);
 void   g_timer_destroy (GTimer  *timer);
 void   g_timer_start   (GTimer  *timer);
@@ -1507,7 +1561,7 @@ void      g_timer_stop    (GTimer  *timer);
 void   g_timer_reset   (GTimer  *timer);
 gdouble g_timer_elapsed (GTimer         *timer,
                         gulong  *microseconds);
-
+void    g_usleep        (gulong microseconds);
 
 /* String utility functions that modify a string argument or
  * return a constant string that must not be freed.
@@ -1536,7 +1590,7 @@ gchar*  g_strchomp              (gchar        *string);
 #define g_strstrip( string )   g_strchomp (g_strchug (string))
 
 /* String utility functions that return a newly allocated string which
- * ought to be freed from the caller at some point.
+ * ought to be freed with g_free from the caller at some point.
  */
 gchar*  g_strdup               (const gchar *str);
 gchar*  g_strdup_printf        (const gchar *format,
@@ -1551,7 +1605,29 @@ gchar*    g_strconcat            (const gchar *string1,
                                 ...); /* NULL terminated */
 gchar*   g_strjoin             (const gchar  *separator,
                                 ...); /* NULL terminated */
-gchar*  g_strescape            (gchar        *string);
+/* Make a copy of a string interpreting C string -style escape
+ * sequences. Inverse of g_strescape. The recognized sequences are \b
+ * \f \n \r \t \\ \" and the octal format.
+ */
+gchar*   g_strcompress         (const gchar *source);
+
+/* Convert between the operating system (or C runtime)
+ * representation of file names and UTF-8.
+ */
+gchar*   g_filename_to_utf8 (const gchar *opsysstring);
+gchar*   g_filename_from_utf8 (const gchar *utf8string);
+
+/* Copy a string escaping nonprintable characters like in C strings.
+ * Inverse of g_strcompress. The exceptions parameter, if non-NULL, points
+ * to a string containing characters that are not to be escaped.
+ *
+ * Deprecated API: gchar* g_strescape (const gchar *source);
+ * Luckily this function wasn't used much, using NULL as second parameter
+ * provides mostly identical semantics.
+ */
+gchar*   g_strescape           (const gchar *source,
+                                const gchar *exceptions);
+
 gpointer g_memdup              (gconstpointer mem,
                                 guint         byte_size);
 
@@ -1677,6 +1753,74 @@ g_bit_storage (guint number)
 }
 #endif /* G_CAN_INLINE */
 
+
+/* Trash Stacks
+ * elements need to be >= sizeof (gpointer)
+ */
+G_INLINE_FUNC void     g_trash_stack_push      (GTrashStack **stack_p,
+                                                gpointer      data_p);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC void
+g_trash_stack_push (GTrashStack **stack_p,
+                   gpointer      data_p)
+{
+  GTrashStack *data = (GTrashStack *) data_p;
+
+  data->next = *stack_p;
+  *stack_p = data;
+}
+#endif /* G_CAN_INLINE */
+
+G_INLINE_FUNC gpointer g_trash_stack_pop       (GTrashStack **stack_p);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC gpointer
+g_trash_stack_pop (GTrashStack **stack_p)
+{
+  GTrashStack *data;
+
+  data = *stack_p;
+  if (data)
+    {
+      *stack_p = data->next;
+      /* NULLify private pointer here, most platforms store NULL as
+       * subsequent 0 bytes
+       */
+      data->next = NULL;
+    }
+
+  return data;
+}
+#endif  /* G_CAN_INLINE */
+
+G_INLINE_FUNC gpointer g_trash_stack_peek      (GTrashStack **stack_p);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC gpointer
+g_trash_stack_peek (GTrashStack **stack_p)
+{
+  GTrashStack *data;
+
+  data = *stack_p;
+
+  return data;
+}
+#endif  /* G_CAN_INLINE */
+
+G_INLINE_FUNC guint    g_trash_stack_height    (GTrashStack **stack_p);
+#ifdef G_CAN_INLINE
+G_INLINE_FUNC guint
+g_trash_stack_height (GTrashStack **stack_p)
+{
+  GTrashStack *data;
+  guint i = 0;
+
+  for (data = *stack_p; data; data = data->next)
+    i++;
+
+  return i;
+}
+#endif  /* G_CAN_INLINE */
+
+
 /* String Chunks
  */
 GStringChunk* g_string_chunk_new          (gint size);
@@ -1689,52 +1833,32 @@ gchar*        g_string_chunk_insert_const  (GStringChunk *chunk,
 
 /* Strings
  */
-typedef enum
-{
-  G_STRING_ERROR_NONE,    /* No error occurred */
-  G_STRING_ERROR_INVAL,   /* Invalid input value to function */ 
-  G_STRING_ERROR_READ,    /* read() returned an error - check errno */
-  G_STRING_ERROR_NODATA,  /* No more input data - result string may contain data */
-  G_STRING_ERROR_LENGTH   /* max_length reached */
-} GStringError;
-
-#define      g_string_length(fstring)    (fstring ? fstring->len : 0)
-#define      g_string_str(fstring)       (fstring ? fstring->str : NULL)
-#define      g_string_char(fstring, n)   (fstring->str[n])
-
-#define      g_string_copy(a,b)          (g_string_assign(a, b->str))
-#define      g_string_dup(fstring)       (fstring ? g_string_new(fstring->str) :\
-                                                    g_string_new(NULL))
-
-#define      g_string_cmp(a,b)           (strcmp(g_string_str(a), \
-                                                 g_string_str(b)))
-#define      g_string_ncmp(a,b,n)        (strncmp(g_string_str(a), \
-                                                  g_string_str(b), n))
-#define      g_string_casecmp(a,b)       (g_strcasecmp(g_string_str(a), \
-                                                       g_string_str(b)))
-#define      g_string_ncasecmp(a,b,n)    (g_strncasecmp(g_string_str(a), \
-                                                        g_string_str(b), n))
-#define      g_string_strcmp(a,b)        (strcmp(g_string_str(a), b))
-#define      g_string_strcasecmp(a,b)    (g_strcasecmp(g_string_str(a), b))
-#define      g_string_strncasecmp(a,b,n) (g_strncasecmp(g_string_str(a), b, n))
-
 GString*     g_string_new              (const gchar     *init);
 GString*     g_string_sized_new         (guint           dfl_size);
 void        g_string_free              (GString         *string,
-                                        gint             free_segment);
-GString*     g_string_assign            (GString        *lval,
+                                        gboolean         free_segment);
+GString*     g_string_assign            (GString        *string,
                                         const gchar     *rval);
 GString*     g_string_truncate          (GString        *string,
                                         gint             len);
+GString*     g_string_insert_len        (GString         *string,
+                                         gint             pos,
+                                         const gchar     *val,
+                                         gint             len);
 GString*     g_string_append            (GString        *string,
                                         const gchar     *val);
+GString*     g_string_append_len        (GString        *string,
+                                        const gchar     *val,
+                                         gint             len);
 GString*     g_string_append_c          (GString        *string,
                                         gchar            c);
 GString*     g_string_prepend           (GString        *string,
                                         const gchar     *val);
 GString*     g_string_prepend_c         (GString        *string,
                                         gchar            c);
+GString*     g_string_prepend_len       (GString        *string,
+                                        const gchar     *val,
+                                         gint             len);
 GString*     g_string_insert            (GString        *string,
                                         gint             pos,
                                         const gchar     *val);
@@ -1752,20 +1876,6 @@ void         g_string_sprintf           (GString  *string,
 void         g_string_sprintfa          (GString        *string,
                                         const gchar     *format,
                                         ...) G_GNUC_PRINTF (2, 3);
-GStringError g_string_readline          (GString        *dest_str,
-                                        gint            max_length,
-                                        gint            fd);
-GStringError g_string_readline_buffered (GString        *dest_str,
-                                        GString         *buff_str,
-                                        gint             max_length,
-                                        gint             fd,
-                                        gint             match_bare_cr);
-GList*       g_string_tokenise          (GString        *string,
-                                        gchar           *delims,
-                                        gint             max_tokens,
-                                        gint             allow_empty);
-void         g_string_tokenise_free     (GList          *tokens,
-                                        gint             free_token);
 
 
 /* Resizable arrays, remove fills any cleared spot and shortens the
@@ -1882,7 +1992,7 @@ void        g_datalist_id_set_data_full    (GData          **datalist,
                                          GQuark           key_id,
                                          gpointer         data,
                                          GDestroyNotify   destroy_func);
-void     g_datalist_id_remove_no_notify (GData          **datalist,
+gpointer  g_datalist_id_remove_no_notify (GData                 **datalist,
                                          GQuark           key_id);
 void     g_datalist_foreach             (GData          **datalist,
                                          GDataForeachFunc func,
@@ -1912,7 +2022,7 @@ void        g_dataset_id_set_data_full    (gconstpointer    dataset_location,
                                         GQuark           key_id,
                                         gpointer         data,
                                         GDestroyNotify   destroy_func);
-void     g_dataset_id_remove_no_notify (gconstpointer    dataset_location,
+gpointer  g_dataset_id_remove_no_notify        (gconstpointer    dataset_location,
                                         GQuark           key_id);
 void     g_dataset_foreach             (gconstpointer    dataset_location,
                                         GDataForeachFunc func,
@@ -2437,11 +2547,6 @@ gdouble g_rand_double          (GRand      *rand);
 gdouble g_rand_double_range    (GRand      *rand, 
                                gdouble     min, 
                                gdouble     max);
-/* This might go in, if -lm is no problem for you guys
-gdouble g_rand_normal          (GRand      *rand, 
-                               gdouble     mean, 
-                               gdouble     standard_deviation);
-*/
 
 void    g_random_set_seed      (guint32     seed);
 guint32 g_random_int           (void);
@@ -2450,10 +2555,6 @@ gint32  g_random_int_range     (gint32      min,
 gdouble g_random_double        (void);
 gdouble g_random_double_range  (gdouble     min, 
                                gdouble     max);
-/* dito
-gdouble g_random_normal        (gdouble     mean, 
-                               gdouble     standard_deviation);
-*/
  
 
 /* Prime numbers.
@@ -2570,12 +2671,14 @@ struct _GSourceFuncs
 {
   gboolean (*prepare)  (gpointer  source_data, 
                        GTimeVal *current_time,
-                       gint     *timeout);
+                       gint     *timeout,
+                       gpointer  user_data);
   gboolean (*check)    (gpointer  source_data,
-                       GTimeVal *current_time);
-  gboolean (*dispatch) (gpointer  source_data, 
                        GTimeVal *current_time,
                        gpointer  user_data);
+  gboolean (*dispatch) (gpointer  source_data, 
+                       GTimeVal *dispatch_time,
+                       gpointer  user_data);
   GDestroyNotify destroy;
 };
 
@@ -2602,7 +2705,7 @@ gboolean g_source_remove_by_source_data      (gpointer       source_data);
 gboolean g_source_remove_by_funcs_user_data  (GSourceFuncs  *funcs,
                                              gpointer       user_data);
 
-void g_get_current_time                    (GTimeVal      *result);
+void g_get_current_time                        (GTimeVal       *result);
 
 /* Running the main loop */
 GMainLoop*     g_main_new              (gboolean        is_running);
@@ -2690,7 +2793,7 @@ void        g_main_set_poll_func     (GPollFunc   func);
 GIOChannel* g_io_channel_unix_new    (int         fd);
 gint        g_io_channel_unix_get_fd (GIOChannel *channel);
 
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
 
 GUTILS_C_VAR guint g_pipe_readable_msg;
 
@@ -2748,47 +2851,44 @@ GIOChannel *g_io_channel_win32_new_stream_socket (int socket);
 
 /* Windows emulation stubs for common Unix functions
  */
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
 #  define MAXPATHLEN 1024
 
 #ifdef _MSC_VER
 typedef int pid_t;
 #endif
 
-/* These POSIXish functions are available in the Microsoft C library
- * prefixed with underscore (which of course technically speaking is
- * the Right Thing, as they are non-ANSI. Not that being non-ANSI
- * prevents Microsoft from practically requiring you to include
- * <windows.h> every now and then...).
- *
- * You still need to include the appropriate headers to get the
- * prototypes, <io.h> or <direct.h>.
+/*
+ * To get prototypes for the following POSIXish functions, you have to
+ * include the indicated non-POSIX headers. The functions are defined
+ * in OLDNAMES.LIB (MSVC) or -lmoldname-msvc (mingw32).
  *
- * For some functions, we provide emulators in glib, which are prefixed
- * with gwin_.
+ * getcwd: <direct.h> (MSVC), <io.h> (mingw32)
+ * getpid: <process.h>
+ * access: <io.h>
+ * unlink: <stdio.h> or <io.h>
+ * open, read, write, lseek, close: <io.h>
+ * rmdir: <direct.h>
+ * pipe: <direct.h>
  */
-#    define getcwd             _getcwd
-#    define getpid             _getpid
-#    define access             _access
-#ifdef __GNUC__
-#    define stat               _stat
-#endif
-#    define unlink             _unlink
-#    define open               _open
-#    define read               _read
-#    define write              _write
-#    define lseek              _lseek
-#    define close              _close
-#    define pipe(phandles)     _pipe (phandles, 4096, _O_BINARY)
-#    define popen              _popen
-#    define pclose             _pclose
-#    define fdopen             _fdopen
-#    define ftruncate(fd, size)        gwin_ftruncate (fd, size)
-#    define opendir            gwin_opendir
-#    define readdir            gwin_readdir
-#    define rewinddir          gwin_rewinddir
-#    define closedir           gwin_closedir
+
+/* pipe is not in OLDNAMES.LIB or -lmoldname-msvc. */
+#define pipe(phandles) _pipe (phandles, 4096, _O_BINARY)
+
+/* For some POSIX functions that are not provided by the MS runtime,
+ * we provide emulators in glib, which are prefixed with g_win32_.
+ */
+#    define ftruncate(fd, size)        g_win32_ftruncate (fd, size)
+
+/* -lmingw32 also has emulations for these, but we need our own
+ * for MSVC anyhow, so we might aswell use them always.
+ */
+#    define opendir            g_win32_opendir
+#    define readdir            g_win32_readdir
+#    define rewinddir          g_win32_rewinddir
+#    define closedir           g_win32_closedir
 #    define NAME_MAX 255
+
 struct DIR
 {
   gchar    *dir_name;
@@ -2802,42 +2902,90 @@ struct dirent
   gchar  d_name[NAME_MAX + 1];
 };
 /* emulation functions */
-extern int     gwin_ftruncate  (gint            f,
-                                guint           size);
-DIR*           gwin_opendir    (const gchar    *dirname);
-struct dirent* gwin_readdir    (DIR            *dir);
-void           gwin_rewinddir  (DIR            *dir);
-gint           gwin_closedir   (DIR            *dir);
-#endif  /* NATIVE_WIN32 */
+extern int     g_win32_ftruncate       (gint            f,
+                                        guint           size);
+DIR*           g_win32_opendir         (const gchar    *dirname);
+struct dirent* g_win32_readdir         (DIR            *dir);
+void           g_win32_rewinddir       (DIR            *dir);
+gint           g_win32_closedir        (DIR            *dir);
+
+/* The MS setlocale uses locale names of the form "English_United
+ * States.1252" etc. We want the Unixish standard form "en", "zh_TW"
+ * etc. This function gets the current thread locale from Windows and
+ * returns it as a string of the above form for use in forming file
+ * names etc. The returned string should be deallocated with g_free().
+ */
+gchar *                g_win32_getlocale  (void);
+
+/* Translate a Win32 error code (as returned by GetLastError()) into
+ * the corresponding message. The returned string should be deallocated
+ * with g_free().
+ */
+gchar *         g_win32_error_message (gint error);
+
+#endif  /* G_OS_WIN32 */
 
 
 /* GLib Thread support
  */
+
+typedef void           (*GThreadFunc)          (gpointer       value);
+
+typedef enum
+{
+    G_THREAD_PRIORITY_LOW,
+    G_THREAD_PRIORITY_NORMAL,
+    G_THREAD_PRIORITY_HIGH,
+    G_THREAD_PRIORITY_URGENT
+} GThreadPriority;
+
+typedef struct _GThread         GThread;
+struct  _GThread
+{
+  GThreadPriority priority;
+  gboolean bound;
+  gboolean joinable;
+};
+
 typedef struct _GMutex         GMutex;
 typedef struct _GCond          GCond;
 typedef struct _GPrivate       GPrivate;
 typedef struct _GStaticPrivate GStaticPrivate;
+
 typedef struct _GThreadFunctions GThreadFunctions;
 struct _GThreadFunctions
 {
-  GMutex*  (*mutex_new)       (void);
-  void     (*mutex_lock)      (GMutex          *mutex);
-  gboolean (*mutex_trylock)   (GMutex          *mutex);
-  void     (*mutex_unlock)    (GMutex          *mutex);
-  void     (*mutex_free)      (GMutex          *mutex);
-  GCond*   (*cond_new)        (void);
-  void     (*cond_signal)     (GCond           *cond);
-  void     (*cond_broadcast)  (GCond           *cond);
-  void     (*cond_wait)       (GCond           *cond,
-                              GMutex           *mutex);
-  gboolean (*cond_timed_wait) (GCond           *cond,
-                              GMutex           *mutex, 
-                              GTimeVal         *end_time);
-  void      (*cond_free)      (GCond           *cond);
-  GPrivate* (*private_new)    (GDestroyNotify   destructor);
-  gpointer  (*private_get)    (GPrivate                *private_key);
-  void      (*private_set)    (GPrivate                *private_key,
-                              gpointer          data);
+  GMutex*  (*mutex_new)           (void);
+  void     (*mutex_lock)          (GMutex              *mutex);
+  gboolean (*mutex_trylock)       (GMutex              *mutex);
+  void     (*mutex_unlock)        (GMutex              *mutex);
+  void     (*mutex_free)          (GMutex              *mutex);
+  GCond*   (*cond_new)            (void);
+  void     (*cond_signal)         (GCond               *cond);
+  void     (*cond_broadcast)      (GCond               *cond);
+  void     (*cond_wait)           (GCond               *cond,
+                                  GMutex               *mutex);
+  gboolean (*cond_timed_wait)     (GCond               *cond,
+                                  GMutex               *mutex, 
+                                  GTimeVal             *end_time);
+  void      (*cond_free)          (GCond               *cond);
+  GPrivate* (*private_new)        (GDestroyNotify       destructor);
+  gpointer  (*private_get)        (GPrivate            *private_key);
+  void      (*private_set)        (GPrivate            *private_key,
+                                  gpointer              data);
+  void      (*thread_create)      (GThreadFunc                  thread_func,
+                                  gpointer              arg,
+                                  gulong                stack_size,
+                                  gboolean              joinable,
+                                  gboolean              bound,
+                                  GThreadPriority       priority,
+                                  gpointer              thread);
+  void      (*thread_yield)       (void);
+  void      (*thread_join)        (gpointer             thread);
+  void      (*thread_exit)        (void);
+  void      (*thread_set_priority)(gpointer             thread, 
+                                  GThreadPriority       priority);
+  void      (*thread_self)        (gpointer              thread);
 };
 
 GUTILS_C_VAR GThreadFunctions  g_thread_functions_for_glib_use;
@@ -2885,6 +3033,20 @@ GMutex*  g_static_mutex_get_mutex_impl   (GMutex **mutex);
                                                        (void) (private_key = \
                                                         (GPrivate*) (value)), \
                                                        (private_key, value))
+#define g_thread_yield()              G_THREAD_CF (thread_yield, (void)0, ())
+#define g_thread_exit()               G_THREAD_CF (thread_exit, (void)0, ())
+
+GThread* g_thread_create (GThreadFunc           thread_func,
+                         gpointer               arg,
+                         gulong                 stack_size,
+                         gboolean               joinable,
+                         gboolean               bound,
+                         GThreadPriority        priority);
+GThread* g_thread_self ();
+void g_thread_join (GThread* thread);
+void g_thread_set_priority (GThread* thread, 
+                           GThreadPriority priority);
+
 /* GStaticMutexes can be statically initialized with the value
  * G_STATIC_MUTEX_INIT, and then they can directly be used, that is
  * much easier, than having to explicitly allocate the mutex before
@@ -2896,6 +3058,7 @@ GMutex*   g_static_mutex_get_mutex_impl   (GMutex **mutex);
     g_mutex_trylock (g_static_mutex_get_mutex (mutex))
 #define g_static_mutex_unlock(mutex) \
     g_mutex_unlock (g_static_mutex_get_mutex (mutex)) 
+
 struct _GStaticPrivate
 {
   guint index;
@@ -2905,6 +3068,49 @@ gpointer g_static_private_get (GStaticPrivate    *private_key);
 void     g_static_private_set (GStaticPrivate  *private_key, 
                               gpointer          data,
                               GDestroyNotify    notify);
+gpointer g_static_private_get_for_thread (GStaticPrivate *private_key,
+                                         GThread        *thread);
+void g_static_private_set_for_thread (GStaticPrivate *private_key, 
+                                     GThread        *thread,
+                                     gpointer        data,
+                                     GDestroyNotify  notify);
+
+typedef struct _GStaticRecMutex GStaticRecMutex;
+struct _GStaticRecMutex
+{
+  GStaticMutex mutex;
+  unsigned int depth;
+  GSystemThread owner;
+};
+
+#define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT }
+void     g_static_rec_mutex_lock        (GStaticRecMutex *mutex);
+gboolean g_static_rec_mutex_trylock     (GStaticRecMutex *mutex);
+void     g_static_rec_mutex_unlock      (GStaticRecMutex *mutex);
+void     g_static_rec_mutex_lock_full   (GStaticRecMutex *mutex,
+                                        guint            depth);
+guint    g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex);
+
+typedef struct _GStaticRWLock GStaticRWLock;
+struct _GStaticRWLock
+{
+  GStaticMutex mutex; 
+  GCond *read_cond;
+  GCond *write_cond;
+  guint read_counter;
+  gboolean write;
+  guint want_to_write;
+};
+
+#define G_STATIC_RW_LOCK_INIT { G_STATIC_MUTEX_INIT, NULL, NULL, 0, FALSE, FALSE }
+
+void      g_static_rw_lock_reader_lock    (GStaticRWLock* lock);
+gboolean  g_static_rw_lock_reader_trylock (GStaticRWLock* lock);
+void      g_static_rw_lock_reader_unlock  (GStaticRWLock* lock);
+void      g_static_rw_lock_writer_lock    (GStaticRWLock* lock);
+gboolean  g_static_rw_lock_writer_trylock (GStaticRWLock* lock);
+void      g_static_rw_lock_writer_unlock  (GStaticRWLock* lock);
+void      g_static_rw_lock_free (GStaticRWLock* lock);
 
 /* these are some convenience macros that expand to nothing if GLib
  * was configured with --disable-threads. for using StaticMutexes,
@@ -2955,7 +3161,7 @@ extern void glib_dummy_decl (void);
 #  define G_LOCK_EXTERN(name)          extern void glib_dummy_decl (void)
 #  define G_LOCK(name)
 #  define G_UNLOCK(name)
-#  define G_TRYLOCK(name)              (FALSE)
+#  define G_TRYLOCK(name)              (TRUE)
 #endif /* !G_THREADS_ENABLED */
 
 #ifdef __cplusplus