#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:
*
#endif
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
/* On native Win32, directory separator is the backslash, and search path
* separator is the semicolon.
#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" {
* 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
#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.
#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.
*/
} 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
* 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;
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;
};
+/* 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);
/* 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);
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);
#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,
...); /* 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);
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;
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;
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);
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,
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,
GTimeVal *current_time,
gpointer user_data);
gboolean (*dispatch) (gpointer source_data,
- GTimeVal *current_time,
+ GTimeVal *dispatch_time,
gpointer user_data);
GDestroyNotify destroy;
};
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);
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;
/* 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;
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
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;
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;
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
# 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