glib.h New functions for conversion between UTF-8 and the encoding
[platform/upstream/glib.git] / glib / glib.h
index dba5629..0a6d646 100644 (file)
@@ -131,6 +131,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.
@@ -326,9 +334,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
@@ -690,6 +695,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;
@@ -870,6 +877,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);
@@ -1531,6 +1604,13 @@ gchar*   g_strcompress           (const gchar *source);
  */
 gchar*   g_strescape           (const gchar *source,
                                 const gchar *exceptions);
+/*
+ * 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);
+
 /* Deprecated API:
  * gchar* g_strescape (const gchar *source);
  * Luckily this function wasn't much used.
@@ -2576,7 +2656,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;
 };
@@ -2604,7 +2684,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);
@@ -2757,44 +2837,37 @@ GIOChannel *g_io_channel_win32_new_stream_socket (int socket);
 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;
@@ -2808,12 +2881,21 @@ 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);
+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);
+
 #endif  /* G_OS_WIN32 */
 
 
@@ -2864,18 +2946,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;
@@ -3053,7 +3136,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