williamr@2: /* williamr@2: * Copyright (c) 1997-1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * Copyright (c) 2003 williamr@2: * Francois Dumont williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: #ifndef _STLP_INTERNAL_WINDOWS_H williamr@2: #define _STLP_INTERNAL_WINDOWS_H williamr@2: williamr@2: #if !defined (_STLP_PLATFORM) williamr@2: # define _STLP_PLATFORM "Windows" williamr@2: #endif williamr@2: williamr@2: #if !defined (_STLP_BIG_ENDIAN) && !defined (_STLP_LITTLE_ENDIAN) williamr@2: # if defined (_MIPSEB) williamr@2: # define _STLP_BIG_ENDIAN 1 williamr@2: # endif williamr@2: # if defined (__i386) || defined (_M_IX86) || defined (_M_ARM) || \ williamr@2: defined (__amd64__) || defined (_M_AMD64) || defined (__x86_64__) || \ williamr@2: defined (__alpha__) williamr@2: # define _STLP_LITTLE_ENDIAN 1 williamr@2: # endif williamr@2: # if defined (__ia64__) williamr@2: /* itanium allows both settings (for instance via gcc -mbig-endian) - hence a seperate check is required */ williamr@2: # if defined (__BIG_ENDIAN__) williamr@2: # define _STLP_BIG_ENDIAN 1 williamr@2: # else williamr@2: # define _STLP_LITTLE_ENDIAN 1 williamr@2: # endif williamr@2: # endif williamr@2: #endif /* _STLP_BIG_ENDIAN */ williamr@2: williamr@2: #if !defined (_STLP_WINDOWS_H_INCLUDED) williamr@2: # define _STLP_WINDOWS_H_INCLUDED williamr@2: # if !(defined ( _STLP_MSVC ) || defined (__BORLANDC__) || defined (__ICL) || defined (__WATCOMC__) || \ williamr@2: defined (__MINGW32__) || defined (__DMC__)) williamr@2: # if defined (_STLP_USE_MFC) williamr@2: # include williamr@2: # else williamr@2: # include williamr@2: # endif williamr@2: # else williamr@2: /* This section serves as a replacement for windows.h header for Visual C++ */ williamr@2: # if defined (__cplusplus) williamr@2: extern "C" { williamr@2: # endif williamr@2: # if (defined (_M_AMD64) || defined (_M_IA64) || (!defined (_STLP_WCE) && defined (_M_MRX000)) || defined (_M_ALPHA) || \ williamr@2: (defined (_M_PPC) && (_STLP_MSVC_LIB >= 1000))) && !defined (RC_INVOKED) williamr@2: # define InterlockedIncrement _InterlockedIncrement williamr@2: # define InterlockedDecrement _InterlockedDecrement williamr@2: # define InterlockedExchange _InterlockedExchange williamr@2: /* Here we use a different macro name than the InterlockedExchangePointer SDK function williamr@2: * to avoid macro definition conflict as the SDK might already define InterlockedExchangePointer williamr@2: * as a macro. williamr@2: */ williamr@2: # define STLPInterlockedExchangePointer _InterlockedExchangePointer williamr@2: # define _STLP_STDCALL williamr@2: # else williamr@2: # if defined (_MAC) williamr@2: # define _STLP_STDCALL _cdecl williamr@2: # else williamr@2: # define _STLP_STDCALL __stdcall williamr@2: # endif williamr@2: # endif williamr@2: williamr@2: # if defined (_STLP_NEW_PLATFORM_SDK) williamr@2: _STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedIncrement(long volatile *); williamr@2: _STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedDecrement(long volatile *); williamr@2: _STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedExchange(long volatile *, long); williamr@2: # if defined (STLPInterlockedExchangePointer) williamr@2: _STLP_IMPORT_DECLSPEC void* _STLP_STDCALL STLPInterlockedExchangePointer(void* volatile *, void*); williamr@2: # endif williamr@2: _STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedExchangeAdd(long volatile *, long); williamr@2: # elif defined (_STLP_WCE) williamr@2: williamr@2: /* start of eMbedded Visual C++ specific section */ williamr@2: # include /* needed for basic windows types */ williamr@2: williamr@2: /** in SDKs generated with PB5, windef.h somehow includes headers which then williamr@2: define setjmp. */ williamr@2: # if (_WIN32_WCE >= 0x500) williamr@2: # define _STLP_NATIVE_SETJMP_H_INCLUDED williamr@2: # endif williamr@2: williamr@2: # ifndef _WINBASE_ /* winbase.h already included? */ williamr@2: long WINAPI InterlockedIncrement(long*); williamr@2: long WINAPI InterlockedDecrement(long*); williamr@2: long WINAPI InterlockedExchange(long*, long); williamr@2: # endif williamr@2: williamr@2: # ifndef __WINDOWS__ /* windows.h already included? */ williamr@2: williamr@2: # if defined (x86) williamr@2: # include /* needed for inline versions of Interlocked* functions */ williamr@2: # endif williamr@2: williamr@2: # ifndef _MFC_VER williamr@2: williamr@2: # define MessageBox MessageBoxW williamr@2: int WINAPI MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType); williamr@2: williamr@2: # define wvsprintf wvsprintfW williamr@2: int WINAPI wvsprintfW(LPWSTR, LPCWSTR, va_list ArgList); williamr@2: williamr@2: void WINAPI ExitThread(DWORD dwExitCode); williamr@2: williamr@2: # if !defined (COREDLL) williamr@2: # define _STLP_WCE_WINBASEAPI DECLSPEC_IMPORT williamr@2: # else williamr@2: # define _STLP_WCE_WINBASEAPI williamr@2: # endif williamr@2: williamr@2: _STLP_WCE_WINBASEAPI int WINAPI williamr@2: MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, williamr@2: int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar); williamr@2: williamr@2: _STLP_WCE_WINBASEAPI UINT WINAPI GetACP(); williamr@2: williamr@2: _STLP_WCE_WINBASEAPI BOOL WINAPI TerminateProcess(HANDLE hProcess, DWORD uExitCode); williamr@2: williamr@2: # define OutputDebugString OutputDebugStringW williamr@2: void WINAPI OutputDebugStringW(LPCWSTR); williamr@2: williamr@2: _STLP_WCE_WINBASEAPI void WINAPI Sleep(DWORD); williamr@2: williamr@2: # undef _STLP_WCE_WINBASEAPI williamr@2: williamr@2: # endif /* !_MFC_VER */ williamr@2: williamr@2: # endif /* !__WINDOWS__ */ williamr@2: williamr@2: /* end of eMbedded Visual C++ specific section */ williamr@2: williamr@2: # else williamr@2: /* boris : for the latest SDK, you may actually need the other version of the declaration (above) williamr@2: * even for earlier VC++ versions. There is no way to tell SDK versions apart, sorry ... williamr@2: */ williamr@2: _STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedIncrement(long*); williamr@2: _STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedDecrement(long*); williamr@2: _STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedExchange(long*, long); williamr@2: # endif williamr@2: williamr@2: # if !defined (STLPInterlockedExchangePointer) williamr@2: /* This API function do not exist in the old platform SDK and is equivalent to williamr@2: * InterlockedExchange on 32 bits platform: williamr@2: */ williamr@2: # if defined (__cplusplus) williamr@2: /* We do not define this function if we are not in a C++ translation unit just williamr@2: * because of the inline portability issue it would introduce. We will have to williamr@2: * fix it the day we need this function for a C translation unit. williamr@2: */ williamr@2: inline williamr@2: void* _STLP_CALL STLPInterlockedExchangePointer(void* volatile* __a, void* __b) { williamr@2: # if defined (_STLP_MSVC) williamr@2: /* Here MSVC produces warning if 64 bits portability issue is activated. williamr@2: * MSVC do not see that _STLP_ATOMIC_EXCHANGE_PTR is a macro which content williamr@2: * is based on the platform, Win32 or Win64 williamr@2: */ williamr@2: # pragma warning (push) williamr@2: # pragma warning (disable : 4311) // pointer truncation from void* to long williamr@2: # pragma warning (disable : 4312) // conversion from long to void* of greater size williamr@2: # endif williamr@2: # if !defined (_STLP_NO_NEW_STYLE_CASTS) williamr@2: return reinterpret_cast(InterlockedExchange(reinterpret_cast(const_cast(__a)), williamr@2: reinterpret_cast(__b))); williamr@2: # else williamr@2: return (void*)InterlockedExchange((long*)__a, (long)__b); williamr@2: # endif williamr@2: # if defined (_STLP_MSVC) williamr@2: # pragma warning (pop) williamr@2: # endif williamr@2: } williamr@2: # endif williamr@2: # endif williamr@2: williamr@2: # if !defined (_STLP_WCE) williamr@2: _STLP_IMPORT_DECLSPEC void _STLP_STDCALL Sleep(unsigned long); williamr@2: _STLP_IMPORT_DECLSPEC void _STLP_STDCALL OutputDebugStringA(const char* lpOutputString); williamr@2: # endif williamr@2: williamr@2: # if defined (InterlockedIncrement) williamr@2: # pragma intrinsic(_InterlockedIncrement) williamr@2: # pragma intrinsic(_InterlockedDecrement) williamr@2: # pragma intrinsic(_InterlockedExchange) williamr@2: # pragma intrinsic(_InterlockedExchangePointer) williamr@2: # endif williamr@2: # if defined (__cplusplus) williamr@2: } /* extern "C" */ williamr@2: # endif williamr@2: williamr@2: # endif /* STL_MSVC __BORLANDC__ __ICL __WATCOMC__ __MINGW32__ __DMC__*/ williamr@2: williamr@2: #endif /* _STLP_WINDOWS_H_INCLUDED */ williamr@2: williamr@2: #endif /* _STLP_INTERNAL_WINDOWS_H */