/* Custom glibconfig.h for multiple targets */

#ifndef __GLIBCONFIG_H__
#define __GLIBCONFIG_H__

#include <glib/gmacros.h>
#include <limits.h>
#include <float.h>
#define GLIB_HAVE_ALLOCA_H
#define GLIB_USING_SYSTEM_PRINTF

G_BEGIN_DECLS

#define G_MINFLOAT FLT_MIN
#define G_MAXFLOAT FLT_MAX
#define G_MINDOUBLE DBL_MIN
#define G_MAXDOUBLE DBL_MAX
#define G_MINSHORT SHRT_MIN
#define G_MAXSHORT SHRT_MAX
#define G_MAXUSHORT USHRT_MAX
#define G_MININT INT_MIN
#define G_MAXINT INT_MAX
#define G_MAXUINT UINT_MAX
#define G_MINLONG LONG_MIN
#define G_MAXLONG LONG_MAX
#define G_MAXULONG ULONG_MAX

typedef signed char gint8;
typedef unsigned char guint8;
typedef signed short gint16;
typedef unsigned short guint16;
#define G_GINT16_MODIFIER "h"
#define G_GINT16_FORMAT "hi"
#define G_GUINT16_FORMAT "hu"
typedef signed int gint32;
typedef unsigned int guint32;
#define G_GINT32_MODIFIER ""
#define G_GINT32_FORMAT "i"
#define G_GUINT32_FORMAT "u"

#define G_HAVE_GINT64 1

#ifdef _WIN32
	typedef signed long long gint64;
	typedef unsigned long long guint64;
	#define G_GINT64_CONSTANT(val) (val##LL)
	#define G_GUINT64_CONSTANT(val) (val##ULL)
	#define G_GINT64_MODIFIER "I64"
	#define G_GINT64_FORMAT "I64i"
	#define G_GUINT64_FORMAT "I64u"

	#ifdef _WIN64
		#define GLIB_SIZEOF_VOID_P 8
		#define GLIB_SIZEOF_LONG   4
		#define GLIB_SIZEOF_SIZE_T 8

		typedef signed long long gssize;
		typedef unsigned long long gsize;
		#define G_GSIZE_MODIFIER "I64"
		#define G_GSSIZE_MODIFIER "I64"
		#define G_GSIZE_FORMAT "I64u"
		#define G_GSSIZE_FORMAT "I64d"

		#define G_MAXSIZE G_MAXUINT64
		#define G_MINSSIZE G_MININT64
		#define G_MAXSSIZE G_MAXINT64
	#else
		#define GLIB_SIZEOF_VOID_P 4
		#define GLIB_SIZEOF_LONG   4
		#define GLIB_SIZEOF_SIZE_T 4

		typedef signed int gssize;
		typedef unsigned int gsize;
		#define G_GSIZE_MODIFIER ""
		#define G_GSSIZE_MODIFIER ""
		#define G_GSIZE_FORMAT "u"
		#define G_GSSIZE_FORMAT "i"

		#define G_MAXSIZE G_MAXUINT
		#define G_MINSSIZE G_MININT
		#define G_MAXSSIZE G_MAXINT
	#endif
#else
	#ifdef __LP64__
		typedef signed long gint64;
		typedef unsigned long guint64;
		#define G_GINT64_CONSTANT(val) (val##L)
		#define G_GUINT64_CONSTANT(val) (val##UL)
		#define G_GINT64_MODIFIER "l"
		#define G_GINT64_FORMAT "li"
		#define G_GUINT64_FORMAT "lu"
		#define GLIB_SIZEOF_VOID_P 8
		#define GLIB_SIZEOF_LONG   8
		#define GLIB_SIZEOF_SIZE_T 8
		#define GLIB_SIZEOF_SSIZE_T 8

		typedef signed long gssize;
		typedef unsigned long gsize;
		#define G_GSIZE_MODIFIER "l"
		#define G_GSSIZE_MODIFIER "l"
		#define G_GSIZE_FORMAT "lu"
		#define G_GSSIZE_FORMAT "li"
		#define G_MAXSIZE G_MAXULONG
		#define G_MINSSIZE G_MINLONG
		#define G_MAXSSIZE G_MAXLONG
	#else
		typedef signed long long gint64;
		typedef unsigned long long guint64;
		#define G_GINT64_CONSTANT(val) (val##LL)
		#define G_GUINT64_CONSTANT(val) (val##ULL)
		#define G_GINT64_MODIFIER "ll"
		#define G_GINT64_FORMAT "lli"
		#define G_GUINT64_FORMAT "llu"
		#define GLIB_SIZEOF_VOID_P 4
		#define GLIB_SIZEOF_LONG   4
		#define GLIB_SIZEOF_SIZE_T 4
		#define GLIB_SIZEOF_SSIZE_T 4

		typedef signed int gssize;
		typedef unsigned int gsize;
		#define G_GSIZE_MODIFIER ""
		#define G_GSSIZE_MODIFIER ""
		#define G_GSIZE_FORMAT "u"
		#define G_GSSIZE_FORMAT "i"
		#define G_MAXSIZE G_MAXUINT
		#define G_MINSSIZE G_MININT
		#define G_MAXSSIZE G_MAXINT
	#endif
#endif

typedef gint64 goffset;
#define G_MINOFFSET G_MININT64
#define G_MAXOFFSET G_MAXINT64

#define G_GOFFSET_MODIFIER      G_GINT64_MODIFIER
#define G_GOFFSET_FORMAT        G_GINT64_FORMAT
#define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val)

#ifdef _WIN32
	#ifdef _WIN64
		#define GPOINTER_TO_INT(p) ((gint)  (gint64) (p))
		#define GPOINTER_TO_UINT(p) ((guint) (guint64) (p))
		#define GINT_TO_POINTER(i) ((gpointer) (gint64) (i))
		#define GUINT_TO_POINTER(u) ((gpointer) (guint64) (u))
		typedef signed long long gintptr;
		typedef unsigned long long guintptr;
		#define G_GINTPTR_MODIFIER      "I64"
		#define G_GINTPTR_FORMAT        "I64i"
		#define G_GUINTPTR_FORMAT       "I64u"
	#else
		#define GPOINTER_TO_INT(p) ((gint)   (p))
		#define GPOINTER_TO_UINT(p) ((guint)  (p))
		#define GINT_TO_POINTER(i) ((gpointer)  (i))
		#define GUINT_TO_POINTER(u) ((gpointer)  (u))
		typedef signed int gintptr;
		typedef unsigned int guintptr;
		#define G_GINTPTR_MODIFIER      ""
		#define G_GINTPTR_FORMAT        "i"
		#define G_GUINTPTR_FORMAT       "u"
	#endif
#else
	#ifdef __LP64__
		#define GPOINTER_TO_INT(p) ((gint)  (glong) (p))
		#define GPOINTER_TO_UINT(p) ((guint) (gulong) (p))
		#define GINT_TO_POINTER(i) ((gpointer) (glong) (i))
		#define GUINT_TO_POINTER(u) ((gpointer) (gulong) (u))
		typedef signed long gintptr;
		typedef unsigned long guintptr;
		#define G_GINTPTR_MODIFIER      "l"
		#define G_GINTPTR_FORMAT        "li"
		#define G_GUINTPTR_FORMAT       "lu"
	#else
		#define GPOINTER_TO_INT(p) ((gint)  (gint) (p))
		#define GPOINTER_TO_UINT(p) ((guint) (guint) (p))
		#define GINT_TO_POINTER(i) ((gpointer) (gint) (i))
		#define GUINT_TO_POINTER(u) ((gpointer) (guint) (u))
		typedef signed int gintptr;
		typedef unsigned int guintptr;
		#define G_GINTPTR_MODIFIER      ""
		#define G_GINTPTR_FORMAT        "i"
		#define G_GUINTPTR_FORMAT       "u"
	#endif
#endif

#ifndef G_DISABLE_DEPRECATED
#define g_ATEXIT(proc)	(atexit (proc))
#define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END
#endif

#define GLIB_MAJOR_VERSION @GLIB_MAJOR_VERSION@
#define GLIB_MINOR_VERSION @GLIB_MINOR_VERSION@
#define GLIB_MICRO_VERSION @GLIB_MICRO_VERSION@

#ifdef __CYGWIN__
	#define G_OS_UNIX
	#define G_PLATFORM_WIN32
	#define G_WITH_CYGWIN
#elif defined _WIN32
	#define G_OS_WIN32
	#define G_PLATFORM_WIN32
#else
	#define G_OS_UNIX
#endif

#define G_VA_COPY	va_copy
#ifdef __LP64__ // TODO: not sure whether this is correct
	#define G_VA_COPY_AS_ARRAY 1
#endif

#define G_HAVE_ISO_VARARGS 1
#define G_HAVE_GNUC_VARARGS 1
#define G_HAVE_GROWING_STACK 0
#ifdef _WIN32
	#define G_GNUC_INTERNAL
#else
	#define G_HAVE_GNUC_VISIBILITY 1
	#define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
#endif
#define G_THREADS_ENABLED
#ifdef _WIN32
	#define G_THREADS_IMPL_WIN32
#else
	#define G_THREADS_IMPL_POSIX
#endif
#define G_ATOMIC_LOCK_FREE

#define GINT16_TO_LE(val) ((gint16) (val))
#define GUINT16_TO_LE(val) ((guint16) (val))
#define GINT16_TO_BE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
#define GUINT16_TO_BE(val) (GUINT16_SWAP_LE_BE (val))
#define GINT32_TO_LE(val) ((gint32) (val))
#define GUINT32_TO_LE(val) ((guint32) (val))
#define GINT32_TO_BE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
#define GUINT32_TO_BE(val) (GUINT32_SWAP_LE_BE (val))
#define GINT64_TO_LE(val) ((gint64) (val))
#define GUINT64_TO_LE(val) ((guint64) (val))
#define GINT64_TO_BE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
#define GUINT64_TO_BE(val) (GUINT64_SWAP_LE_BE (val))
#ifdef __LP64__
	#define GLONG_TO_LE(val) ((glong) GINT64_TO_LE (val))
	#define GULONG_TO_LE(val) ((gulong) GUINT64_TO_LE (val))
	#define GLONG_TO_BE(val) ((glong) GINT64_TO_BE (val))
	#define GULONG_TO_BE(val) ((gulong) GUINT64_TO_BE (val))
#else
	#define GLONG_TO_LE(val) ((glong) GINT32_TO_LE (val))
	#define GULONG_TO_LE(val) ((gulong) GUINT32_TO_LE (val))
	#define GLONG_TO_BE(val) ((glong) GINT32_TO_BE (val))
	#define GULONG_TO_BE(val) ((gulong) GUINT32_TO_BE (val))
#endif
#define GINT_TO_LE(val)  ((gint) GINT32_TO_LE (val))
#define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val))
#define GINT_TO_BE(val)  ((gint) GINT32_TO_BE (val))
#define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val))
#if defined __LP64__ || defined _WIN64
	#define GSIZE_TO_LE(val) ((gsize) GUINT64_TO_LE (val))
	#define GSSIZE_TO_LE(val) ((gssize) GINT64_TO_LE (val))
	#define GSIZE_TO_BE(val) ((gsize) GUINT64_TO_BE (val))
	#define GSSIZE_TO_BE(val) ((gssize) GINT64_TO_BE (val))
#else
	#define GSIZE_TO_LE(val) ((gsize) GUINT32_TO_LE (val))
	#define GSSIZE_TO_LE(val) ((gssize) GINT32_TO_LE (val))
	#define GSIZE_TO_BE(val) ((gsize) GUINT32_TO_BE (val))
	#define GSSIZE_TO_BE(val) ((gssize) GINT32_TO_BE (val))
#endif
#define G_BYTE_ORDER G_LITTLE_ENDIAN

#define GLIB_SYSDEF_POLLIN =1
#define GLIB_SYSDEF_POLLOUT =4
#define GLIB_SYSDEF_POLLPRI =2
#define GLIB_SYSDEF_POLLHUP =16
#define GLIB_SYSDEF_POLLERR =8
#define GLIB_SYSDEF_POLLNVAL =32

#if defined _WIN32 || defined __CYGWIN__
	#define G_MODULE_SUFFIX "dll"
	typedef void *GPid;
#else
	#define G_MODULE_SUFFIX "so"
	typedef int GPid;
#endif

#define GLIB_SYSDEF_AF_UNIX 1
#define GLIB_SYSDEF_AF_INET 2
#if defined _WIN32 || defined __CYGWIN__
	#define GLIB_SYSDEF_AF_INET6 23
#elif defined __FreeBSD__
	#define GLIB_SYSDEF_AF_INET6 28
#elif defined __OpenBSD__ || defined __NetBSD__
	#define GLIB_SYSDEF_AF_INET6 24
#elif defined __APPLE__
	#define GLIB_SYSDEF_AF_INET6 30
#else
	#define GLIB_SYSDEF_AF_INET6 10
#endif

#define GLIB_SYSDEF_MSG_OOB 1
#define GLIB_SYSDEF_MSG_PEEK 2
#define GLIB_SYSDEF_MSG_DONTROUTE 4

G_END_DECLS

#endif
