#ifndef RSPAMD_CONFIG_H_IN
#define RSPAMD_CONFIG_H_IN

#cmakedefine BUILD_STATIC        1
#cmakedefine CURL_FOUND          1
#cmakedefine DEBUG_MODE          1
#cmakedefine GIT_VERSION         1
#cmakedefine GLIB_COMPAT         1
#cmakedefine GLIB_HASH_COMPAT		 1
#cmakedefine GLIB_RE_COMPAT		 1
#cmakedefine GLIB_UNISCRIPT_COMPAT		 1
#cmakedefine HAVE_AIO_H          1
#cmakedefine HAVE_ARPA_INET_H    1
#cmakedefine HAVE_ASM_PAUSE      1
#cmakedefine HAVE_ATOMIC_BUILTINS 1
#cmakedefine HAVE_CLOCK_GETTIME  1
#cmakedefine HAVE_CLOCK_PROCESS_CPUTIME_ID  1
#cmakedefine HAVE_CLOCK_VIRTUAL  1
#cmakedefine HAVE_COMPATIBLE_QUEUE_H    1
#cmakedefine HAVE_CPUID_H        1
#cmakedefine HAVE_CTYPE_H        1
#cmakedefine HAVE_DIRENT_H       1
#cmakedefine HAVE_DIRFD          1
#cmakedefine HAVE_ENDIAN_H       1
#cmakedefine HAVE_EXP2L          1
#cmakedefine HAVE_EXPL           1
#cmakedefine HAVE_EXPLICIT_BZERO 1
#cmakedefine HAVE_FADVISE        1
#cmakedefine HAVE_FALLOCATE      1
#cmakedefine HAVE_FCNTL_H        1
#cmakedefine HAVE_FDATASYNC      1
#cmakedefine HAVE_FETCH_H        1
#cmakedefine HAVE_FLOCK          1
#cmakedefine HAVE_FPATHCONF      1
#cmakedefine HAVE_GETPAGESIZE    1
#cmakedefine HAVE_GET_CPUID      1
#cmakedefine HAVE_GLOB_H         1
#cmakedefine HAVE_GRP_H          1
#cmakedefine HAVE_INET_PTON      1
#cmakedefine HAVE_INTTYPES_H     1
#cmakedefine HAVE_IPV6_V6ONLY    1
#cmakedefine HAVE_LIBAIO_H       1
#cmakedefine HAVE_LIBEVENT2      1
#cmakedefine HAVE_LIBGEN_H       1
#cmakedefine HAVE_LIBUTIL_H      1
#cmakedefine HAVE_LOCALE_H       1
#cmakedefine HAVE_MACHINE_ENDIAN_H  1
#cmakedefine HAVE_MATH_H         1
#cmakedefine HAVE_MAXPATHLEN     1
#cmakedefine HAVE_MEMSET_S       1
#cmakedefine HAVE_MKSTEMP        1
#cmakedefine HAVE_MMAP_ANON      1
#cmakedefine HAVE_MMAP_NOCORE    1
#cmakedefine HAVE_MMAP_SHARED    1
#cmakedefine HAVE_NANOSLEEP      1
#cmakedefine HAVE_NETDB_H        1
#cmakedefine HAVE_NETINET_IN_H   1
#cmakedefine HAVE_NETINET_TCP_H  1
#cmakedefine HAVE_NFTW           1
#cmakedefine HAVE_OASYNC         1
#cmakedefine HAVE_ONOFOLLOW      1
#cmakedefine HAVE_OCLOEXEC       1
#cmakedefine HAVE_OPENSSL        1
#cmakedefine HAVE_O_DIRECT       1
#cmakedefine HAVE_PATH_MAX       1
#cmakedefine HAVE_PCRE_JIT       1
#cmakedefine HAVE_PCRE_JIT_FAST  1
#cmakedefine HAVE_PIDFILE        1
#cmakedefine HAVE_PIDFILE_FILENO 1
#cmakedefine HAVE_POLL_H         1
#cmakedefine HAVE_POSIX_FALLOCATE 1
#cmakedefine HAVE_PTHREAD_PROCESS_SHARED 1
#cmakedefine HAVE_PWD_H          1
#cmakedefine HAVE_RDTSC          1
#cmakedefine HAVE_READPASSPHRASE_H  1
#cmakedefine HAVE_SA_SIGINFO     1
#cmakedefine HAVE_SANE_SHMEM     1
#cmakedefine HAVE_SANE_TZSET     1
#cmakedefine HAVE_SCHED_YEILD    1
#cmakedefine HAVE_SC_NPROCESSORS_ONLN 1
#cmakedefine HAVE_SEARCH_H       1
#cmakedefine HAVE_SENDFILE       1
#cmakedefine HAVE_SETITIMER      1
#cmakedefine HAVE_SETPROCTITLE   1
#cmakedefine HAVE_SETSIG         1
#cmakedefine HAVE_SIGINFO_H      1
#cmakedefine HAVE_SOCK_SEQPACKET 1
#cmakedefine HAVE_SSL_TLSEXT_HOSTNAME 1
#cmakedefine HAVE_STDBOOL_H      1
#cmakedefine HAVE_STDINT_H       1
#cmakedefine HAVE_STDIO_H        1
#cmakedefine HAVE_STDLIB_H       1
#cmakedefine HAVE_STRINGS_H      1
#cmakedefine HAVE_STRING_H       1
#cmakedefine HAVE_STROPS_H       1
#cmakedefine HAVE_SYSEXITS_H     1
#cmakedefine HAVE_SYSLOG_H       1
#cmakedefine HAVE_SYS_CDEFS_H    1
#cmakedefine HAVE_SYS_ENDIAN_H   1
#cmakedefine HAVE_SYS_EVENTFD_H  1
#cmakedefine HAVE_SYS_FILE_H     1
#cmakedefine HAVE_SYS_IOCTL_H    1
#cmakedefine HAVE_SYS_MMAN_H     1
#cmakedefine HAVE_SYS_PARAM_H    1
#cmakedefine HAVE_SYS_QUEUE_H    1
#cmakedefine HAVE_SYS_RESOURCE_H 1
#cmakedefine HAVE_SYS_SENDFILE_H 1
#cmakedefine HAVE_SYS_SOCKET_H   1
#cmakedefine HAVE_SYS_STAT_H     1
#cmakedefine HAVE_SYS_TIMEB_H    1
#cmakedefine HAVE_SYS_TIME_H     1
#cmakedefine HAVE_SYS_TYPES_H    1
#cmakedefine HAVE_SYS_UIO_H      1
#cmakedefine HAVE_SYS_UN_H       1
#cmakedefine HAVE_SYS_UTSNAME_H  1
#cmakedefine HAVE_SYS_WAIT_H     1
#cmakedefine HAVE_TANH           1
#cmakedefine HAVE_TANHL          1
#cmakedefine HAVE_TERMIOS_H      1
#cmakedefine HAVE_TIME_H         1
#cmakedefine HAVE_UNISTD_H       1
#cmakedefine HAVE_VFORK          1
#cmakedefine HAVE_WAIT4          1
#cmakedefine HAVE_WAITPID        1
#cmakedefine HAVE_WEAK_SYMBOLS   1
#cmakedefine LIBEVENT_EVHTTP     1
#cmakedefine PARAM_H_HAS_BITSET  1
#cmakedefine WITH_DB             1
#cmakedefine WITH_FANN           1
#cmakedefine USABLE_GD           1
#cmakedefine WITH_GPERF_TOOLS    1
#cmakedefine WITH_HIREDIS        1
#cmakedefine WITH_HYPERSCAN      1
#cmakedefine WITH_JEMALLOC       1
#cmakedefine WITH_JUDY           1
#cmakedefine WITH_LUA            1
#cmakedefine WITH_LUAJIT         1
#cmakedefine WITH_PCRE2          1
#cmakedefine WITH_PROFILER       1
#cmakedefine WITH_SNOWBALL       1
#cmakedefine WITH_SQLITE         1
#cmakedefine WITH_SYSTEM_HIREDIS 1
#cmakedefine WITH_TORCH          1

#cmakedefine DISABLE_PTHREAD_MUTEX 1

#ifdef HAVE_LIBEVENT2
#define HAVE_EVUTIL_RNG_INIT 1
#endif

/* Detect endianness */

#ifdef HAVE_ENDIAN_H
 #include <endian.h>
#elif defined(HAVE_SYS_ENDIAN_H)
 #include <sys/endian.h>
#elif defined(HAVE_MACHINE_ENDIAN_H)
 #include <machine/endian.h>
#elif defined(__sun)
 #include <sys/byteorder.h>
 #ifdef _LITTLE_ENDIAN
  #define BYTE_ORDER LITTLE_ENDIAN
 #else
  #define BYTE_ORDER BIG_ENDIAN
 #endif
#endif

#ifndef BYTE_ORDER

#ifndef LITTLE_ENDIAN
 #define LITTLE_ENDIAN   1234
#endif
#ifndef BIG_ENDIAN
 #define BIG_ENDIAN      4321
#endif

#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \
    defined(__BIG_ENDIAN__) || \
    defined(__ARMEB__) || \
    defined(__THUMBEB__) || \
    defined(__AARCH64EB__) || \
    defined(_MIBSEB) || defined(__MIBSEB) || defined(__MIBSEB__)
#define BYTE_ORDER BIG_ENDIAN
#elif defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN || \
    defined(__LITTLE_ENDIAN__) || \
    defined(__ARMEL__) || \
    defined(__THUMBEL__) || \
    defined(__AARCH64EL__) || \
    defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__)
#define BYTE_ORDER LITTLE_ENDIAN
#else
#error "I don't know what architecture this is!"
#endif

#endif /* BYTE_ORDER */

#define RSPAMD_CONFDIR "${CONFDIR}"
#define RSPAMD_LOCAL_CONFDIR "${LOCAL_CONFDIR}"
#define RSPAMD_RUNDIR "${RUNDIR}"
#define RSPAMD_LOGDIR "${LOGDIR}"
#define RSPAMD_DBDIR "${DBDIR}"
#define RSPAMD_EXAMPLESDIR "${EXAMPLESDIR}"
#define RSPAMD_PLUGINSDIR "${PLUGINSDIR}"
#define RSPAMD_LUALIBDIR "${LUALIBDIR}"
#define RSPAMD_RULESDIR "${RULESDIR}"
#define RSPAMD_WWWDIR "${WWWDIR}"
#define RSPAMD_PREFIX "${CMAKE_INSTALL_PREFIX}"
#define RSPAMD_LIBDIR "${RSPAMD_LIBDIR}"

#define RSPAMD_VERSION_MAJOR "${RSPAMD_VERSION_MAJOR}"
#define RSPAMD_VERSION_MINOR "${RSPAMD_VERSION_MINOR}"
#define RSPAMD_VERSION_PATCH "${RSPAMD_VERSION_PATCH}"

#define RSPAMD_VERSION_MAJOR_NUM ${RSPAMD_VERSION_MAJOR_NUM}
#define RSPAMD_VERSION_MINOR_NUM ${RSPAMD_VERSION_MINOR_NUM}
#define RSPAMD_VERSION_PATCH_NUM ${RSPAMD_VERSION_PATCH_NUM}

#define RSPAMD_VERSION_BRANCH "${RSPAMD_VERSION_MAJOR}.${RSPAMD_VERSION_MINOR}"

#if defined(GIT_VERSION) && GIT_VERSION == 1
# define RVERSION         "${RSPAMD_VERSION}"
# define RSPAMD_VERSION_FULL         "${RSPAMD_VERSION}_${RSPAMD_ID}"
# define RID              "${RSPAMD_ID}"
# define RSPAMD_VERSION_NUM 0x${RSPAMD_VERSION_MAJOR_NUM}${RSPAMD_VERSION_MINOR_NUM}${RSPAMD_VERSION_PATCH_NUM}${RSPAMD_ID}ULL
#else
# define RSPAMD_VERSION_FULL         "${RSPAMD_VERSION}"
# define RVERSION          "${RSPAMD_VERSION}"
# define RSPAMD_VERSION_NUM 0x${RSPAMD_VERSION_MAJOR_NUM}${RSPAMD_VERSION_MINOR_NUM}${RSPAMD_VERSION_PATCH_NUM}0000000ULL
# define RID "release"
#endif

#define RSPAMD_MASTER_SITE_URL "${RSPAMD_MASTER_SITE_URL}"

#define MODULES_NUM        ${RSPAMD_MODULES_NUM}

#define BUILDROOT "${CMAKE_BINARY_DIR}"

/* sys/types */
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif

/* cdefs */
#ifdef HAVE_SYS_CDEFS_H
#include <sys/cdefs.h>
#endif

/* sys/param */
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif

/* stdint */
#ifdef HAVE_STDINT_H
#include <stdint.h>
#elif defined(HAVE_INTTYPES_H)
#include <inttypes.h>
#endif

/* stdbool */
#ifdef HAVE_STDBOOL_H
#include <stdbool.h>
#endif

/* stdlib */
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

/* stdio */
#ifdef HAVE_STDIO_H
#include <stdio.h>
#endif

/* time */
#ifdef HAVE_TIME_H
#include <time.h>
#endif

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

/* string */
#ifdef HAVE_STRING_H
#include <string.h>
#endif

#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif

#include <errno.h>

#include <glib.h>
#include <gmodule.h>

#ifdef GLIB_RE_COMPAT
#include "gregex.h"
#endif
#ifdef GLIB_UNISCRIPT_COMPAT
#include "guniscript.h"
#endif
#ifdef GLIB_COMPAT
#include "gchecksum.h"
#endif

#if (GLIB_MAJOR_VERSION == 2) && (GLIB_MINOR_VERSION < 14)
typedef off_t goffset;
#endif

#ifndef PARAM_H_HAS_BITSET
/* Bit map related macros. */
#ifndef NBBY
# define NBBY    8               /* number of bits in a byte */
#endif
#define setbit(a, \
		i)     (((unsigned char *)(a))[(i) / NBBY] |= 1 << ((i) % NBBY))
#define clrbit(a, \
		i)     (((unsigned char *)(a))[(i) / NBBY] &= ~(1 << ((i) % NBBY)))
#define isset(a,i)                                                      \
	(((const unsigned char *)(a))[(i) / NBBY] & (1 << ((i) % NBBY)))
#define isclr(a,i)                                                      \
	((((const unsigned char *)(a))[(i) / NBBY] & (1 << ((i) % NBBY))) == 0)
#endif

#ifdef _MSC_VER
# define RSPAMD_PACKED(name) \
    __pragma(pack(push, 1)) struct name __pragma(pack(pop))
#elif defined(__GNUC__)
# define RSPAMD_PACKED(name) struct __attribute__((packed)) name
#else
# define RSPAMD_PACKED(name) struct name
#endif

#ifndef RSPAMD_ALIGNED
#if defined(_MSC_VER)
# define RSPAMD_ALIGNED(x) __declspec(align(x))
# define RSPAMD_OPTIMIZE(x)
# define RSPAMD_ALWAYS_INLINE
#elif defined(__GNUC__)
# define RSPAMD_ALIGNED(x) __attribute__((aligned(x)))
# define RSPAMD_ALWAYS_INLINE __attribute__((always_inline))
#ifndef __clang__
# define RSPAMD_OPTIMIZE(x) __attribute__((__optimize__ (x)))
#else
# define RSPAMD_OPTIMIZE(x)
#endif
#else
# define RSPAMD_ALIGNED(x)
# define RSPAMD_OPTIMIZE(x)
# define RSPAMD_ALWAYS_INLINE
#endif
#endif

#ifndef BITSPERBYTE
# define BITSPERBYTE (NBBY * sizeof (char))
#endif
#ifndef NBYTES
# define NBYTES(nbits)   (((nbits) + BITSPERBYTE - 1) / BITSPERBYTE)
#endif

extern uint64_t ottery_rand_uint64(void);
#define UCL_RANDOM_FUNCTION ottery_rand_uint64()

/* Disable slab allocator if jemalloc is already in the system */
#if defined(WITH_JEMALLOC) || defined(__FreeBSD__) || \
	(defined(__NetBSD__) && __NetBSD_Version__ >= 500000000)
#if 0
	#define g_slice_alloc(sz) g_malloc(sz)
	#define g_slice_alloc0(sz) g_malloc0(sz)
	#define g_slice_free1(sz, p) g_free(p)
#endif
#endif

#ifdef __cplusplus
    #define RSPAMD_CONSTRUCTOR(f) \
        static void f(void); \
        struct f##_t_ { f##_t_(void) { f(); } }; static f##_t_ f##_; \
        static void f(void)
#elif defined(_MSC_VER)
    #pragma section(".CRT$XCU",read)
    #define INITIALIZER2_(f,p) \
        static void f(void); \
        __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \
        __pragma(comment(linker,"/include:" p #f "_")) \
        static void f(void)
    #ifdef _WIN64
        #define RSPAMD_CONSTRUCTOR(f) INITIALIZER2_(f,"")
    #else
        #define RSPAMD_CONSTRUCTOR(f) INITIALIZER2_(f,"_")
    #endif
#else
    #define RSPAMD_CONSTRUCTOR(f) \
        static void f(void) __attribute__((constructor)); \
        static void f(void)
#endif

#endif
