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 d04499a..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:
  *
@@ -72,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.
@@ -82,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" {
@@ -103,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
@@ -127,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.
@@ -253,7 +278,6 @@ 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.
  */
@@ -322,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
@@ -655,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;
@@ -686,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;
@@ -866,6 +889,72 @@ struct _GTuples
 };
 
 
+/* 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
+{
+  gfloat v_float;
+  struct {
+    guint mantissa : 23;
+    guint biased_exponent : 8;
+    guint sign : 1;
+  } mpn;
+};
+union _GDoubleIEEE754
+{
+  gdouble v_double;
+  struct {
+    guint mantissa_low : 32;
+    guint mantissa_high : 20;
+    guint biased_exponent : 11;
+    guint sign : 1;
+  } mpn;
+};
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+union _GFloatIEEE754
+{
+  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
  */
 void   g_list_push_allocator    (GAllocator     *allocator);
@@ -970,7 +1059,7 @@ gpointer g_slist_nth_data  (GSList         *list,
 
 /* Queues
  */
-GQueue*  g_queue_create         (void);
+GQueue*  g_queue_new            (void);
 void     g_queue_free           (GQueue  *queue);
 void     g_queue_push_head      (GQueue  *queue,
                                 gpointer data);
@@ -1082,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,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,
@@ -1515,8 +1605,28 @@ gchar*    g_strconcat            (const gchar *string1,
                                 ...); /* NULL terminated */
 gchar*   g_strjoin             (const gchar  *separator,
                                 ...); /* NULL terminated */
-/* deprecated function */
-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);
@@ -1654,7 +1764,7 @@ G_INLINE_FUNC void
 g_trash_stack_push (GTrashStack **stack_p,
                    gpointer      data_p)
 {
-  GTrashStack *data = data_p;
+  GTrashStack *data = (GTrashStack *) data_p;
 
   data->next = *stack_p;
   *stack_p = data;
@@ -1672,7 +1782,10 @@ g_trash_stack_pop (GTrashStack **stack_p)
   if (data)
     {
       *stack_p = data->next;
-      memset (data, 0, sizeof (GTrashStack));
+      /* NULLify private pointer here, most platforms store NULL as
+       * subsequent 0 bytes
+       */
+      data->next = NULL;
     }
 
   return data;
@@ -1723,19 +1836,29 @@ gchar*        g_string_chunk_insert_const  (GStringChunk *chunk,
 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);
@@ -1869,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,
@@ -1899,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,
@@ -2554,7 +2677,7 @@ struct _GSourceFuncs
                        GTimeVal *current_time,
                        gpointer  user_data);
   gboolean (*dispatch) (gpointer  source_data, 
-                       GTimeVal *current_time,
+                       GTimeVal *dispatch_time,
                        gpointer  user_data);
   GDestroyNotify destroy;
 };
@@ -2582,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);
@@ -2670,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;
 
@@ -2728,51 +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, like <stdio.h>, <io.h>, <direct.h> or <process.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
-#    define fileno             _fileno
-#endif
-#    define fstat              _fstat
-#    define unlink             _unlink
-#    define open               _open
-#    define read               _read
-#    define write              _write
-#    define lseek              _lseek
-#    define close              _close
-#    define rmdir              _rmdir
-#    define pipe(phandles)     _pipe (phandles, 4096, _O_BINARY)
-#    define popen              _popen
-#    define pclose             _pclose
-#    define fdopen             _fdopen
-#    define hypot              _hypot
-#    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;
@@ -2786,13 +2902,28 @@ 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
@@ -2805,7 +2936,7 @@ typedef enum
     G_THREAD_PRIORITY_LOW,
     G_THREAD_PRIORITY_NORMAL,
     G_THREAD_PRIORITY_HIGH,
-    G_THREAD_PRIORITY_URGENT
+    G_THREAD_PRIORITY_URGENT
 } GThreadPriority;
 
 typedef struct _GThread         GThread;
@@ -2842,18 +2973,19 @@ struct _GThreadFunctions
   gpointer  (*private_get)        (GPrivate            *private_key);
   void      (*private_set)        (GPrivate            *private_key,
                                   gpointer              data);
-  gpointer  (*thread_create)      (GThreadFunc                  thread_func,
+  void      (*thread_create)      (GThreadFunc                  thread_func,
                                   gpointer              arg,
                                   gulong                stack_size,
                                   gboolean              joinable,
                                   gboolean              bound,
-                                  GThreadPriority       priority);
+                                  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);
-  gpointer  (*thread_self)        (void);
+  void      (*thread_self)        (gpointer              thread);
 };
 
 GUTILS_C_VAR GThreadFunctions  g_thread_functions_for_glib_use;
@@ -2942,24 +3074,22 @@ void g_static_private_set_for_thread (GStaticPrivate *private_key,
                                      GThread        *thread,
                                      gpointer        data,
                                      GDestroyNotify  notify);
-#ifndef G_STATIC_REC_MUTEX_INIT
-/* if GStaticRecMutex is not just a differently initialized GStaticMutex, 
- * the following is done:
- * This can't be done in glibconfig.h, as GStaticPrivate and gboolean
- * are not yet known there 
- */
+
 typedef struct _GStaticRecMutex GStaticRecMutex;
 struct _GStaticRecMutex
 {
   GStaticMutex mutex;
-  GStaticPrivate counter; 
+  unsigned int depth;
+  GSystemThread owner;
 };
-#define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT, G_STATIC_PRIVATE_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);
-#define  g_static_rec_mutex_get_mutex(mutex) ((mutex)->mutex)
-#endif /* G_STATIC_REC_MUTEX_INIT */
+
+#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
@@ -3031,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