|  | /* | 
|  | * Win32 heap definitions | 
|  | * | 
|  | * Copyright 1996 Alexandre Julliard | 
|  | */ | 
|  |  | 
|  | #ifndef __WINE_HEAP_H | 
|  | #define __WINE_HEAP_H | 
|  |  | 
|  | #include "config.h" | 
|  |  | 
|  | #include "winbase.h" | 
|  | #include "winnls.h" | 
|  | #include "wine/unicode.h" | 
|  | #include "wine/windef16.h"  /* for SEGPTR */ | 
|  |  | 
|  | extern HANDLE SystemHeap; | 
|  |  | 
|  | extern SEGPTR HEAP_GetSegptr( HANDLE heap, DWORD flags, LPCVOID ptr ); | 
|  | extern BOOL HEAP_CreateSystemHeap(void); | 
|  |  | 
|  | /* SEGPTR helper macros */ | 
|  |  | 
|  | #define SEGPTR_ALLOC(size) \ | 
|  | (HeapAlloc( GetProcessHeap(), HEAP_WINE_SEGPTR, (size) )) | 
|  | #define SEGPTR_NEW(type) \ | 
|  | ((type *)HeapAlloc( GetProcessHeap(), HEAP_WINE_SEGPTR, sizeof(type) )) | 
|  | #define SEGPTR_STRDUP(str) \ | 
|  | (HIWORD(str) ? HEAP_strdupA( GetProcessHeap(), HEAP_WINE_SEGPTR, (str) ) : (LPSTR)(str)) | 
|  | #define SEGPTR_STRDUP_WtoA(str) \ | 
|  | (HIWORD(str) ? HEAP_strdupWtoA( GetProcessHeap(), HEAP_WINE_SEGPTR, (str) ) : (LPSTR)(str)) | 
|  | #define SEGPTR_FREE(ptr) \ | 
|  | (HIWORD(ptr) ? HeapFree( GetProcessHeap(), HEAP_WINE_SEGPTR, (ptr) ) : 0) | 
|  | #define SEGPTR_GET(ptr) MapLS(ptr) | 
|  |  | 
|  |  | 
|  | /* strdup macros */ | 
|  | /* DO NOT USE THEM!!  they will go away soon */ | 
|  |  | 
|  | inline static LPSTR HEAP_strdupA( HANDLE heap, DWORD flags, LPCSTR str ) | 
|  | { | 
|  | INT len = strlen(str) + 1; | 
|  | LPSTR p = HeapAlloc( heap, flags, len ); | 
|  | if (p) memcpy( p, str, len ); | 
|  | return p; | 
|  | } | 
|  |  | 
|  | inline static LPWSTR HEAP_strdupW( HANDLE heap, DWORD flags, LPCWSTR str ) | 
|  | { | 
|  | INT len = strlenW(str) + 1; | 
|  | LPWSTR p = HeapAlloc( heap, flags, len * sizeof(WCHAR) ); | 
|  | if (p) memcpy( p, str, len * sizeof(WCHAR) ); | 
|  | return p; | 
|  | } | 
|  |  | 
|  | inline static LPWSTR HEAP_strdupAtoW( HANDLE heap, DWORD flags, LPCSTR str ) | 
|  | { | 
|  | LPWSTR ret; | 
|  | INT len; | 
|  |  | 
|  | if (!str) return NULL; | 
|  | len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 ); | 
|  | ret = HeapAlloc( heap, flags, len * sizeof(WCHAR) ); | 
|  | if (ret) MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len ); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | inline static LPSTR HEAP_strdupWtoA( HANDLE heap, DWORD flags, LPCWSTR str ) | 
|  | { | 
|  | LPSTR ret; | 
|  | INT len; | 
|  |  | 
|  | if (!str) return NULL; | 
|  | len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL ); | 
|  | ret = HeapAlloc( heap, flags, len ); | 
|  | if(ret) WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL ); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | /* system heap private data */ | 
|  | /* you must lock the system heap before using this structure */ | 
|  | typedef struct | 
|  | { | 
|  | void     *gdi;        /* GDI heap */ | 
|  | void     *user;       /* USER handle table */ | 
|  | void     *cursor;     /* cursor information */ | 
|  | void     *queue;      /* message queues descriptor */ | 
|  | void     *win;        /* windows descriptor */ | 
|  | void     *root;       /* X11 root window */ | 
|  | } SYSTEM_HEAP_DESCR; | 
|  |  | 
|  | extern SYSTEM_HEAP_DESCR *SystemHeapDescr; | 
|  |  | 
|  | #endif  /* __WINE_HEAP_H */ |