/* This stuff will eventually be replaced by calls to the storage manager in the new GHC/Hugs RTS. -- sof */ #if defined(__CYGWIN32__) || defined(__MINGW32__) || defined(__CYGWIN__) #define __BASTARDIZED_WIN32__ 1 #define COM 1 #endif /*----------------------------------------------------------- -- (c) 1998, Daan Leijen, leijen@@fwi.uva.nl -----------------------------------------------------------*/ /* #define DEBUG */ /* if you don't use COM, comment this out */ /* (pass the setting for this via command line instead.) */ /* #define COM */ /* define the DLL export macro */ #if defined(_BASTARDIZED_WIN32__) #define DLLEXPORT(res) __declspec(dllexport) res #else /* redef this default for your system */ #define DLLEXPORT(res) extern res #endif #ifdef COM #define COBJMACROS #define CINTERFACE #endif #include #if !defined(__BASTARDIZED_WIN32__) && defined(COM) #include #else # if defined(__BASTARDIZED_WIN32__) #include # if defined(__BASTARDIZED_WIN32__) && defined(COM) #include "comPrim.h" # endif # endif #include #endif #ifdef DEBUG static int nallocs = 0; static int nallocs_ = 0; #endif void primPointerCheck(void) { #ifdef DEBUG if (nallocs - nallocs_ != 0) printf( "pointer errors: allocs - frees = %i\n", nallocs - nallocs_ ); nallocs_ = nallocs; #endif } /*----------------------------------------------------------- -- Free routines for foreign objects -----------------------------------------------------------*/ DLLEXPORT(void) primFreeBSTR( void* p ) { #ifdef COM if (p) SysFreeString( (BSTR)p ); #endif } DLLEXPORT(void) primNoFree( void* p ) { #if 0 char msg[200]; WCHAR* wmsg; HRESULT hr; sprintf(msg, "freeing: %p", p); MessageBox(NULL, msg, "primNoFree", MB_OK ); hr = primGUIDToString(p, &wmsg); if (SUCCEEDED(hr)) { MessageBoxW(NULL, wmsg, L"primNoFree-clsid", MB_OK); } #endif } void primFinalise (void* f, void* a) { ((void (*)(void *))f)(a); } /*----------------------------------------------------------- -- Memory allocation -----------------------------------------------------------*/ DLLEXPORT(void*) primAllocMemory( int size ) { #ifdef COM #ifdef DEBUG void* p; p = CoTaskMemAlloc( size ); printf("alloc: %p, size = %i\n", p, size ); if (p) nallocs++; return p; #else return CoTaskMemAlloc(size); #endif #else return malloc(size); #endif } /* COM version of freeing */ #ifdef COM DLLEXPORT(void) primFreeMemory( void* p ) { #ifdef DEBUG if (!p) printf( "freeing null pointer\n" ); #endif if (!p) return; #if defined(DEBUG) if (p) nallocs--; printf( "free: %p\n", p); #endif CoTaskMemFree( p ); } #endif #ifndef COM DLLEXPORT(void) primFreeMemory( void* p ) { #ifdef DEBUG if (!p) printf( "free null pointer\n" ); #endif if (!p) return; free(p); } #endif /* !COM */ /* Strictly speaking, converting a function pointer to a void* is not guaranteed to be information preserving in ANSI C. */ void* finalFreeMemory() { return (void*)&primFreeMemory; } void* finalNoFree() { return (void*)&primNoFree; } void* finalFreeBSTR() { return (void*)&primFreeBSTR; }