/* * 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 // 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 together: MFCCE's wcealt.h doesn't * check for __PLACEMENT_NEW_INLINE before defining operator new, so when * 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 at all. * all needed Win32 API functions are defined in */ #ifndef _ABORT_DEFINED # define _STLP_ABORT() TerminateProcess(reinterpret_cast(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 */