# Define a warning for the user, so they don't edit clamav-types.h
AC_SUBST(GENERATE_WARNING, ["Warning: This file is generated with ./configure. Do not edit!"])

# Initialize definitions to empty strings, in case they're not needed.
AC_SUBST(INT8_DEF, [""])
AC_SUBST(UINT8_DEF, [""])
AC_SUBST(INT16_DEF, [""])
AC_SUBST(UINT16_DEF, [""])
AC_SUBST(INT32_DEF, [""])
AC_SUBST(UINT32_DEF, [""])
AC_SUBST(INT64_DEF, [""])
AC_SUBST(UINT64_DEF, [""])

# Check sys/int_types.h first, to give it higher priority on Solaris
AC_CHECK_HEADER(
    [sys/int_types.h], 
    [ dnl Found
        AC_SUBST(INT_TYPES_HEADER, ["#include <sys/int_types.h>"])
    ], 
    [ dnl Not-found
        AC_CHECK_HEADER(
            [inttypes.h], 
            [ dnl Found; C99: inttypes.h should include stdint.h; more universal because some older platforms don't provide stdint.h
                AC_SUBST(INT_TYPES_HEADER, ["#include <inttypes.h>"])
            ], 
            [ dnl Not-found
                AC_CHECK_HEADER(
                    [stdint.h], 
                    [ dnl Found
                        AC_SUBST(INT_TYPES_HEADER, ["#include <stdint.h>"])
                    ], 
                    [ dnl Not-found
                        AC_COMPILE_IFELSE(
                            [ dnl Check if Windows (Cygwin), using auto-defined _MSC_VER
                                AC_LANG_PROGRAM([
                                    [
                                        #ifndef _MSC_VER
                                            error: _MSC_VER not found!
                                        #endif]
                                    ]
                                )
                            ],
                            [ dnl It's Windows, stdint.h should exist.
                                AC_SUBST(INT_TYPES_HEADER, ["#include <stdint.h>"])
                            ],
                            [ dnl No int types header available. We'll define the types manually.
                                AC_SUBST(INT8_DEF, ["typedef signed char int8_t;"])
                                AC_SUBST(UINT8_DEF, ["typedef unsigned char uint8_t;"])

                                if test $ac_cv_sizeof_int = 2; then 
                                    AC_SUBST(INT16_DEF, ["typedef signed int int16_t;"])
                                    AC_SUBST(UINT16_DEF, ["typedef unsigned int uint16_t;"])
                                elif test $ac_cv_sizeof_short = 2; then 
                                    AC_SUBST(INT16_DEF, ["typedef signed short int16_t;"])
                                    AC_SUBST(UINT16_DEF, ["typedef unsigned short uint16_t;"])
                                fi

                                if test $ac_cv_sizeof_int = 4; then 
                                    AC_SUBST(INT32_DEF, ["typedef signed int int32_t;"])
                                    AC_SUBST(UINT32_DEF, ["typedef unsigned int uint32_t;"])
                                elif test $ac_cv_sizeof_long = 4; then 
                                    AC_SUBST(INT32_DEF, ["typedef signed long int32_t;"])
                                    AC_SUBST(UINT32_DEF, ["typedef unsigned long uint32_t;"])
                                fi

                                if test $ac_cv_sizeof_long = 8; then 
                                    AC_SUBST(INT64_DEF, ["typedef signed long int64_t;"])
                                    AC_SUBST(UINT64_DEF, ["typedef unsigned long uint64_t;"])
                                elif test $ac_cv_sizeof_long_long = 8; then 
                                    AC_SUBST(INT64_DEF, ["typedef signed long long int64_t;"])
                                    AC_SUBST(UINT64_DEF, ["typedef unsigned long long uint64_t;"])
                                fi
                            ]
                        )
                    ],
                )
            ],
        )
    ],
)

# If _SF64_PREFIX isn't defined, this may be used.
if test $ac_cv_sizeof_int = 4; then 
    AC_SUBST(DEFINE_SF32_PREFIX, ["#define _SF32_PREFIX \"\""])
elif test $ac_cv_sizeof_long = 4; then 
    AC_SUBST(DEFINE_SF32_PREFIX, ["#define _SF32_PREFIX \"l\""])
fi

# If _SF32_PREFIX isn't defined, this may be used.
if test $ac_cv_sizeof_long = 8; then 
    AC_SUBST(DEFINE_SF64_PREFIX, ["#define _SF64_PREFIX \"l\""])
elif test $ac_cv_sizeof_long_long = 8; then 
    AC_SUBST(DEFINE_SF64_PREFIX, ["#define _SF64_PREFIX \"ll\""])
fi