/****************************************************************
 *  RetroShare is distributed under the following license:
 *
 *  Copyright (C) 2006,2007 crypton
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, 
 *  Boston, MA  02110-1301, USA.
 ****************************************************************/

#ifndef RSGLOBAL_H
#define RSGLOBAL_H

/**
 * OS and compilers detection via defines (preprocessor).
 *
 * Most of this defines are from Qt (Trolltech).
 * In each category (OS_ and CC_) one define exludes the others.
 * Warning: if you want to add a define to this file, the order is very important.
 *
 * Operating systems:
 * - OS_WINDOWS
 *   - OS_WIN32
 *   - OS_WIN64
 *   - OS_WINCE_POCKETPC (Windows CE for PocketPC)
 *   - OS_WINCE_SMARTPHONE (Windows CE for smartphone)
 * - OS_POSIX
 *   - OS_MACOSX
 *   - OS_LINUX
 *   - OS_HURD
 *   - OS_BSD
 *     - OS_FREEBSD
 *     - OS_NETBSD
 *     - OS_OPENBSD
 *
 * Compilers:
 * - CC_MSVC (Microsoft Visual C++)
 *   - CC_MSVC6 (Visual C++ 6)
 *   - CC_MSVC7 (Visual C++ .NET)
 *   - CC_MSVC71 (Visual C++ 2003)
 *   - CC_MSVC8 (Visual C++ 2005)
 * - CC_WINCE (Microsoft Visual C++ Embedded for Windows CE)
 *   - CC_WINCE1 (Windows CE 1.x)
 *   - CC_WINCE2 (Windows CE 2.x)
 *   - CC_WINCE3 (Windows CE 3.x)
 *   - CC_WINCE4 (Windows CE 4.x)
 *   - CC_WINCE5 (Windows CE 5.x)
 * - CC_GCC
 *   - CC_MINGW (Native GCC under Windows)
 *   - CC_GCC3 (GNU GCC 3.x)
 *   - CC_GCC4 (GNU GCC 4.x)
 * - CC_INTEL (Intel C++)
 * - CC_BORLAND (Borland C++)
 *
 * @file global.h
 * @see qglobal.h from Qt4
 * 
 */

//OS
#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
	#define OS_MACOSX
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
	#define OS_WIN32
#elif defined(WIN64) || defined(_WIN64) || defined(__WIN64__)
	#define OS_WIN64
#elif defined(__linux__) || defined(__linux)
	#define OS_LINUX
#elif defined(__FreeBSD__) || defined(__DragonFly__)
	#define OS_FREEBSD
#elif defined(__NetBSD__)
	#define OS_NETBSD
#elif defined(__OpenBSD__)
	#define OS_OPENBSD
#elif defined(__GNU_HURD__)
	#define OS_HURD
#elif defined(__HAIKU__)
	#define OS_HAIKU
#elif defined(WIN32_PLATFORM_PSPC)
	#define OS_WINCE_POCKETPC
#elif defined(WIN32_PLATFORM_WFSP)
	#define OS_WINCE_SMARTPHONE
#else
	#error This OS has not been tested
#endif

#if defined(OS_WIN32) || defined(OS_WIN64) || defined(OS_WINCE_POCKETPC) || defined(OS_WINCE_SMARTPHONE)
	#define OS_WINDOWS
#endif

#if defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(OS_OPENBSD)
	#define OS_BSD
#endif

#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_HURD) || defined(OS_BSD) || defined(OS_HAIKU)
	#define OS_POSIX
#endif


//Compilers
#if defined(__INTEL_COMPILER)
	#define CC_INTEL
#elif defined(_MSC_VER)
	#define CC_MSVC
	#if _MSC_VER <= 1200
		#define CC_MSVC6
	#elif _MSC_VER <= 1300
		#define CC_MSVC7
	#elif _MSC_VER <= 1310
		#define CC_MSVC71
	#elif _MSC_VER <= 1400
		#define CC_MSVC8
	#endif
#elif defined(_WIN32_WCE)
	#define CC_WINCE
	#if _WIN32_WCE <= 101
		#define CC_WINCE1
	#elif _WIN32_WCE <= 211
		#define CC_WINCE2
	#elif _WIN32_WCE <= 300
		#define CC_WINCE3
	#elif _WIN32_WCE <= 400
		#define CC_WINCE4
	#elif _WIN32_WCE <= 500
		#define CC_WINCE5
	#endif
#elif defined(__GNUC__)
	#define CC_GCC
	#if __GNUC__ == 3
		#define CC_GCC3
	#elif _MSC_VER == 4
		#define CC_GCC4
	#endif
	#if defined(__MINGW32__)
		#define CC_MINGW
	#endif
#elif defined(__BORLANDC__) || defined(__TURBOC__)
	#define CC_BORLAND
#else
	#error This compiler has not been tested
#endif

#endif	//OWGLOBAL_H
