
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef AXUTIL_UTILS_DEFINES_H
#define AXUTIL_UTILS_DEFINES_H

#include <stddef.h>

#if !defined(_WIN32)
#include <stdint.h> 
#endif

#ifdef __cplusplus
extern "C"
{
#endif

#if defined(_WIN32) && !defined(AXIS2_SKIP_INT_TYPEDEFS)
    /**
     * ANSI Type definitions for Windows
     */
    typedef unsigned __int8 uint8_t;
    typedef __int8 int8_t;
    typedef unsigned __int16 uint16_t;
    typedef __int16 int16_t;
    typedef unsigned __int32 uint32_t;
    typedef __int32 int32_t;
    typedef unsigned __int64 uint64_t;
    typedef __int64 int64_t;
#endif

/**
 * Definition of format specifiers
 * for printf family of functions
 */

#if defined(_WIN32)
#define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%I64d"
#define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%I64u"
#define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%I32d"
#define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%I32u"
#else
#if __WORDSIZE == 64
#define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%ld"
#define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%lu"
#else
#define AXIS2_PRINTF_INT64_FORMAT_SPECIFIER "%lld"
#define AXIS2_PRINTF_UINT64_FORMAT_SPECIFIER "%llu"
#endif
# if defined(_MSC_VER) && _MSC_VER >= 1300
#  define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%I32d"
#  define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%I32u"
# else
#  define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%d"
#  define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%u"
# endif
/**#define AXIS2_PRINTF_INT32_FORMAT_SPECIFIER "%d"
#define AXIS2_PRINTF_UINT32_FORMAT_SPECIFIER "%u" */
#endif

    /**
      * Type definitions
      */
    typedef char axis2_char_t;
    typedef int axis2_bool_t;
    typedef int axis2_status_t;
    typedef int axis2_scope_t;
    typedef unsigned int axis2_ssize_t;
    typedef char axis2_byte_t;
	typedef unsigned char axis2_unsigned_byte_t;

#define AXIS2_STRING(s) s

#define AXIS2_CHAR(c) c

#define AXIS2_CRLF_LENGTH 2

#define AXIS2_CRLF "\r\n"

    /* These constant definitions should later be moved to platform dependant
     * files
     */

#define AXIS2_EOLN '\0'

    /**
      * Boolean values
      */
#define AXIS2_TRUE 1
#define AXIS2_FALSE 0

    /**
      *   Exporting
      */
#if defined(_WIN32) && !defined(AXIS2_DECLARE_STATIC)
#define AXIS2_EXPORT __declspec(dllexport)
#else
#define AXIS2_EXPORT
#endif

    /**
      *   Importing
      */
#if defined(_WIN32)
#define AXIS2_IMPORT __declspec(dllimport)
#else
#define AXIS2_IMPORT
#endif

    /**
      *   Calling Conventions
      */
#if defined(__GNUC__)

#if defined(__i386)
#define AXIS2_CALL __attribute__((cdecl))
#define AXIS2_WUR __attribute__((warn_unused_result))
#else
#define AXIS2_CALL
#define AXIS2_WUR
#endif

#elif defined(_WIN32)
#define AXIS2_CALL __stdcall
#define AXIS2_WUR

#else                           /* Unix */
#define AXIS2_CALL
#define AXIS2_WUR

#endif

#define AXIS2_THREAD_FUNC AXIS2_CALL


#ifdef DOXYGEN

    /* define these just so doxygen documents them */

    /**
     * AXIS2_DECLARE_STATIC is defined when including Axis2's Core headers,
     * to provide static linkage when the dynamic library may be unavailable.
     *
     * @see AXIS2_DECLARE_EXPORT
     *
     * AXIS2_DECLARE_STATIC and AXIS2_DECLARE_EXPORT are left undefined when
     * including Axis2's Core headers, to import and link the symbols from the
     * dynamic Axis2 Core library and assure appropriate indirection and calling
     * conventions at compile time.
     */
# define AXIS2_DECLARE_STATIC

    /**
     * AXIS2_DECLARE_EXPORT is defined when building the Axis2 Core dynamic
     * library, so that all public symbols are exported.
     *
     * @see AXIS2_DECLARE_STATIC
     */
# define AXIS2_DECLARE_EXPORT

#endif                          /* def DOXYGEN */

#if !defined(_WIN32)

    /**
     * Axis2 Core functions are declared with AXIS2_EXTERN  AXIS2_CALL

       , so they may
     * use the most appropriate calling convention.  Other
     * Core functions with variable arguments must use AXIS2_DECLARE_NONSTD().
     * @code
     * AXIS2_EXTERN rettype) axis2_func(args AXIS2_CALL


     * @endcode
     */
#define AXIS2_EXTERN

    /**
     * Axis2 Core variable argument and hook functions are declared with
     * AXIS2_DECLARE_NONSTD(), as they must use the C language calling convention.
     * @see AXIS2_DECLARE
     * @code
     * AXIS2_DECLARE_NONSTD(rettype) axis2_func(args [...])
     * @endcode
     */
#define AXIS2_DECLARE_NONSTD(type)     type

    /**
     * Axis2 Core variables are declared with AXIS2_DECLARE_DATA.
     * This assures the appropriate indirection is invoked at compile time.
     *
     * @code
     * AXIS2_DECLARE_DATA type axis2_variable
     * @endcode
     */
#define AXIS2_DECLARE_DATA

#elif defined(AXIS2_DECLARE_STATIC)
#ifdef __cplusplus
#define AXIS2_EXTERN extern "C"
#else
#define AXIS2_EXTERN
#endif
#define AXIS2_EXTERN_NONSTD
#define AXIS2_DECLARE_DATA
#elif defined(AXIS2_DECLARE_EXPORT)
#define AXIS2_EXTERN                    AXIS2_EXPORT
#define AXIS2_EXTERN_NONSTD             AXIS2_EXPORT
#define AXIS2_DECLARE_DATA
#else
#define AXIS2_EXTERN                    AXIS2_IMPORT
#define AXIS2_EXTERN_NONSTD             AXIS2_IMPORT
#define AXIS2_DECLARE_DATA
#endif

#ifdef __cplusplus
}
#endif

#endif                          /* AXIS2_UTILS_DEFINES_H */
