/* $Id: stdafx.h 4003 2006-03-21 23:18:43Z Darkvater $ */

#ifndef STDAFX_H
#define STDAFX_H

#if defined(_MSC_VER)
# pragma once

#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
#pragma warning(disable: 4100) // parameter not used
#pragma warning(disable: 4244) // conversion
#pragma warning(disable: 4245) // conversion
#pragma warning(disable: 4201) // nameless union
#pragma warning(disable: 4514) // removed unref inline
#pragma warning(disable: 4127) // constant conditional expression
#pragma warning(disable: 4276) // MSVC BUG??? Complains about function body not declared when using function pointers
#pragma warning(disable: 4761) // warning C4761: integral size mismatch in argument; conversion supplied
#endif

//#pragma fourbyteints on
//#include <stdlib.h>
//#include <assert.h>
//#include <string.h>
#include "palmdep.h"
/*#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <extras.h>
*/
#if defined(UNIX) || defined(__MINGW32__)
#	include <sys/types.h>
#endif

#if defined(__OS2__)
#	include <types.h>
#endif

#ifdef __BEOS__
#include <SupportDefs.h>
#endif

#ifdef SUNOS
#include <alloca.h>
#endif

#ifdef __MORPHOS__
// morphos defines certain amiga defines per default, we undefine them
// here to make the rest of source less messy and more clear what is
// required for morphos and what for amigaos
#	ifdef amigaos
#		undef amigaos
#	endif
#	ifdef __amigaos__
#		undef __amigaos__
#	endif
#	ifdef __AMIGA__
#		undef __AMIGA__
#	endif
#	ifdef AMIGA
#		undef AMIGA
#	endif
#	ifdef amiga
#   	undef amiga
#	endif
#endif /* __MORPHOS__ */

#define BSWAP32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) << 8) & 0xFF0000) | (((x) << 24) & 0xFF000000))
#define BSWAP16(x) ((x) >> 8 | (x) << 8)

// by default we use [] var arrays
#define VARARRAY_SIZE


// Stuff for GCC
#if defined(__GNUC__)
# define NORETURN
# define FORCEINLINE inline
# define CDECL
//#include <alloca.h>
//#include <malloc.h>
# define __int64 long long
# define NOT_REACHED() assert(0)
# define GCC_PACK __attribute__((packed))

#	if (__GNUC__ == 2)
#  undef VARARRAY_SIZE
#  define VARARRAY_SIZE 0
# endif
#endif

#if defined(__WATCOMC__)
#       define NORETURN
#       define FORCEINLINE inline
#       define CDECL
#       define NOT_REACHED() assert(0)
#       define GCC_PACK
#       undef TTD_ALIGNMENT_4
#       undef TTD_ALIGNMENT_2

#       include <Malloc.h>
#endif

#if defined(__MINGW32__) || defined(__CYGWIN__)
#include <malloc.h> // alloca()
#endif

// Stuff for CodeWarrior
//#define _MSL_OS_DIRECT_MALLOC
#pragma c99 on
#pragma longlong_enums on
#pragma longlong on
#pragma bool on
//#define assert(x)
#define __int64 long long
#define FORCEINLINE _MSL_USE_INLINE
#define CDECL _MSL_CDECL
#define NORETURN
#define GCC_PACK
//#include <alloca.h>
#define TTD_LITTLE_ENDIAN
#define NOT_REACHED()
#define WITH_ZLIB
#define TTD_ALIGNMENT_4
#define TTD_ALIGNMENT_2
#define NO_DEBUG_MESSAGES
#define MYINLINE inline
#define OTTD_ALIGNMENT

// Windows has always LITTLE_ENDIAN
#if defined(WIN32) || defined(__OS2__)
  #define TTD_LITTLE_ENDIAN
#else
// Else include endian[target/host].h, which has the endian-type, autodetected by the Makefile
  #if defined(STRGEN)
    #include "endian_host.h"
  #else
  	// MYCODE EDIT removed endian check and replaced TTD ALIGNMENT manually
    //#include "endian_target.h"
  #endif
#endif

#define PATHSEP "/"


//#define int long
typedef unsigned char byte;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
typedef unsigned int uint;
typedef long long int64;
typedef long long uint64;
typedef signed char int8;
typedef signed short int16;
typedef signed long int32;
typedef unsigned char bool;

// Setup alignment and conversion macros
#if defined(TTD_BIG_ENDIAN)
# define OTTD_ALIGNMENT

  static inline uint32 TO_LE32(uint32 x) { return BSWAP32(x); }
  static inline uint16 TO_LE16(uint16 x) { return BSWAP16(x); }
  static inline uint32 FROM_LE32(uint32 x) { return BSWAP32(x); }
  static inline uint16 FROM_LE16(uint16 x) { return BSWAP16(x); }
# define TO_BE32(x) (x)
# define TO_BE16(x) (x)
# define FROM_BE32(x) (x)
# define FROM_BE16(x) (x)
# define TO_BE32X(x) (x)

#else

  static inline uint32 TO_BE32(uint32 x) { return BSWAP32(x); }
  static inline uint16 TO_BE16(uint16 x) { return BSWAP16(x); }
  static inline uint32 FROM_BE32(uint32 x) { return BSWAP32(x); }
  static inline uint16 FROM_BE16(uint16 x) { return BSWAP16(x); }
# define TO_LE32X(x) (x)
# define TO_LE32(x) (x)
# define TO_LE16(x) (x)
# define TO_BE32X(x) BSWAP32(x)
# define FROM_LE32(x) (x)
# define FROM_LE16(x) (x)

#endif

#if !defined(GAME_DATA_DIR)
# define GAME_DATA_DIR ""
#endif

#if !defined(PERSONAL_DIR)
# define PERSONAL_DIR ""
#endif

/*
#ifndef __cplusplus
#ifndef __BEOS__
enum {
	false = 0,
	true = 1,
};
#endif
#endif
*/

// Compile time assertions
#ifdef __OS2__
# define assert_compile(expr)
#else
//#       define assert_compile(expr) void __ct_assert__(int a[1 - 2 * !(expr)])
# define assert_compile(expr) void __ct_assert__(int a[1 - 2 * !(expr)])
#endif

assert_compile(sizeof(uint32) == 4);
assert_compile(sizeof(uint16) == 2);
assert_compile(sizeof(uint8)  == 1);

#define lengthof(x) (sizeof(x)/sizeof(x[0]))
#define endof(x) (&x[lengthof(x)])
#define lastof(x) (&x[lengthof(x) - 1])
#ifndef offsetof
# define offsetof(s,m)   (size_t)&(((s *)0)->m)
#endif


// take care of some name clashes on macos
#if defined(__APPLE__)
# define GetString OTTD_GetString
# define DrawString OTTD_DrawString
# define Random OTTD_Random
# define CloseConnection OTTD_CloseConnection
#endif /* __APPLE */

#ifdef __AMIGA__
// it seems AmigaOS already have a Point declared
# define Point OTTD_AMIGA_POINT
#endif

#endif /* STDAFX_H */
