mirror of
https://github.com/reactos/reactos.git
synced 2024-09-11 05:12:43 +00:00
334 lines
9.8 KiB
C
334 lines
9.8 KiB
C
/*
|
|
* File to have Microsoft eMbedded Visual C++ 3.0 and .NET working with STLport
|
|
* May 2004
|
|
* Origin : Zdenek Nemec - zero@mapfactor.com
|
|
* Michael Fink - vividos@users.sourceforge.net
|
|
*/
|
|
|
|
#ifndef _STLP_EVC_H
|
|
#define _STLP_EVC_H
|
|
|
|
#define _STLP_COMPILER "eMbedded Visual C++"
|
|
|
|
// This flag is being used by STLport to support
|
|
// old-fashioned Windows CE SDK (see stl_wince.h)
|
|
// do not use with eMebedded Visual C++ 3 or 4!
|
|
#ifdef _STLP_WINCE
|
|
# undef _STLP_WINCE
|
|
#endif
|
|
|
|
/* Compiler dependent define. The following defines may be available:
|
|
* _STLP_WCE_EVC3 when compiling under eMbedded Visual C++ 3
|
|
* _STLP_WCE_NET when compiling under eMbedded Visual C++ .NET
|
|
* _STLP_WCE always defined when compiling with one of the above
|
|
*/
|
|
#undef _STLP_WCE_EVC3
|
|
#undef _STLP_WCE_NET
|
|
|
|
#if (_WIN32_WCE > 300)
|
|
# define _STLP_WCE_NET UNDER_CE
|
|
#elif (_WIN32_WCE == 300)
|
|
# define _STLP_WCE_EVC3 UNDER_CE
|
|
#else
|
|
# error No support for Windows CE below 3.0!
|
|
#endif
|
|
|
|
// This is defined for all platforms using Windows CE
|
|
#define _STLP_WCE
|
|
|
|
/* All Windows CE versions up to at least version 5 are little-endian, even
|
|
* if the hardware (like e.g. MIPS) can be configured for big-endian, too. */
|
|
#define _STLP_LITTLE_ENDIAN
|
|
|
|
// Ensure _DEBUG is defined.
|
|
#if defined (DEBUG) && !defined (_DEBUG)
|
|
# define _DEBUG
|
|
#endif
|
|
|
|
// inherit all msvc6 options
|
|
#include <stl/config/_msvc.h>
|
|
|
|
// CE up to at least version 5 has no C locale support
|
|
#define _STLP_NO_LOCALE_SUPPORT
|
|
|
|
#if _WIN32_WCE >= 420
|
|
// SDKs built with PB5 have terminate&co in namespace std...
|
|
# define _STLP_VENDOR_TERMINATE_STD _STLP_VENDOR_STD
|
|
# define _STLP_VENDOR_UNCAUGHT_EXCEPTION_STD _STLP_VENDOR_STD
|
|
// ...and new_handler/set_new_handler in the global namespace.
|
|
# define _STLP_GLOBAL_NEW_HANDLER 1
|
|
#endif
|
|
|
|
// Always threaded in eMbedded Visual C++ 3.0 and .NET
|
|
#ifndef _MT
|
|
# define _MT
|
|
#endif
|
|
|
|
// we don't have a static native runtime library
|
|
#undef _STLP_USING_CROSS_NATIVE_RUNTIME_LIB
|
|
|
|
#if _WIN32_WCE < 400
|
|
// no long double under CE3 and older
|
|
# define _STLP_NO_LONG_DOUBLE
|
|
#endif
|
|
|
|
// no *f and *l math functions available
|
|
#define _STLP_NO_VENDOR_MATH_F
|
|
#define _STLP_NO_VENDOR_MATH_L
|
|
|
|
/*
|
|
* Redirect cout, cerr and clog:
|
|
* If defined redirect cout, cerr and clog to
|
|
* files stdout.txt, stderr.txt and stdlog.txt
|
|
*/
|
|
//# define _STLP_REDIRECT_STDSTREAMS
|
|
|
|
/*
|
|
* Static class members may generate LNK1179:
|
|
* Wrong COMDAT packing may cause LNK1179 error.
|
|
* For details see http://groups.google.com/groups?th=8a05c82c4ffee280
|
|
* example P78. This define is not used/needed at this moment
|
|
* but may came handy in future...
|
|
*/
|
|
//# define _STLP_STATIC_MEMBERS_BUG
|
|
|
|
// Use wide-string interface of windows native functions (CreateFile...).
|
|
// Note that this should be defined all the time while under CE.
|
|
#if defined (UNICODE)
|
|
# define _STLP_USE_WIDE_INTERFACE
|
|
#endif
|
|
|
|
// Force exception std to std instead of __std_alias.
|
|
#if defined (__cplusplus) && !defined (_STLP_HAS_NO_NAMESPACES)
|
|
# ifdef _STLP_VENDOR_EXCEPT_STD
|
|
# undef _STLP_VENDOR_EXCEPT_STD
|
|
# endif
|
|
# define _STLP_VENDOR_EXCEPT_STD std
|
|
#endif
|
|
|
|
// short string optimization bug under evc3, evc4 using ARM compiler
|
|
#if _MSC_VER < 1400 && (defined (ARM) || defined (_ARM_))
|
|
# define _STLP_DONT_USE_SHORT_STRING_OPTIM
|
|
#endif
|
|
|
|
// when using MFC, disable another placement new declaration, since there is one in wcealt.h
|
|
#if !defined (__BUILDING_STLPORT) && defined (_MFC_VER)
|
|
# define __PLACEMENT_NEW_INLINE
|
|
#endif
|
|
|
|
// threads
|
|
#undef _REENTRANT
|
|
#define _REENTRANT
|
|
#undef _NOTHREADS
|
|
|
|
// Use old fashioned headers (ctime vs. time.h).
|
|
#undef _STLP_NO_NEW_C_HEADERS
|
|
#define _STLP_NO_NEW_C_HEADERS
|
|
|
|
// exception handling support: only on evc4 and user added /GX to project settings
|
|
#if defined (_STLP_WCE_EVC3) || !defined (_CPPUNWIND)
|
|
# define _STLP_NO_EXCEPTION_HEADER
|
|
# define _STLP_NO_EXCEPTIONS
|
|
# undef _STLP_USE_EXCEPTIONS
|
|
# ifndef _STLP_THROW_BAD_ALLOC
|
|
# define _STLP_THROW_BAD_ALLOC { _STLP_WINCE_TRACE(L"out of memory"); ExitThread(1); }
|
|
# endif
|
|
#endif
|
|
|
|
#define _STLP_WINCE_TRACE(msg) OutputDebugString(msg)
|
|
|
|
/*
|
|
* eMbedded Visual C++ .NET specific settings
|
|
*/
|
|
#if defined (_STLP_WCE_NET)
|
|
|
|
// evc4 has no locale and time support
|
|
# define _STLP_NO_LOCALE_SUPPORT
|
|
# define _STLP_NO_TIME_SUPPORT
|
|
|
|
// ptrdiff_t is not defined in evc4 headers
|
|
# ifndef _PTRDIFF_T_DEFINED
|
|
typedef int ptrdiff_t;
|
|
# define _PTRDIFF_T_DEFINED
|
|
# endif
|
|
|
|
/*
|
|
* Helper macros for including the native headers in cases where a file with
|
|
* the same name also exists in the STLport include folder. The idea behind
|
|
* this is that we first go up one directory and then down into a dir that
|
|
* is only present in the native install but not in STLport.
|
|
*
|
|
*/
|
|
# if !defined (_STLP_NATIVE_INCLUDE_PATH)
|
|
# if defined (_X86_)
|
|
# if defined (_STLP_WCE_TARGET_PROC_SUBTYPE_EMULATOR)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../Emulator
|
|
# else
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../X86
|
|
# endif
|
|
# elif defined (_ARM_)
|
|
# if _MSC_VER < 1400
|
|
// eVC3/4
|
|
# if defined (ARMV4)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../Armv4
|
|
# elif defined (ARMV4I)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../Armv4i
|
|
# elif defined (ARMV4T)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../Armv4t
|
|
# else
|
|
# error Unknown ARM SDK.
|
|
# endif
|
|
# else
|
|
// VC8 crosscompiling for CE
|
|
# if defined (ARMV4)
|
|
// VC8 bundled Pocket PC 2003 SDK don't have a target CPU subfolder.
|
|
# if defined(WIN32_PLATFORM_PSPC)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../Include
|
|
# else
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../Armv4
|
|
# endif
|
|
# elif defined(ARMV4I) || defined(ARMV4T)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../Armv4i
|
|
# else
|
|
# error Unknown ARM SDK.
|
|
# endif
|
|
# endif
|
|
# elif defined (_MIPS_)
|
|
# if defined (MIPS16)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../mips16
|
|
# elif defined (MIPSII)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../mipsII
|
|
# elif defined (MIPSII_FP)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../mipsII_fp
|
|
# elif defined (MIPSIV)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../mipsIV
|
|
# elif defined (MIPSIV_FP)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../mipsIV_fp
|
|
# else
|
|
# error Unknown MIPS SDK.
|
|
# endif
|
|
# elif defined (SHx)
|
|
# if defined (SH3)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../sh3
|
|
# elif defined (SH4)
|
|
# define _STLP_NATIVE_INCLUDE_PATH ../sh4
|
|
# else
|
|
# error Unknown SHx SDK.
|
|
# endif
|
|
# else
|
|
# error Unknown SDK.
|
|
# endif
|
|
# endif /* !_STLP_NATIVE_INCLUDE_PATH */
|
|
|
|
/* Workaround when using MFCCE and using <new> together: MFCCE's wcealt.h doesn't
|
|
* check for __PLACEMENT_NEW_INLINE before defining operator new, so when <new>
|
|
* defines the operatore before, there will be an error C2084:
|
|
* "function 'void *__cdecl operator new(unsigned int,void *)' already has a body".
|
|
*/
|
|
# ifdef _STLP_USE_MFC
|
|
# define __PLACEMENT_NEW_INLINE
|
|
# endif
|
|
|
|
#endif /* _STLP_WCE_NET */
|
|
|
|
/*
|
|
* eMbedded Visual C++ 3.0 specific settings
|
|
*/
|
|
#if defined (_STLP_WCE_EVC3)
|
|
|
|
# define _STLP_NO_NATIVE_MBSTATE_T
|
|
|
|
// evc3 has no locale and time support
|
|
# define _STLP_NO_LOCALE_SUPPORT
|
|
# define _STLP_NO_TIME_SUPPORT
|
|
|
|
// evc3 has new, but no explicit header
|
|
# define _STLP_NO_NEW_HEADER
|
|
# define _STLP_NO_NEW_NEW_HEADER
|
|
|
|
// evc3 has no bad_alloc and no typeinfo
|
|
# undef _STLP_NO_BAD_ALLOC
|
|
# define _STLP_NO_BAD_ALLOC
|
|
|
|
# undef _STLP_NO_TYPEINFO
|
|
# define _STLP_NO_TYPEINFO
|
|
|
|
// missing things in eMbedded Visual C++ 3.0 headers
|
|
# ifndef _SIZE_T_DEFINED
|
|
typedef unsigned int size_t;
|
|
# define _SIZE_T_DEFINED
|
|
# endif
|
|
|
|
# ifndef _WCHAR_T_DEFINED
|
|
typedef unsigned short wchar_t;
|
|
# define _WCHAR_T_DEFINED
|
|
# endif
|
|
|
|
// ptrdiff_t is not defined in evc3 headers
|
|
# ifndef _PTRDIFF_T_DEFINED
|
|
typedef int ptrdiff_t;
|
|
# define _PTRDIFF_T_DEFINED
|
|
# endif
|
|
|
|
// clock_t is not defined in evc3 headers
|
|
# ifndef _CLOCK_T_DEFINED
|
|
typedef long clock_t;
|
|
# define _CLOCK_T_DEFINED
|
|
# endif
|
|
|
|
// Struct tm is not defined in evc3 headers
|
|
# ifndef _TM_DEFINED
|
|
struct tm {
|
|
int tm_sec; /* seconds after the minute - [0,59] */
|
|
int tm_min; /* minutes after the hour - [0,59] */
|
|
int tm_hour; /* hours since midnight - [0,23] */
|
|
int tm_mday; /* day of the month - [1,31] */
|
|
int tm_mon; /* months since January - [0,11] */
|
|
int tm_year; /* years since 1900 */
|
|
int tm_wday; /* days since Sunday - [0,6] */
|
|
int tm_yday; /* days since January 1 - [0,365] */
|
|
int tm_isdst; /* daylight savings time flag */
|
|
};
|
|
# define _TM_DEFINED
|
|
# endif
|
|
|
|
// define placement new and delete operator
|
|
// note: when MFCCE headers are included first, don't define the new operator,
|
|
// since it was already defined in wcealt.h
|
|
# ifdef __cplusplus
|
|
# ifndef __PLACEMENT_NEW_INLINE
|
|
# ifndef _MFC_VER
|
|
inline void *__cdecl operator new(size_t, void *_P) { return (_P); }
|
|
# endif /* _MFC_VER */
|
|
inline void __cdecl operator delete(void *, void *) { return; }
|
|
# define __PLACEMENT_NEW_INLINE
|
|
# endif
|
|
# endif /* __cplusplus */
|
|
|
|
// evc3 doesn't have native wide functions, e.g. fgetwc, wmemmove
|
|
# define _STLP_NO_NATIVE_WIDE_FUNCTIONS
|
|
|
|
// evc3 doesn't have assert.h
|
|
# ifndef _ASSERT_DEFINED
|
|
# define assert(expr) _STLP_ASSERT(expr)
|
|
# define _ASSERT_DEFINED
|
|
# endif
|
|
|
|
#endif /* _STLP_WCE_EVC3 */
|
|
|
|
/*
|
|
* original call: TerminateProcess(GetCurrentProcess(), 0);
|
|
* we substitute the GetCurrentProcess() with the result of the inline function
|
|
* defined in kfuncs.h, since we then can avoid including <windows.h> at all.
|
|
* all needed Win32 API functions are defined in <stl/_windows.h>
|
|
*/
|
|
#ifndef _ABORT_DEFINED
|
|
# define _STLP_ABORT() TerminateProcess(reinterpret_cast<HANDLE>(66), 0)
|
|
# define _ABORT_DEFINED
|
|
#endif
|
|
|
|
// Notice: windows.h isn't included here anymore; all needed defines are in
|
|
// stl/_windows.h now
|
|
|
|
#endif /* _STLP_EVC_H */
|